anthropics/claude-for-legal-policy-monitor
> PIAs, DPA reviews, and triage results to find policy drift; or direct query for a proposed new practice. Use when the user asks "does our policy cover this", "we want to start doing X — does the policy need updating", "run the policy monitor", "policy sweep", or wants to find where the privacy policy no longer matches what the team actually does.
npx skills add https://github.com/anthropics/claude-for-legal --skill policy-monitor
Sweep mode (no argument or --sweep):
~/.claude/plugins/config/claude-for-legal/privacy-legal/CLAUDE.md → outputs folder path, policy document, last sweep date.~/.claude/plugins/config/claude-for-legal/privacy-legal/CLAUDE.md.Direct query mode (with description argument):
~/.claude/plugins/config/claude-for-legal/privacy-legal/CLAUDE.md → current policy commitments + actual policy document.Schedule: Set up a recurring reminder in your own scheduler (calendar, task manager, or CI) to run /privacy-legal:policy-monitor weekly. Scheduled execution requires a scheduled-tasks integration, which is not bundled with this plugin.
/privacy-legal:policy-monitor
/privacy-legal:policy-monitor "We want to start using behavioral data to personalize onboarding emails"
Privacy policies drift from practice in one direction: practice moves forward,
policy stays behind. A PIA approves a new data category. A DPA is signed with a
subprocessor not listed anywhere. A triage result marks a new use case conditional
with a disclosure requirement that the policy doesn't yet make. Months later,
someone reads the policy and it doesn't reflect what actually happens.
This skill catches the drift before it becomes a problem — either by crawling the
outputs folder weekly, or by answering the direct question: "we're about to start
doing X, what does that mean for the policy?"
The output is always the same: here's the gap, here's the suggested language.
Read ~/.claude/plugins/config/claude-for-legal/privacy-legal/CLAUDE.md:
## Who we are → ## Regulatory footprint — the regimes in scope (GDPR, CCPA / CPRA / other state consumer privacy, GLBA, HIPAA, FERPA, COPPA, VPPA, CPNI, etc.)## Privacy policy commitments — the commitments extracted from the published policy## Outputs — outputs folder path, policy document location, last sweep dateIf ## Outputs contains [PLACEHOLDER]:
> "Outputs aren't configured yet. I can still run a direct-query check — describe
> what you're planning to do and I'll diff it against your current policy. To enable
> the crawl sweep, run /privacy-legal:cold-start-interview and provide the outputs
> folder path."
Read the actual privacy policy document from the path in ## Outputs → **Privacy
policy document**. The commitments in the config CLAUDE.md are a summary; the actual document
is authoritative for suggesting edits.
The website privacy policy is one surface. Modern privacy programs make binding commitments in at least four more places that regulators actively scrutinize for inconsistencies:
Add fields to the practice profile for each surface's location and last-updated date. The sweep checks each against the current policy and flags divergence: "Privacy policy updated [date]. App Store label last updated [earlier date] — may not reflect the new data category. CMP last configured [date] — verify cookie purposes match the policy."
A company with a clean privacy policy and a stale App Store label is a company with an FTC complaint waiting to happen. Sweep the surfaces, not just the document.
The website privacy policy is one notice. Federally-regulated practices require a separate, sector-specific notice that the website policy does not substitute for. If ## Regulatory footprint includes any of the following, the sweep diffs practice against that notice in addition to the website policy — or flags its absence if no such notice has been configured:
| Footprint entry | Sectoral notice to diff against | What to flag |
|---|---|---|
| GLBA / Reg P (financial institution handling NPI) | GLBA initial + annual privacy notice (12 C.F.R. Part 1016, or the functional regulator's equivalent) | Outputs implying new NPI categories, sharing with non-affiliated third parties, or changes to opt-out mechanics that the Reg P notice doesn't reflect. A DPA signed with an analytics vendor receiving NPI with no matching Reg P notice update is a gap. |
| HIPAA (covered entity or BA) | Notice of Privacy Practices (45 C.F.R. § 164.520) | Outputs implying new uses or disclosures, new routine categories, or changes to patient-rights mechanics. A BAA signed with a new subcontractor flowing PHI with no matching NPP refresh is a gap. |
| FERPA (school or school service provider) | Annual directory-information / rights notice (34 C.F.R. § 99.37) | Outputs implying new disclosure categories to service providers under the school-official exception, new directory-information elements, or changes that implicate parental-consent flow-through. |
| COPPA (operator of service directed to children <13) | Direct notice to parents + online notice (16 C.F.R. § 312.4) | Outputs implying new data categories collected from children, new third-party disclosures, or changes to the verifiable-parental-consent mechanic. |
| VPPA / CPNI / DPPA / other sectoral | The regime's specific notice or consent regime | Processing activities the regime restricts that aren't reflected in the configured notice. |
If no sectoral notice is configured for a regime in the footprint, surface this as a standing gap on every sweep, not a one-time finding. The sweep output should include:
> Sectoral notice coverage:
> - [regime]: [configured notice path + last updated, or "NOT CONFIGURED — flag each sweep until resolved"]
If the sweep cannot locate the sectoral notice, say so explicitly — do not silently default to diffing only against the website policy. A fintech DPO relying on a policy-monitor sweep that ignored GLBA would ship with an outdated regulator-facing notice and no warning. Surface the gap loudly.
Ask the user if the footprint is ambiguous. If ## Regulatory footprint says "GDPR / CCPA" but the outputs scan surfaces PHI, NPI, or student data categories, surface the footprint-vs-practice mismatch before proceeding: "Your footprint doesn't list [GLBA / HIPAA / FERPA / COPPA] but this sweep is looking at outputs that involve [category]. Should this regime be added to the footprint, and is there a sectoral notice to diff against?"
Sweep mode: No argument, --sweep, or triggered by schedule.
→ Scan the outputs folder. Diff all outputs since last sweep against current policy.
Direct query mode: User provides a description of a proposed new practice.
→ Diff that practice against current policy. Suggest updates.
Read ## Outputs → Last policy sweep date. Scan for output files in the
outputs folder that are dated after that date. If no date is recorded, scan all
files and note: "First sweep — scanning all outputs."
If the outputs folder is empty or has no new files since the last sweep:
> "No new outputs since [last sweep date]. Policy appears current with recent
> practice. Next scheduled sweep: [date]."
Update Last policy sweep in ~/.claude/plugins/config/claude-for-legal/privacy-legal/CLAUDE.md to today's date after completing the sweep.
PIAs (Privacy Impact Assessments):
retention periods, user rights implications, any conditions placed on the processing
DPA reviews (signed or approved):
any obligations to data subjects created by the DPA terms
categories, new data locations, obligations inconsistent with policy
Triage results (PIA REQUIRED / PROCEED outcomes):
(e.g., "disclosure to affected parties required before launch")
DSAR responses:
any systems added to the systems list
For each flagged item, assess:
REQUIRED update — the policy makes a commitment that this output contradicts, or
the processing is occurring and the policy has no coverage at all. Not updating creates
a material misrepresentation.
> Example: Policy says "we collect name, email, and payment information." A PIA
> approved collection of location data. Policy says nothing about location. That's
> a REQUIRED update — you're collecting data you haven't disclosed.
ADVISABLE update — the policy is silent but not in conflict. The processing is
defensible without updating, but cleaner with it.
> Example: Policy says "we may share data with service providers." A DPA was signed
> with a new analytics vendor. Policy doesn't name the vendor but doesn't exclude
> them either. Advisable to add to a named subprocessor list if one is maintained.
[WORK-PRODUCT HEADER — per plugin config ## Outputs — differs by role; see `## Who's using this`]
# Privacy Policy Monitor — Sweep Report
**Date:** [date]
**Outputs scanned:** [N files] | **New since last sweep:** [N files]
**Gaps found:** [N] REQUIRED | [N] ADVISABLE
---
## REQUIRED updates
### [Gap 1 short name]
**Source:** [filename / output type that triggered this]
**What's happening:** [plain description of the new practice]
**Current policy:** [quote the relevant section — or "No coverage"]
**Gap:** [what's missing or inconsistent]
**Suggested language:**
> *Add to [section name]:*
> "[Drafted policy text — specific, consistent with house style of the actual policy]"
---
[repeat for each REQUIRED gap]
---
## ADVISABLE updates
### [Gap name]
**Source:** [filename]
**What's happening:** [description]
**Current policy:** [quote or "Silent"]
**Suggested language:**
> *Add to / update [section]:*
> "[Drafted text]"
---
## No action needed
[List outputs scanned where no gaps were found — confirms they were reviewed]
---
## Next steps
- [ ] Review REQUIRED updates — each needs a decision before the associated
feature/processing goes live (or immediately if already live)
- [ ] Review ADVISABLE updates — lower urgency but worth addressing at next
policy refresh
- [ ] Next scheduled sweep: [date]
Extract from the user's description:
If the description is vague, ask one clarifying question before proceeding. Don't
run a long intake — this mode should be fast.
Check the proposed practice against every relevant section of the current policy:
| Check | Current policy says | Proposed practice | Verdict |
|---|---|---|---|
| Data categories | [what policy lists] | [new category if any] | 🟢 Covered / 🟡 Gap / 🔴 Conflict |
| Purposes | [stated purposes] | [new purpose] | |
| Third parties / subprocessors | [stated parties] | [new party if any] | |
| Retention | [retention commitment] | [implied retention] | |
| User rights | [rights offered] | [any new rights implications] | |
| Disclosure / notice | [what policy says about telling users] | [what this practice requires] | |
[WORK-PRODUCT HEADER — per plugin config ## Outputs — differs by role; see `## Who's using this`]
# Privacy Policy Check: [Proposed practice in one line]
**Bottom line:** [POLICY UPDATE REQUIRED / ADVISABLE / NO UPDATE NEEDED]
---
## What's covered
[List aspects of the proposed practice already addressed by the current policy —
brief, confirms they don't need to change]
## What's missing
### [Gap 1]
**Current policy:** [quote or "Silent"]
**What's needed:** [why this gap matters — legal, reputational, or consistency reason]
**Suggested language:**
> *Add to [section]:*
> "[Drafted text]"
### [Gap 2]
[same format]
## What conflicts
### [Conflict 1 — if any]
**Current policy says:** [quote]
**Proposed practice does:** [what conflicts]
**Resolution:** [which one needs to change and why — usually the practice adjusts
to match the policy, or the policy gets updated to a defensible new position]
---
## Timing
[If any gap is REQUIRED: "Policy update should happen before this goes live."
If ADVISABLE: "Can proceed; update at next policy refresh."]
Policy language should:
just the config CLAUDE.md summary, before drafting)
break it ("service providers who assist us in operating our business" ages better
than naming every vendor)
location data" if the architecture has that data flowing to an analytics vendor)
sentence addition
When drafting, always say which section to add to. If the right section doesn't
exist, say so and suggest creating it.
Set up a recurring reminder in your own scheduler (calendar, task manager, or CI)
to run /privacy-legal:policy-monitor weekly. Scheduled execution requires a
scheduled-tasks integration, which is not bundled with this plugin.
Whenever the sweep runs, it updates ## Outputs → Last policy sweep in
~/.claude/plugins/config/claude-for-legal/privacy-legal/CLAUDE.md, so the next sweep only looks at new files.
End with the next-steps decision tree per CLAUDE.md ## Outputs. Customize the options to what this skill just produced — the five default branches (draft the X, escalate, get more facts, watch and wait, something else) are a starting point, not a lock-in. The tree is the output; the lawyer picks.
If the sweep surfaced more than ~10 drift findings, or any time the user asks: offer the dashboard (see CLAUDE.md ## Outputs → Dashboard offer for data-heavy outputs). Shape the offer for this output — counts by surface (policy clause / PIA / DPA / triage), counts by severity, and a sortable grid of findings with source artifact and recommended remediation.
decisions, but a human reviews and approves every change.
reg-gap-analysis. This skillmonitors internal practice drift, not external legal changes.
configured folder, the sweep won't find them. The direct-query mode works without
saved outputs.
saved to the configured folder.
Take anthropics/claude-for-legal-policy-monitor from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.