{"_id":"@anterislab/guard","_rev":"6-baac83fd5392efadeaaed4c1b261f1ea","name":"@anterislab/guard","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"@anterislab/guard","version":"0.1.0","keywords":["ai-agents","guardrails","policy-engine","llm-safety","autonomous-agents","eu-ai-act","audit-trail"],"author":{"name":"AnterisLab","email":"hello@anterislab.com"},"license":"MIT","_id":"@anterislab/guard@0.1.0","maintainers":[{"name":"anterislab-org","email":"hello@anterislab.com"}],"homepage":"https://www.anterislab.com","bugs":{"url":"https://github.com/AnterisLab/anterislab-guard/issues"},"dist":{"shasum":"83fcc285b4e82332f719dab44c7d91794dd54094","tarball":"https://registry.npmjs.org/@anterislab/guard/-/guard-0.1.0.tgz","fileCount":4,"integrity":"sha512-vCP8HXu000kUifEBtypRBr7qKM/WAJKH2a1pmsRKiOh9mBMTMOKEogCWLCy44Zlcp7EQNZiPyLYzAgzvjxn8kA==","signatures":[{"sig":"MEUCIQCLYlzRLeUVu61vNBZ12O/cGJu+1tPPwVPElz0p4SUFpQIgXAjuNKRkeiQGyoLVjehel8Uh5MUAQJSq5wIYcJKIb58=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10849},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"9e28b0ef9f57d487524809e75b4bd2f0cafc0b7c","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"anterislab-org","email":"hello@anterislab.com"},"repository":{"url":"git+https://github.com/AnterisLab/anterislab-guard.git","type":"git"},"_npmVersion":"11.19.1","description":"Real-time policy guard for autonomous agents. One line to wrap your agent: every action is evaluated against your plain-language policies before it executes.","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/guard_0.1.0_1789154348496_0.8539039143340439","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@anterislab/guard","version":"0.1.1","keywords":["ai-agents","guardrails","policy-engine","llm-safety","autonomous-agents","eu-ai-act","audit-trail"],"author":{"name":"AnterisLab","email":"hello@anterislab.com"},"license":"MIT","_id":"@anterislab/guard@0.1.1","maintainers":[{"name":"anterislab-org","email":"hello@anterislab.com"}],"homepage":"https://www.anterislab.com","bugs":{"url":"https://github.com/AnterisLab/anterislab-guard/issues"},"dist":{"shasum":"6c7700a19904dbb6611599ea386d626a68545183","tarball":"https://registry.npmjs.org/@anterislab/guard/-/guard-0.1.1.tgz","fileCount":4,"integrity":"sha512-ryEWFxwO3dYy37dlRC0b9ExELVmkDhlsAxyRi3te7b7rgfgs2zrZ4ZbTNo9Zx6WwqCtf2J0cSmb5wdcVjRCAAQ==","signatures":[{"sig":"MEUCIQCiY1kFYH5eAA3PFWAL9tg8s+e/BTh0akNUUDHNwJmcIwIgKqctfpqapanQ4Skl+fdhBodfqZZ63bdelUzJ4Xmz59M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10849},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"9e28b0ef9f57d487524809e75b4bd2f0cafc0b7c","scripts":{"build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"anterislab-org","email":"hello@anterislab.com"},"deprecated":"Deprecato: build non aggiornata, priva della gestione quota 402. Usare la 0.2.x.","repository":{"url":"git+https://github.com/AnterisLab/anterislab-guard.git","type":"git"},"_npmVersion":"11.19.1","description":"Real-time policy guard for autonomous agents. One line to wrap your agent: every action is evaluated against your plain-language policies before it executes.","directories":{},"_nodeVersion":"26.4.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0"},"_npmOperationalInternal":{"tmp":"tmp/guard_0.1.1_1789199905233_0.8940784784000804","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@anterislab/guard","version":"0.2.0","keywords":["ai-agents","guardrails","policy-engine","llm-safety","autonomous-agents","kill-switch","audit-trail"],"author":{"name":"AnterisLab","email":"hello@anterislab.com"},"license":"MIT","_id":"@anterislab/guard@0.2.0","maintainers":[{"name":"anterislab-org","email":"hello@anterislab.com"}],"homepage":"https://www.anterislab.com","bugs":{"url":"https://github.com/AnterisLab/anterislab-guard/issues"},"dist":{"shasum":"5b247e3b398ccc9880f08029d605b575407a4d01","tarball":"https://registry.npmjs.org/@anterislab/guard/-/guard-0.2.0.tgz","fileCount":27,"integrity":"sha512-2iw75K1rTXvrTQoXZhyprZWeNkumh0S8Z0hgbcMShObF0NGj69yvOgJMQghHm3z6+9zdEwM3xGn7yO3Vab5uiw==","signatures":[{"sig":"MEQCIDw883BU+EUltbQjQtPpSi8ALARROyUfTtYm78+lp2/fAiAS40x5GUWArs/n+RRGF5T42GPl96zrEN0tJQedFab+VQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIACNCB2dQqaJOxuti/Khz0FOtwid+hE6d5bP1bN+EvphAiEAiUuSW41qMnEc6ZKZSXw+VFGIW7/U+gEt8Tx0PtFk5gg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anterislab%2fguard@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":155475},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"4a16850c2a885f2ad867d96d0d60fa1b89eeece7","scripts":{"test":"npm run build && node --test test/*.test.mjs","build":"tsc","prepack":"npm run build && npm run check:artifact","test:unit":"node --test test/*.test.mjs","typecheck":"tsc --noEmit","check:artifact":"node scripts/check-artifact.mjs","prepublishOnly":"npm run build && npm run check:artifact"},"_npmUser":{"name":"anterislab-org","email":"hello@anterislab.com"},"repository":{"url":"git+https://github.com/AnterisLab/anterislab-guard.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time policy guard for autonomous agents: every action is evaluated against your plain-language policies before it executes. Fail-closed by construction.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^20.19.43"},"_npmOperationalInternal":{"tmp":"tmp/guard_0.2.0_1789764660137_0.5600166745283157","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@anterislab/guard","version":"0.2.1","keywords":["ai-agents","guardrails","policy-engine","llm-safety","autonomous-agents","kill-switch","audit-trail"],"author":{"name":"AnterisLab","email":"hello@anterislab.com"},"license":"MIT","_id":"@anterislab/guard@0.2.1","maintainers":[{"name":"anterislab-org","email":"hello@anterislab.com"}],"homepage":"https://www.anterislab.com","bugs":{"url":"https://github.com/AnterisLab/anterislab-guard/issues"},"dist":{"shasum":"f39ad28571a08757cf673f809d6222ccc04f2e82","tarball":"https://registry.npmjs.org/@anterislab/guard/-/guard-0.2.1.tgz","fileCount":29,"integrity":"sha512-DIyZisNLzV6xTnTOHm5cpAr2yLnwlGTd2miR47bJ0DV8emTmMGwshvbTg67kyGk3Kl7erCWG1dqQasFd/CnYIQ==","signatures":[{"sig":"MEQCIAkVzkFFmylXbZNiqLL0WmQH/DQ9s4KSEpmNlVM2d+HGAiByoCRc5Z1gj3PixL0G7K2k/lXKN+7cyS4AaUUDjfhG/w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDCdbLOtBIc+t0F+doyfYYqK6iC0wQHA66eHgSTLyItGwIhAPU9rPZKboJpeqA9fM5xGbG5JsIx+0knWA4LYfUdqkRF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anterislab%2fguard@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":156112},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./package.json":"./package.json"},"gitHead":"437683eb7f71ee4eccaf83f21fbca9d583cc03d6","scripts":{"test":"npm run build && node --test test/*.test.mjs","build":"tsc","prepack":"npm run build && npm run check:artifact","test:unit":"node --test test/*.test.mjs","typecheck":"tsc --noEmit","check:artifact":"node scripts/check-artifact.mjs","prepublishOnly":"npm run build && npm run check:artifact"},"_npmUser":{"name":"anterislab-org","email":"hello@anterislab.com"},"repository":{"url":"git+https://github.com/AnterisLab/anterislab-guard.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time policy guard for autonomous agents: every action is evaluated against your plain-language policies before it executes. Fail-closed by construction.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^20.19.43"},"_npmOperationalInternal":{"tmp":"tmp/guard_0.2.1_1789766177136_0.8797117437084994","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"_id":"@anterislab/guard@1.0.0","bugs":{"url":"https://github.com/AnterisLab/anterislab-guard/issues"},"dist":{"shasum":"960cbcbbf21b68d02c91d8d1ad23fb5aea44ab70","tarball":"https://registry.npmjs.org/@anterislab/guard/-/guard-1.0.0.tgz","fileCount":31,"integrity":"sha512-mH3781o22vcnJuS+/NfzeUXgjyUzhHsR+XLL2pWLpz6iOS5LBzwab9rP+m6EUK4U7WGWPwjwrPM6Mko2GYjxAw==","signatures":[{"sig":"MEUCIClA63MuLu9H8s2Zlp312GEAChoX8QaUM0H0pq56o9RcAiEAn42JnIYp7sqiEXlpESP65yq7cZUptBDWo1BUltSRajM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDqLnLTPU8odXrV07asuCOyohGQRHiyqjh1K6RDCNy/TwIhAIfi38iRlzuR5Uy0TGv/+/49aNdV1Qo3uCi7YeSnTDuv"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@anterislab%2fguard@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":166723},"main":"./dist/index.js","name":"@anterislab/guard","type":"module","types":"./dist/index.d.ts","author":{"name":"AnterisLab","email":"hello@anterislab.com"},"engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./mock":{"types":"./dist/mock.d.ts","import":"./dist/mock.js"},"./package.json":"./package.json"},"gitHead":"5c2574e20e970f38c3a13fbffd7e264e40061f5c","license":"MIT","scripts":{"lint":"eslint .","test":"npm run build && node --test test/*.test.mjs","build":"tsc","prepack":"npm run build && npm run check:artifact","test:unit":"node --test test/*.test.mjs","typecheck":"tsc --noEmit","test:coverage":"mkdir -p coverage && npm run build && node --test --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=./coverage/lcov.info test/*.test.mjs","check:artifact":"node scripts/check-artifact.mjs","prepublishOnly":"npm run build && npm run check:artifact"},"version":"1.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"f513434e-fa31-4e53-b2e0-1585f06dc079"}},"homepage":"https://anterislab.com","keywords":["ai-agents","ai-safety","guardrails","policy-engine","llm-safety","autonomous-agents","kill-switch","audit-trail","fail-closed"],"repository":{"url":"git+https://github.com/AnterisLab/anterislab-guard.git","type":"git"},"_npmVersion":"11.19.0","description":"Real-time policy guard for autonomous agents: every action is evaluated against your plain-language policies before it executes. Fail-closed by construction.","directories":{},"maintainers":[{"name":"anterislab-org","email":"hello@anterislab.com"}],"sideEffects":false,"_nodeVersion":"24.21.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.18.0","@eslint/js":"^9.18.0","typescript":"^5.9.3","@types/node":"^20.19.43","typescript-eslint":"^8.20.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/guard_1.0.0_1790627358636_0.8577586348116282"}}},"time":{"created":"2026-09-11T19:19:08.374Z","modified":"2026-09-28T20:29:19.091Z","0.1.0":"2026-09-11T19:19:08.629Z","0.1.1":"2026-09-12T07:58:25.371Z","0.2.0":"2026-09-18T20:51:00.217Z","0.2.1":"2026-09-18T21:16:17.231Z","1.0.0":"2026-09-28T20:29:18.741Z"},"bugs":{"url":"https://github.com/AnterisLab/anterislab-guard/issues"},"author":{"name":"AnterisLab","email":"hello@anterislab.com"},"license":"MIT","homepage":"https://anterislab.com","keywords":["ai-agents","ai-safety","guardrails","policy-engine","llm-safety","autonomous-agents","kill-switch","audit-trail","fail-closed"],"repository":{"url":"git+https://github.com/AnterisLab/anterislab-guard.git","type":"git"},"description":"Real-time policy guard for autonomous agents: every action is evaluated against your plain-language policies before it executes. Fail-closed by construction.","maintainers":[{"name":"anterislab-org","email":"hello@anterislab.com"}],"readme":"\n# @anterislab/guard\n\n[![CI](https://github.com/AnterisLab/anterislab-guard/actions/workflows/ci.yml/badge.svg)](https://github.com/AnterisLab/anterislab-guard/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/AnterisLab/anterislab-guard/graph/badge.svg)](https://codecov.io/gh/AnterisLab/anterislab-guard)\n[![npm](https://img.shields.io/npm/v/@anterislab/guard.svg)](https://www.npmjs.com/package/@anterislab/guard)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nRuntime guard for autonomous agents: every action is evaluated **before** it executes, and a\nstop order actually stops the agent.\n\nZero runtime dependencies. Node 20+.\n\n## Requirements\n\nAnterisLab Guard is the open-source client SDK for the AnterisLab policy engine. It requires an\nactive AnterisLab subscription to function. A 14-day free tier is available for evaluation.\n\nThe policy engine and kill switch run in the AnterisLab cloud. This SDK provides the client side:\nenforcement, transport, verdict verification, and kill switch coordination.\n\n## Try it without a subscription\n\nThe fastest way to see the SDK in action is the public sandbox. No signup, no\nAPI key, no credit card:\n\n```js\nimport { Guard, GuardBlockedError } from '@anterislab/guard';\n\nconst guard = new Guard({ apiKey: 'anteris_sandbox_public' });\n\ntry {\n  await guard.decide(\n    { type: 'payment', amount: 250, currency: 'EUR' },\n    'billing-bot',\n  );\n} catch (error) {\n  if (error instanceof GuardBlockedError) {\n    console.log('blocked:', error.message);   // sandbox policy: amount > 100\n  }\n}\n\n## Installation\n\n```bash\nnpm install @anterislab/guard\n```\n\n## Minimal usage\n\n```js\nimport { Guard, GuardBlockedError } from '@anterislab/guard';\n\nconst guard = new Guard({ apiKey: process.env.ANTERISLAB_API_KEY });\n\nconst charge = guard.wrapFn(paymentAgent.charge, {\n  agent: 'billing-bot',\n  toAction: (amount) => ({ type: 'payment', amount, currency: 'EUR' }),\n});\n\ntry {\n  await charge(4200);        // if the gate denies, charge() is NOT invoked\n} catch (error) {\n  if (error instanceof GuardBlockedError) {\n    console.error('action denied:', error.message);\n  }\n}\n```\n\n## Full coverage: `wrap()`\n\n`wrap()` protects **every** method on the object. Exceptions are declared one by one:\n\n```js\nconst safe = guard.wrap(agent, { agent: 'billing-bot', passthrough: ['describe'] });\nawait safe.charge(10);     // evaluated\nawait safe.refund(10);     // evaluated\nsafe.describe();           // passthrough, explicitly declared\n```\n\n## Kill switch\n\n```js\nconst guard = new Guard({\n  apiKey: process.env.ANTERISLAB_API_KEY,\n  killSwitch: { tenant: 'acme', agent: 'billing-bot', baseUrl, apiKey },\n});\n\nawait guard.halt('incident in progress', 'INC-1234');   // stops NOW, no round-trip\nawait guard.status();\nawait guard.resume({ reason: 'incident resolved', evidence: 'INC-1234' });\n\nconst stop = await guard.startStream();   // halt via SSE in milliseconds\n```\n\nWith `maxStaleSeconds: 0` the client revalidates state on every action; with the default (90 s) it\nreduces round-trips and relies on server-side enforcement as a second layer.\n\n## Signed verdicts\n\n```js\nnew Guard({ apiKey, verifyVerdict: process.env.ANTERISLAB_VERDICT_SECRET });\n```\n\nWhen `verifyVerdict` is configured, an unsigned positive verdict is **rejected**. The signature\ncovers the exact response body.\n\n## Testing without a subscription\n\nDevelopment and tests do not need a subscription or a live control plane. Import the\npublic mock from the `/mock` subpath:\n\n```js\nimport { Guard } from '@anterislab/guard';\nimport { createMockFetch, approvedVerdict, blockedVerdict } from '@anterislab/guard/mock';\n\nconst mock = createMockFetch({ status: 200, body: approvedVerdict() });\nconst guard = new Guard({ apiKey: 'test-key', fetchImpl: mock.fetch });\n\n// ... run your guarded code ...\n\nmock.evaluateCalls;   // number of calls to /api/v1/evaluate\nmock.calls;           // full request log (url, method, headers, body)\nmock.reset();         // clear the log and restart the responder sequence\n```\n\nThe responder can be:\n\n- a **single route** — the same response for every call;\n- an **array of routes** — successive responses, the last one repeats;\n- a **function** — receives each request and returns a route, useful for\n  kill-switch tests where different URLs return different shapes.\n\nUse `signBody(secret, rawBody)` to produce an HMAC-SHA256 signature in the\nformat `verifyVerdict` expects. The mock never performs a network call and\ncontains no production logic.\n\n## Options\n\n| Option | Default | Description |\n|---|---|---|\n| `apiKey` | — | **Required.** Never appears in URLs, bodies, or error messages. |\n| `baseUrl` | `https://www.anterislab.com` | Control plane origin. Must be listed in `allowedHosts`. |\n| `allowedHosts` | `anterislab.com`, `www.anterislab.com` | Hosts the key is allowed to travel to. |\n| `allowInsecureHttp` | `false` | Allows `http://` **only** on loopback, for development. |\n| `timeoutMs` | `5000` | Covers the entire transaction, including body reads. |\n| `retries` | `1` | Only on transport failures and 5xx. Never on 401/402/403/409. |\n| `maxRetryAfterMs` | `30000` | Maximum delay honored from a `Retry-After`. Beyond that: reject. |\n| `failOpen` | `false` | If the guard is unreachable, proceeds and records `UNAVAILABLE`. **Never raises a real `APPROVED` and never bypasses a 402.** |\n| `verifyVerdict` | — | HMAC secret or custom verifier `(body, signature) => boolean`. |\n| `idempotency` | `true` | `Idempotency-Key` per action, reused across retries. |\n| `expectedAgent` | — | Pins the client to a single agent identity. |\n| `onDecision` | — | Telemetry on every verdict. Cannot change the outcome. |\n| `onPaused` | — | **Notification.** If it resolves, rejects, or throws, the action does not run. |\n\n## Errors\n\n| Class | `code` | What to do |\n|---|---|---|\n| `GuardBlockedError` | `GUARD_BLOCKED` | The policy denied the action. Do not retry: it is a decision. |\n| `GuardPausedError` | `GUARD_PAUSED` | Human review required. Notify and stop. |\n| `GuardHaltedError` | `GUARD_HALTED` | Kill switch is active. Wait for resume. |\n| `GuardQuotaError` | `GUARD_QUOTA_EXCEEDED` | Quota exhausted (`402`). **Terminal.** Upgrade your plan. |\n| `GuardAuthError` | `GUARD_UNAUTHORIZED` (401) / `GUARD_FORBIDDEN` (403) | Credential or perimeter. |\n| `GuardPolicyError` | `GUARD_STALE_POLICY` | `409`, e.g. mismatched `expected_epoch`. |\n| `GuardUnavailableError` | `GUARD_UNAVAILABLE` | Guard unreachable. Fail-closed. |\n| `GuardConfigError` | `GUARD_CONFIG` | Configuration that would weaken guarantees. |\n| `GuardStateInvalidError` | `GUARD_STATE_INVALID` | Kill switch state too stale. |\n\n## Guarantees\n\n1. An unrecognized verdict **does not authorize** (positive allow-list, fail-closed).\n2. `wrap()` covers every method: the error for omission is closed.\n3. `PAUSED` blocks whatever the hook does.\n4. The timeout covers body reads too and does not depend on `fetch`'s `signal`.\n5. `402`, `401`, `403`, `409` are terminal: never retried.\n6. The API key never appears in URLs, bodies, or logs.\n7. A halt arriving during evaluation still stops the action (anti-TOCTOU).\n\n## Documentation\n\nFull documentation lives in [`docs/`](docs/README.md):\n\n- **[Quick start](docs/quick-start.md)** — install and run your first guarded action.\n- **[Configuration](docs/configuration.md)** — every option `new Guard(...)` to accepts.\n- **[Verdict reacts](docs/verdicts.\n.md)** —- what `APPROVED`, `FLAGGED`, `BLOCKED`, and `PAUSED` mean.\n- **[Error handling](docs/error-handling.md)** — the `GuardError` hierarchy and how **[Kill switch](docs/kill-switch.md)** — local halt, verified state, SSE stream.\n- **[Testing](docs/testing.md)** — the public mock, and testing without a subscription.\n- **[Subscription](docs/subscription.md)** — free tier, expiry, and upgrading.\n- **[Security model](docs/security-model.md)** — what the SDK protects against, and what it does not.\n- **[API reference](docs/api-reference.md)** — the complete public surface.\n\nFor vulnerability reporting, see [SECURITY.md](SECURITY.md).\nFor contributing, see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}