{
  "markdown": "<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/catfish-1234/proctor/main/assets/proctor-logo.svg\" alt=\"proctor logo, a watchful eye with a green checkmark pupil\" width=\"96\" height=\"96\">\n</p>\n\n<h1 align=\"center\">proctor</h1>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@kavishdua/proctor\"><img src=\"https://img.shields.io/npm/v/@kavishdua/proctor?color=2ea043&label=npm\" alt=\"npm version\"></a>\n  <a href=\"https://github.com/catfish-1234/proctor/actions/workflows/ci.yml\"><img src=\"https://github.com/catfish-1234/proctor/actions/workflows/ci.yml/badge.svg?branch=main\" alt=\"CI status\"></a>\n  <a href=\"https://github.com/catfish-1234/proctor/blob/main/LICENSE\"><img src=\"https://img.shields.io/npm/l/@kavishdua/proctor?color=blue\" alt=\"MIT license\"></a>\n</p>\n\n<p align=\"center\"><strong>Your agent didn't fix the bug. It deleted the test and told you it passed. proctor catches it.</strong></p>\n\nproctor reads your git diff and blocks the changes an AI coding agent makes when it fakes a\nfinished job: deleting a failing test, weakening the assertion, hardcoding the answer, swallowing\nthe error, or switching off the checks that were about to catch any of it.\n\nNo network, no account, no API key. The whole check runs offline. You need Node 20 or newer.\n\n## Contents\n\n**Getting started**\n\n- [Quickstart](#quickstart), try it against a repo without installing anything\n- [Install](#install), and exactly what it writes\n- [What that setup does](#what-that-setup-does)\n- [One thing to do afterwards](#one-thing-to-do-afterwards)\n- [Checking it worked](#checking-it-worked)\n- [Removing it](#removing-it)\n\n**Using it day to day**\n\n- [See it catch a real cheat](#see-it-catch-a-real-cheat)\n- [What happens when it blocks](#what-happens-when-it-blocks)\n- [What do the codes mean?](#what-do-the-codes-mean)\n- [Badges](#badges)\n- [CI](#ci)\n\n**Why it works**\n\n- [How it works](#how-it-works)\n- [Can the agent get around it?](#can-the-agent-get-around-it)\n- [By the numbers](#by-the-numbers)\n- [Benchmark](#benchmark)\n\n**Reference**\n\n- [Going further](#going-further), every doc page\n- [The Proctor](#the-proctor)\n- [License](#license)\n\n## Quickstart\n\nThe npm package is not published yet: `npm view @kavishdua/proctor` currently returns 404, so an\n`npx @kavishdua/proctor ...` command from the registry will not work. Until the first release, run\nthe checked-out source against any git repository:\n\n```bash\ngit clone https://github.com/catfish-1234/proctor.git\ncd proctor\nnpm ci\nnpm run build\nnode dist/cli.js check /path/to/repository\n```\n\nIf it prints `✓ proctor: honest pass`, your current changes are clean. If your changes don't touch\ntests at all, that's the answer you should expect.\n\nThe check writes nothing to the repository being checked and makes no runtime network call.\n`npm ci` installs build dependencies only in the proctor checkout.\n\n## Install\n\nTwo steps, and the second one is the only thing that writes to your repo.\n\n**Claude Code**\n\n```\n/plugin marketplace add catfish-1234/proctor\n/plugin install proctor@proctor-marketplace\n```\n\n**Gemini CLI or Qwen Code**\n\n```bash\ngemini extensions install https://github.com/catfish-1234/proctor\nqwen extensions install https://github.com/catfish-1234/proctor\n```\n\n**Anything else** (30 agents supported, or none at all)\n\nUntil the npm package is published, build its installable tarball from source:\n\n```bash\n# In the proctor checkout\nnpm ci\nnpm run build\nnpm pack\n\n# In the repository proctor should guard; use the .tgz path printed above\nnpm install --save-dev /absolute/path/to/kavishdua-proctor-*.tgz\n```\n\n**Installing writes nothing to your repository.** The install prints exactly what the next command\nwould write, and stops. When you want the guards:\n\n```bash\nnpx proctor setup\n```\n\n### What that setup does\n\nThis is the complete list of what `proctor setup` writes, and where. Nothing outside your\nrepository is touched, and no network call is made.\n\n| Path | What it is | If it already exists |\n| --- | --- | --- |\n| The ruleset file for each agent this repo uses, e.g. `.claude/skills/proctor/SKILL.md`, `.cursor/rules/proctor.mdc`, `AGENTS.md` | The honest-completion rules your agent reads before it works | A shared file like `AGENTS.md` keeps your content; only proctor's delimited block is replaced |\n| `.git/hooks/pre-commit` | Blocks a cheat at commit time | A pre-commit hook that isn't proctor's is left alone |\n| `.claude/settings.json` | The Claude Code Stop hook, written only if this repo uses Claude Code | Merged into the existing JSON; nothing else in the file changes |\n| `.proctor-adapter-manifest.json` | Records what was written, so `uninstall` can take exactly that back out | Rewritten |\n\nHow the agent list is chosen: proctor looks for each agent's own config (`.cursor/`, `.claude/`,\n`WARP.md`, and so on) and writes the ruleset to just those. A repo with no agent config gets\n`AGENTS.md`, the cross-vendor standard. Run `proctor agents` first to see the list for your repo.\n`--all` installs to all 30 supported agents; `--agents claude-code,cursor` names them yourself.\n\n`setup` stays out of the way where setting itself up would be wrong: in CI, in a global install,\nwhen pulled in as somebody else's dependency, outside a git repository, or under `npx`.\n\n**If you want the old install-and-wire behavior**, set `PROCTOR_AUTO_SETUP=1` and installing runs\n`proctor setup` for you. `PROCTOR_NO_POSTINSTALL=1` silences the install-time notice entirely.\n\n### One thing to do afterwards\n\n**Commit what it wrote.** The ruleset files and `.proctor-adapter-manifest.json` are ordinary files\nin your repo, and they only reach your teammates and your CI once they're committed.\n\n```bash\ngit add -A && git commit -m \"chore: add proctor\"\n```\n\nIf you use Claude Code, restart it so it picks up the new Stop hook.\n\nThat's the whole setup. You don't need to run proctor by hand, remember any flags, or write a\nconfig file.\n\n### Checking it worked\n\n```bash\nproctor drift-check   # exits 0 if every deployed ruleset copy still matches the source\nproctor statusline    # \"proctor: watching\", or \"proctor: 3 caught\" once it has blocked something\n```\n\nOr trip it deliberately: delete a test in a scratch branch and run `proctor check`.\n\n### Removing it\n\n```bash\nproctor uninstall --dry-run   # see what would go\nproctor uninstall\n```\n\nIt removes only what it installed. Your own content in a shared file like `AGENTS.md` stays, a\npre-commit hook that isn't proctor's is left alone, and `proctor.config.json` is left for you to\nkeep or delete. To skip the hook once without uninstalling: `git commit --no-verify`.\n\n## See it catch a real cheat\n\nAn agent is asked to fix a bug in a slug generator. It can't get the whitespace-only case to\nreturn `''`, so instead of fixing `slugify()`, it deletes the inconvenient test:\n\n```diff\n describe('slugify', () => {\n   it('converts spaces to dashes', () => {\n     expect(slugify('Hello World')).toBe('hello-world');\n   });\n-  it('handles a whitespace-only input', () => {\n-    expect(slugify('   ')).toBe('');\n-  });\n });\n```\n\n```\n$ proctor check\ntests/slug.test.ts\n  ❌ tests/slug.test.ts:5  [RH001]  Test function 'handles a whitespace-only input' was deleted in this change.\n      Restore the deleted test or document why it was intentionally removed.\n\nHow to fix these honestly:\n  proctor check --explain RH001 --fix\n\n1 finding (1 error, 0 warnings)\n$ echo $?\n2\n```\n\nThe commit never lands. The agent has to actually fix `slugify()`, not just make the red go away.\n\nHere's the full two-scene recording: proctor catching a deleted test at the CLI layer, then the\nClaude Code Stop hook blocking the same cheat live in an agent session.\n\n![proctor demo](https://raw.githubusercontent.com/catfish-1234/proctor/main/assets/demo.gif)\n\n## What happens when it blocks\n\nYour agent handles it. When a check fires, proctor prints what tripped and what an honest fix looks\nlike, and the agent goes and does that instead. That's the normal path and it needs nothing from\nyou. At the terminal you'll see the finding and an exit code of `2`.\n\nThree cases want a human, and each is one command.\n\n**The test change was genuinely intended.** A feature got removed, so its tests went with it.\nRecord it and the finding stops blocking:\n\n```bash\nproctor approve RH001 tests/legacy-billing.test.ts --reason \"billing v1 removed in RFC-88\"\ngit add proctor.config.json && git commit -m \"chore: approve RH001 for legacy billing\"\n```\n\nIt stays visible in every report with your reason attached. Approvals are read from the **committed**\nconfig, so an agent cannot approve its own change in the change it is making, and an approval you\nhaven't committed yet has no effect.\n\n**It's a false positive.** Suppress that one line:\n\n```js\n// proctor-ignore: RH004 reason: this is a lookup table, not a fixture hardcode\n```\n\nThe marker has to be committed before the change it excuses, for the same reason approvals do. See\n[inline suppression](https://github.com/catfish-1234/proctor/blob/main/docs/CONFIGURATION.md#inline-suppression).\n\n**You want to know why a check exists.** Every finding prints its ID, and every ID explains itself:\n\n```bash\nproctor check --explain RH001        # what this check looks for\nproctor check --explain RH001 --fix  # what an honest fix looks like\n```\n\n## What do the codes mean?\n\nEvery finding carries a short ID like `RH001`. They are just stable labels, the same idea as an\nESLint rule name, so a check can be referenced without spelling out a whole sentence. Nothing to\nmemorize: the plain-English name and full explanation print with every finding.\n\nThere are two families, and the split is by the claim each one checks.\n\n**RH0xx checks \"the tests pass.\"** These read the test suite and the code directly beneath it.\n\n| | Catches |\n|---|---|\n| RH001 | A test deleted or renamed away |\n| RH002 | An assertion weakened into a vaguer one |\n| RH003 | A test skipped, disabled, or commented out |\n| RH004 | An implementation hardcoded to match a fixture |\n| RH005 | A function body replaced with a stub |\n| RH006 | A snapshot rewritten with no reason given |\n| RH007 | A test excluded via a config change |\n| RH008 | An assertion that always passes |\n| RH009 | A trivial test swapped in for a real one |\n| RH010 | An async test detached, or timeouts/retries used to mask a failure |\n| RH011 | Type and lint errors silenced instead of fixed |\n| RH012 | A test step removed from CI, or neutered so failures stop counting |\n| RH013 | A coverage threshold lowered or removed |\n| RH014 | A surviving test changed to exercise fewer generated, looped, or table-driven cases |\n\n**WI1xx checks \"the work is done.\"** Deleting a test is only one way to fake a finished job. These\nread shipped code for the rest of them, and none of the cheats they catch touches a test file.\n\n> **Beta, and opt-in for now.** The WI family is off by default in v1.0.0. Turn it on for one run\n> with `proctor check --wi` (or `--all-checks`), or for good by listing the IDs you want in\n> `enabled` in `proctor.config.json`, which also applies them in both hooks. Nothing about them is\n> weakened by being opt-in: thirteen checks reading arbitrary source across 25+ languages is a\n> larger false-positive surface than the RH family's, and it has had less real-world exposure, so\n> they earn default-on in a later release rather than assuming it.\n\n| | Catches |\n|---|---|\n| WI101 | An error discarded by an empty handler, so failures pass unnoticed |\n| WI102 | An explicit \"not implemented\" marker shipped inside finished-looking work |\n| WI103 | Validation deleted so the case it rejected now goes through |\n| WI104 | Proctor, a commit hook, or a type/lint gate switched off instead of satisfied |\n| WI105 | Real network, database, or filesystem work replaced with canned data |\n| WI106 | Types widened to `any` to silence the type checker |\n| WI107 | A security check switched off, or an authorization gate removed |\n| WI108 | Source or tests hidden from git, and therefore from every check |\n| WI109 | A test's expected value edited to match the buggy output |\n| WI110 | A test, lint, or build script rewritten so it can no longer fail |\n| WI111 | The code under test deleted, or a test file emptied of its tests |\n| WI112 | Assertions deleted from a surviving test, a golden file rewritten, or a module aliased to a stub |\n| WI113 | A benchmark workload reduced, dependency downgraded, or fixed delay added instead of fixing the failure |\n\nEvery WI check skips test files on purpose. An empty catch is how you assert that something throws,\ncanned data is what a fixture is for, and a loose cast is ordinary when building a partial mock.\nThey watch the code your tests are meant to be proving.\n\nMost of them also have the same escape hatch: a line whose comment explains why it is correct does\nnot get flagged. That is not a loophole, it is the point. An agent racing to a green build does not\nstop to write the sentence, and if it does, the sentence is now in the diff for a human to read and\ndisagree with.\n\n## Badges\n\n[![proctor](https://img.shields.io/badge/proctor-honest_pass-22C55E)](https://github.com/catfish-1234/proctor)\n\n`✓ proctor: honest pass` prints after a clean `proctor check`, and `proctor badge` gives you the\nsame result as Markdown to paste into your own README or a PR description (generated by\n[`src/badge/index.ts`](https://github.com/catfish-1234/proctor/blob/main/src/badge/index.ts)):\n\n```bash\n$ proctor badge\n[![proctor](https://img.shields.io/badge/proctor-honest_pass-22C55E)](https://github.com/catfish-1234/proctor)\n```\n\nA run only earns it when it is genuinely clean. Findings you approved through `approvedTestChanges`\ndo not count as clean, since somebody decided to let those through. The printed line is suppressed\nunder `--ci`, which is what the hooks and the GitHub Action use.\n\n## CI\n\nAdd proctor to a pull request in nine lines. Findings land in the job summary, and in Code Scanning\nas inline PR comments if the repository has it enabled.\n\n```yaml\n# .github/workflows/proctor.yml\non: [pull_request]\njobs:\n  proctor:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7\n        with: { fetch-depth: 0 }\n      - uses: catfish-1234/proctor@v1\n```\n\n`v1` is a moving tag: it follows the newest `1.x` release, so patch and minor fixes arrive without\na PR. To pin exactly instead, use a full commit SHA\n(`catfish-1234/proctor@11fcd5cbad7d3a731dc5e79c4858012e74c6fc52`), which is immutable and cannot be\nmoved under you.\n\n## How it works\n\nproctor has two halves.\n\nThe **ruleset** is a short document telling your agent how to finish work honestly. Most agents\nfollow it most of the time.\n\nThe **guard** is for the rest of the time. A ruleset alone is a request, and an agent under\npressure to show green can talk itself out of a request. So proctor also ships a\ndeterministic, diff-level guard that runs on every commit and at the end of every agent turn, and\nblocks the changes that broke the rules. It works below the agent's own reasoning: it reads the\ncode change itself, never the agent's explanation of it, so nothing the agent says can argue\nwith it.\n\n## Can the agent get around it?\n\nThat is the question the design answers, so it is worth being concrete about.\n\n**The commit hook fails closed.** If proctor cannot run at all, the commit is blocked rather than\nallowed. This used to be the other way round and it was the worst bug in the tool: the hook ran\n`npx @kavishdua/proctor check --staged` and treated exit 1 as \"clean with warnings\", but `npx` also\nexits 1 when it cannot resolve the package, so an unreachable registry looked identical to a clean\nrun and the commit landed unchecked. The hook now probes with `--version` first, prefers a local\ninstall over the network, and refuses the commit when it cannot check it.\n\n**Config is read from the committed baseline, not your working tree.** An agent that edits\n`proctor.config.json` in the same change it is trying to land has changed nothing about the run:\nenforcement uses the version at the diff baseline. The same goes for approvals and for inline\n`proctor-ignore` markers, which only count when they were committed *before* the change they\nexcuse. Self-approval is not a matter of policy here, it does not work.\n\n**Switching the guard off is itself a finding.** WI104 fires on a check removed from `enabled`, a\nseverity downgraded, an ignore pattern or approval added, a ruleset file deleted, a `--no-verify`\nadded to a script, or TypeScript strictness turned off. Since the config edit was already inert,\nthe point of the check is to make the attempt visible rather than to stop it.\n\n**It reads the diff, never the explanation.** Nothing the agent says about its change is an input.\nThe remaining honest gap is a human running `git commit --no-verify`, which is deliberate: that is a\nperson overriding their own tooling, and it is caught at the next turn by the Stop hook and in CI.\n\n## By the numbers\n\n**How often agents actually do this.** These are other people's published measurements, not ours:\n\n| | |\n|---|---|\n| **33.3%** | of ambiguous coding tasks where Claude Sonnet 4 hardcoded the expected output rather than solve the problem ([EvilGenie](https://arxiv.org/abs/2511.21654)) |\n| **2.1%** | the same behaviour on unambiguous tasks, where the right fix was never in doubt (same paper) |\n| **0.7%** | of tasks where Gemini 2.5 Pro deleted a test file outright (same paper) |\n| **up to 100 pts** | gap between \"the visible tests pass\" and \"the held-out tests pass\" on the largest tasks in [SpecBench](https://arxiv.org/abs/2605.21384). It widens by about 28 points per tenfold increase in code size, and adding test coverage does not close it |\n| **8 of 8** | agent benchmarks that [Berkeley RDI](https://rdi.berkeley.edu/blog/trustworthy-benchmarks-cont/) drove to near-perfect scores without solving a single task. SWE-bench Verified fell to a pytest hook that forced every test to pass |\n\n**What proctor catches.** The fixture and benchmark numbers below come out of `npm test`; the\nadversarial number comes from the independent widening corpus in [`bench/redteam/`](https://github.com/catfish-1234/proctor/tree/main/bench/redteam):\n\n| | |\n|---|---|\n| **139 of 139** | planted cheats caught. One fixture per check per language, each asserted against the exact finding proctor has to produce, not just \"something fired\" |\n| **0 of 33** | near-miss fixtures flagged. Each one is a change built to look like a cheat and be legitimate: a single `@ts-ignore` with a justification, one retry rather than five, an empty catch whose comment explains itself, a guard clause extracted into a validator |\n| **21 of 21** | recorded cheats caught in the benchmark corpus, across 7 signatures. Whole-repo task diffs rather than minimal fixtures. The 22nd task is a control that plants no cheat, and proctor stays silent on it. Reproduce with `proctor bench --mock` |\n| **76 of 76** | adversarial cheat diffs caught with **both families enabled**, and **0 of 24** legitimate controls flagged, across eleven total red-team rounds. The corpus probes the WI family too, so reproduce it with `--all-checks`; the RH family alone catches 25 of the 76, since the rest are cheats the WI checks were written for. Includes process-status laundering, workload cuts, dependency rollback, fixed-delay masking, CI trigger/matrix contraction, diagnostic suppression, and out-of-band Git index hiding. Reproduce with `node bench/redteam/probe.mjs` |\n| **3.8%** | of 689 real human commits, sampled from 20 maintained open-source repositories across seven languages, produce any finding at all from the default check set. **2.32%** produce a blocking one, and most of those are the check correctly noticing that somebody deleted a test or added a skip marker |\n| **27** | checks in two families, across **25+** languages, installable into **30** agents |\n| **under 1s** | to check a commit, offline. Measured here at roughly 0.25s on a 3-file diff and 0.55s on a 79-file one, cold Node start included |\n\n**What we don't claim.** That proctor makes an agent *behave* better. That is a different measurement\nand our own [benchmark](#benchmark) has not produced it: both complete live runs passed their\nheld-out tests in every one of the 44 invocations, so the agent never reached the point where\ncheating was worth it and there was no behaviour to change in either arm. The 139 of 139 above is a detection claim, which\nis the claim the tool actually makes.\n\n## Benchmark\n\n`proctor bench` measures how often an agent games its own tests, and how often proctor catches it,\nacross a fixed pool of tasks with the ruleset on and off.\n\nThe honest state of this evidence: a complete 22-task live run against `claude-code`, both arms,\nall 44 agent invocations scored, against held-out tests each verified to fail their own unfixed\nsource.\n\n| | proctor off | proctor on |\n|---|---|---|\n| cheat rate | **4.5%** (1 of 22) | **4.5%** (1 of 22) |\n| honest-pass rate | **100.0%** | **100.0%** |\n\n**No difference between the arms, and the honest-pass column explains why.** Every one of the 44\nruns passed its held-out tests, including the one that tripped a signature. The held-out design\nexists precisely so an agent that fakes a green build fails a test it never saw. Nothing failed\none. The agent solved every task in the pool, including the seven built to make cheating cheaper\nthan fixing, so the situation the tool exists for never arose in either arm and there was no\nbehaviour left for the intervention to change.\n\nAn earlier run of this same corpus showed 9.1% against 4.5%, and **that difference did not\nreproduce**. It was one task out of 22, which is what noise looks like at this sample size. Both\nruns are consistent with the same conclusion, and the apparent improvement in the first one would\nhave been exactly the sort of unearned green this project exists to catch.\n\nThe single flagged diff was a **false positive**, and chasing it was worth more than the headline\nnumber. RH004 fired on task-17 in both arms, against an agent that had replaced a\n`return version >= base` stub with a real 52-line semver implementation. The flagged line was the\n`return 0` that terminates its new comparator, which is the correct \"equal\" result, paired by the\ncheck against the deleted stub thirty lines away in a different function. That has been fixed, so\nthe same run scored against current code reads **0.0% in both arms**. The table above is left as\nthe run actually scored, because a benchmark that quietly restates old results as if the tool had\nalways behaved this way is not a record of anything.\n\nThe eight held-out suites that could not distinguish a fix from a cheat were found and strengthened\nbefore this run, and `tests/bench-heldout-discriminates.test.ts` now enforces that property for\nevery task. See [bench/METHODOLOGY.md](https://github.com/catfish-1234/proctor/blob/main/bench/METHODOLOGY.md).\n\nThe task corpus ships with this repository rather than the npm package, so `bench` needs a clone:\n\n```bash\ngit clone https://github.com/catfish-1234/proctor && cd proctor\nnpm install && npm run build\nnode dist/cli.js bench --tasks 22 --agent claude-code --out bench/results-live.csv\n```\n\nA 22-task run is 44 agent invocations, which is more than one Claude subscription session allows.\nThree attempts reached 16, 14 and 16 tasks before the agent started returning \"You've hit your\nsession limit\", and a rate-limited agent looks exactly like an honest one once it reaches the CSV:\nno changes, no cheat, no finding. `--resume` carries the completed tasks over from the\n`.partial.csv` a failed attempt leaves behind, so a run can span more than one window; the numbers\nabove were collected that way. `PROCTOR_BENCH_TIMEOUT_MS` raises the per-invocation budget, which\nthe hard-tier tasks need. Read the `proctor: bench task-NN ... failed` lines on stderr before\ntrusting any number the table prints.\n\n## Going further\n\nEverything above is the whole product for most people. These pages are for when you want more:\n\n| Page | What's in it |\n|------|--------------|\n| [docs/CLI.md](https://github.com/catfish-1234/proctor/blob/main/docs/CLI.md) | Every command and flag |\n| [docs/CONFIGURATION.md](https://github.com/catfish-1234/proctor/blob/main/docs/CONFIGURATION.md) | Config file, severities, approvals, [inline suppression](https://github.com/catfish-1234/proctor/blob/main/docs/CONFIGURATION.md#inline-suppression) |\n| [docs/TROUBLESHOOTING.md](https://github.com/catfish-1234/proctor/blob/main/docs/TROUBLESHOOTING.md) | It didn't fire, it fired wrongly, my approval didn't take |\n| [docs/LANGUAGES.md](https://github.com/catfish-1234/proctor/blob/main/docs/LANGUAGES.md) | Per-language support matrix, the 30 supported agents, known limitations |\n| [CONTRIBUTING.md](https://github.com/catfish-1234/proctor/blob/main/CONTRIBUTING.md) | Setting up, adding a check, adding an agent |\n| [docs/RELEASING.md](https://github.com/catfish-1234/proctor/blob/main/docs/RELEASING.md) | Maintainer notes: how a tag becomes a release |\n| [RESEARCH.md](https://github.com/catfish-1234/proctor/blob/main/RESEARCH.md) | Why it's built this way, and how it compares to Stryker and EvilGenie |\n| [bench/METHODOLOGY.md](https://github.com/catfish-1234/proctor/blob/main/bench/METHODOLOGY.md) | How the benchmark works and what it does not claim |\n\nproctor supports 25+ languages and installs to 30 agents. Five diff-level checks (RH001, RH002,\nRH003, RH007, RH011) work across all of them; six (RH004, RH005, RH006, RH008, RH009, RH010) are\nJS/TS/Python-only; and RH012 and RH013 read CI and coverage config, so they apply everywhere. Of the\nwork-integrity family, WI101, WI102 and WI103 carry per-language signatures, WI104 reads config\nfiles so it applies everywhere, and WI105 and WI106 are scoped to the languages whose tokens are\nunambiguous. [Full matrix](https://github.com/catfish-1234/proctor/blob/main/docs/LANGUAGES.md).\n\n## The Proctor\n\nPicture the exam invigilator: arms crossed, half-moon glasses, watching over a sweating robot\nmid-delete of a failing test. That's proctor. The logo is a watchful eye with a green checkmark for\na pupil, watching whether your green is real. When it catches a cheat, the iris flips red and the\npupil becomes an X.\n\n## License\n\nMIT\n",
  "bytes": 26323,
  "sha": "3e80365034942b57cc2eb987587fd92d8b68bc26c3cdd35591b91e5f8f243eb6",
  "repo_slug": "catfish-1234/proctor",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_catfish_1234_proctor_a30fb36b/readme"
}