Watchlight — Developer Edition
Govern an AI agent in five minutes. One install, zero infrastructure, same API as production.
Watchlight is an Agent Runtime Governance Control Plane — it puts a policy decision point in front of every action your AI agents take, authorizing tool calls and recording a tamper-evident, value-free audit trail.
The Developer Edition is the free, open front door to it. It runs the real
authorization engine in-process, so you can add a governed ALLOW / DENY
to your agent on your own laptop — no server, no database, no signup. It's for
evaluating the model and shipping governed agents; the code you write here is the
code you run in production — going to production is pointing the same code at the
running control plane, not a rewrite.
For enterprises, Watchlight provides the wider Agent Runtime Governance Control Plane: signed, tamper-evident lineage; multi-tenant isolation; drift & anomaly detection → automatic quarantine; and fleet-wide revocation across every agent and environment. → watchlight.ai
How the pieces fit together
your code · agents · tools
┌─────────────┬──────────────────┬──────────────┬─────────────┐
│ @govern.tool│ LangGraph / │ MCP client │ custom app │
│ (decorator) │ Pydantic AI / │ (any tool) │ │
│ │ Claude Agent │ │ │
└──────┬──────┴────────┬─────────┴──────┬───────┴──────┬──────┘
│ │ │ │
watchlight watchlight.<fw> watchlight-mcp watchlight
(govern) .governed_plugin (PEP · MCP spec) SDK
└───────────────┴───────┬────────┴──────────────┘
▼
┌───────────────────────────────┐
│ Watchlight engine · Cedar │ the REAL engine,
│ in-process · zero infra │ a compiled wheel
└───────────────┬───────────────┘
PERMIT ─ forward │ ─ DENY (blocked before execution)
▼
value-free audit → .watchlight/audit.jsonl
▼
watchlight dev · http://localhost:7000
Production = the SAME code, pointed at the governed control plane
(signed audit · multi-tenant · drift→quarantine · fleet revocation).
| Package | You use it for |
|---|---|
watchlight |
the govern decorator + the watchlight dev dashboard |
watchlight[langgraph|pydantic-ai|claude-agent] |
govern an existing framework agent |
watchlight-agent-sdk |
the lifecycle SDK — InProcessClient, sessions, preflight, local lineage (imports as watchlight_core) |
watchlight-mcp |
govern an MCP server (a policy enforcement point) |
watchlight-engine |
the compiled in-process engine (pulled in automatically) |
watchlight[all] |
one install for the whole DE — SDK + every plugin + the MCP PEP; runs every example in the docs |
Just want everything?
pip install "watchlight[all]"pulls the SDK, all framework plugins, and the MCP PEP in one go — so every example on docs.watchlight.ai/de runs with a single install. Note the SDK's module name iswatchlight_core(there is nowatchlight-corepackage on PyPI).
Runnable, self-contained examples for every one of these are in
examples/ — start with
examples/governed_research_agent.py.
Quickstart
The
governdecorator,watchlight dev, and the framework + MCP integrations below all work today. Full guide: Developer Edition docs.
pip install watchlight
from watchlight import govern
@govern.tool(intent="research")
def web_search(query: str) -> str:
...
@govern.tool(intent="transfer") # governed, but no policy permits it
def transfer_funds(to: str, amount: int) -> str:
...
$ python agent.py
watchlight: governing 'my-agent' (dev mode, in-process engine)
watchlight: ALLOW read tool/web_search
watchlight: DENY execute tool/transfer_funds no matching policy
That DENY line — in your own terminal, in under five minutes, with no
account — is the product.
Already using a framework? Govern it in-process
Bring your existing LangGraph, Pydantic AI, or Claude Agent SDK agent under governance with zero infrastructure — the same plugin you ship to production, wired to the in-process engine:
pip install 'watchlight[langgraph]' # or [pydantic-ai], [claude-agent]
from watchlight.langgraph import governed_plugin # .pydantic_ai / .claude_agent
plugin = governed_plugin("watchlight.policy.json") # in-process, zero infra
async with await plugin.start_run("research-agent") as handle:
if not await handle.authorize_action("read", "tool/web_search"):
raise PermissionError("denied before it executed")
... # your tool runs, every action governed + recorded to .watchlight/audit.jsonl
Going to production is one environment variable, not a rewrite — set
WATCHLIGHT_APDP_URL and the identical code authorizes against a running policy
service. Runnable examples for all three frameworks are in
examples/.
Watch every decision live — watchlight dev
A zero-dependency local dashboard that tails your value-free audit trail and shows every governance decision as it happens — the ALLOWs, and the DENYs that stopped a tool before it ran.
watchlight dev # → http://127.0.0.1:7000
Run your governed agent in another terminal and watch the decisions stream in. It shows only this process — fleet-wide lineage, signed audit, and drift→quarantine are the governed control plane (Enterprise).
Govern an MCP server
Put a policy decision point in front of any MCP
server (spec 2026-07-28). Every governed call — tools/call, resources/read,
resources/subscribe, prompts/get — is authorized in-process before it
reaches the server, so a denied call never executes.
pip install watchlight-mcp
import watchlight_mcp
watchlight_mcp.serve(
listen_addr="127.0.0.1:9700",
upstream_url="http://localhost:3000/mcp", # the MCP server you're governing
upstream_server="github",
policy_files=["examples/mcp.policy.json"],
audit_path=".watchlight/audit.jsonl", # ← the file `watchlight dev` tails
)
Point your MCP client at http://127.0.0.1:9700/mcp instead of the server. A
self-contained, self-demonstrating example (it fires an allowed and a denied
call and proves the denied one never ran) is in
examples/governed_mcp_server.py.
For a stdio-launched server use serve_stdio(...); to run non-blocking and
hot-reload policies use serve_background(...). Pass tls_cert=/tls_key= to
terminate HTTPS on the listener, and upstream_ca= to trust a private
https:// upstream. See the MCP server guide.
Watch the MCP decisions live
watchlight dev tails .watchlight/audit.jsonl — so give the PEP the same
audit_path (above) and run the console beside it, from the same directory:
# terminal 1 — the governed MCP server, auditing to the file the console tails
python examples/governed_mcp_server.py
# terminal 2 — the live console
watchlight dev # → http://127.0.0.1:7000
Every tools/call decision streams in — the tool, the upstream it fronts, and
the reason a call was denied. (The example prints the exact
watchlight dev --audit … command for its own audit file.)
What runs locally
| Capability | Developer Edition (free / open) | Enterprise |
|---|---|---|
| Policy engine | in-process Cedar, policies from a local .cedar file |
a running, scaled policy service |
| Sub-agent scope attenuation | engine-side strict-subset validation | same, server-side |
| Content / PII screening | policy-based, in-process | a running guardrails service |
| Audit | local JSONL, greppable, value-free | a signed, tamper-evident audit service |
| Dashboard | watchlight dev → localhost:7000 (policies + execution lineage) |
the full operator console |
Everything the Developer Edition removes is infrastructure, never a guarantee. Fail-closed semantics, engine-side attenuation, explicit scopes, and value-free audit are identical in every mode.
Open source, and the compiled engine
Everything you write against is open and Apache-2.0 — read it, audit it, fork it:
watchlight— thegoverndecorator,govern.scopeattenuation, the CLI, and thewatchlight devdashboard- the framework plugins —
watchlight-langgraph,watchlight-pydantic-ai,watchlight-claude-agent - the MCP PEP's transport layer, and every example in this repo
The decision engine ships as a compiled wheel — watchlight-engine (the Cedar authorization pipeline) and the watchlight-mcp runtime — both free to use, including in production. The engine source is the part Watchlight sells; the code you integrate with is not.
You don't have to trust a black box to trust the decisions:
- The policy language is open. Decisions are standard Cedar — an open, formally-specified language; the same policy yields the same decision, deterministically.
- The integration layer is open. The SDK, plugins, CLI, and PEP transport are all readable here, so you can see exactly what the engine is asked and what it returns.
- Every decision is on disk. Each
ALLOW/DENYis appended, value-free, to.watchlight/audit.jsonl— inspect the engine's behaviour on your own machine, tool by tool.
Want the engine source or an air-gapped build? That's Enterprise — email sales@watchlight.ai.
A note on identity
The Developer Edition authorizes the principal you assert — the agent you construct the governor with, or the Watchlight-Agent-Id a governed MCP request carries. It does not cryptographically prove the caller: on your own machine, running both sides, that's the right trade — zero setup, no IdP, no signup. Bind any non-loopback listener behind something that authenticates the caller (a reverse proxy doing mTLS/OIDC, or the Enterprise plane).
Identity hardens as you grow, without changing your policies:
- Developer Edition — the principal is asserted (cooperative, local-dev).
- Next — an optional signed session token binds the principal to a key your process holds, so a prompt-injected sub-agent can't rewrite a header to escalate — still no external infrastructure.
- Enterprise — identity is attested: federated (OIDC) and workload (mTLS) identity, cryptographically verified across the fleet.
Only how strongly the principal is proven changes between these — the policies you write do not.
Progressive disclosure
Each level is one environment variable away from the next. Nothing is rewritten between levels.
- Level 0 —
pip install watchlight. In-process engine, audit to stdout. - Level 1 —
watchlight dev. Adds a local dashboard (decisions, denials, scope tree, execution lineage). - Level 2 —
docker compose up. Real policy service + database; policies still from your local file. - Level 3 — Production. The full governed platform.
Deploying to production? We're glad to help you get there — email sales@watchlight.ai and we'll help you plan the rollout.
Developer Edition vs Enterprise
The Developer Edition is the real engine — free, open, and running in-process so you can evaluate the entire authorization model on your laptop with zero infrastructure. Enterprise is the same code pointed at the governed control plane; it doesn't replace anything, it adds what a fleet in production needs:
- Signed, tamper-evident lineage & audit — every decision and lineage event cryptographically signed (KMS-backed), so the trail is court-defensible.
- Multi-tenant isolation + roll-up administration — tenant hierarchy, scoped admins, and a cross-tenant authorization matrix.
- Drift & anomaly detection → automatic quarantine — behavioural, goal-drift, and argument-shape detectors that quarantine a misbehaving agent before the next action.
- Full enforcement-effect taxonomy — beyond allow/deny: block, terminate, quarantine, sever-subtree, and revoke, enforced at runtime across the plane.
- Fleet-wide revocation & cross-environment governance — revoke authority across every agent at once, and govern dev, staging, and prod under one authority model (including sovereign / air-gapped deployment).
- Content / PII guardrails service and global execution-graph lineage with the full operator console.
- SSO / RBAC / enterprise audit, high availability, support, and SLAs.
You've outgrown the Developer Edition when…
- Compliance asks "prove who authorized this in production" → you need signed, tamper-evident lineage.
- You're governing more than one agent, or more than one environment → central policy lifecycle + the global execution graph.
- Security wants a misbehaving agent stopped before its next action → drift/anomaly detection → automatic quarantine.
- You need to revoke authority fleet-wide, not process-by-process.
- Procurement needs SSO, RBAC, HA, SLAs, or sovereign/air-gapped deployment.
Each of these is a governance guarantee a single in-process engine structurally cannot provide — it needs the control plane.
Migrating is one environment variable — never a rewrite. The tools you decorate, the policies you write, and the guarantees you rely on (fail-closed, engine-side attenuation, explicit scopes, value-free audit) are identical in every mode. Enterprise simply points the same code at a running plane.
The engine ships as a compiled wheel and the Developer Edition is a deliberate subset of the platform — the governed control plane (signing, multi-tenant, guardrails, drift, execution-graph) is the enterprise product, never bundled here.
→ Talk to us about Enterprise when you're ready for production.
License
The Developer-Edition SDK, the framework plugins, this repository, and the
watchlight dev dashboard are Apache-2.0 — use, fork, and ship them freely.
The authorization engine (watchlight-engine) and the MCP runtime
(watchlight-mcp) ship as compiled wheels under the Watchlight Developer
Edition license; they are free to use, including in production.
Want the engine source, an air-gapped build, or to govern a fleet in production? That's the Enterprise plane — email sales@watchlight.ai.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file watchlight-0.3.0.tar.gz.
File metadata
- Download URL: watchlight-0.3.0.tar.gz
- Upload date:
- Size: 34.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2acc92327e99dbbd5351efd69a2607b660e2ef65144404bdcdaf64f23454d04
|
|
| MD5 |
9173a8f47d4d5ca24041e398a519b6b4
|
|
| BLAKE2b-256 |
f68884228537264465fed3ef3fdaced393b5d52cf99de223ef445185ef5069eb
|
Provenance
The following attestation bundles were made for watchlight-0.3.0.tar.gz:
Publisher:
publish.yml on watchlight-ai-beacon/watchlight-de
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
watchlight-0.3.0.tar.gz -
Subject digest:
d2acc92327e99dbbd5351efd69a2607b660e2ef65144404bdcdaf64f23454d04 - Sigstore transparency entry: 2628832582
- Sigstore integration time:
-
Permalink:
watchlight-ai-beacon/watchlight-de@0271f939ba513b4774b643cb892727558af0a7be -
Branch / Tag:
refs/heads/main - Owner: https://github.com/watchlight-ai-beacon
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0271f939ba513b4774b643cb892727558af0a7be -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file watchlight-0.3.0-py3-none-any.whl.
File metadata
- Download URL: watchlight-0.3.0-py3-none-any.whl
- Upload date:
- Size: 30.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ca0c39919f927d38483a171294b2c73e31472b91ba755bd77d79fc1f02d4b208
|
|
| MD5 |
439fac5a8fb23c2ef697c36b6d940efb
|
|
| BLAKE2b-256 |
7bb6780f6f8b11c8f41e8d32142d3edbd6d53f9c8fcfcd9bb5b6f913f9cb876f
|
Provenance
The following attestation bundles were made for watchlight-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on watchlight-ai-beacon/watchlight-de
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
watchlight-0.3.0-py3-none-any.whl -
Subject digest:
ca0c39919f927d38483a171294b2c73e31472b91ba755bd77d79fc1f02d4b208 - Sigstore transparency entry: 2628832585
- Sigstore integration time:
-
Permalink:
watchlight-ai-beacon/watchlight-de@0271f939ba513b4774b643cb892727558af0a7be -
Branch / Tag:
refs/heads/main - Owner: https://github.com/watchlight-ai-beacon
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0271f939ba513b4774b643cb892727558af0a7be -
Trigger Event:
workflow_dispatch
-
Statement type: