Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions assistant/src/config/bundled-skills/screen-recording/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
name: "Screen Recording"
description: "Capture screen recordings during computer-use sessions. Records the display or a specific window as H.264 MP4 video with optional audio."
user-invocable: false
disable-model-invocation: false
metadata:
vellum:
emoji: "πŸŽ₯"
os: ["darwin"]
Comment on lines +6 to +9
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ”΄ Multi-line YAML metadata not parsed by line-based frontmatter parser, losing os constraint and emoji

The metadata field in the new SKILL.md uses multi-line nested YAML syntax, but the frontmatter parser (assistant/src/skills/frontmatter.ts:28-62) is a simple line-by-line key-value parser that splits on :. It does not support multi-line YAML or nested structures.

Root Cause and Impact

When the parser encounters:

metadata:
  vellum:
    emoji: "πŸŽ₯"
    os: ["darwin"]

It parses each line independently, producing:

  • metadata β†’ "" (empty string)
  • vellum β†’ "" (empty string)
  • emoji β†’ "πŸŽ₯"
  • os β†’ ["darwin"]

Since metadata is an empty string, the check at assistant/src/config/skills.ts:309 (if (metadataRaw)) evaluates to false and skips JSON parsing entirely. The metadata field on the skill will be undefined.

This causes two problems:

  1. The os: ["darwin"] constraint is lost β€” the skill will appear available on all platforms instead of only macOS. The OS eligibility check at assistant/src/config/skills.ts:149-158 will never fire because vellum.os is undefined.
  2. The emoji πŸŽ₯ is lost β€” the skill won't display its intended icon.

Every other skill in the codebase uses single-line JSON for metadata (e.g., metadata: {"vellum": {"emoji": "🍎", "os": ["darwin"]}} in assistant/src/config/bundled-skills/macos-automation/SKILL.md).

Suggested change
metadata:
vellum:
emoji: "πŸŽ₯"
os: ["darwin"]
metadata: {"vellum": {"emoji": "πŸŽ₯", "os": ["darwin"]}}
Open in Devin Review

Was this helpful? React with πŸ‘ or πŸ‘Ž to provide feedback.

Comment on lines +6 to +9
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use JSON metadata frontmatter for OS gating

The skill loader only parses metadata as a single-line JSON value (JSON.parse(fields.metadata) in assistant/src/config/skills.ts), but this frontmatter uses nested YAML under metadata:. That means metadata is effectively dropped, including os: ["darwin"], so this macOS-only skill becomes eligible on other platforms and can be surfaced/invoked where screen recording is unavailable.

Useful? React with πŸ‘Β / πŸ‘Ž.

---

# Screen Recording

You have access to a screen recording capability that captures what happens on the user's Mac during computer-use sessions.

## How It Works

- **Automatic in QA mode**: When a QA/test session starts, recording begins automatically before any destructive actions (clicks, typing, etc.)
- **Can be requested explicitly**: Sessions can be configured with `requiresRecording: true` to enable recording outside of QA mode
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid claiming requiresRecording works outside QA

This instruction says requiresRecording: true enables recording outside QA mode, but the macOS session starts recording only in the qaMode path and app call sites only provide a ScreenRecorder when qaMode == true. In practice, a non-QA session with only requiresRecording cannot start recording and can hit recording-gate failure behavior, so this guidance teaches an unsupported flow.

Useful? React with πŸ‘Β / πŸ‘Ž.

- **Recording gate**: When recording is required, destructive actions are blocked until the first video frame is confirmed captured

## Recording Details

- **Format**: H.264 MP4 video at 30 fps
- **Resolution**: 1920Γ—1080
- **Bitrate**: 4 Mbps video, 128 kbps AAC audio (when audio is enabled)
- **Capture scope**: Either the full display or a specific window
- **Storage**: Files are saved to `~/Library/Application Support/vellum-assistant/recordings/`
- **Naming**: `qa-recording-{timestamp}.mp4`

## Health Checks

A first-frame handshake verifies the capture pipeline is healthy within 5 seconds of starting. If no frames arrive:
- **Required recording**: The session fails immediately with a clear error
- **Optional recording**: A warning is shown but the session continues

## After Recording

When a recording completes:
1. The video file is saved to disk
2. A file-backed attachment is created (metadata in DB, file stays on disk)
3. The attachment is linked to the originating chat message
4. The video appears inline in the conversation for playback

## Retention

Recordings have an expiration timestamp (default: 7 days, configurable). An automatic cleanup worker runs periodically (every 6 hours) and deletes expired recording files from disk.

## Limitations

- Requires Screen Recording permission in System Settings > Privacy & Security
- Only available on macOS
- One recording at a time per session
- Recording must be stopped explicitly (or stops when the session ends)
- Large recordings consume disk space until cleanup runs

## When to Mention Recording

- Tell users their QA session is being recorded when relevant
- Offer to analyze recordings using the media-processing skill (keyframe extraction, event detection)
- Mention retention period if users ask about storage or cleanup
- If recording fails, explain the specific error (permission denied, no display found, etc.)
Loading