{
  "markdown": "<div align=\"center\">\n\n<img src=\"https://www.reelier.com/avatar.svg\" width=\"72\" alt=\"Reelier\" />\n\n# Reelier\n\n### Let your agents write. Keep the receipts.\n\n*Your agents worked all night. Here's exactly what changed.*\n\nReelier records the run that worked, freezes it as a replayable skill, and replays it deterministically — every run comes back as a receipt: proof of what the agent did and what changed because of it. **Agents make claims. Reelier writes receipts.**\n\n[![npm version](https://img.shields.io/npm/v/reelier.svg?color=blue)](https://www.npmjs.com/package/reelier)\n[![CI](https://github.com/seldonframe/reelier/actions/workflows/ci.yml/badge.svg)](https://github.com/seldonframe/reelier/actions/workflows/ci.yml)\n[![tests](https://img.shields.io/badge/tests-3621%20passing-brightgreen.svg)](./test)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n[![Discord](https://img.shields.io/badge/Discord-join-5865F2?logo=discord&logoColor=white)](https://discord.gg/nSp5sd4v)\n[![stars](https://img.shields.io/github/stars/seldonframe/reelier?style=social)](https://github.com/seldonframe/reelier)\n\n**[Website](https://www.reelier.com)** · **[Docs](https://www.reelier.com/docs)** · **[SPEC.md](./SPEC.md)**\n\n<img src=\"https://raw.githubusercontent.com/seldonframe/reelier/main/docs/assets/reelier-demo.gif\" width=\"760\" alt=\"Reelier: Dependabot bumps a dependency, Reelier replays your recorded agent run at 0 tokens and diffs it, catching the drift on the PR before you merge\" />\n\n<sub><a href=\"https://www.reelier.com/reelier-explainer.mp4\">▶ watch with sound (27s)</a></sub>\n\n<a href=\"https://glama.ai/mcp/servers/seldonframe/reelier\"><img width=\"380\" height=\"200\" src=\"https://glama.ai/mcp/servers/seldonframe/reelier/badge\" alt=\"Reelier MCP server on Glama\" /></a>\n\n</div>\n\n---\n\n## Receipts on your agent PRs — install and done\n\nAgent-authored PRs (Dependabot, Claude, Codex, Cursor, …) get a receipt comment in seconds: author, files changed, declared scope vs. what actually changed, sensitive paths flagged. No workflow file, no CLI, no config.\n\n**[→ Install the Reelier receipts GitHub App](https://github.com/apps/reelier-receipts)** — free on public repos, forever.\n\n> **Reelier receipt — agent PR**\n> Author: `dependabot[bot]` · Files changed: 2 (+119 −41)\n> Declared scope: none (add `.reelier/scope.yml` to enable unexpected-write detection)\n> Sensitive paths touched: ⚠ 1 — `package-lock.json`\n> Proves scope and change, not correctness\n\n<sub>A real receipt from Reelier's own repos — [see one live](https://github.com/seldonframe/reelier/pull/27). Declare scope per agent in `.reelier/scope.yml` (or a <code>reelier-scope</code> block in the PR body) and the receipt reports unexpected writes. The receipt proves scope and change, never correctness or safety.</sub>\n\n---\n\n## Why\n\nAI agents are non-deterministic — the same prompt, a different result every run — and they'll claim they did the work whether they did or not. Reelier records the run that worked, replays it deterministically, and writes a signed receipt that proves it. Point it at your existing CI in one workflow — it adds a verifiable receipt, it doesn't replace your stack.\n\nMeasured on a real head-to-head benchmark, same task, same data ([full method](./docs/REFERENCE.md#benchmark-method)):\n\n- **1,000 / 1,000 replays byte-identical**\n- **Every replay ships a signed receipt** — proof of what ran and what changed, never a claim\n- **0 LLM calls at replay** — deterministic re-execution, not re-reasoning\n\nDeterministic replay is also [~50× cheaper and ~59× faster than re-running the agent, on the same benchmark](./docs/REFERENCE.md#benchmark-method).\n\n## Install\n\n```sh\nnpm i -g reelier && reelier init\n```\n\n```sh\n# No Node install needed — same commands via Docker:\ndocker run --rm ghcr.io/seldonframe/reelier --help\n```\n\n`reelier init [--dry-run]` performs one checkpointed local inspection across all three Reelier paths: Path A observation coverage, Path B replay/freeze candidates, and Path C boundable/outcome-capable/shadow-only/unsupported connections and candidates. It does not deploy, gate, dispatch, upload, copy credentials, or rewrite host configuration. `--dry-run` writes nothing; the normal command writes only sanitized artifacts below `.reelier/init/`.\n\n### As an agent plugin\n\nTeach your coding agent when to reach for Reelier. Same two commands, either host:\n\n```sh\nclaude plugin marketplace add seldonframe/reelier\nclaude plugin install reelier@seldonframe\n```\n\n```sh\ncodex plugin marketplace add seldonframe/reelier\ncodex plugin add reelier@seldonframe\n```\n\nThis installs two Agent Skills and nothing else. `reelier-replay` teaches your agent to freeze a\nrepeatable tool-call job and replay it at 0 tokens. `reelier-write-safety` covers bounding an\nagent's writes before you grant them: what the recorder sees, what a policy refuses, and what a\nreceipt does and does not prove. **It ships no MCP servers**, so it does not wrap, observe, or gate\nany tool call on its own; the `reelier` CLI does that, and the skills drive it via `npx`. Packaged in both the [Agent Plugins](https://agent-plugins.org) v1.0.0 format (`plugin/agent-plugins/`) and the Claude Code format (`plugin/claude/`), generated from one source by `scripts/build-plugin-packages.mjs`.\n\nVerified end to end on `codex-cli 0.147.0-alpha.1.2`: both formats install, enable, and the skill reaches the model. Other hosts are untested, and per-host status is tracked in [`docs/specs/agent-plugins-coverage-v1.md`](docs/specs/agent-plugins-coverage-v1.md) §4 rather than claimed here.\n\n## How to use it\n\n```sh\nreelier init --dry-run              # inspect Path A/B/C locally; write nothing\nreelier init                        # persist resumable sanitized inspection artifacts\nreelier run  <name>.skill.md        # replay deterministically — 0 tokens (read-only by default)\nreelier diff <name>                 # SAME or DRIFTED, per step — exit 1 on drift\nreelier push <name>.skill.md        # sync receipts to your ledger (opt-in)\nreelier ci                          # write a workflow: drift-CI + PR receipts, one command\n```\n\n1. **Inspect, then record or freeze.** `reelier init` reveals observed coverage and local candidates without changing routes. `reelier mcp --wrap \"<mcp server>\"` proxies live tools; `reelier scan`/`from-session` freezes supported history.\n2. **Compile.** `reelier compile` turns a trace into a `SKILL.md` — 0 LLM calls, minimal assertions, honest gaps printed as **Open questions**.\n3. **Replay.** `reelier run` replays it at Level 0 — no LLM, byte-identical, read-only by default (writes need `--allow-writes`).\n4. **Diff.** `reelier diff` reports SAME or DRIFTED per step, with the failing assertion as the *why* — exit 1 on drift.\n5. **Log in.** `reelier login` connects this machine to Reelier Cloud with a device code in your browser — or set `REELIER_CLOUD_URL`/`REELIER_CLOUD_KEY` for CI and self-hosting.\n6. **Push.** Every run is a receipt; `reelier push` optionally syncs it to a ledger for a permalink and an embeddable verified-replay badge.\n\nAlready have an Agent Skill? Convert it — your skill, minus the model:\n\n```sh\nreelier compile trace.jsonl --from-skill ./my-skill/SKILL.md\n```\n\n## Three tests, one skill\n\n| Test | Command | Answers |\n| --- | --- | --- |\n| **Determinism** | `reelier run <skill.md>` | *Does this still do what it did?* |\n| **Recovery** | `reelier run <skill.md> --fail N` | *If this broke, would the skill notice and heal?* |\n| **Drift** | `reelier run <skill.md> --wrap \"<your mcp server>\"` | *Has the world moved out from under this skill?* |\n\n*Taxonomy due to Mads Hansen's review of the launch post.* Full semantics for each test, including recovery injection and manifest guardrails: [docs/REFERENCE.md](./docs/REFERENCE.md).\n\n## Gate Dependabot / Renovate bump PRs\n\nDependabot and Renovate open the PR and run your test suite — but neither knows what your agent actually *does* at runtime, so a dependency bump that silently changes a tool call's shape (a renamed field, a new default, a different error) sails through with green unit tests. This is the check they don't run.\n\nCopy [`.github/workflows/reelier-bump-check.yml`](.github/workflows/reelier-bump-check.yml) into your repo, point `skill:` at your own recorded `.skill.md` file(s), and it will: gate to PRs from `dependabot[bot]`/`renovate[bot]` (or a `dependencies` label), install the bumped dependency, replay your recorded skill live against it at `--max-level 0` (0 tokens), and fail the check on the exact step that drifted.\n\nThis tests dependency and MCP-tool-call behavior — it does **not** test model upgrades; `--max-level 0` never calls an LLM. Full listing copy and setup: [`docs/marketplace-listing.md`](docs/marketplace-listing.md).\n\n## Prove it\n\nA pushed receipt carries a ladder of independently-verifiable claims — not one blanket \"verified.\" Depending on what you turn on, it can be signed, timestamped, CI-attested, and carry cross-checkable provider request-ids. `reelier verify` recomputes every claim offline, and a claim you haven't enabled just renders as an honest gap, never a shamed one.\n\nSee a real one: [reelier.com/r/HWBdmGob9KeHRqXi-OEaRD0z](https://www.reelier.com/r/HWBdmGob9KeHRqXi-OEaRD0z).\n\nFull 8-rung ladder, what each rung does and doesn't prove: [docs/REFERENCE.md](./docs/REFERENCE.md).\n\n## If your skills are employees\n\n| Employee lifecycle | Reelier equivalent |\n| --- | --- |\n| Skillify a session | `reelier from-session` |\n| Performance review | `reelier run` + `reelier diff` |\n| Fleet maintenance | scheduled replays + drift alerts |\n| The record | signed receipts |\n\n\"Verified\" describes the record, never the agent — a receipt proves what ran and what changed, not that the agent was good at its job.\n\nAn employment contract doesn't make an employee good — it makes what they did visible and bounded. Same here: receipts prove scope and change, never correctness.\n\n## Who it's for\n\n- **Solo dev / OSS maintainer** — a real regression test again; drift can't pass silently.\n- **Team shipping agent changes** — \"it ran clean\" becomes a checkable PR artifact, not a claim.\n- **Agency running agents for clients** — signed, timestamped proof-of-delivery a client can verify.\n- **Marketplace buyer or seller** — corroborated receipts are reviews that can't be astroturfed.\n- **Audit-facing ops** — a signed, CI-attested trail of every write, idempotency key included.\n\n---\n\nMIT, free forever (versions ≤0.16.0 remain AGPL-3.0). Your data — skills, traces, runs — is specified in [SPEC.md](./SPEC.md), so leaving is copying a folder.\n\n**Contributing:** issues and PRs welcome — [SPEC.md](./SPEC.md) is the source of truth for formats; fix the code, not the spec. `npm test` before a PR.\n\n<div align=\"center\">\n\n**If Reelier saved you a re-run, [star it](https://github.com/seldonframe/reelier) ⭐ — it's how other builders find it.**\n\n</div>\n",
  "bytes": 10916,
  "sha": "2a445f4b754f1fd6224cd8ba4ea76277aedd8f3fc10c48075d64fdcfbad46721",
  "repo_slug": "seldonframe/reelier",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_seldonframe_reelier_fde70e2b/readme"
}