{
  "markdown": "<!-- mcp-name: io.github.oxbshw/watch-skill -->\n<div align=\"center\">\n\n<img src=\"docs/assets/watch-skill-hero.webp\" alt=\"Watch Skill: watch a video, remember the evidence with timestamps, and verify an agent's work through THE LOOP\" width=\"88%\">\n\n# Watch Skill\n\n**Give every AI agent eyes for video — and a way to check its own work.**\n\n[![CI](https://github.com/oxbshw/watch-skill/actions/workflows/ci.yml/badge.svg)](https://github.com/oxbshw/watch-skill/actions/workflows/ci.yml)\n[![Install](https://github.com/oxbshw/watch-skill/actions/workflows/install.yml/badge.svg)](https://github.com/oxbshw/watch-skill/actions/workflows/install.yml)\n[![PyPI](https://img.shields.io/pypi/v/watch-skill)](https://pypi.org/project/watch-skill/)\n[![Downloads](https://img.shields.io/pypi/dm/watch-skill)](https://pypi.org/project/watch-skill/)\n[![Agent Skills](https://www.skills.sh/b/oxbshw/watch-skill)](https://www.skills.sh/oxbshw/watch-skill)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776AB)](pyproject.toml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n[Install](#install) · [Documentation](docs/README.md) · [Examples](examples/README.md) · [Comparison](docs/comparison.md) · [Roadmap](docs/ROADMAP.md)\n\n</div>\n\nWatch Skill turns videos, live streams, meetings, and screen recordings into a searchable,\ntimestamped index. An agent can ask what happened, get an answer that cites the exact\nmoment behind it, and ask again tomorrow without processing the video a second time.\n\nWhen the video is the agent's *own* browser or desktop session, **THE LOOP** closes the\ncircle: record the work, critique it against plain-language criteria, and show before and\nafter. That critique is *advisory* — a model describing pictures. To decide whether the\nwork actually succeeded, attach a **verification contract**: deterministic checks, frozen\nbefore the run, that hold the verdict.\n\n```bash\nuvx --from \"watch-skill[standard]\" watch-skill setup\n```\n\n<p align=\"center\">\n  <img src=\"docs/assets/loop_before_after.gif\" alt=\"A checkout flow fails with a NaN total, is fixed, and passes verification\" width=\"720\">\n  <br>\n  <sub>THE LOOP catching a <code>$NaN</code> total that an end-state screenshot misses, then showing the fix.</sub>\n</p>\n\n## What it does\n\n| | |\n|---|---|\n| **Watch** | Scene-aware frames, on-screen text, and local-first transcription from 1,800+ sites, live HLS/DASH streams, local media, meetings, browsers, windows, and desktops. |\n| **Watch live** | A session that reports what changed **while the source is still playing** — bounded queues, counted drops, cursor-addressed events, and a rolling buffer that pins the evidence around each one. [Guide](docs/live.md) |\n| **Remember** | A persistent, searchable index with timestamp citations, hybrid retrieval, cross-video synthesis, and reusable lessons. |\n| **Verify** | A capture → critique → fix → re-capture loop for browser flows, interfaces, generated video, gameplay, and monitored streams — with deterministic contracts deciding pass or fail. |\n| **Operate** | Drive a browser and prove the effect of each action — deterministic target resolution, per-step receipts, and verdicts that reject a page reporting success over a failed request. [Guide](docs/browser-runtime.md) |\n\nAvailable as Claude Code skills, 39 MCP tools, a CLI, a REST API, and native adapters for\nLangChain/LangGraph, CrewAI, the OpenAI Agents SDK, LlamaIndex, and AutoGen.\n\nFour things it will not do, because each one is a way of being confidently wrong:\n\n- **Answer from a video that changed.** Identity follows the bytes, not the path. Overwrite\n  `demo.mp4` and the next question returns `stale`, not yesterday's frames.\n- **Upload a frame you did not agree to send.** A configured API key is not consent.\n  `watch-skill plan` prints every network action before a run makes one.\n- **Call an absent judgement a pass.** No frames, no OCR, an unreachable model, a timed-out\n  check — all `inconclusive`. Only a required deterministic check produces a `pass`.\n- **Claim a capability it has not checked.** `watch-skill capture-capabilities` says what this\n  machine can actually record, and whether each answer was machine-tested or merely probed.\n\n## Install\n\nTwo pieces, and you want both. The **engine** does the work; the **skills** teach your\nagent when to reach for it.\n\n```bash\n# 1. the engine — installs, wires up every AI agent on the machine, backs up each config\nuvx --from \"watch-skill[standard]\" watch-skill setup\n\n# 2. the skills — into Claude Code, Codex, Cursor, Copilot, Gemini CLI, and 20+ more\nnpx skills add oxbshw/watch-skill -g\n```\n\nWatch Skill ships on PyPI, not npm. The second command runs\n[Vercel's `skills` CLI](https://www.skills.sh), which reads the ten `SKILL.md`\nfiles out of this repository and installs them into whichever agents you have —\nthere is no `watch-skill` npm package to install, and the engine is Python\neither way.\n\nNeither needs a clone, and the engine command works the same on macOS, Linux, and\nWindows — [CI runs it on all three](https://github.com/oxbshw/watch-skill/actions/workflows/install.yml)\non every push.\n\nPrefer a permanent install to `uvx` fetching on demand?\n\n```bash\npipx install \"watch-skill[standard]\"     # or: pip install \"watch-skill[standard]\"\nwatch-skill setup\n```\n\n<details>\n<summary>Other ways in — Claude Code plugin, Docker, from source</summary>\n\n**Claude Code plugin** — skills, slash commands, and the MCP server in one:\n\n```text\n/plugin marketplace add oxbshw/watch-skill\n/plugin install watch-skill@watch-skill\n/watch-skill:setup-watch-skill\n```\n\n**Docker** — nothing on the host; the volume is where the index lives, so do not skip it:\n\n```bash\ndocker run --rm -i -v watch-skill-data:/data ghcr.io/oxbshw/watch-skill serve\n```\n\nBuilt for `linux/amd64` and `linux/arm64`, with an SBOM and a signed build attestation.\n\n**From source** (installs uv and Python if either is missing):\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/oxbshw/watch-skill/main/scripts/install.sh | sh\n```\n\n```powershell\npowershell -ExecutionPolicy Bypass -c \"irm https://raw.githubusercontent.com/oxbshw/watch-skill/main/scripts/install.ps1 | iex\"\n```\n\n**Wiring an agent by hand** — the block most MCP clients take:\n\n```json\n{ \"mcpServers\": { \"watch-skill\": {\n    \"command\": \"uvx\",\n    \"args\": [\"--from\", \"watch-skill[standard]\", \"watch-skill\", \"serve\"] } } }\n```\n\nZed, Amp, and a few others name that key differently; each\n[agent guide](docs/agents/README.md) shows the exact shape.\n\n</details>\n\n`standard` is frames, retrieval, and MCP — about 200 MB. `watch-skill[all]` adds OCR,\nlocal Whisper, REST, and the browser THE LOOP drives. `watch-skill doctor` names anything\nmissing and prints the one command that installs it, so starting small is safe.\n\nComing from [claude-video](https://github.com/bradautomates/claude-video)? Your `/watch`\ncommands and flags work unchanged — see the [migration guide](docs/migrate-from-claude-video.md).\n\n## First run\n\n```bash\nwatch-skill watch \"https://youtu.be/...\" \"Summarize the important moments.\"\n```\n\nThat prints a report and an id. Everything after it is a lookup against the index, not a\nsecond download:\n\n```bash\nwatch-skill ask <video_id> \"when does the demo first fail?\"\nwatch-skill search \"pricing decision\"        # across every video you've watched\nwatch-skill library ask \"what did the team decide about auth?\"\n```\n\nUseful flags on `watch`:\n\n| Flag | Use it when |\n|---|---|\n| `--detail transcript` | You want the words, not the pictures — much faster |\n| `--detail balanced` \\| `token-burner` | More frames, more cost |\n| `--start 4:10 --end 6:00` | Only a slice of a long video matters |\n| `--word-timestamps` | You need the exact word, not the ten-second segment it sat in |\n| `--no-cache` | Re-fetch a source that changed |\n\nAnd the rest of the surface:\n\n```bash\nwatch-skill serve                            # MCP over stdio — what agents connect to\nwatch-skill api                              # REST, port 8748\nwatch-skill doctor                           # check and repair the setup\nwatch-skill viewer <video_id> --out r.html   # one self-contained page to share\nwatch-skill loop viewer <loop_id>            # a run's iterations, compared\nwatch-skill bench providers                  # compare every provider you have a key for\n```\n\nTranscription, OCR, and search run locally and need no API key. Visual question\nanswering uses whichever provider you already pay for — Anthropic, OpenAI, Gemini,\nOpenRouter, Groq, Together, Fireworks, DeepSeek, xAI, Mistral, MiniMax, Moonshot,\nZ.ai, or Qwen — or nothing at all with a local Ollama model. Anything else that\nspeaks the OpenAI format (vLLM, LM Studio, llama.cpp, LiteLLM, Azure OpenAI, a\ncompany gateway) works through the `custom` provider:\n\n```bash\nwatch-skill setup-vision --provider groq            # or any of the above\nwatch-skill setup-vision --provider custom \\\n  --base-url http://127.0.0.1:8000/v1               # your own server\n```\n\nSee [Getting started](docs/getting-started.md) for manual installation and\n[Configuration](docs/configuration.md) for provider and privacy settings.\n\n## Why use it\n\n- **Evidence instead of frame dumps.** Scene detection and perceptual deduplication spend\n  the frame budget on distinct moments. Answers include timestamps, confidence, and the\n  evidence used to support them.\n- **Persistent video memory.** Analyze once, ask again without downloading or transcribing\n  the same video. Hybrid full-text and vector retrieval works within one video or across\n  the entire library.\n- **Local-first processing.** Original-language captions are preferred, local Whisper is\n  the default fallback, and cloud speech-to-text is opt-in. An Ollama configuration keeps\n  the complete pipeline on the machine.\n- **Flow verification.** THE LOOP records an agent's browser, screen, or window and checks\n  the result against plain-language criteria, producing a before/after comparison. The\n  model's read of that recording is advisory; a [verification\n  contract](docs/verification.md) turns it into a decision, and its evidence bundle is\n  hash-bound so an edited result stops verifying.\n- **Corrections that persist.** `report_mistake` stores a local lesson, applies it to related\n  questions, and turns it into a replayable evaluation.\n- **Measured cost controls.** Text-first answers, semantic caching, configurable token\n  budgets, and explicit `cheapest`, `quality_first`, and `offline_only` policies keep the\n  trade-offs visible.\n- **Multilingual retrieval.** Script-aware OCR routing, Arabic normalization, CJK substring\n  matching, and multilingual embeddings support questions across languages.\n\nSixteen providers is a menu, not an answer, so there is a benchmark that\nsettles it on your own keys: `watch-skill bench providers` reads the same\ncommitted frames with every provider you have configured and prints char-hit\nrate, latency, and cost from each one's *reported* tokens — see\n[method and results](benchmarks/providers/README.md).\n\nThe repository includes reproducible [cost](benchmarks/cost/RESULTS.md) and\n[perception](benchmarks/perception/RESULTS.md) benchmarks. Product claims in this README\nlink to the relevant implementation notes or testable example rather than relying on\nunqualified marketing numbers.\n\n## Works with your agent\n\nThe setup command detects supported clients and updates their configuration with a backup.\nManual guides are available for every entry below.\n\n| | | | |\n|:---:|:---:|:---:|:---:|\n| [<img src=\"docs/assets/agents/claude-code.webp\" width=\"150\" alt=\"Claude Code avatar\">](docs/agents/claude-code.md)<br>[Claude Code](docs/agents/claude-code.md) | [<img src=\"docs/assets/agents/claude-desktop.webp\" width=\"150\" alt=\"Claude Desktop avatar\">](docs/agents/claude-desktop.md)<br>[Claude Desktop](docs/agents/claude-desktop.md) | [<img src=\"docs/assets/agents/cursor.webp\" width=\"150\" alt=\"Cursor avatar\">](docs/agents/cursor.md)<br>[Cursor](docs/agents/cursor.md) | [<img src=\"docs/assets/agents/codex-cli.webp\" width=\"150\" alt=\"Codex CLI avatar\">](docs/agents/codex-cli.md)<br>[Codex CLI](docs/agents/codex-cli.md) |\n| [<img src=\"docs/assets/agents/cline.webp\" width=\"150\" alt=\"Cline avatar\">](docs/agents/cline.md)<br>[Cline](docs/agents/cline.md) | [<img src=\"docs/assets/agents/windsurf.webp\" width=\"150\" alt=\"Windsurf avatar\">](docs/agents/windsurf.md)<br>[Windsurf](docs/agents/windsurf.md) | [<img src=\"docs/assets/agents/gemini-cli.webp\" width=\"150\" alt=\"Gemini CLI avatar\">](docs/agents/gemini-cli.md)<br>[Gemini CLI](docs/agents/gemini-cli.md) | [<img src=\"docs/assets/agents/vscode.webp\" width=\"150\" alt=\"VS Code avatar\">](docs/agents/vscode.md)<br>[VS Code](docs/agents/vscode.md) |\n| [<img src=\"docs/assets/agents/github-copilot-cli.webp\" width=\"150\" alt=\"GitHub Copilot CLI avatar\">](docs/agents/github-copilot-cli.md)<br>[GitHub Copilot CLI](docs/agents/github-copilot-cli.md) | [<img src=\"docs/assets/agents/kimi-code.webp\" width=\"150\" alt=\"Kimi Code avatar\">](docs/agents/kimi-code.md)<br>[Kimi Code](docs/agents/kimi-code.md) | [<img src=\"docs/assets/agents/qwen-code.webp\" width=\"150\" alt=\"Qwen Code avatar\">](docs/agents/qwen-code.md)<br>[Qwen Code](docs/agents/qwen-code.md) | [<img src=\"docs/assets/agents/opencode.webp\" width=\"150\" alt=\"OpenCode avatar\">](docs/agents/opencode.md)<br>[OpenCode](docs/agents/opencode.md) |\n| [<img src=\"docs/assets/agents/goose.webp\" width=\"150\" alt=\"Goose avatar\">](docs/agents/goose.md)<br>[Goose](docs/agents/goose.md) | [<img src=\"docs/assets/agents/openhands.webp\" width=\"150\" alt=\"OpenHands avatar\">](docs/agents/openhands.md)<br>[OpenHands](docs/agents/openhands.md) | [<img src=\"docs/assets/agents/kilocode.webp\" width=\"150\" alt=\"Kilo Code avatar\">](docs/agents/kilocode.md)<br>[Kilo Code](docs/agents/kilocode.md) | [<img src=\"docs/assets/agents/qodo.webp\" width=\"150\" alt=\"Qodo avatar\">](docs/agents/qodo.md)<br>[Qodo](docs/agents/qodo.md) |\n| [<img src=\"docs/assets/agents/agent-zero.webp\" width=\"150\" alt=\"Agent Zero avatar\">](docs/agents/agent-zero.md)<br>[Agent Zero](docs/agents/agent-zero.md) | [<img src=\"docs/assets/agents/openclaw.webp\" width=\"150\" alt=\"OpenClaw avatar\">](docs/agents/openclaw.md)<br>[OpenClaw](docs/agents/openclaw.md) | [<img src=\"docs/assets/agents/pi.webp\" width=\"150\" alt=\"Pi avatar\">](docs/agents/pi.md)<br>[Pi](docs/agents/pi.md) | [<img src=\"docs/assets/agents/hermes.webp\" width=\"150\" alt=\"Hermes avatar\">](docs/agents/hermes.md)<br>[Hermes](docs/agents/hermes.md) |\n| [<img src=\"docs/assets/agents/zed.webp\" width=\"150\" alt=\"Zed avatar\">](docs/agents/zed.md)<br>[Zed](docs/agents/zed.md) | [<img src=\"docs/assets/agents/roo-code.webp\" width=\"150\" alt=\"Roo Code avatar\">](docs/agents/roo-code.md)<br>[Roo Code](docs/agents/roo-code.md) | [<img src=\"docs/assets/agents/continue.webp\" width=\"150\" alt=\"Continue avatar\">](docs/agents/continue.md)<br>[Continue](docs/agents/continue.md) | [<img src=\"docs/assets/agents/jetbrains.webp\" width=\"150\" alt=\"JetBrains IDEs avatar\">](docs/agents/jetbrains.md)<br>[JetBrains](docs/agents/jetbrains.md) |\n| [<img src=\"docs/assets/agents/amp.webp\" width=\"150\" alt=\"Amp avatar\">](docs/agents/amp.md)<br>[Amp](docs/agents/amp.md) | [<img src=\"docs/assets/agents/aider.webp\" width=\"150\" alt=\"Aider avatar\">](docs/agents/aider.md)<br>[Aider](docs/agents/aider.md) | | |\n\n[<img src=\"docs/assets/agents/frameworks.webp\" width=\"360\" alt=\"Framework agent avatars collaborating around a shared video engine\">](docs/agents/frameworks.md)\n\nNative tools are also available for [LangChain/LangGraph, CrewAI, OpenAI Agents SDK,\nLlamaIndex, and AutoGen](docs/agents/frameworks.md); any other framework can use REST or\nMCP.\n\n### Why both skills and MCP\n\nMCP gives an agent 39 tools. Skills give it the judgement about when to use them —\nthat a screen recording in the conversation is worth watching, that a follow-up\nquestion should hit the index instead of re-processing, that a UI change deserves a\nverification pass. An agent with only the tools waits to be told; an agent with the\nskills reaches for them.\n\nThat is why `npx skills add oxbshw/watch-skill -g` is step two of the install and not\nan optional extra. Pick individual ones with `--skill <name>`, or list them first:\n\n```bash\nnpx skills add oxbshw/watch-skill --list\n```\n\n| Connection | How it reaches the agent |\n|---|---|\n| **Skills** | Every agent the [skills CLI](https://skills.sh) supports — Claude Code, Codex CLI, Cursor, GitHub Copilot, Gemini CLI, VS Code, and the rest — plus [OpenClaw](docs/agents/openclaw.md), [Pi](docs/agents/pi.md), and [Hermes-style agents](docs/agents/hermes.md) |\n| **MCP** | [Claude Desktop](docs/agents/claude-desktop.md), [Cursor](docs/agents/cursor.md), [Codex CLI](docs/agents/codex-cli.md), [Cline](docs/agents/cline.md), [Windsurf](docs/agents/windsurf.md), [Gemini CLI](docs/agents/gemini-cli.md), [VS Code](docs/agents/vscode.md), [GitHub Copilot CLI](docs/agents/github-copilot-cli.md), [Zed](docs/agents/zed.md), [Roo Code](docs/agents/roo-code.md), [Continue](docs/agents/continue.md), [Kimi Code](docs/agents/kimi-code.md), [Qwen Code](docs/agents/qwen-code.md), [OpenCode](docs/agents/opencode.md), [Goose](docs/agents/goose.md), [OpenHands](docs/agents/openhands.md), [Kilo Code](docs/agents/kilocode.md), [Qodo](docs/agents/qodo.md), [Agent Zero](docs/agents/agent-zero.md) |\n| **Native Python tools** | [LangChain/LangGraph, CrewAI, OpenAI Agents SDK, LlamaIndex, and AutoGen](docs/agents/frameworks.md) |\n| **HTTP** | Vercel AI SDK, n8n, and any client that can call REST/OpenAPI |\n\nThe [full compatibility matrix](docs/agents/README.md) separates machine-tested,\nmachine-configured, and documentation-verified integrations. If your agent is missing,\nthe [adapter template](templates/agent-adapter/README.md) provides a short contribution\npath.\n\n## Browser Runtime\n\nWatch Skill has one browser subsystem with two modes. *Observer* mode watches\nsomeone else work and verifies the result. *Operator* mode does the work and\nholds itself to the same standard.\n\n```python\nfrom watch_skill.operate import (\n    Action, ActionKind, BrowserRuntime, Expectation, SideEffect, Target,\n)\n\nruntime = BrowserRuntime(source)          # an already-running browser session\nresult = runtime.run_task(\"save the display name\", [\n    Action(kind=ActionKind.CLICK, intent=\"save\",\n           target=Target(role=\"button\", name=\"Save\"),\n           side_effect=SideEffect.REVERSIBLE,\n           expect=Expectation(text_present=\"Saved\", network_ok=True)),\n])\n\nresult.verified          # False — the page said Saved, PATCH /api/save returned 500\nresult.receipts[-1].reason\n```\n\nThe rule the runtime is built around: **dispatching an action is not the same\nas proving its effect.** Playwright returning from `click()` proves a click was\ndelivered and nothing more, so every action carries an expectation written down\nbeforehand, and the verdict is the comparison. An action with no expectation is\n`UNVERIFIED`, never `SUCCEEDED`.\n\nThat is what catches the failure mode nothing else does — a page that renders\nsuccess over a request that failed. `network_ok` correlates the requests made\nduring the step, so \"Saved\" over a 500 is a failure with the request named in\nthe receipt.\n\nOther properties worth knowing:\n\n- **Targets resolve deterministically first** — accessible role and name, then\n  label, test id, placeholder, selector, text. Vision is last because it is the\n  most expensive signal and the least stable across a redeploy.\n- **Ambiguity is refused, not guessed.** Two buttons named \"Delete account\" is\n  not a case where the first one is probably right.\n- **Retries respect side effects.** Clicking \"Next\" again is fine; clicking\n  \"Buy\" again is not. Recovery never repeats an action that may have taken.\n- **Every step produces a receipt** — how the target was found and with what\n  confidence, what changed, which requests ran, the verdict, and any recovery.\n\nRun the benchmark against the bundled local fixture site:\n\n```bash\npython -m watch_skill.operate.benchmark --out build/benchmark\n```\n\nIt scores **false-success rate** — tasks where the runtime claimed the goal was\nmet and the server disagrees — because task success rate on its own counts a\nconfident wrong answer as a win. Ground truth comes from the fixture server's\nown state, not from anything the browser reported.\n\nOn that nine-task fixture benchmark every ground-truth verdict was classified\ncorrectly and no false-success verdict was produced. Nine tasks on one\nsynthetic site is a regression gate rather than a capability claim: it does not\ncover real websites, authentication, or shadow DOM, and no other tool was\nmeasured under the same method. [Full method and results](docs/release-proof.md)\nand the [design](docs/browser-runtime.md).\n\n## Common workflows\n\n### Build a searchable video library\n\n```bash\nwatch-skill batch ./recordings --limit 50\nwatch-skill library overview\nwatch-skill library ask \"What did the team decide about authentication?\"\n```\n\n`library ask` synthesizes evidence across videos and retains per-video timestamp\nprovenance. The [library example](examples/12-library-memory/) demonstrates a question\nwhose answer is distributed across four clips.\n\n### Verify an agent's browser work\n\n```bash\nwatch-skill loop start \"browser:http://127.0.0.1:3000\" \\\n  \"Checkout completes and the total is always a valid currency amount\"\n```\n\nThe loop captures the full interaction, critiques failures, and records the before/after\ncomparison once the agent applies a fix — the run shown at the top of this page.\n[Example 14](examples/14-browser-verification/) walks through that transient `$NaN` bug.\n\nThe critique is one model's reading of the recording. To make success a decision rather\nthan an opinion, attach deterministic checks:\n\n```bash\nwatch-skill verify run checkout-contract.json --dir .\n```\n\n`pass` requires every **required** check to pass. A check that fails, times out, or never\nruns makes the run `inconclusive` — never a pass. See\n[Verification](docs/verification.md).\n\n### Write up a video, with every line cited\n\n```bash\nwatch-skill notes <video_id> --write notes.md\n```\n\nChapters, what was said, what was on screen, and the frames to prove it —\nassembled from the index rather than generated, so every statement carries the\ntimestamp it came from and can be checked against that second in the source.\nNo model runs in the path, so the same index always produces the same document.\n\n### Export an offline report\n\n```bash\nwatch-skill viewer <video_id> --out video-report.html\n```\n\nThe generated page contains its frames, transcript, OCR, cached answers, and cited\nevidence. It has no external runtime dependencies and can be opened without a server.\n\n## Benchmarks\n\nMeasured on stated hardware, or not stated at all. Every result is generated by a\ncommand anyone can rerun, from fixtures whose ground truth is committed beside them.\n\n| Benchmark | Question it answers |\n|---|---|\n| [Perception](benchmarks/perception/) | Which OCR backend reads which script, at what cost in latency and memory |\n| [Vision providers](benchmarks/providers/) | Which of sixteen providers to point this at, on your own keys |\n| [Cost](benchmarks/cost/) | What a watch and an ask actually spend |\n| [Video backends](benchmarks/video_backends/) | Whether an external provider's output can be ingested as durable evidence |\n\nThe video-backend benchmark is the newest and the strictest. It grades a provider on\nwhether Watch Skill could store what it returns as a citation: are the frames the ones\nthat were asked for, do the timestamps mean what they appear to mean, does a transcript\nland where the speech is, and does a written analysis say anything traceable to the\nsource.\n\nIt runs against two kinds of input. A **generated fixture** carries ground truth exact\nto the millisecond — hard cuts on frame boundaries, a 25-frame ladder where every frame\nhas its own identity, speech placed at offsets the generator chose. **Real footage**\nhas no authored truth, so the benchmark derives it from the file: decode the window\naround each probe and locate the returned frame inside it.\n\nThe first subject is [Adversal MCP 0.1.4](benchmarks/video_backends/adversal/), tested\nat the vendor's request days after release. It is a preview of an early version, and it\nis written as one — including the parts that did not work, and the axes where the two\nsystems came out exactly equal because both call the same underlying tool.\n\n<p align=\"center\">\n  <img src=\"benchmarks/video_backends/adversal/comparison.svg\" alt=\"Seven axes measured on the same files with the same scorer: written-analysis groundedness 89.7% vs 27.9%, citations per 100 words 13.23 vs 0.12, frame delivery on real footage 96.9% vs 31.2%, transcript text accuracy 100% vs 100%, transcript interval alignment 0.747 vs 0.525 IoU, cue starts within half a second 100% vs 25%, and frame identity at a requested time 100% vs 100%\" width=\"100%\">\n</p>\n\nThe chart is drawn from the run's own raw JSON every time the report is generated, so\nit cannot drift from the numbers beside it. Two of the seven axes are exact ties, and\nthey are labelled as such: both systems transcribed the fixture's script without a\nsingle word error, and both return the same frame for a requested time because both\nshell out to the same `ffmpeg` seek. The gap on the remaining axes is largely one\nreproducible bug, which the report documents with a reproduction rather than a verdict.\n\n## Examples\n\nThe examples progress from a first watch to agent integration, cross-video memory, and\nself-verification.\n\n| Track | Examples |\n|---|---|\n| Learn the core | [01 Watch and ask](examples/01-watch-and-ask), [02 Focused moment](examples/02-focused-moment), [03 Cross-video search](examples/03-cross-video-search) |\n| Build with agents | [06 MCP and REST](examples/06-agent-integration), [09 Framework adapters](examples/09-framework-adapters), [15 Private offline workflow](examples/15-private-offline-workflow) |\n| Understand and organize | [05 Multilingual Arabic](examples/05-multilingual-arabic), [10 Structured extraction](examples/10-structured-extraction), [11 Batch mode](examples/11-batch-mode), [12 Library memory](examples/12-library-memory) |\n| Verify and improve | [04 UI loop](examples/04-ui-loop), [07 Lessons and stats](examples/07-lessons-and-stats), [08 Loop types](examples/08-loop-types), [13 Self-improvement](examples/13-self-improvement), [14 Browser verification](examples/14-browser-verification), [17 Freshness and offline](examples/17-freshness-and-offline), [20 Observer loop](examples/20-observer-loop) |\n| Watch live | [18 Live watch](examples/18-live-watch), [19 Live browser](examples/19-live-browser) |\n| Share results | [16 Export a self-contained viewer](examples/16-shareable-viewer) |\n\nSee the [example catalog](examples/README.md) for prerequisites, expected output, and a\nrecommended path through all 20 examples.\n\n## Architecture\n\nAll interfaces call the same Python core. Skills and agent adapters decide *when* to use\nWatch Skill; acquisition, perception, transcription, indexing, answering, and verification\nremain in `src/watch_skill`.\n\n```mermaid\nflowchart LR\n    A[\"Agents and frameworks\"] --> S[\"Skills · MCP · CLI · REST\"]\n    S --> AC[\"Acquire\"]\n    AC --> P[\"Scenes · OCR · transcript\"]\n    P --> I[(\"Persistent index\")]\n    I --> Q[\"Answers · extraction · library\"]\n    I --> L[\"Lessons and evaluations\"]\n    V[\"Browser · screen · stream capture\"] --> C[\"Loop critic\"]\n    C --> I\n```\n\nRead [Architecture](docs/architecture.md) for the data model, provider boundaries, and\nextension points.\n\n### The Workspace\n\nThis repository holds both halves of the product. The Python engine above is\nthe root; `workspace/` is the agent workspace built on\n[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) — the Watch\nDSH plugins, the Memory service, and the Web and Desktop applications.\n\nThe two are independent to install. `pip install watch-skill` reads\n`pyproject.toml` at the root and never descends into `workspace/`, and the\nworkspace needs Node and pnpm but no Python.\n\n```bash\ncd workspace && node scripts/bootstrap.mjs\n```\n\nStart at [workspace/docs/setup.md](workspace/docs/setup.md); the workspace has\nits own [README](workspace/README.md), ADRs and gate suite.\n\n## Documentation\n\n| Guide | Use it for |\n|---|---|\n| [Documentation index](docs/README.md) | Choose a guide by task or audience |\n| [Getting started](docs/getting-started.md) | Installation, first watch, and first agent connection |\n| [Tool reference](docs/tools/README.md) | All 39 MCP tools and their REST/CLI counterparts |\n| [Configuration](docs/configuration.md) | Storage, privacy, models, limits, and environment variables |\n| [Agent matrix](docs/agents/README.md) | Per-client setup and verification status |\n| [Verification](docs/verification.md) | Contracts, deterministic checks, assurance levels, attestations |\n| [Use-case packs](docs/packs/README.md) | Recipes for research, meetings, QA, content, and operations |\n| [THE LOOP](docs/guides/the-loop.md) | Capture, critique, iteration, and proof artifacts |\n| [Cost policy](docs/cost.md) | Routing, budgets, caching, and benchmark method |\n| [Video-backend benchmark](benchmarks/video_backends/) | Whether an external provider's output can be ingested as durable evidence |\n| [Troubleshooting](docs/troubleshooting.md) | Dependency repair and common runtime errors |\n| [Comparison](docs/comparison.md) | Honest trade-offs against the alternatives |\n| [Engineering decisions](docs/DECISIONS.md) | The reasoning behind non-obvious design choices |\n| [Roadmap](docs/ROADMAP.md) | Planned work and contribution opportunities |\n\n## Development\n\n```bash\ngit clone https://github.com/oxbshw/watch-skill\ncd watch-skill\nuv sync --extra all\nuv run pytest\nuv run ruff check .\n```\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for test tiers, documentation standards, and the\nagent-adapter checklist. Security and privacy reports are covered by\n[SECURITY.md](SECURITY.md).\n\n## Listed on\n\nIndependent directories that index Watch Skill. They are maintained by their operators,\nso the details there can lag a release.\n\n- [Agent Skills Hub](https://agentskillshub.top/skill/oxbshw/watch-skill/)\n- [Neuralbox](https://neuralbox.tech/oxbshw-watch-skill)\n\n---\n\n<div align=\"center\">\n\nReleased under the [MIT License](LICENSE) · Built by [oxbshw](https://github.com/oxbshw)\n\n</div>\n",
  "bytes": 30401,
  "sha": "0fa469c7e87879a20c7de4bda88a16b23a595c96f59f9a3cd8fbaaabb03cdf1d",
  "repo_slug": "oxbshw/watch-skill",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_oxbshw_watch_skill_f304e76b/readme"
}