moq-dev/moq is an implementation of Media over QUIC, a protocol for delivering live media and other real-time data over QUIC with WebTransport, WebCodecs, and WebAudio. It is intended for live streaming and other applications that need low latency and large-scale fan-out, with Rust and TypeScript libraries. The catalogue add-ons teach coding agents how to build with MoQ.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/moq-dev/moq/spawn-questnpx skills add moq-dev/moq --skill spawn-questgit clone --depth 1 https://github.com/moq-dev/moqWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/moq-dev/moq/spawn-quest)<a href="https://agentmods.dev/skills/moq-dev/moq/spawn-quest"><img src="https://agentmods.dev/badge/skills/moq-dev/moq/spawn-quest.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00065 | $0.01408 |
| Opus 5 | $0.00032 | $0.00704 |
| Sonnet 5 | $0.00013 | $0.00282 |
| Haiku 4.5 | $0.00006 | $0.00141 |
Grade A, and why
spawn-quest scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 103 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Before you begin, read quest/AGENTS.md completely.
Resolve the first argument to a questline directory under quest/, defaulting
to quest/ itself: m0 means quest/m0.
git fetch origin before looking at claims. The remote branch is the
coordination mechanism, so stale remote-tracking refs mean offering a quest
another agent already claimed, and the spawned agent finds out only when its
push is rejected.
Read every quest in the scope, not just the summaries in each README.md. Drop
the ones a recent branch or open PR already claims.
Resolve a stale branch (old, no open PR) before keeping its quest in the start pool, rather than only mentioning it. Left in place it makes the agent's claim push fail as non-fast-forward, which the agent then reports as a lost race that never happened.
Inspect what the branch carries beyond its base. A claim placeholder is itself a commit, so "carries no work" is not the same as "has nothing unmerged", and conflating the two strands a quest forever:
- Placeholder commits only. Someone claimed the quest and abandoned it
without starting. Delete the ref and keep the quest in the pool: nothing is
lost, and treating it as claimed would retire the quest permanently on the
strength of an empty commit. Pin the remote delete to the tip you inspected,
with
git push --force-with-lease=<branch>:<sha> origin --delete <branch>. An unconditional delete races the owner coming back, and would erase a real commit pushed between the inspection and the delete along with the claim it renewed. A rejected lease means that is what happened, so treat the quest as claimed. Delete the local ref too when it points at that same tip, or the agent cannot cut the branch it was told to cut. - Real commits. Do not cut a fresh branch over them. Hand the agent the existing branch to continue, rebased onto its base. It still claims, with a fresh UUID placeholder pushed under a lease pinned to the tip you inspected. Two runs that both adopt the same branch would otherwise both skip the claim, and a rebase that changes nothing gives neither of them the rejected push that decides the race.
- Checked out in a worktree, or carrying an open PR. Treat the quest as claimed and take it out of the pool.
Put every quest to the user in priority order - the depth-first walk of the
scope's Quests lists - with a recommendation and the one fact behind it.
Batch the questions; do not spend a round per quest. The choices are start,
plan (use $plan-quest when a material decision is unmade), move,
delete, and leave.
Offer start only for a ready quest: quest/AGENTS.md executes one only when
it has no Required section. For work an agent cannot do - a decision that is
a conversation, a credential only the user can mint, or verification this
machine cannot run, such as a Linux-only build or a benchmark whose exit
criteria is a measured before/after - recommend leave and name what would
unblock it.
Spawning
Settle a base branch per quest and pass it to that quest's agent. Apply the Branch Targeting rules in CLAUDE.md: dev
only for a semver break in a published API, main for everything else. One
scope mixes both, so a single base for the whole wave puts some PR on the
wrong branch. Never let an agent derive its own base: an agent branching from
wherever it stands puts this skill's own tree edits in its PR.
Spawn one background agent per start, each with isolation: "worktree", in
waves of two or three unless the machine is idle - a saturated box makes agents
ship unverified. Never edit a running agent's worktree; message it instead.
Give each agent the base branch, the quest path, and nothing it could read for itself. Instruct it to:
- Read
quest/AGENTS.md, the quest,CONTRIBUTING.md, and the guides for the areas it touches. - Cut the quest branch (the quest path without
.md) from that base and claim it with an empty placeholder commit whose message contains a freshly generated UUID, pushed immediately withgit push origin HEADafter pointing the upstream at the base. When triage hands over an existing branch to continue, rebase it onto the base and claim it the same way, but push the placeholder with--force-with-leasepinned to the tip triage inspected, so a second adopter loses the race rather than joining it. The UUID is what makes the claim a race: two agents claiming the same quest from the same base in the same second otherwise produce the same commit object, and the loser's push succeeds as already-up-to-date instead of being rejected. A rejected push lost the race: stop and report. Never force the claim push;--force-with-leasepinned to its own claim is fine after a rebase. - Implement, run
just fix,just check, andjust testthroughnix develop --command, exercise the changed surface for real, walk the Cross-Package Sync table, and open a PR perCONTRIBUTING.md, deleting the quest and every reference to it in that same PR. - Leave package versions and lockfile version metadata alone.
- Name in the PR any check that did not run, rather than claiming it or leaving it out.
- Never deploy, apply, or mutate anything outside the repository.
- On a blocker: write what it learned into the quest so the next attempt starts ahead, push that, then stop and report rather than improvising past it.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today First seen · 103 lines · 65 tokens per session scan A 6b09b802db48
spawn-quest is a skill published in the GitHub repository moq-dev/moq (1,493 stars, last pushed today), licensed Apache-2.0. It adds 65 tokens to every session and 1,408 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-05.
Other skills, from other repositories
observability-stack
Spin up StreamKit's local observability stack (skit + Prometheus + Grafana, optional speech gateway) and validate the Grafana dashboards end-to-end. Use when testing metrics/dashboards, debugging empty dashboard panels, or reproducing the speech-gateway monitoring setup locally.
testing-web-capture
End-to-end testing of the StreamKit web-capture gateway demo (examples/web-capture) with the native servo plugin. Use when verifying clip/cast endpoints, servo page rendering, or cross-session pixel isolation.
testing-convert-stream-views
Testing the Convert and Stream views end-to-end in StreamKit. Use when writing or running browser-based tests for oneshot pipelines (TTS, transcription, file conversion) or dynamic MoQ stream pipelines, including marketplace plugin installation and YAML-driven UI controls.
adding-plugins
Checklist for making a StreamKit plugin official and downloadable from the registry. Use when adding a new native plugin or updating an existing one for marketplace distribution.
architecture
StreamKit crate relationships, data flow, key abstractions, and UI architecture. Use when understanding how the codebase is structured, how pipelines flow from YAML to execution, or how crates depend on each other.
common-pitfalls
Known mistakes that coding agents frequently make in the StreamKit codebase. Use before starting any task to avoid wasted effort — covers WebSocket vs REST state, perf baselines, Bun-only tooling, SPDX headers, lint suppressions, and React.memo barriers.