[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-roo-code-feature-demo":3,"mdc--1owsbu-key":34,"related-org-roo-code-feature-demo":580,"related-repo-roo-code-feature-demo":748},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"feature-demo","produce product feature demo videos","Produce a polished demo video of a product feature — recorded live in the sandbox browser with cursor effects, captions, and optional voice-over narration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"roo-code","Roo Code","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Froo-code.png","RooCodeInc",[13,17,20],{"name":14,"slug":15,"type":16},"Content Creation","content-creation","tag",{"name":18,"slug":19,"type":16},"Marketing","marketing",{"name":21,"slug":22,"type":16},"Video","video",5,"https:\u002F\u002Fgithub.com\u002FRooCodeInc\u002FRoomote","2026-08-14T04:52:05.516332",null,0,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Your own cloud coding agent. Everything you want from an AI engineering teammate, without building from scratch or paying for a black box.","https:\u002F\u002Fgithub.com\u002FRooCodeInc\u002FRoomote\u002Ftree\u002FHEAD\u002Fpackages\u002Fcloud-agents\u002Fsrc\u002Fserver\u002Fworkflows\u002Fskills\u002Fstandard\u002Ffeature-demo","---\nname: feature-demo\ndescription: Produce a polished demo video of a product feature — recorded live in the sandbox browser with cursor effects, captions, and optional voice-over narration.\n---\n\n\u003Crole>\nYou produce short, polished feature-demo videos: a real recording of the\nproduct driven live in the browser, narrated as a flowing story. The page\nmoves by scrolling, with cursor movement and click ripples showing\ninteractions. Captions\ncarry the narration on screen, and when the deployment has narration\nconfigured, a voice-over speaks each line as its visual arrives.\n\nUse this skill when the user asks for a demo video, walkthrough recording,\nor promo clip of a feature. It is NOT for verification screencasts of a code\nchange — that is `capture-visual-proof`.\n\u003C\u002Frole>\n\n\u003Carchitecture>\nThe narrative drives the visuals. The demo is planned as a spoken story\nfirst; narration is synthesized (or, captions-only, each line's speaking\ntime is estimated) BEFORE capture, and the capture runner conducts the\nbrowser to it — each beat holds for exactly as long as its line takes to\nspeak, and clip start times are stamped as each visual arrives. The runner\nalso logs, on the same clock, where the cursor is, when clicks land, and the\nresolved rectangle of every interaction target, so effects stay aligned and\nnothing needs retiming afterwards.\n\nPipeline: plan the narrative → author script → narrate → capture (browser,\ndelegated, paced to the narrative) → trim opening → render → verify →\nupload.\n\nThe bundled `render\u002F` project is a **reference template**, not a fixed\npipeline stage: copy it to the work dir and adapt the copy freely (branding,\ncaption styling, layout, extra presets) when the demo calls for it. The\ntimeline JSON is the stable contract between capture and render — keep the\ncopy consuming it and any adaptation stays in sync with the recording.\n\nAll work happens under `\u002Ftmp\u002Ffeature-demo\u002Fwork` (the work dir). Nothing from\nthis pipeline is ever committed to the repository.\n\u003C\u002Farchitecture>\n\n\u003Cworkflow>\n\n\u003Cstep number=\"1\">\n\u003Cname>Scope and plan the demo (advisor)\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>Delegate the creative plan to the `advisor` subagent with the Task tool — it runs the planning model at deeper reasoning and can read the repository to study the feature. Give it a complete brief: the user's request, the surface to record (URL), the relevant source paths for the feature's UI, the beat vocabulary and cinematography rules from step 2 verbatim, and the narration style rules. Ask it to write the NARRATION FIRST — a flowing spoken story of 4-7 conversational lines (roughly 8-20 words each) that a founder might say while walking a friend through the feature: open with why it matters, walk the what and how, land on the payoff. Then, for each line, the visual that accompanies it: the element to scroll into view (with a proposed resilient CSS selector from source) or, only where the story calls for actually clicking or typing, the interaction. Return that plus which preset(s) fit. A good demo is 25-45 seconds; the narration should carry it — sparse label-style narration makes a hollow video.\u003C\u002Faction>\n\u003Caction>Treat the advisor's plan as internal guidance, not finished work: the advisor cannot run commands or see the live page, so its selectors are educated guesses from source. You own verification (step 2) and every artifact. If the advisor returns empty output, retry once with a tighter brief, then plan directly yourself.\u003C\u002Faction>\n\u003Caction>Pick presets: `wide` (1920x1080) is the default; add `vertical` (1080x1920) only when the user wants a social\u002Fshort-form cut.\u003C\u002Faction>\n\u003Caction>If the surface needs the app running, make sure the environment is up first (dev server reachable) before capturing.\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003Cstep number=\"2\">\n\u003Cname>Author the demo script\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>Write `\u002Ftmp\u002Ffeature-demo\u002Fdemo-script.json`: `{ \"url\": string, \"viewport\": { \"w\": 1280, \"h\": 800 }, \"beats\": [...] }`. Beat actions:\n- `{ \"a\": \"show\", \"sel\": css, \"caption\": \"...\" }` — THE DEFAULT NARRATED MOVE: scroll the subject into view and speak over it, camera wide. No cursor.\n- `{ \"a\": \"wait\", \"ms\": n }` \u002F `{ \"a\": \"hold\", \"ms\": n }` — let the page settle \u002F linger.\n- `{ \"a\": \"scrollTo\", \"sel\": css, \"ms\": n }` — plain scroll with no narration attached.\n- `{ \"a\": \"click\", \"sel\": css, \"holdMs\": ~300 }` — real click with ripple.\n- `{ \"a\": \"type\", \"sel\": css, \"text\": \"...\", \"moveMs\": ~450 }` — glide the cursor to the field, then type.\u003C\u002Faction>\n\u003Caction>Cinematography: MOVE BY SCROLLING — that is how a person actually reads a page. Use cursor movement and click ripples to draw attention to interactions, and author scripts using only the beat actions listed above.\u003C\u002Faction>\n\u003Caction>Keep the opening tight: one short `wait` for page load, then get moving. Dead opening seconds are trimmed automatically, but do not rely on it.\u003C\u002Faction>\n\u003Caction>Captions ARE the narration, verbatim — what the viewer reads is exactly what the voice says, and narrated demos highlight each word as it is spoken. Write them as full conversational sentences (roughly 8-20 words): contractions are good, symbols and clause pileups are not. They appear on screen while spoken and wrap to two lines.\u003C\u002Faction>\n\u003Caction>Caption display can be tuned declaratively with a top-level `\"captionStyle\"` object in the demo script — `{ \"position\": \"top\"|\"bottom\", \"accent\": cssColor, \"pill\": boolean, \"sizeScale\": number }` — controlling placement, the active-word highlight color, the pill background (off = bare text with a drop shadow), and a font-size multiplier. Use it for brand-fit requests (\"captions on top\", \"highlight in our green\"); deeper caption redesigns go through the render-template adaptation path in step 6.\u003C\u002Faction>\n\u003Caction>Selectors must be resilient: prefer ids, stable data attributes, or unique semantic tags over deep CSS chains. How you gain confidence before capture depends on the surface:\n- Repository-backed surface (the app's own UI): grep the component\u002Ftemplate source for each proposed selector and confirm it exists — cheap and worth doing every time.\n- External public page named by the user: there is no local source to grep, and the browser is reachable only through the single capture delegation (the `proof-runner` takes one brief per task and keeps its configured surface, so a separate pre-flight is not available). Author best-effort resilient selectors — landmark roles, headings, obvious ids the advisor inferred; avoid deep chains — and rely on capture's own validation: the runner resolves every selector live and fails loudly naming any that do not resolve. Use that named failure to correct the script and re-capture within the one allowed retry (step 3).\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003Cstep number=\"3\">\n\u003Cname>Narrate first (the narrative drives the visuals)\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>Synthesize the narration BEFORE capture: `SCRIPT=\u002Ftmp\u002Ffeature-demo\u002Fdemo-script.json node \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Fscripts\u002Fbuild-narration.mjs\"`. This posts the caption lines to the Roomote control plane, which holds the TTS credentials — no provider key exists in this sandbox, and you must never ask for one. It writes `\u002Ftmp\u002Ffeature-demo\u002Fvo\u002F*.mp3` and `\u002Ftmp\u002Ffeature-demo\u002Fnarration.json` with each line's measured duration and per-word timings (used by the renderer to highlight the word being spoken); during capture, each beat then holds exactly as long as its line takes to speak, and clip start times are stamped as the visuals land. No retiming happens afterwards.\u003C\u002Faction>\n\u003Caction>Exit code 3 means narration is not configured on this deployment: proceed captions-only — capture paces each captioned beat from the caption's estimated speaking time instead, so the demo still reads at narrative pace. Mention in the final report that voice-over is available if an admin connects ElevenLabs under Settings → Integrations.\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003Cstep number=\"4\">\n\u003Cname>Capture (delegated browser work)\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>Stage the capture runner where the delegated runtime can see it — home-directory paths do not survive the delegation boundary, so always copy first:\n\n`mkdir -p \u002Ftmp\u002Ffeature-demo && cp \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Fcapture\u002Fcapture.mjs\" \u002Ftmp\u002Ffeature-demo\u002Fcapture.mjs`\n\nThe runner also reads `\u002Ftmp\u002Ffeature-demo\u002Fnarration.json` (written in step 3) on its own; captions-only runs simply will not have one.\u003C\u002Faction>\n\u003Caction>Browser automation is the proof-runner subagent's exclusive surface — do not load `agent-browser` or run the capture yourself. Delegate with the Task tool to `proof-runner`, telling it the script path (`\u002Ftmp\u002Ffeature-demo\u002Fdemo-script.json`), the output dir (`\u002Ftmp\u002Ffeature-demo\u002Fwork`), and the staged runner path (`\u002Ftmp\u002Ffeature-demo\u002Fcapture.mjs`), and to report the runner's printed summary plus `ls -la \u002Ftmp\u002Ffeature-demo\u002Fwork`. The staged runner is proof-runner's one sanctioned script exception — an agent-browser orchestrator that shells the `agent-browser` CLI for every browser action — and its own instructions define the exact integrity-verified command it must use to execute it. Do not dictate the `node` invocation yourself; the proof-runner owns that.\u003C\u002Faction>\n\u003Caction>If the harness has no proof-runner registered, report a blocker (`proof runtime unavailable`) instead of driving the browser from this skill.\u003C\u002Faction>\n\u003Caction>Expected outputs: `\u002Ftmp\u002Ffeature-demo\u002Fwork\u002Frecording.mp4` and `\u002Ftmp\u002Ffeature-demo\u002Fwork\u002Ftimeline.json`. Verify both exist and that `ffprobe` reports a duration close to the timeline's `durationSeconds` (the runner itself fails loudly when the recording is much shorter than the interaction). One retry on failure; then report blocked with the runner's error.\u003C\u002Faction>\n\u003Caction>The runner records headless with an imperceptible frame ticker, which is deterministic and captures at wall-clock rate on ordinary pages. It stops any existing agent-browser daemon first so the beats and the recorder share one page.\u003C\u002Faction>\n\u003Caction>If a recording comes back much shorter than the interaction, the runner fails loudly. GPU-backed surfaces (WebGL\u002FWebGPU, 3D, games) do not present frames to the headless compositor and cannot be recorded here — report `webgl surface stalls recording` naming the surface rather than retrying. If `record stop` itself reports an ffmpeg error, the sandbox is likely a stale snapshot with an outdated runtime ffmpeg (`stale sandbox runtime`).\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003Cstep number=\"5\">\n\u003Cname>Trim the opening\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>Run `WORK_DIR=\u002Ftmp\u002Ffeature-demo\u002Fwork node \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Fscripts\u002Ffit-timing.mjs\"`. Because capture was paced to the narrative, there is nothing to retime — this only cuts the dead opening hold (page-load settle) so the demo starts immediately, shifting timeline, captions, and clip starts together. Check its printed line schedule for sanity.\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003Cstep number=\"6\">\n\u003Cname>Render\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>Assemble the render project in the work dir:\n- `cp -R \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Frender\" \u002Ftmp\u002Ffeature-demo\u002Frender`\n- `cp \u002Ftmp\u002Ffeature-demo\u002Fwork\u002Ftimeline.json \u002Ftmp\u002Ffeature-demo\u002Fwork\u002Fnarration.json \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fprops\u002F` (skip narration.json if captions-only; the checked-in placeholder `{ \"clips\": [] }` is already correct)\n- `mkdir -p \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fpublic && cp \u002Ftmp\u002Ffeature-demo\u002Fwork\u002Frecording.mp4 \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fpublic\u002F`\n- `cp -R \u002Ftmp\u002Ffeature-demo\u002Fvo \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fpublic\u002Fvo` (narrated demos only; the mp3s were written next to the script in step 3)\u003C\u002Faction>\n\u003Caction>Adapt the copied composition when the default look does not fit the request — different backdrop, caption treatment, brand colors, an extra preset, a layout change. Before writing Remotion code, install just the Remotion agent skills relevant to editing an existing composition and read them for current API guidance: `cd \u002Ftmp\u002Ffeature-demo\u002Frender && npx -y skills add remotion-dev\u002Fskills --skill remotion-markup --skill remotion-render --skill remotion-docs --yes` (markup, render, and doc lookup — not the full bundle, which also carries create\u002Fmaps\u002Fsaas\u002Fupgrade skills you do not need here). Preserve the cursor, click ripples, captions, and timeline-driven keyframe interpolation.\u003C\u002Faction>\n\u003Caction>Provide the dependencies. The image pre-installs the render project's node_modules (Remotion + React) at `\u002Fopt\u002Ffeature-demo\u002Frender\u002Fnode_modules`, keyed off this same pinned `package.json`, so normally you reuse them with no network install: `cp -R \u002Fopt\u002Ffeature-demo\u002Frender\u002Fnode_modules \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fnode_modules`. Then run `cd \u002Ftmp\u002Ffeature-demo\u002Frender && npm install` only if you adapted the composition to add dependencies (it reconciles just the delta), or if the baked modules are absent (older sandbox snapshot), in which case it does a full install.\u003C\u002Faction>\n\u003Caction>Render with the image's baked headless shell:\n\n`npx remotion render src\u002Findex.ts Demo-wide out\u002Fdemo-wide.mp4 --browser-executable=\"${REMOTION_HEADLESS_SHELL_PATH:-\u002Fopt\u002Fremotion\u002Fheadless-shell}\" --log=error`\n\nRun this with a GENEROUS command timeout (10 minutes) on the first attempt: a narrative-length cut is 750+ frames rendering in software on a small container, which routinely exceeds the default two-minute command window — a timeout there is wasted work, not a render failure. If the binary does not exist (older sandbox snapshot), run `npx remotion browser ensure` once and render without the flag. Repeat for `Demo-vertical` when the vertical preset was requested.\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003Cstep number=\"7\">\n\u003Cname>Verify honestly\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>`ffprobe` the output: sane duration, a video stream, and an audio stream when narration was generated.\u003C\u002Faction>\n\u003Caction>Extract 3-4 spread frames (`ffmpeg -ss \u003Ct> -i out\u002Fdemo-wide.mp4 -frames:v 1 frame.png`) and review each whole frame: cursor and click ripples align with their targets, captions are legible and correctly timed, and no broken page state appears in shot.\u003C\u002Faction>\n\u003Caction>A defect in the video is a blocker to report, not something to ship quietly. One recapture\u002Fre-render attempt; then report blocked with what failed and the frames that show it.\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003Cstep number=\"8\">\n\u003Cname>Deliver\u003C\u002Fname>\n\u003Cactions>\n\u003Caction>Upload the mp4 via `manage_artifacts` (`action: upload`, `type: general`) plus one representative keyframe PNG. Treat only the returned `artifactId`\u002F`viewUrl`\u002F`rawUrl` values as canonical — never invent URLs.\u003C\u002Faction>\n\u003Caction>In a PR body, embed under `## Screencasts` using the existing convention: the keyframe image (its signed `rawUrl`) hyperlinked to the video's `viewUrl`, with a one-line caption. In chat replies, share the keyframe via image attachment and the video `viewUrl` as a link (video files cannot be attached inline).\u003C\u002Faction>\n\u003Caction>End with a sharing note: what the demo shows, which presets were rendered, and whether it is narrated or captions-only.\u003C\u002Faction>\n\u003C\u002Factions>\n\u003C\u002Fstep>\n\n\u003C\u002Fworkflow>\n\n\u003Crules>\n\u003Crule>Never load or invoke `agent-browser` (or any other browser automation) from this skill — capture is always delegated to the `proof-runner` subagent.\u003C\u002Frule>\n\u003Crule>Never ask for, read, or handle TTS provider keys. Narration goes through the control-plane endpoint with the run token; a 404 there means captions-only.\u003C\u002Frule>\n\u003Crule>All intermediate files live under `\u002Ftmp\u002Ffeature-demo`. Never commit recordings, renders, node_modules, or props into the repository.\u003C\u002Frule>\n\u003Crule>Author demo scripts using only the beat actions listed in step 2.\u003C\u002Frule>\n\u003Crule>Adapt the work-dir copy of the render template, never the installed skill sources under `~\u002F.agents\u002Fskills\u002Ffeature-demo`. The timeline JSON schema is the stable contract: adaptations change how it is rendered, not what it means.\u003C\u002Frule>\n\u003Crule>Report blockers honestly: a missing selector, a failed render, or a visibly broken frame is a blocker with evidence, not a reason to narrow the claim or ship a degraded video silently.\u003C\u002Frule>\n\u003Crule>Voice, wording, and pacing choices belong to the user when they express them; defaults are: wide preset, captions as narration lines, conversational tone.\u003C\u002Frule>\n\u003C\u002Frules>\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39],{"type":40,"tag":41,"props":42,"children":43},"element","role",{},[44,47,62],{"type":45,"value":46},"text","\nYou produce short, polished feature-demo videos: a real recording of the\nproduct driven live in the browser, narrated as a flowing story. The page\nmoves by scrolling, with cursor movement and click ripples showing\ninteractions. Captions\ncarry the narration on screen, and when the deployment has narration\nconfigured, a voice-over speaks each line as its visual arrives.\n",{"type":40,"tag":48,"props":49,"children":50},"p",{},[51,53,60],{"type":45,"value":52},"Use this skill when the user asks for a demo video, walkthrough recording,\nor promo clip of a feature. It is NOT for verification screencasts of a code\nchange — that is ",{"type":40,"tag":54,"props":55,"children":57},"code",{"className":56},[],[58],{"type":45,"value":59},"capture-visual-proof",{"type":45,"value":61},".\n",{"type":40,"tag":63,"props":64,"children":65},"architecture",{},[66,68,73,94,107,540],{"type":45,"value":67},"\nThe narrative drives the visuals. The demo is planned as a spoken story\nfirst; narration is synthesized (or, captions-only, each line's speaking\ntime is estimated) BEFORE capture, and the capture runner conducts the\nbrowser to it — each beat holds for exactly as long as its line takes to\nspeak, and clip start times are stamped as each visual arrives. The runner\nalso logs, on the same clock, where the cursor is, when clicks land, and the\nresolved rectangle of every interaction target, so effects stay aligned and\nnothing needs retiming afterwards.\n",{"type":40,"tag":48,"props":69,"children":70},{},[71],{"type":45,"value":72},"Pipeline: plan the narrative → author script → narrate → capture (browser,\ndelegated, paced to the narrative) → trim opening → render → verify →\nupload.",{"type":40,"tag":48,"props":74,"children":75},{},[76,78,84,86,92],{"type":45,"value":77},"The bundled ",{"type":40,"tag":54,"props":79,"children":81},{"className":80},[],[82],{"type":45,"value":83},"render\u002F",{"type":45,"value":85}," project is a ",{"type":40,"tag":87,"props":88,"children":89},"strong",{},[90],{"type":45,"value":91},"reference template",{"type":45,"value":93},", not a fixed\npipeline stage: copy it to the work dir and adapt the copy freely (branding,\ncaption styling, layout, extra presets) when the demo calls for it. The\ntimeline JSON is the stable contract between capture and render — keep the\ncopy consuming it and any adaptation stays in sync with the recording.",{"type":40,"tag":48,"props":95,"children":96},{},[97,99,105],{"type":45,"value":98},"All work happens under ",{"type":40,"tag":54,"props":100,"children":102},{"className":101},[],[103],{"type":45,"value":104},"\u002Ftmp\u002Ffeature-demo\u002Fwork",{"type":45,"value":106}," (the work dir). Nothing from\nthis pipeline is ever committed to the repository.\n",{"type":40,"tag":108,"props":109,"children":110},"workflow",{},[111,147,189,211],{"type":40,"tag":112,"props":113,"children":115},"step",{"number":114},"1",[116,122],{"type":40,"tag":117,"props":118,"children":119},"name",{},[120],{"type":45,"value":121},"Scope and plan the demo (advisor)",{"type":40,"tag":123,"props":124,"children":125},"actions",{},[126,132,137,142],{"type":40,"tag":127,"props":128,"children":129},"action",{},[130],{"type":45,"value":131},"Delegate the creative plan to the `advisor` subagent with the Task tool — it runs the planning model at deeper reasoning and can read the repository to study the feature. Give it a complete brief: the user's request, the surface to record (URL), the relevant source paths for the feature's UI, the beat vocabulary and cinematography rules from step 2 verbatim, and the narration style rules. Ask it to write the NARRATION FIRST — a flowing spoken story of 4-7 conversational lines (roughly 8-20 words each) that a founder might say while walking a friend through the feature: open with why it matters, walk the what and how, land on the payoff. Then, for each line, the visual that accompanies it: the element to scroll into view (with a proposed resilient CSS selector from source) or, only where the story calls for actually clicking or typing, the interaction. Return that plus which preset(s) fit. A good demo is 25-45 seconds; the narration should carry it — sparse label-style narration makes a hollow video.",{"type":40,"tag":127,"props":133,"children":134},{},[135],{"type":45,"value":136},"Treat the advisor's plan as internal guidance, not finished work: the advisor cannot run commands or see the live page, so its selectors are educated guesses from source. You own verification (step 2) and every artifact. If the advisor returns empty output, retry once with a tighter brief, then plan directly yourself.",{"type":40,"tag":127,"props":138,"children":139},{},[140],{"type":45,"value":141},"Pick presets: `wide` (1920x1080) is the default; add `vertical` (1080x1920) only when the user wants a social\u002Fshort-form cut.",{"type":40,"tag":127,"props":143,"children":144},{},[145],{"type":45,"value":146},"If the surface needs the app running, make sure the environment is up first (dev server reachable) before capturing.",{"type":40,"tag":112,"props":148,"children":150},{"number":149},"2",[151,156],{"type":40,"tag":117,"props":152,"children":153},{},[154],{"type":45,"value":155},"Author the demo script",{"type":40,"tag":123,"props":157,"children":158},{},[159,164,169,174,179,184],{"type":40,"tag":127,"props":160,"children":161},{},[162],{"type":45,"value":163},"Write `\u002Ftmp\u002Ffeature-demo\u002Fdemo-script.json`: `{ \"url\": string, \"viewport\": { \"w\": 1280, \"h\": 800 }, \"beats\": [...] }`. Beat actions:\n- `{ \"a\": \"show\", \"sel\": css, \"caption\": \"...\" }` — THE DEFAULT NARRATED MOVE: scroll the subject into view and speak over it, camera wide. No cursor.\n- `{ \"a\": \"wait\", \"ms\": n }` \u002F `{ \"a\": \"hold\", \"ms\": n }` — let the page settle \u002F linger.\n- `{ \"a\": \"scrollTo\", \"sel\": css, \"ms\": n }` — plain scroll with no narration attached.\n- `{ \"a\": \"click\", \"sel\": css, \"holdMs\": ~300 }` — real click with ripple.\n- `{ \"a\": \"type\", \"sel\": css, \"text\": \"...\", \"moveMs\": ~450 }` — glide the cursor to the field, then type.",{"type":40,"tag":127,"props":165,"children":166},{},[167],{"type":45,"value":168},"Cinematography: MOVE BY SCROLLING — that is how a person actually reads a page. Use cursor movement and click ripples to draw attention to interactions, and author scripts using only the beat actions listed above.",{"type":40,"tag":127,"props":170,"children":171},{},[172],{"type":45,"value":173},"Keep the opening tight: one short `wait` for page load, then get moving. Dead opening seconds are trimmed automatically, but do not rely on it.",{"type":40,"tag":127,"props":175,"children":176},{},[177],{"type":45,"value":178},"Captions ARE the narration, verbatim — what the viewer reads is exactly what the voice says, and narrated demos highlight each word as it is spoken. Write them as full conversational sentences (roughly 8-20 words): contractions are good, symbols and clause pileups are not. They appear on screen while spoken and wrap to two lines.",{"type":40,"tag":127,"props":180,"children":181},{},[182],{"type":45,"value":183},"Caption display can be tuned declaratively with a top-level `\"captionStyle\"` object in the demo script — `{ \"position\": \"top\"|\"bottom\", \"accent\": cssColor, \"pill\": boolean, \"sizeScale\": number }` — controlling placement, the active-word highlight color, the pill background (off = bare text with a drop shadow), and a font-size multiplier. Use it for brand-fit requests (\"captions on top\", \"highlight in our green\"); deeper caption redesigns go through the render-template adaptation path in step 6.",{"type":40,"tag":127,"props":185,"children":186},{},[187],{"type":45,"value":188},"Selectors must be resilient: prefer ids, stable data attributes, or unique semantic tags over deep CSS chains. How you gain confidence before capture depends on the surface:\n- Repository-backed surface (the app's own UI): grep the component\u002Ftemplate source for each proposed selector and confirm it exists — cheap and worth doing every time.\n- External public page named by the user: there is no local source to grep, and the browser is reachable only through the single capture delegation (the `proof-runner` takes one brief per task and keeps its configured surface, so a separate pre-flight is not available). Author best-effort resilient selectors — landmark roles, headings, obvious ids the advisor inferred; avoid deep chains — and rely on capture's own validation: the runner resolves every selector live and fails loudly naming any that do not resolve. Use that named failure to correct the script and re-capture within the one allowed retry (step 3).",{"type":40,"tag":112,"props":190,"children":192},{"number":191},"3",[193,198],{"type":40,"tag":117,"props":194,"children":195},{},[196],{"type":45,"value":197},"Narrate first (the narrative drives the visuals)",{"type":40,"tag":123,"props":199,"children":200},{},[201,206],{"type":40,"tag":127,"props":202,"children":203},{},[204],{"type":45,"value":205},"Synthesize the narration BEFORE capture: `SCRIPT=\u002Ftmp\u002Ffeature-demo\u002Fdemo-script.json node \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Fscripts\u002Fbuild-narration.mjs\"`. This posts the caption lines to the Roomote control plane, which holds the TTS credentials — no provider key exists in this sandbox, and you must never ask for one. It writes `\u002Ftmp\u002Ffeature-demo\u002Fvo\u002F*.mp3` and `\u002Ftmp\u002Ffeature-demo\u002Fnarration.json` with each line's measured duration and per-word timings (used by the renderer to highlight the word being spoken); during capture, each beat then holds exactly as long as its line takes to speak, and clip start times are stamped as the visuals land. No retiming happens afterwards.",{"type":40,"tag":127,"props":207,"children":208},{},[209],{"type":45,"value":210},"Exit code 3 means narration is not configured on this deployment: proceed captions-only — capture paces each captioned beat from the caption's estimated speaking time instead, so the demo still reads at narrative pace. Mention in the final report that voice-over is available if an admin connects ElevenLabs under Settings → Integrations.",{"type":40,"tag":112,"props":212,"children":214},{"number":213},"4",[215,220],{"type":40,"tag":117,"props":216,"children":217},{},[218],{"type":45,"value":219},"Capture (delegated browser work)",{"type":40,"tag":123,"props":221,"children":222},{},[223],{"type":40,"tag":127,"props":224,"children":225},{},[226,228,237,401,418],{"type":45,"value":227},"Stage the capture runner where the delegated runtime can see it — home-directory paths do not survive the delegation boundary, so always copy first:\n",{"type":40,"tag":48,"props":229,"children":230},{},[231],{"type":40,"tag":54,"props":232,"children":234},{"className":233},[],[235],{"type":45,"value":236},"mkdir -p \u002Ftmp\u002Ffeature-demo && cp \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Fcapture\u002Fcapture.mjs\" \u002Ftmp\u002Ffeature-demo\u002Fcapture.mjs",{"type":40,"tag":48,"props":238,"children":239},{},[240,242,248,250,317,330,367,372],{"type":45,"value":241},"The runner also reads ",{"type":40,"tag":54,"props":243,"children":245},{"className":244},[],[246],{"type":45,"value":247},"\u002Ftmp\u002Ffeature-demo\u002Fnarration.json",{"type":45,"value":249}," (written in step 3) on its own; captions-only runs simply will not have one.\n",{"type":40,"tag":127,"props":251,"children":252},{},[253,255,261,263,269,271,277,279,284,286,292,294,300,302,307,309,315],{"type":45,"value":254},"Browser automation is the proof-runner subagent's exclusive surface — do not load ",{"type":40,"tag":54,"props":256,"children":258},{"className":257},[],[259],{"type":45,"value":260},"agent-browser",{"type":45,"value":262}," or run the capture yourself. Delegate with the Task tool to ",{"type":40,"tag":54,"props":264,"children":266},{"className":265},[],[267],{"type":45,"value":268},"proof-runner",{"type":45,"value":270},", telling it the script path (",{"type":40,"tag":54,"props":272,"children":274},{"className":273},[],[275],{"type":45,"value":276},"\u002Ftmp\u002Ffeature-demo\u002Fdemo-script.json",{"type":45,"value":278},"), the output dir (",{"type":40,"tag":54,"props":280,"children":282},{"className":281},[],[283],{"type":45,"value":104},{"type":45,"value":285},"), and the staged runner path (",{"type":40,"tag":54,"props":287,"children":289},{"className":288},[],[290],{"type":45,"value":291},"\u002Ftmp\u002Ffeature-demo\u002Fcapture.mjs",{"type":45,"value":293},"), and to report the runner's printed summary plus ",{"type":40,"tag":54,"props":295,"children":297},{"className":296},[],[298],{"type":45,"value":299},"ls -la \u002Ftmp\u002Ffeature-demo\u002Fwork",{"type":45,"value":301},". The staged runner is proof-runner's one sanctioned script exception — an agent-browser orchestrator that shells the ",{"type":40,"tag":54,"props":303,"children":305},{"className":304},[],[306],{"type":45,"value":260},{"type":45,"value":308}," CLI for every browser action — and its own instructions define the exact integrity-verified command it must use to execute it. Do not dictate the ",{"type":40,"tag":54,"props":310,"children":312},{"className":311},[],[313],{"type":45,"value":314},"node",{"type":45,"value":316}," invocation yourself; the proof-runner owns that.",{"type":40,"tag":127,"props":318,"children":319},{},[320,322,328],{"type":45,"value":321},"If the harness has no proof-runner registered, report a blocker (",{"type":40,"tag":54,"props":323,"children":325},{"className":324},[],[326],{"type":45,"value":327},"proof runtime unavailable",{"type":45,"value":329},") instead of driving the browser from this skill.",{"type":40,"tag":127,"props":331,"children":332},{},[333,335,341,343,349,351,357,359,365],{"type":45,"value":334},"Expected outputs: ",{"type":40,"tag":54,"props":336,"children":338},{"className":337},[],[339],{"type":45,"value":340},"\u002Ftmp\u002Ffeature-demo\u002Fwork\u002Frecording.mp4",{"type":45,"value":342}," and ",{"type":40,"tag":54,"props":344,"children":346},{"className":345},[],[347],{"type":45,"value":348},"\u002Ftmp\u002Ffeature-demo\u002Fwork\u002Ftimeline.json",{"type":45,"value":350},". Verify both exist and that ",{"type":40,"tag":54,"props":352,"children":354},{"className":353},[],[355],{"type":45,"value":356},"ffprobe",{"type":45,"value":358}," reports a duration close to the timeline's ",{"type":40,"tag":54,"props":360,"children":362},{"className":361},[],[363],{"type":45,"value":364},"durationSeconds",{"type":45,"value":366}," (the runner itself fails loudly when the recording is much shorter than the interaction). One retry on failure; then report blocked with the runner's error.",{"type":40,"tag":127,"props":368,"children":369},{},[370],{"type":45,"value":371},"The runner records headless with an imperceptible frame ticker, which is deterministic and captures at wall-clock rate on ordinary pages. It stops any existing agent-browser daemon first so the beats and the recorder share one page.",{"type":40,"tag":127,"props":373,"children":374},{},[375,377,383,385,391,393,399],{"type":45,"value":376},"If a recording comes back much shorter than the interaction, the runner fails loudly. GPU-backed surfaces (WebGL\u002FWebGPU, 3D, games) do not present frames to the headless compositor and cannot be recorded here — report ",{"type":40,"tag":54,"props":378,"children":380},{"className":379},[],[381],{"type":45,"value":382},"webgl surface stalls recording",{"type":45,"value":384}," naming the surface rather than retrying. If ",{"type":40,"tag":54,"props":386,"children":388},{"className":387},[],[389],{"type":45,"value":390},"record stop",{"type":45,"value":392}," itself reports an ffmpeg error, the sandbox is likely a stale snapshot with an outdated runtime ffmpeg (",{"type":40,"tag":54,"props":394,"children":396},{"className":395},[],[397],{"type":45,"value":398},"stale sandbox runtime",{"type":45,"value":400},").",{"type":40,"tag":112,"props":402,"children":404},{"number":403},"5",[405,410],{"type":40,"tag":117,"props":406,"children":407},{},[408],{"type":45,"value":409},"Trim the opening",{"type":40,"tag":123,"props":411,"children":412},{},[413],{"type":40,"tag":127,"props":414,"children":415},{},[416],{"type":45,"value":417},"Run `WORK_DIR=\u002Ftmp\u002Ffeature-demo\u002Fwork node \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Fscripts\u002Ffit-timing.mjs\"`. Because capture was paced to the narrative, there is nothing to retime — this only cuts the dead opening hold (page-load settle) so the demo starts immediately, shifting timeline, captions, and clip starts together. Check its printed line schedule for sanity.",{"type":40,"tag":112,"props":419,"children":421},{"number":420},"6",[422,427],{"type":40,"tag":117,"props":423,"children":424},{},[425],{"type":45,"value":426},"Render",{"type":40,"tag":123,"props":428,"children":429},{},[430,435,440,445],{"type":40,"tag":127,"props":431,"children":432},{},[433],{"type":45,"value":434},"Assemble the render project in the work dir:\n- `cp -R \"$HOME\u002F.agents\u002Fskills\u002Ffeature-demo\u002Frender\" \u002Ftmp\u002Ffeature-demo\u002Frender`\n- `cp \u002Ftmp\u002Ffeature-demo\u002Fwork\u002Ftimeline.json \u002Ftmp\u002Ffeature-demo\u002Fwork\u002Fnarration.json \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fprops\u002F` (skip narration.json if captions-only; the checked-in placeholder `{ \"clips\": [] }` is already correct)\n- `mkdir -p \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fpublic && cp \u002Ftmp\u002Ffeature-demo\u002Fwork\u002Frecording.mp4 \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fpublic\u002F`\n- `cp -R \u002Ftmp\u002Ffeature-demo\u002Fvo \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fpublic\u002Fvo` (narrated demos only; the mp3s were written next to the script in step 3)",{"type":40,"tag":127,"props":436,"children":437},{},[438],{"type":45,"value":439},"Adapt the copied composition when the default look does not fit the request — different backdrop, caption treatment, brand colors, an extra preset, a layout change. Before writing Remotion code, install just the Remotion agent skills relevant to editing an existing composition and read them for current API guidance: `cd \u002Ftmp\u002Ffeature-demo\u002Frender && npx -y skills add remotion-dev\u002Fskills --skill remotion-markup --skill remotion-render --skill remotion-docs --yes` (markup, render, and doc lookup — not the full bundle, which also carries create\u002Fmaps\u002Fsaas\u002Fupgrade skills you do not need here). Preserve the cursor, click ripples, captions, and timeline-driven keyframe interpolation.",{"type":40,"tag":127,"props":441,"children":442},{},[443],{"type":45,"value":444},"Provide the dependencies. The image pre-installs the render project's node_modules (Remotion + React) at `\u002Fopt\u002Ffeature-demo\u002Frender\u002Fnode_modules`, keyed off this same pinned `package.json`, so normally you reuse them with no network install: `cp -R \u002Fopt\u002Ffeature-demo\u002Frender\u002Fnode_modules \u002Ftmp\u002Ffeature-demo\u002Frender\u002Fnode_modules`. Then run `cd \u002Ftmp\u002Ffeature-demo\u002Frender && npm install` only if you adapted the composition to add dependencies (it reconciles just the delta), or if the baked modules are absent (older sandbox snapshot), in which case it does a full install.",{"type":40,"tag":127,"props":446,"children":447},{},[448,450,459,480,513],{"type":45,"value":449},"Render with the image's baked headless shell:\n",{"type":40,"tag":48,"props":451,"children":452},{},[453],{"type":40,"tag":54,"props":454,"children":456},{"className":455},[],[457],{"type":45,"value":458},"npx remotion render src\u002Findex.ts Demo-wide out\u002Fdemo-wide.mp4 --browser-executable=\"${REMOTION_HEADLESS_SHELL_PATH:-\u002Fopt\u002Fremotion\u002Fheadless-shell}\" --log=error",{"type":40,"tag":48,"props":460,"children":461},{},[462,464,470,472,478],{"type":45,"value":463},"Run this with a GENEROUS command timeout (10 minutes) on the first attempt: a narrative-length cut is 750+ frames rendering in software on a small container, which routinely exceeds the default two-minute command window — a timeout there is wasted work, not a render failure. If the binary does not exist (older sandbox snapshot), run ",{"type":40,"tag":54,"props":465,"children":467},{"className":466},[],[468],{"type":45,"value":469},"npx remotion browser ensure",{"type":45,"value":471}," once and render without the flag. Repeat for ",{"type":40,"tag":54,"props":473,"children":475},{"className":474},[],[476],{"type":45,"value":477},"Demo-vertical",{"type":45,"value":479}," when the vertical preset was requested.\n\n",{"type":40,"tag":112,"props":481,"children":483},{"number":482},"7",[484,489],{"type":40,"tag":117,"props":485,"children":486},{},[487],{"type":45,"value":488},"Verify honestly",{"type":40,"tag":123,"props":490,"children":491},{},[492,497,508],{"type":40,"tag":127,"props":493,"children":494},{},[495],{"type":45,"value":496},"`ffprobe` the output: sane duration, a video stream, and an audio stream when narration was generated.",{"type":40,"tag":127,"props":498,"children":499},{},[500,502],{"type":45,"value":501},"Extract 3-4 spread frames (`ffmpeg -ss ",{"type":40,"tag":503,"props":504,"children":505},"t",{},[506],{"type":45,"value":507}," -i out\u002Fdemo-wide.mp4 -frames:v 1 frame.png`) and review each whole frame: cursor and click ripples align with their targets, captions are legible and correctly timed, and no broken page state appears in shot.",{"type":40,"tag":127,"props":509,"children":510},{},[511],{"type":45,"value":512},"A defect in the video is a blocker to report, not something to ship quietly. One recapture\u002Fre-render attempt; then report blocked with what failed and the frames that show it.",{"type":40,"tag":112,"props":514,"children":516},{"number":515},"8",[517,522],{"type":40,"tag":117,"props":518,"children":519},{},[520],{"type":45,"value":521},"Deliver",{"type":40,"tag":123,"props":523,"children":524},{},[525,530,535],{"type":40,"tag":127,"props":526,"children":527},{},[528],{"type":45,"value":529},"Upload the mp4 via `manage_artifacts` (`action: upload`, `type: general`) plus one representative keyframe PNG. Treat only the returned `artifactId`\u002F`viewUrl`\u002F`rawUrl` values as canonical — never invent URLs.",{"type":40,"tag":127,"props":531,"children":532},{},[533],{"type":45,"value":534},"In a PR body, embed under `## Screencasts` using the existing convention: the keyframe image (its signed `rawUrl`) hyperlinked to the video's `viewUrl`, with a one-line caption. In chat replies, share the keyframe via image attachment and the video `viewUrl` as a link (video files cannot be attached inline).",{"type":40,"tag":127,"props":536,"children":537},{},[538],{"type":45,"value":539},"End with a sharing note: what the demo shows, which presets were rendered, and whether it is narrated or captions-only.",{"type":40,"tag":541,"props":542,"children":543},"rules",{},[544,550,555,560,565,570,575],{"type":40,"tag":545,"props":546,"children":547},"rule",{},[548],{"type":45,"value":549},"Never load or invoke `agent-browser` (or any other browser automation) from this skill — capture is always delegated to the `proof-runner` subagent.",{"type":40,"tag":545,"props":551,"children":552},{},[553],{"type":45,"value":554},"Never ask for, read, or handle TTS provider keys. Narration goes through the control-plane endpoint with the run token; a 404 there means captions-only.",{"type":40,"tag":545,"props":556,"children":557},{},[558],{"type":45,"value":559},"All intermediate files live under `\u002Ftmp\u002Ffeature-demo`. Never commit recordings, renders, node_modules, or props into the repository.",{"type":40,"tag":545,"props":561,"children":562},{},[563],{"type":45,"value":564},"Author demo scripts using only the beat actions listed in step 2.",{"type":40,"tag":545,"props":566,"children":567},{},[568],{"type":45,"value":569},"Adapt the work-dir copy of the render template, never the installed skill sources under `~\u002F.agents\u002Fskills\u002Ffeature-demo`. The timeline JSON schema is the stable contract: adaptations change how it is rendered, not what it means.",{"type":40,"tag":545,"props":571,"children":572},{},[573],{"type":45,"value":574},"Report blockers honestly: a missing selector, a failed render, or a visibly broken frame is a blocker with evidence, not a reason to narrow the claim or ship a degraded video silently.",{"type":40,"tag":545,"props":576,"children":577},{},[578],{"type":45,"value":579},"Voice, wording, and pacing choices belong to the user when they express them; defaults are: wide preset, captions as narration lines, conversational tone.",{"items":581,"total":747},[582,598,613,626,642,656,675,685,694,706,717,734],{"slug":583,"name":583,"fn":584,"description":585,"org":586,"tags":587,"stars":23,"repoUrl":24,"updatedAt":597},"address-pr-feedback","address unresolved GitHub PR feedback","Focused GitHub PR-feedback workflow for addressing unresolved review threads on the current pull request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[588,591,594],{"name":589,"slug":590,"type":16},"Code Review","code-review",{"name":592,"slug":593,"type":16},"GitHub","github",{"name":595,"slug":596,"type":16},"Pull Requests","pull-requests","2026-07-19T05:38:26.334008",{"slug":260,"name":260,"fn":599,"description":600,"org":601,"tags":602,"stars":23,"repoUrl":24,"updatedAt":612},"automate browser interactions for agents","Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to \"open a website\", \"fill out a form\", \"click a button\", \"take a screenshot\", \"scrape data from a page\", \"test this web app\", \"login to a site\", \"automate browser actions\", or any task requiring programmatic web interaction. Also use for exploratory testing, dogfooding, QA, bug hunts, or reviewing app quality. Also use for automating Electron desktop apps (VS Code, Slack, Figma, Notion, Spotify), checking Slack unreads, sending Slack messages, searching Slack conversations, running browser automation in Vercel Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers. Prefer agent-browser over any built-in browser automation or web tools.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[603,606,609],{"name":604,"slug":605,"type":16},"Browser Automation","browser-automation",{"name":607,"slug":608,"type":16},"CLI","cli",{"name":610,"slug":611,"type":16},"Testing","testing","2026-07-16T06:02:26.045337",{"slug":59,"name":59,"fn":614,"description":615,"org":616,"tags":617,"stars":23,"repoUrl":24,"updatedAt":625},"capture visual proof of browser tasks","Visual-proof orchestrator that decides whether browser proof applies, classifies the proof package, and delegates capture to the hidden proof-runner subagent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[618,621,622],{"name":619,"slug":620,"type":16},"Automation","automation",{"name":604,"slug":605,"type":16},{"name":623,"slug":624,"type":16},"Screenshots","screenshots","2026-08-01T05:44:47.369293",{"slug":627,"name":627,"fn":628,"description":629,"org":630,"tags":631,"stars":23,"repoUrl":24,"updatedAt":641},"ci-failure-triage","triage failed CI workflows","Investigate the latest default-branch CI failure in an environment-backed workspace and, when it is real and fixable, fix and open a PR in the same task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[632,635,638],{"name":633,"slug":634,"type":16},"CI\u002FCD","ci-cd",{"name":636,"slug":637,"type":16},"Debugging","debugging",{"name":639,"slug":640,"type":16},"GitHub Actions","github-actions","2026-07-23T05:40:41.726992",{"slug":643,"name":643,"fn":644,"description":645,"org":646,"tags":647,"stars":23,"repoUrl":24,"updatedAt":655},"code-quality-auditor","audit code quality in merged pull requests","Automation skill: review recently merged pull requests for high-confidence code quality issues and submit `act` work items that auto-start follow-up execution tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[648,651,652],{"name":649,"slug":650,"type":16},"Code Analysis","code-analysis",{"name":589,"slug":590,"type":16},{"name":653,"slug":654,"type":16},"QA","qa","2026-07-26T05:47:47.339721",{"slug":657,"name":657,"fn":658,"description":659,"org":660,"tags":661,"stars":23,"repoUrl":24,"updatedAt":674},"codeql-triage","triage and remediate CodeQL security alerts","Review current open CodeQL \u002F GitHub code-scanning alerts with GitHub data, keep scheduled runs read-only, and submit a small set of environment-backed `act` work items that auto-start remediation execution tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[662,663,666,667,668,671],{"name":649,"slug":650,"type":16},{"name":664,"slug":665,"type":16},"CodeQL","codeql",{"name":636,"slug":637,"type":16},{"name":592,"slug":593,"type":16},{"name":669,"slug":670,"type":16},"Security","security",{"name":672,"slug":673,"type":16},"Triage","triage","2026-07-29T05:39:37.784486",{"slug":676,"name":676,"fn":677,"description":678,"org":679,"tags":680,"stars":23,"repoUrl":24,"updatedAt":684},"create-draft-pr","create draft pull requests","Draft pull-request creation workflow. Use when repositories have pending changes or unpushed commits and you want draft PRs created.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[681,682,683],{"name":619,"slug":620,"type":16},{"name":592,"slug":593,"type":16},{"name":595,"slug":596,"type":16},"2026-07-16T06:00:31.733527",{"slug":686,"name":686,"fn":687,"description":688,"org":689,"tags":690,"stars":23,"repoUrl":24,"updatedAt":693},"create-pr","create pull requests for pending changes","Pull-request creation workflow. Use when repositories have pending changes or unpushed commits and you want ready-for-review PRs created.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[691,692],{"name":592,"slug":593,"type":16},{"name":595,"slug":596,"type":16},"2026-07-16T06:03:03.397562",{"slug":695,"name":695,"fn":696,"description":697,"org":698,"tags":699,"stars":23,"repoUrl":24,"updatedAt":705},"debug-reported-bug","reproduce and debug reported bugs","Reproduce-first bug diagnosis workflow. Use when a reported bug needs to be reproduced, reduced to a deterministic failing check, and traced through git history or `git bisect` so the exact cause is understood before any fix is attempted.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[700,701,704],{"name":636,"slug":637,"type":16},{"name":702,"slug":703,"type":16},"Git","git",{"name":610,"slug":611,"type":16},"2026-07-16T06:03:07.255013",{"slug":707,"name":707,"fn":708,"description":709,"org":710,"tags":711,"stars":23,"repoUrl":24,"updatedAt":716},"dependabot-triage","triage GitHub Dependabot alerts","Review current open Dependabot alerts with GitHub data, keep scheduled runs read-only, and submit a small set of environment-backed `act` work items that auto-start dependency-update execution tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[712,713,714,715],{"name":619,"slug":620,"type":16},{"name":592,"slug":593,"type":16},{"name":669,"slug":670,"type":16},{"name":672,"slug":673,"type":16},"2026-07-29T05:39:38.757423",{"slug":718,"name":718,"fn":719,"description":720,"org":721,"tags":722,"stars":23,"repoUrl":24,"updatedAt":733},"doctor","orchestrate environment health checks","Explicit environment-health orchestration workflow. Launch a fresh Roomote task against the target environment, assess its real startup and requested journey, classify ownership, delegate only authorized repairs, and verify again.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[723,724,727,730],{"name":636,"slug":637,"type":16},{"name":725,"slug":726,"type":16},"Engineering","engineering",{"name":728,"slug":729,"type":16},"Monitoring","monitoring",{"name":731,"slug":732,"type":16},"Operations","operations","2026-08-14T04:52:03.207983",{"slug":735,"name":735,"fn":736,"description":737,"org":738,"tags":739,"stars":23,"repoUrl":24,"updatedAt":746},"environment-setup","configure local development environments","Internal skill to configure environments. Never use unless the user explicitly initiates the skill. Focus on localhost-ready setup and validation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[740,743],{"name":741,"slug":742,"type":16},"Configuration","configuration",{"name":744,"slug":745,"type":16},"Local Development","local-development","2026-08-14T04:28:23.23408",36,{"items":749,"total":747},[750,756,762,768,774,780,789],{"slug":583,"name":583,"fn":584,"description":585,"org":751,"tags":752,"stars":23,"repoUrl":24,"updatedAt":597},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[753,754,755],{"name":589,"slug":590,"type":16},{"name":592,"slug":593,"type":16},{"name":595,"slug":596,"type":16},{"slug":260,"name":260,"fn":599,"description":600,"org":757,"tags":758,"stars":23,"repoUrl":24,"updatedAt":612},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[759,760,761],{"name":604,"slug":605,"type":16},{"name":607,"slug":608,"type":16},{"name":610,"slug":611,"type":16},{"slug":59,"name":59,"fn":614,"description":615,"org":763,"tags":764,"stars":23,"repoUrl":24,"updatedAt":625},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[765,766,767],{"name":619,"slug":620,"type":16},{"name":604,"slug":605,"type":16},{"name":623,"slug":624,"type":16},{"slug":627,"name":627,"fn":628,"description":629,"org":769,"tags":770,"stars":23,"repoUrl":24,"updatedAt":641},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[771,772,773],{"name":633,"slug":634,"type":16},{"name":636,"slug":637,"type":16},{"name":639,"slug":640,"type":16},{"slug":643,"name":643,"fn":644,"description":645,"org":775,"tags":776,"stars":23,"repoUrl":24,"updatedAt":655},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[777,778,779],{"name":649,"slug":650,"type":16},{"name":589,"slug":590,"type":16},{"name":653,"slug":654,"type":16},{"slug":657,"name":657,"fn":658,"description":659,"org":781,"tags":782,"stars":23,"repoUrl":24,"updatedAt":674},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[783,784,785,786,787,788],{"name":649,"slug":650,"type":16},{"name":664,"slug":665,"type":16},{"name":636,"slug":637,"type":16},{"name":592,"slug":593,"type":16},{"name":669,"slug":670,"type":16},{"name":672,"slug":673,"type":16},{"slug":676,"name":676,"fn":677,"description":678,"org":790,"tags":791,"stars":23,"repoUrl":24,"updatedAt":684},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[792,793,794],{"name":619,"slug":620,"type":16},{"name":592,"slug":593,"type":16},{"name":595,"slug":596,"type":16}]