[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71QCT1J9SE670TZJENMNH24":3,"skill-same:01M71QCT1J9SE670TZJENMNH24":136},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":14,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":63,"install":64,"resources":77},"01M71QCT1J9SE670TZJENMNH24","vss-summarize-video",null,"Use to summarize a recorded video via the LVS summarization microservice (HITL-gated) with a VLM fallback. Not for report generation or live RTSP captioning.","pattanation\u002FNorvik","pattanation","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F235419268?v=4","01M71M5THHYYB15ME8R2E4FCZG","Patta","01M71M5TJM1NDM992M8PDKYR2K",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"vss summarize video","summarize","Video","gated","generation","via","operational","github","with","use","for","NVIDIA","microservice","fallback","live","team","Blueprint","captioning","search","LVS","2026-11-10 13:02:02",false,"---\nname: vss-summarize-video\ndescription: Use to summarize a recorded video via the LVS summarization microservice (HITL-gated) with a VLM fallback. Not for report generation or live RTSP captioning.\nlicense: Apache-2.0\nmetadata:\n  version: \"3.2.0\"\n  author: \"NVIDIA Video Search and Summarization team\"\n  github-url: \"https:\u002F\u002Fgithub.com\u002FNVIDIA-AI-Blueprints\u002Fvideo-search-and-summarization\"\n  tags: \"nvidia blueprint operational\"\n---\n## Instructions\n\nFollow the routing tables and step-by-step workflows below. Each section that ends in *workflow*, *quick start*, or *flow* is intended to be executed top-to-bottom. Detailed reference material lives in `references\u002F`.\n\n## Examples\n\nWorked end-to-end examples are kept under `evals\u002F` (each `*.json` manifest contains a runnable scenario) and inline in the per-workflow `curl` blocks below. Run a Tier-3 evaluation with `nv-base validate \u003Cthis-skill-dir> --agent-eval` to replay them.\n\nCall the VLM NIM or the video summarization microservice **directly**.\nAlways run `curl` commands yourself; never instruct the user to run them.\n\nPrimary video workflow query type: **\"Summarize this video.\"** Direct video summarization API\nand service-ops requests are handled by the reference-routed sections below.\n\n## Purpose\n\nProduce a single, polished narrative summary of one recorded video clip, with\ntimestamped events when the LVS microservice path is reachable.\n\n**Do NOT use this skill for:**\n- Live RTSP captioning — use `vss-deploy-dense-captioning`.\n- Report generation, including incident or alert-window reports — use `vss-generate-video-report` Mode B.\n- Semantic search across the archive — use `vss-search-archive`.\n\n## Prerequisites\n\n- VSS `lvs` profile running on `$HOST_IP` (port 38111) OR a reachable\n  VLM\u002FRT-VLM endpoint as a fallback. The `vss-deploy-profile` skill brings\n  these up.\n- Network reachability from the agent host to both endpoints; clip URLs from\n  VIOS must be fetchable by the chosen backend.\n- `jq` and `curl` available on the agent host.\n\n## Limitations\n\n- Direct VLM fallback uses a single fixed prompt and cannot target\n  scenario\u002Fevents — output quality is lower than the LVS path.\n- Remote VLM endpoints generally cannot reach `localhost`\u002Fprivate clip URLs.\n- One backend call per request; no parallel hedging or multi-pass summaries.\n\n## Troubleshooting\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `\u002Fv1\u002Fready` returns 503 repeatedly | LVS service still warming up | Retry up to ~30 s as shown in *Setup*; if it never returns 200 the service may not be deployed |\n| Empty `video_summary` and `events` | Clip does not contain the requested events | Re-run with broader `scenario` or different `events` |\n| VLM returns `\u003Cthink>` block | Cosmos Reason 2 reasoning mode | Strip everything up to `\u003C\u002Fthink>` before rendering |\n| Empty stdout from `curl \u002Fv1\u002Fready` | Service legitimately returns 200 with empty body | Always check HTTP status with `-o \u002Fdev\u002Fnull -w '%{http_code}'`, never inspect the body |\n\nSee [`references\u002Fvideo-summarization-debugging.md`](references\u002Fvideo-summarization-debugging.md) for deeper diagnostics.\n\n## Reference Map\n\nUse these references only when the user asks for the relevant detail, or when\nthe core workflow below needs deeper video summarization information:\n\n- **video summarization API details**: [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md) for\n  `\u002Fv1\u002Fsummarize`, `\u002Fsummarize`, `\u002Fv1\u002Fgenerate_captions`,\n  `\u002Fv1\u002Fstream_summarize`, health probes, `\u002Fmodels`, `\u002Frecommended_config`,\n  `\u002Fmetrics`, request fields, response shapes, and API gotchas.\n- **video summarization service configuration and ops**:\n  [`references\u002Fvideo-summarization-deployment.md`](references\u002Fvideo-summarization-deployment.md) for\n  the VSS `lvs` profile, ports, required env vars, logs, status, dry-runs,\n  teardown, model\u002Fbackend swaps, Elasticsearch\u002FNeo4j\u002FArangoDB backend\n  selection, and service-level troubleshooting.\n- **Extended video summarization ops references**:\n  [`references\u002Fvideo-summarization-environment-variables.md`](references\u002Fvideo-summarization-environment-variables.md),\n  [`references\u002Fvideo-summarization-debugging.md`](references\u002Fvideo-summarization-debugging.md), and\n  `assets\u002Fvideo-summarization.env.example`.\n\nLoad `video-summarization-api.md` only when you need a request field, response shape, or\nendpoint that is not already covered by the Step 2 LVS or fallback VLM\nexample below, or when handling a direct video summarization API\nrequest. Load `video-summarization-deployment.md` only for deployment,\nconfiguration, or service operations.\n\n## Video Summarization API And Service Ops Requests\n\nIf the user asks to call or debug video summarization endpoints directly, answer from\n[`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md) instead of running the\nend-to-end video summarization workflow. Examples: list video summarization models, check\nreadiness, get recommended chunking config, inspect metrics, explain a 422\nresponse, or build a `\u002Fv1\u002Fsummarize` request body.\n\nIf the user asks to configure, deploy, restart, tear down, or troubleshoot the\nvideo summarization service, prefer the `vss-deploy-profile` skill for full VSS profile\ndeployment and use [`references\u002Fvideo-summarization-deployment.md`](references\u002Fvideo-summarization-deployment.md)\nfor video summarization-specific service details.\n\n## Routing\n\nDecide purely from video summarization service availability (probed in\n*Setup → Availability checks* below). **Duration does not drive routing.**\n\n| `\u002Fv1\u002Fready` | Backend | Endpoint |\n|---|---|---|\n| HTTP 200 | LVS microservice with HITL | `POST ${LVS_BACKEND_URL}\u002Fv1\u002Fsummarize` |\n| Anything else | VLM \u002F RT-VLM with the default prompt + fallback note | `POST ${VLM_BASE_URL}\u002Fv1\u002Fchat\u002Fcompletions` |\n\nFallback message when the LVS service is unreachable — copy verbatim above the summary:\n\n> ⚠ **Note:** Input video `\u003Cname>` is `\u003CN>`s long.\n> The video summarization service is not deployed, so this summary was\n> produced by the VLM alone with a generic default prompt. Deploy the\n> `lvs` profile for higher-quality summaries with scenario\u002Fevents\n> targeting.\n\n## Deployment prerequisite\n\nThe VSS **lvs** profile on `$HOST_IP` is the primary backend. If the\n`\u002Fv1\u002Fready` probe (see *Setup → Availability checks*) returns anything\nother than 200 after the warmup retries, ask the user:\n\n> *\"The VSS `lvs` profile isn't running on `$HOST_IP`. Shall I deploy it now using the `\u002Fvss-deploy-profile` skill with `-p lvs`? Reply `no` to summarize with the VLM-only fallback instead (lower quality, no scenario\u002Fevents targeting).\"*\n\n- **Yes** → hand off to `\u002Fvss-deploy-profile`, then re-probe and continue with Step 2 (LVS + HITL).\n- **No** → go straight to **Step 2 fallback (VLM with default prompt)** and prepend the Routing fallback note. Do not ask again, and do not run scenario\u002Fevents HITL.\n- **Pre-authorized to deploy autonomously** (caller said so explicitly) → skip the confirmation and invoke `\u002Fvss-deploy-profile` directly.\n- **Pre-authorized to use VLM fallback** (\"skip lvs, just use the VLM\") → go straight to Step 2 fallback without prompting.\n\n---\n\n## Setup\n\n**Endpoints (defaults for a local VSS `lvs` deployment):**\n\n- VLM \u002F RT-VLM: `${VLM_BASE_URL}` — default `${RTVI_VLM_BASE_URL:-http:\u002F\u002F${HOST_IP:-localhost}:8018}`\n- LVS service: `${LVS_BACKEND_URL}` — default `http:\u002F\u002F${HOST_IP:-localhost}:38111`\n- VIOS: owned by `vss-manage-video-io-storage`; refer there.\n\nUse env vars when set (strip trailing `\u002Fv1` from the VLM base — the skill appends it). Otherwise use the defaults. If neither works, ask the user — do not scan ports or read config files to guess.\n\n**Model name:** read `${VLM_NAME}` (default\n`nim_nvidia_cosmos-reason2-8b_hf-1208`). It must match the id RT-VLM\n`\u002Fv1\u002Fmodels` advertises; do not substitute the friendly\n`nvidia\u002Fcosmos-reason2-8b`.\n\nFor endpoint schemas, optional fields, response envelopes, and error handling, see [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md).\n\n**Availability checks** (run both before routing).\n**Readiness is determined by the HTTP status code only** — the LVS\n`\u002Fv1\u002Fready` may legitimately return `200` with an empty body, so do not\ninspect the body.\n\n```bash\nVLM=\"${VLM_BASE_URL:-${RTVI_VLM_BASE_URL:-http:\u002F\u002F${HOST_IP:-localhost}:8018}}\"\nVLM=\"${VLM%\u002Fv1}\"\n\n# VLM \u002F RT-VLM: 200 on \u002Fv1\u002Fmodels\nvlm_code=$(curl -s -o \u002Fdev\u002Fnull -w '%{http_code}' --connect-timeout 3 --max-time 10 \\\n  \"$VLM\u002Fv1\u002Fmodels\")\n[ \"$vlm_code\" = \"200\" ] && echo \"VLM OK\" || echo \"VLM not reachable (HTTP $vlm_code)\"\n\n# Video summarization service: 200 on \u002Fv1\u002Fready, with retry on 503 (warmup) for up to ~30s\nVIDEO_SUMMARIZATION_URL=${LVS_BACKEND_URL:-http:\u002F\u002F${HOST_IP:-localhost}:38111}\nvideo_sum_code=000\nfor i in $(seq 1 10); do\n  video_sum_code=$(curl -s -o \u002Fdev\u002Fnull -w '%{http_code}' --connect-timeout 3 --max-time 10 \"$VIDEO_SUMMARIZATION_URL\u002Fv1\u002Fready\")\n  case \"$video_sum_code\" in\n    200) echo \"video summarization OK\"; break ;;\n    503) sleep 3 ;;                 # warming up; keep polling\n    *)   break ;;                   # any other code = not reachable, stop retrying\n  esac\ndone\n[ \"$video_sum_code\" = \"200\" ] || echo \"video summarization service not reachable (HTTP $video_sum_code)\"\n```\n\n**How to interpret the results:**\n\n- `video_sum_code = 200` → **Step 2 (LVS + HITL)** for every video.\n- `video_sum_code != 200`, `vlm_code = 200` → **Step 2 fallback (VLM)**; prepend the Routing fallback note.\n- `vlm_code != 200` → fail; at least one backend must be reachable.\n- A non-200 LVS code after the retry loop is the ONLY signal of unavailability. Empty stdout or missing JSON fields are NOT \"unavailable.\"\n\n---\n\n## Step 1 - Get the clip URL via `vss-manage-video-io-storage` (sub-task, NOT the final answer)\n\n**Use the `vss-manage-video-io-storage` skill for all VIOS interactions** — it\nowns the canonical curl recipes, parameter defaults, and delete\u002Fupload flows.\nDo not fabricate URLs or hand-roll VIOS calls; they will drift.\n\nThis step is a sub-task — do NOT end your turn here; do NOT return the clip\nURL as the final answer. From VIOS collect three values:\n\n1. **`streamId`** (via `sensor\u002Flist` → `sensor\u002F\u003Cid>\u002Fstreams`, or directly from an upload response).\n2. **Timeline** - `{startTime, endTime}` (ISO 8601 UTC). `endTime - startTime` is the duration; needed only for the user-facing header (routing is driven solely by `\u002Fv1\u002Fready`).\n3. **Temporary MP4 clip URL** — the `\u002Fstorage\u002Ffile\u002F\u003CstreamId>\u002Furl` variant with `container=mp4`. Response field: `.videoUrl`. Both backends need an HTTP(S) URL they can `GET`.\n\nEverything else (auth, upload, `disableAudio`, expiry, etc.) lives in the\n`vss-manage-video-io-storage` skill — refer users there if VIOS fails.\n\n---\n\n## Step 2 — Primary: video summarization microservice with HITL\n\nUse this path **whenever** `\u002Fv1\u002Fready` returned 200 in Setup. Duration is irrelevant.\n\nFor advanced fields (`media_info`, `schema`, structured output, stream captioning, metrics, recommended config) see [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md).\n\n### HITL: collect scenario and events first (REQUIRED — do not skip)\n\nFull walk-through is in [`references\u002Fhitl-prompts.md`](references\u002Fhitl-prompts.md). Always run HITL before calling the LVS service.\n\n**Autonomous-mode defaults.** When the caller has bypassed HITL (\"run\nautonomously without prompting\") AND the original query asks for\n`default`\u002F`defaults` (or gives none), use\n`scenario=\"activity monitoring\"` and `events=[\"notable activity\"]`\n**verbatim** — do not infer from filename or sensor name. Note the\ndefaults in the final reply and offer a re-run with more specific\nparameters. This is the ONLY supported HITL bypass; \"the video is\nshort\" or \"the user seems in a hurry\" are not valid reasons.\n\nPrefer `POST \u002Fv1\u002Fsummarize` (3.2 GA route); `\u002Fsummarize` is a compatibility alias.\n\n```bash\nVIDEO_SUMMARIZATION_URL=${LVS_BACKEND_URL:-http:\u002F\u002F${HOST_IP:-localhost}:38111}\n\n# From HITL reply:\nSCENARIO='warehouse monitoring'\nEVENTS_JSON='[\"notable activity\"]'\nOBJECTS_JSON=''  # '' to omit, else '[\"forklifts\",\"pallets\",\"workers\"]'\n\ncurl -s --max-time 300 -X POST \"$VIDEO_SUMMARIZATION_URL\u002Fv1\u002Fsummarize\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"$(jq -n --arg url \"\u003Cclip_url_from_vss_manage_video_io_storage>\" \\\n        --arg model \"${VLM_NAME:-nim_nvidia_cosmos-reason2-8b_hf-1208}\" \\\n        --arg scenario \"$SCENARIO\" \\\n        --argjson events \"$EVENTS_JSON\" \\\n        --argjson objects \"${OBJECTS_JSON:-null}\" '{\n    url: $url,\n    model: $model,\n    scenario: $scenario,\n    events: $events,\n    chunk_duration: 10,\n    num_frames_per_second_or_fixed_frames_chunk: 20,\n    use_fps_for_chunking: false,\n    seed: 1\n  } + (if $objects == null then {} else {objects_of_interest: $objects} end)')\" \\\n  | jq -r '.choices[0].message.content' \\\n  | jq '{video_summary, events}'\n```\n\nIf both `video_summary` and `events` are empty, the clip probably doesn't contain the requested events — re-run with broader `scenario`\u002F`events`, don't report \"no content\".\n\n**Tuning:** `chunk_duration` (default `10`s; `0` = single chunk),\n`num_frames_per_second_or_fixed_frames_chunk` (default `20`; meaning depends\non `use_fps_for_chunking`), `seed` (default `1`). `num_frames_per_chunk` is\ndeprecated.\n\n---\n\n## Step 2 fallback — VLM direct with default prompt\n\nUse this path **only** when `\u002Fv1\u002Fready` did not return 200 after warmup. Do NOT run HITL — the user did not opt in; you fell back because the service was missing. Prepend the Routing fallback note to the response.\n\n```bash\nVLM=\"${VLM_BASE_URL:-${RTVI_VLM_BASE_URL:-http:\u002F\u002F${HOST_IP:-localhost}:8018}}\"\nVLM=\"${VLM%\u002Fv1}\"\nPROMPT='Describe in detail what is happening in this video,\nincluding all visible people, vehicles, equipments, objects,\nactions, and environmental conditions.\nOUTPUT REQUIREMENTS:\n[timestamp-timestamp] Description of what is happening.\nEXAMPLE:\n[0.0s-4.0s] \u003Cdescription of the first event>\n[4.0s-12.0s] \u003Cdescription of the second event>'\n\ncurl -s --max-time 300 -X POST \"$VLM\u002Fv1\u002Fchat\u002Fcompletions\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"$(jq -n \\\n        --arg model \"${VLM_NAME:-nim_nvidia_cosmos-reason2-8b_hf-1208}\" \\\n        --arg text \"$PROMPT\" \\\n        --arg url \"\u003Cclip_url_from_vss_manage_video_io_storage>\" \\\n        '{\n          model: $model,\n          temperature: 0.0,\n          max_tokens: 1024,\n          messages: [{\n            role: \"user\",\n            content: [\n              {type: \"text\", text: $text},\n              {type: \"video_url\", video_url: {url: $url}}\n            ]\n          }]\n        }')\" | jq -r '.choices[0].message.content'\n```\n\n**Response:** standard OpenAI chat-completion envelope. The summary is in\n`choices[0].message.content`.\n\n**Cosmos-model notes:** Cosmos Reason 2 supports reasoning via\n`\u003Cthink>...\u003C\u002Fthink>\u003Canswer>...\u003C\u002Fanswer>` blocks. Omit the reasoning\ninstructions if you want a plain summary. Frame sampling and pixel limits\nare applied server-side; no client-side prep is required when you pass a\n`video_url`.\n\n---\n\n## End-to-end example\n\nSee [`references\u002Fend-to-end-example.md`](references\u002Fend-to-end-example.md) for\nthe full LVS-or-VLM-fallback script that probes `\u002Fv1\u002Fready` and runs the\nappropriate path.\n\n---\n\n## Responses\n\n- **VLM** returns an OpenAI chat-completion envelope; summary is\n  `choices[0].message.content`.\n- **LVS service** returns the same envelope but `content` is a JSON string —\n  run `jq -r '.choices[0].message.content' | jq` to reach `{video_summary, events}`.\n- **Errors** surface as HTTP non-2xx plus JSON `{error: ...}`. LVS `503` usually\n  means warmup — retry `\u002Fv1\u002Fready`.\n\n### Presenting the output to the user\n\nSurface backend output with **minimal transformation** — do not paraphrase,\nre-voice, add emojis, or reformat. **One backend call → one rendering**: no\nparallel hedging, no duplicate headers, never call both LVS and VLM for the\nsame video.\n\n**Header line.** Start with exactly one:\n\n```\nSummary of \u003Cvideo_name> (\u003Cduration>)\n```\n\n`\u003Cduration>` = `Ns` for `\u003C 60 s`, else `Mm Ss` (e.g. `3m 30s`).\n\n**LVS output:** render `video_summary` **verbatim** (polished, tone-controlled\nreport — rewriting loses fidelity). Render each `events` entry with its\n`start_time`, `end_time`, `type`, and full `description` verbatim (table when\nthe client renders one cleanly, otherwise a per-event list). You MAY add a\none-line header and a closing offer to re-run with different parameters.\n\n**VLM output:** render `choices[0].message.content` verbatim. If the model\nproduced `\u003Cthink>…\u003C\u002Fthink>\u003Canswer>…\u003C\u002Fanswer>` blocks, drop the `\u003Cthink>`\nblock and show the answer.\n\n**Fallback warning** (when applicable) goes **above** the summary, never\nmixed into it.\n\n## Tips\n\n- **Route by service availability, not by duration.** Probe `\u002Fv1\u002Fready` once\n  in Setup; HTTP 200 → LVS+HITL for every clip; anything else → VLM fallback.\n- **HITL is mandatory on the LVS path.** The `defaults` opt-in is the only\n  sanctioned bypass. The VLM fallback path is silent (no HITL).\n- **Readiness = HTTP 200 on `\u002Fv1\u002Fready`. Nothing else.** Body may be empty.\n  Always use `curl -s -o \u002Fdev\u002Fnull -w '%{http_code}'` — never pipe through\n  `jq`\u002F`grep`\u002F`head`.\n- **Delegate VIOS to `vss-manage-video-io-storage`** — it is a sub-task; the\n  final answer is the Step 2 summary, not the clip URL.\n- **`jq` twice for LVS output.** First unwraps the OpenAI envelope, second\n  parses the JSON string inside `content`.\n- **Prefer `\u002Fv1\u002Fsummarize` for 3.2 GA**; `\u002Fsummarize` is a compatibility alias.\n- **Use the exact VLM model id advertised by the endpoint** (default\n  `nim_nvidia_cosmos-reason2-8b_hf-1208`).\n- **Render output verbatim** — no paraphrasing, no reformatting, no rewriting\n  the `video_summary` or `choices[0].message.content`.\n- **One call, one render.** No parallel hedging, no double renderings.\n\n## Cross-reference\n\n- **vss-deploy-profile** — bring up the `base` (VLM only) or `lvs` (VLM + video summarization service) profile\n- **vss-manage-video-io-storage** (VIOS API) — upload videos, list streams, get clip URLs\n- **vss-search-archive** — semantic search across the archive (different profile)\n- **vss-query-analytics** — query incidents\u002Fevents from Elasticsearch\n- **video summarization API reference** — [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md)\n- **video summarization service ops reference** — [`references\u002Fvideo-summarization-deployment.md`](references\u002Fvideo-summarization-deployment.md)\n\nbump:2\n","## Instructions\n\nFollow the routing tables and step-by-step workflows below. Each section that ends in *workflow*, *quick start*, or *flow* is intended to be executed top-to-bottom. Detailed reference material lives in `references\u002F`.\n\n## Examples\n\nWorked end-to-end examples are kept under `evals\u002F` (each `*.json` manifest contains a runnable scenario) and inline in the per-workflow `curl` blocks below. Run a Tier-3 evaluation with `nv-base validate \u003Cthis-skill-dir> --agent-eval` to replay them.\n\nCall the VLM NIM or the video summarization microservice **directly**.\nAlways run `curl` commands yourself; never instruct the user to run them.\n\nPrimary video workflow query type: **\"Summarize this video.\"** Direct video summarization API\nand service-ops requests are handled by the reference-routed sections below.\n\n## Purpose\n\nProduce a single, polished narrative summary of one recorded video clip, with\ntimestamped events when the LVS microservice path is reachable.\n\n**Do NOT use this skill for:**\n- Live RTSP captioning — use `vss-deploy-dense-captioning`.\n- Report generation, including incident or alert-window reports — use `vss-generate-video-report` Mode B.\n- Semantic search across the archive — use `vss-search-archive`.\n\n## Prerequisites\n\n- VSS `lvs` profile running on `$HOST_IP` (port 38111) OR a reachable\n  VLM\u002FRT-VLM endpoint as a fallback. The `vss-deploy-profile` skill brings\n  these up.\n- Network reachability from the agent host to both endpoints; clip URLs from\n  VIOS must be fetchable by the chosen backend.\n- `jq` and `curl` available on the agent host.\n\n## Limitations\n\n- Direct VLM fallback uses a single fixed prompt and cannot target\n  scenario\u002Fevents — output quality is lower than the LVS path.\n- Remote VLM endpoints generally cannot reach `localhost`\u002Fprivate clip URLs.\n- One backend call per request; no parallel hedging or multi-pass summaries.\n\n## Troubleshooting\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `\u002Fv1\u002Fready` returns 503 repeatedly | LVS service still warming up | Retry up to ~30 s as shown in *Setup*; if it never returns 200 the service may not be deployed |\n| Empty `video_summary` and `events` | Clip does not contain the requested events | Re-run with broader `scenario` or different `events` |\n| VLM returns `\u003Cthink>` block | Cosmos Reason 2 reasoning mode | Strip everything up to `\u003C\u002Fthink>` before rendering |\n| Empty stdout from `curl \u002Fv1\u002Fready` | Service legitimately returns 200 with empty body | Always check HTTP status with `-o \u002Fdev\u002Fnull -w '%{http_code}'`, never inspect the body |\n\nSee [`references\u002Fvideo-summarization-debugging.md`](references\u002Fvideo-summarization-debugging.md) for deeper diagnostics.\n\n## Reference Map\n\nUse these references only when the user asks for the relevant detail, or when\nthe core workflow below needs deeper video summarization information:\n\n- **video summarization API details**: [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md) for\n  `\u002Fv1\u002Fsummarize`, `\u002Fsummarize`, `\u002Fv1\u002Fgenerate_captions`,\n  `\u002Fv1\u002Fstream_summarize`, health probes, `\u002Fmodels`, `\u002Frecommended_config`,\n  `\u002Fmetrics`, request fields, response shapes, and API gotchas.\n- **video summarization service configuration and ops**:\n  [`references\u002Fvideo-summarization-deployment.md`](references\u002Fvideo-summarization-deployment.md) for\n  the VSS `lvs` profile, ports, required env vars, logs, status, dry-runs,\n  teardown, model\u002Fbackend swaps, Elasticsearch\u002FNeo4j\u002FArangoDB backend\n  selection, and service-level troubleshooting.\n- **Extended video summarization ops references**:\n  [`references\u002Fvideo-summarization-environment-variables.md`](references\u002Fvideo-summarization-environment-variables.md),\n  [`references\u002Fvideo-summarization-debugging.md`](references\u002Fvideo-summarization-debugging.md), and\n  `assets\u002Fvideo-summarization.env.example`.\n\nLoad `video-summarization-api.md` only when you need a request field, response shape, or\nendpoint that is not already covered by the Step 2 LVS or fallback VLM\nexample below, or when handling a direct video summarization API\nrequest. Load `video-summarization-deployment.md` only for deployment,\nconfiguration, or service operations.\n\n## Video Summarization API And Service Ops Requests\n\nIf the user asks to call or debug video summarization endpoints directly, answer from\n[`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md) instead of running the\nend-to-end video summarization workflow. Examples: list video summarization models, check\nreadiness, get recommended chunking config, inspect metrics, explain a 422\nresponse, or build a `\u002Fv1\u002Fsummarize` request body.\n\nIf the user asks to configure, deploy, restart, tear down, or troubleshoot the\nvideo summarization service, prefer the `vss-deploy-profile` skill for full VSS profile\ndeployment and use [`references\u002Fvideo-summarization-deployment.md`](references\u002Fvideo-summarization-deployment.md)\nfor video summarization-specific service details.\n\n## Routing\n\nDecide purely from video summarization service availability (probed in\n*Setup → Availability checks* below). **Duration does not drive routing.**\n\n| `\u002Fv1\u002Fready` | Backend | Endpoint |\n|---|---|---|\n| HTTP 200 | LVS microservice with HITL | `POST ${LVS_BACKEND_URL}\u002Fv1\u002Fsummarize` |\n| Anything else | VLM \u002F RT-VLM with the default prompt + fallback note | `POST ${VLM_BASE_URL}\u002Fv1\u002Fchat\u002Fcompletions` |\n\nFallback message when the LVS service is unreachable — copy verbatim above the summary:\n\n> ⚠ **Note:** Input video `\u003Cname>` is `\u003CN>`s long.\n> The video summarization service is not deployed, so this summary was\n> produced by the VLM alone with a generic default prompt. Deploy the\n> `lvs` profile for higher-quality summaries with scenario\u002Fevents\n> targeting.\n\n## Deployment prerequisite\n\nThe VSS **lvs** profile on `$HOST_IP` is the primary backend. If the\n`\u002Fv1\u002Fready` probe (see *Setup → Availability checks*) returns anything\nother than 200 after the warmup retries, ask the user:\n\n> *\"The VSS `lvs` profile isn't running on `$HOST_IP`. Shall I deploy it now using the `\u002Fvss-deploy-profile` skill with `-p lvs`? Reply `no` to summarize with the VLM-only fallback instead (lower quality, no scenario\u002Fevents targeting).\"*\n\n- **Yes** → hand off to `\u002Fvss-deploy-profile`, then re-probe and continue with Step 2 (LVS + HITL).\n- **No** → go straight to **Step 2 fallback (VLM with default prompt)** and prepend the Routing fallback note. Do not ask again, and do not run scenario\u002Fevents HITL.\n- **Pre-authorized to deploy autonomously** (caller said so explicitly) → skip the confirmation and invoke `\u002Fvss-deploy-profile` directly.\n- **Pre-authorized to use VLM fallback** (\"skip lvs, just use the VLM\") → go straight to Step 2 fallback without prompting.\n\n---\n\n## Setup\n\n**Endpoints (defaults for a local VSS `lvs` deployment):**\n\n- VLM \u002F RT-VLM: `${VLM_BASE_URL}` — default `${RTVI_VLM_BASE_URL:-http:\u002F\u002F${HOST_IP:-localhost}:8018}`\n- LVS service: `${LVS_BACKEND_URL}` — default `http:\u002F\u002F${HOST_IP:-localhost}:38111`\n- VIOS: owned by `vss-manage-video-io-storage`; refer there.\n\nUse env vars when set (strip trailing `\u002Fv1` from the VLM base — the skill appends it). Otherwise use the defaults. If neither works, ask the user — do not scan ports or read config files to guess.\n\n**Model name:** read `${VLM_NAME}` (default\n`nim_nvidia_cosmos-reason2-8b_hf-1208`). It must match the id RT-VLM\n`\u002Fv1\u002Fmodels` advertises; do not substitute the friendly\n`nvidia\u002Fcosmos-reason2-8b`.\n\nFor endpoint schemas, optional fields, response envelopes, and error handling, see [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md).\n\n**Availability checks** (run both before routing).\n**Readiness is determined by the HTTP status code only** — the LVS\n`\u002Fv1\u002Fready` may legitimately return `200` with an empty body, so do not\ninspect the body.\n\n```bash\nVLM=\"${VLM_BASE_URL:-${RTVI_VLM_BASE_URL:-http:\u002F\u002F${HOST_IP:-localhost}:8018}}\"\nVLM=\"${VLM%\u002Fv1}\"\n\n# VLM \u002F RT-VLM: 200 on \u002Fv1\u002Fmodels\nvlm_code=$(curl -s -o \u002Fdev\u002Fnull -w '%{http_code}' --connect-timeout 3 --max-time 10 \\\n  \"$VLM\u002Fv1\u002Fmodels\")\n[ \"$vlm_code\" = \"200\" ] && echo \"VLM OK\" || echo \"VLM not reachable (HTTP $vlm_code)\"\n\n# Video summarization service: 200 on \u002Fv1\u002Fready, with retry on 503 (warmup) for up to ~30s\nVIDEO_SUMMARIZATION_URL=${LVS_BACKEND_URL:-http:\u002F\u002F${HOST_IP:-localhost}:38111}\nvideo_sum_code=000\nfor i in $(seq 1 10); do\n  video_sum_code=$(curl -s -o \u002Fdev\u002Fnull -w '%{http_code}' --connect-timeout 3 --max-time 10 \"$VIDEO_SUMMARIZATION_URL\u002Fv1\u002Fready\")\n  case \"$video_sum_code\" in\n    200) echo \"video summarization OK\"; break ;;\n    503) sleep 3 ;;                 # warming up; keep polling\n    *)   break ;;                   # any other code = not reachable, stop retrying\n  esac\ndone\n[ \"$video_sum_code\" = \"200\" ] || echo \"video summarization service not reachable (HTTP $video_sum_code)\"\n```\n\n**How to interpret the results:**\n\n- `video_sum_code = 200` → **Step 2 (LVS + HITL)** for every video.\n- `video_sum_code != 200`, `vlm_code = 200` → **Step 2 fallback (VLM)**; prepend the Routing fallback note.\n- `vlm_code != 200` → fail; at least one backend must be reachable.\n- A non-200 LVS code after the retry loop is the ONLY signal of unavailability. Empty stdout or missing JSON fields are NOT \"unavailable.\"\n\n---\n\n## Step 1 - Get the clip URL via `vss-manage-video-io-storage` (sub-task, NOT the final answer)\n\n**Use the `vss-manage-video-io-storage` skill for all VIOS interactions** — it\nowns the canonical curl recipes, parameter defaults, and delete\u002Fupload flows.\nDo not fabricate URLs or hand-roll VIOS calls; they will drift.\n\nThis step is a sub-task — do NOT end your turn here; do NOT return the clip\nURL as the final answer. From VIOS collect three values:\n\n1. **`streamId`** (via `sensor\u002Flist` → `sensor\u002F\u003Cid>\u002Fstreams`, or directly from an upload response).\n2. **Timeline** - `{startTime, endTime}` (ISO 8601 UTC). `endTime - startTime` is the duration; needed only for the user-facing header (routing is driven solely by `\u002Fv1\u002Fready`).\n3. **Temporary MP4 clip URL** — the `\u002Fstorage\u002Ffile\u002F\u003CstreamId>\u002Furl` variant with `container=mp4`. Response field: `.videoUrl`. Both backends need an HTTP(S) URL they can `GET`.\n\nEverything else (auth, upload, `disableAudio`, expiry, etc.) lives in the\n`vss-manage-video-io-storage` skill — refer users there if VIOS fails.\n\n---\n\n## Step 2 — Primary: video summarization microservice with HITL\n\nUse this path **whenever** `\u002Fv1\u002Fready` returned 200 in Setup. Duration is irrelevant.\n\nFor advanced fields (`media_info`, `schema`, structured output, stream captioning, metrics, recommended config) see [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md).\n\n### HITL: collect scenario and events first (REQUIRED — do not skip)\n\nFull walk-through is in [`references\u002Fhitl-prompts.md`](references\u002Fhitl-prompts.md). Always run HITL before calling the LVS service.\n\n**Autonomous-mode defaults.** When the caller has bypassed HITL (\"run\nautonomously without prompting\") AND the original query asks for\n`default`\u002F`defaults` (or gives none), use\n`scenario=\"activity monitoring\"` and `events=[\"notable activity\"]`\n**verbatim** — do not infer from filename or sensor name. Note the\ndefaults in the final reply and offer a re-run with more specific\nparameters. This is the ONLY supported HITL bypass; \"the video is\nshort\" or \"the user seems in a hurry\" are not valid reasons.\n\nPrefer `POST \u002Fv1\u002Fsummarize` (3.2 GA route); `\u002Fsummarize` is a compatibility alias.\n\n```bash\nVIDEO_SUMMARIZATION_URL=${LVS_BACKEND_URL:-http:\u002F\u002F${HOST_IP:-localhost}:38111}\n\n# From HITL reply:\nSCENARIO='warehouse monitoring'\nEVENTS_JSON='[\"notable activity\"]'\nOBJECTS_JSON=''  # '' to omit, else '[\"forklifts\",\"pallets\",\"workers\"]'\n\ncurl -s --max-time 300 -X POST \"$VIDEO_SUMMARIZATION_URL\u002Fv1\u002Fsummarize\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"$(jq -n --arg url \"\u003Cclip_url_from_vss_manage_video_io_storage>\" \\\n        --arg model \"${VLM_NAME:-nim_nvidia_cosmos-reason2-8b_hf-1208}\" \\\n        --arg scenario \"$SCENARIO\" \\\n        --argjson events \"$EVENTS_JSON\" \\\n        --argjson objects \"${OBJECTS_JSON:-null}\" '{\n    url: $url,\n    model: $model,\n    scenario: $scenario,\n    events: $events,\n    chunk_duration: 10,\n    num_frames_per_second_or_fixed_frames_chunk: 20,\n    use_fps_for_chunking: false,\n    seed: 1\n  } + (if $objects == null then {} else {objects_of_interest: $objects} end)')\" \\\n  | jq -r '.choices[0].message.content' \\\n  | jq '{video_summary, events}'\n```\n\nIf both `video_summary` and `events` are empty, the clip probably doesn't contain the requested events — re-run with broader `scenario`\u002F`events`, don't report \"no content\".\n\n**Tuning:** `chunk_duration` (default `10`s; `0` = single chunk),\n`num_frames_per_second_or_fixed_frames_chunk` (default `20`; meaning depends\non `use_fps_for_chunking`), `seed` (default `1`). `num_frames_per_chunk` is\ndeprecated.\n\n---\n\n## Step 2 fallback — VLM direct with default prompt\n\nUse this path **only** when `\u002Fv1\u002Fready` did not return 200 after warmup. Do NOT run HITL — the user did not opt in; you fell back because the service was missing. Prepend the Routing fallback note to the response.\n\n```bash\nVLM=\"${VLM_BASE_URL:-${RTVI_VLM_BASE_URL:-http:\u002F\u002F${HOST_IP:-localhost}:8018}}\"\nVLM=\"${VLM%\u002Fv1}\"\nPROMPT='Describe in detail what is happening in this video,\nincluding all visible people, vehicles, equipments, objects,\nactions, and environmental conditions.\nOUTPUT REQUIREMENTS:\n[timestamp-timestamp] Description of what is happening.\nEXAMPLE:\n[0.0s-4.0s] \u003Cdescription of the first event>\n[4.0s-12.0s] \u003Cdescription of the second event>'\n\ncurl -s --max-time 300 -X POST \"$VLM\u002Fv1\u002Fchat\u002Fcompletions\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d \"$(jq -n \\\n        --arg model \"${VLM_NAME:-nim_nvidia_cosmos-reason2-8b_hf-1208}\" \\\n        --arg text \"$PROMPT\" \\\n        --arg url \"\u003Cclip_url_from_vss_manage_video_io_storage>\" \\\n        '{\n          model: $model,\n          temperature: 0.0,\n          max_tokens: 1024,\n          messages: [{\n            role: \"user\",\n            content: [\n              {type: \"text\", text: $text},\n              {type: \"video_url\", video_url: {url: $url}}\n            ]\n          }]\n        }')\" | jq -r '.choices[0].message.content'\n```\n\n**Response:** standard OpenAI chat-completion envelope. The summary is in\n`choices[0].message.content`.\n\n**Cosmos-model notes:** Cosmos Reason 2 supports reasoning via\n`\u003Cthink>...\u003C\u002Fthink>\u003Canswer>...\u003C\u002Fanswer>` blocks. Omit the reasoning\ninstructions if you want a plain summary. Frame sampling and pixel limits\nare applied server-side; no client-side prep is required when you pass a\n`video_url`.\n\n---\n\n## End-to-end example\n\nSee [`references\u002Fend-to-end-example.md`](references\u002Fend-to-end-example.md) for\nthe full LVS-or-VLM-fallback script that probes `\u002Fv1\u002Fready` and runs the\nappropriate path.\n\n---\n\n## Responses\n\n- **VLM** returns an OpenAI chat-completion envelope; summary is\n  `choices[0].message.content`.\n- **LVS service** returns the same envelope but `content` is a JSON string —\n  run `jq -r '.choices[0].message.content' | jq` to reach `{video_summary, events}`.\n- **Errors** surface as HTTP non-2xx plus JSON `{error: ...}`. LVS `503` usually\n  means warmup — retry `\u002Fv1\u002Fready`.\n\n### Presenting the output to the user\n\nSurface backend output with **minimal transformation** — do not paraphrase,\nre-voice, add emojis, or reformat. **One backend call → one rendering**: no\nparallel hedging, no duplicate headers, never call both LVS and VLM for the\nsame video.\n\n**Header line.** Start with exactly one:\n\n```\nSummary of \u003Cvideo_name> (\u003Cduration>)\n```\n\n`\u003Cduration>` = `Ns` for `\u003C 60 s`, else `Mm Ss` (e.g. `3m 30s`).\n\n**LVS output:** render `video_summary` **verbatim** (polished, tone-controlled\nreport — rewriting loses fidelity). Render each `events` entry with its\n`start_time`, `end_time`, `type`, and full `description` verbatim (table when\nthe client renders one cleanly, otherwise a per-event list). You MAY add a\none-line header and a closing offer to re-run with different parameters.\n\n**VLM output:** render `choices[0].message.content` verbatim. If the model\nproduced `\u003Cthink>…\u003C\u002Fthink>\u003Canswer>…\u003C\u002Fanswer>` blocks, drop the `\u003Cthink>`\nblock and show the answer.\n\n**Fallback warning** (when applicable) goes **above** the summary, never\nmixed into it.\n\n## Tips\n\n- **Route by service availability, not by duration.** Probe `\u002Fv1\u002Fready` once\n  in Setup; HTTP 200 → LVS+HITL for every clip; anything else → VLM fallback.\n- **HITL is mandatory on the LVS path.** The `defaults` opt-in is the only\n  sanctioned bypass. The VLM fallback path is silent (no HITL).\n- **Readiness = HTTP 200 on `\u002Fv1\u002Fready`. Nothing else.** Body may be empty.\n  Always use `curl -s -o \u002Fdev\u002Fnull -w '%{http_code}'` — never pipe through\n  `jq`\u002F`grep`\u002F`head`.\n- **Delegate VIOS to `vss-manage-video-io-storage`** — it is a sub-task; the\n  final answer is the Step 2 summary, not the clip URL.\n- **`jq` twice for LVS output.** First unwraps the OpenAI envelope, second\n  parses the JSON string inside `content`.\n- **Prefer `\u002Fv1\u002Fsummarize` for 3.2 GA**; `\u002Fsummarize` is a compatibility alias.\n- **Use the exact VLM model id advertised by the endpoint** (default\n  `nim_nvidia_cosmos-reason2-8b_hf-1208`).\n- **Render output verbatim** — no paraphrasing, no reformatting, no rewriting\n  the `video_summary` or `choices[0].message.content`.\n- **One call, one render.** No parallel hedging, no double renderings.\n\n## Cross-reference\n\n- **vss-deploy-profile** — bring up the `base` (VLM only) or `lvs` (VLM + video summarization service) profile\n- **vss-manage-video-io-storage** (VIOS API) — upload videos, list streams, get clip URLs\n- **vss-search-archive** — semantic search across the archive (different profile)\n- **vss-query-analytics** — query incidents\u002Fevents from Elasticsearch\n- **video summarization API reference** — [`references\u002Fvideo-summarization-api.md`](references\u002Fvideo-summarization-api.md)\n- **video summarization service ops reference** — [`references\u002Fvideo-summarization-deployment.md`](references\u002Fvideo-summarization-deployment.md)\n\nbump:2\n",{"name":5,"license":15,"metadata":52,"description":7},{"tags":53,"author":54,"version":55,"github-url":56},"nvidia blueprint operational","NVIDIA Video Search and Summarization team","3.2.0","https:\u002F\u002Fgithub.com\u002FNVIDIA-AI-Blueprints\u002Fvideo-search-and-summarization","claude\u002Finstall-gsd-build-foQdV","d86cd127f527124b5fd0fd0bc679a4d79b7d01d7",".agents\u002Fskills\u002Fvss-summarize-video","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik","https:\u002F\u002Fnorvik-orpin.vercel.app","https:\u002F\u002Fgithub.com\u002Fpattanation","2026-07-17 11:17:04",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add pattanation\u002FNorvik --skill vss-summarize-video",{"tool":70,"command":71},"bunx","bunx skills add pattanation\u002FNorvik --skill vss-summarize-video",{"tool":73,"command":74},"pnpm","pnpm dlx skills add pattanation\u002FNorvik --skill vss-summarize-video","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002FSKILL.md",true,[78,84,90,94,98,102,106,110,114,118,122,126,130],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"assets\u002Fvideo-summarization.env.example","ASSET","资产文件",2925,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Fassets\u002Fvideo-summarization.env.example",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"BENCHMARK.md","REFERENCE","参考文档",3741,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002FBENCHMARK.md",{"path":91,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":92,"sourceHtmlUrl":93},"evals\u002Fevals.json",654,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Fevals\u002Fevals.json",{"path":95,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":96,"sourceHtmlUrl":97},"evals\u002Flvs_api_ops.json",4082,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Fevals\u002Flvs_api_ops.json",{"path":99,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":100,"sourceHtmlUrl":101},"evals\u002Flvs_profile_summarize.json",4140,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Fevals\u002Flvs_profile_summarize.json",{"path":103,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":104,"sourceHtmlUrl":105},"references\u002Fend-to-end-example.md",3394,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Freferences\u002Fend-to-end-example.md",{"path":107,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":108,"sourceHtmlUrl":109},"references\u002Fhitl-prompts.md",4202,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Freferences\u002Fhitl-prompts.md",{"path":111,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":112,"sourceHtmlUrl":113},"references\u002Fvideo-summarization-api.md",7573,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Freferences\u002Fvideo-summarization-api.md",{"path":115,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":116,"sourceHtmlUrl":117},"references\u002Fvideo-summarization-debugging.md",3461,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Freferences\u002Fvideo-summarization-debugging.md",{"path":119,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":120,"sourceHtmlUrl":121},"references\u002Fvideo-summarization-deployment.md",11565,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Freferences\u002Fvideo-summarization-deployment.md",{"path":123,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":124,"sourceHtmlUrl":125},"references\u002Fvideo-summarization-environment-variables.md",9111,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Freferences\u002Fvideo-summarization-environment-variables.md",{"path":127,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":128,"sourceHtmlUrl":129},"skill-card.md",4390,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Fskill-card.md",{"path":131,"resourceType":132,"resourceTypeDesc":133,"sizeBytes":134,"sourceHtmlUrl":135},"skill.oms.sig","OTHER","其他",6869,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvss-summarize-video\u002Fskill.oms.sig",[137,166,191,214,236,251],{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":141,"sourceHtmlUrl":142,"categories":143,"keywords":150,"publishedAt":47},"01M71QDV4DM8T19HEHWATEF1K4","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FSKILL.md",[144,147],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":148,"categoryName":149,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[151,152,153,37,154,155,156,157,158,159,160,35,161,162,163,164,165],"webapp","testing","webapp testing","applications","local","frontend","debugging","toolkit","logs","browser","playwright","web","behavior","ui","screenshots",{"skillNo":167,"name":168,"nameZh":6,"description":169,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":170,"sourceHtmlUrl":171,"categories":172,"keywords":174,"publishedAt":47},"01M71QDH2GGMXGA9105C9W1N7B","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fweb-artifacts-builder\u002FSKILL.md",[173],{"categoryNo":148,"categoryName":149,"taxonomyType":21,"taxonomyTypeDesc":22},[175,176,177,162,178,179,180,37,181,182,156,183,36,184,185,186,187,188,189,190],"builder","artifacts builder","artifacts","web artifacts builder","single-file","css","Tailwind","ui components","single","file","components","react","multi","state","routing","state management",{"skillNo":192,"name":193,"nameZh":6,"description":194,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":196,"sourceHtmlUrl":197,"categories":198,"keywords":200,"publishedAt":47},"01M71QD9T2XC3EWMQNN9ACNWQ1","vueuse-functions","Apply VueUse composables where appropriate to build concise, maintainable Vue.js \u002F Nuxt features.","MIT","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvueuse-functions\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvueuse-functions\u002FSKILL.md",[199],{"categoryNo":148,"categoryName":149,"taxonomyType":21,"taxonomyTypeDesc":22},[201,202,203,204,205,206,34,207,208,209,210,211,212,213],"functions","vueuse","vueuse functions","project","nuxt","apply","concise","build","https","features","vue","js","composables",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":218,"sourceHtmlUrl":219,"categories":220,"keywords":223,"publishedAt":47},"01M71QD51HWSGYMCMB7RW7PGK8","vue-testing-best-practices","Use for Vue.js testing. Covers Vitest, Vue Test Utils, component testing, mocking, testing patterns, and Playwright for E2E testing.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-testing-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-testing-best-practices\u002FSKILL.md",[221,222],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":148,"categoryName":149,"taxonomyType":21,"taxonomyTypeDesc":22},[224,152,225,211,226,161,227,228,229,34,230,37,231,232,233,36,234,212,235],"vue testing best practices","testing best practices","best practices","test","testing patterns","component","vitest","mocking","e2e","utils","patterns","e2e testing",{"skillNo":237,"name":238,"nameZh":6,"description":239,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":240,"sourceHtmlUrl":241,"categories":242,"keywords":244,"publishedAt":47},"01M71QD358H2DJ9THJRBP77T3T","vue-router-best-practices","Vue Router 4 patterns, navigation guards, route params, and route-component lifecycle interactions.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-router-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-router-best-practices\u002FSKILL.md",[243],{"categoryNo":148,"categoryName":149,"taxonomyType":21,"taxonomyTypeDesc":22},[245,211,246,226,247,229,248,34,234,249,250],"router","vue router best practices","route","guards","navigation","lifecycle",{"skillNo":252,"name":253,"nameZh":6,"description":254,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":195,"licenseFileUrl":255,"sourceHtmlUrl":256,"categories":257,"keywords":259,"publishedAt":47},"01M71QCYPNWDE2MQZ1TF3ED5S4","vue-best-practices","MUST be used for Vue.js tasks. Strongly recommends Composition API with `\u003Cscript setup>` and TypeScript as the standard approach. Covers Vue 3, SSR, Volar, vue-tsc. Load for any Vue, .vue files, Vue Router, Pinia, or Vite with Vue work. ALWAYS use Composition API unless the project explicitly requires Options API.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-best-practices\u002FSKILL.md",[258],{"categoryNo":148,"categoryName":149,"taxonomyType":21,"taxonomyTypeDesc":22},[260,211,226,261,204,262,263,264,245,265,266,267,268,269,270,37,271,36,272,273],"vue best practices","Composition","files","tasks","api","pinia","work","options","ssr","typescript","as","vite","load","standard"]