Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ agents, hooks), plugin metadata, or cookbook config — not application code.
.gitignore
external_plugins/<vendor>/ # vendor-maintained plugins (CoCounsel)
managed-agent-cookbooks/<name>/ # CMA agent.yaml + subagents/ + steering-examples.json
scripts/ # validate.py, lint-tool-scope.py, orchestrate.py,
scripts/ # validate.py, lint-tool-scope.py, lint-skill-refs.py,
# lint-cookbook-docs.py, orchestrate.py,
# deploy-managed-agent.sh, test-cookbooks.sh
references/ # shared templates (company-profile, dashboard)
```
Expand All @@ -39,8 +40,21 @@ claude plugin validate external_plugins/cocounsel-legal
# 2. Cookbook tool-scope lint (orchestrators must not over-grant tools)
python3 scripts/lint-tool-scope.py

# 3. JSON/YAML sanity
python3 -c "import json,glob; [json.load(open(f)) for f in glob.glob('**/*.json', recursive=True)]"
# 3. Slash-command refs in prose resolve to real skills (see "Skill names in
# prose must be canonical" below — `claude plugin validate` does not check this)
python3 scripts/lint-skill-refs.py

# 4. Cookbook README security tables match what the YAML actually grants
# (cookbook rule 2 — lint-tool-scope.py only covers rule 1)
python3 scripts/lint-cookbook-docs.py

# 5. JSON/YAML sanity. Note `**/*.json` does NOT match dotfiles, so a bare glob
# silently skips every .claude-plugin/plugin.json and .mcp.json — walk instead.
python3 -c "
import json, pathlib
for f in pathlib.Path('.').rglob('*.json'):
if '.git' not in f.parts: json.load(open(f))
print('json ok')"
```

### Marketplace invariants (I1–I11)
Expand Down
4 changes: 2 additions & 2 deletions corporate-legal/skills/customize/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,8 @@ and without hand-editing YAML.
- *Turning on the Public Company module:* "I'll prompt you for reporting
calendar and disclosure controls next time you run anything in that
area."
- *AI bulk-review trust "check every row" → "spot-check 10%":* "`/ai-tool-
handoff` will QA a 10% sample rather than every extraction."
- *AI bulk-review trust "check every row" → "spot-check 10%":*
"`/ai-tool-handoff` will QA a 10% sample rather than every extraction."

5. **For shared-profile changes** (company name, industry, jurisdictions,
practice setting, stage): write to
Expand Down
11 changes: 6 additions & 5 deletions employment-legal/skills/customize/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,12 @@ interview and without hand-editing YAML.

Examples:
- *Adding Washington to the jurisdictional footprint:* "`/wage-hour-qa`
and `/termination-review` will start applying WA rules. `/handbook-
updates` will prompt for a WA supplement. `/hiring-review` will now
flag non-compete attempts in WA (unenforceable)."
- *Severance framework 2 weeks/year → 4 weeks/year:* "`/termination-
review` will use the new baseline in severance calculations."
and `/termination-review` will start applying WA rules.
`/handbook-updates` will prompt for a WA supplement. `/hiring-review`
will now flag non-compete attempts in WA (unenforceable)."
- *Severance framework 2 weeks/year → 4 weeks/year:*
"`/termination-review` will use the new baseline in severance
calculations."
- *Risk posture middle → conservative:* "I'll flag more terminations for
escalation, recommend more protective release language, and be stricter
on restrictive covenants."
Expand Down
12 changes: 6 additions & 6 deletions ip-legal/skills/cold-start-interview/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ Write `## Who's using this` and `## Available integrations` sections immediately

**What does [your company] do?** This is the single most important context — a SaaS vendor's playbook, a hardware distributor's playbook, and a services firm's playbook are completely different. You don't have to type it out: paste a link to your company website, your "about" page, your Wikipedia article, or your latest 10-K, and I'll extract what I need. Or give me the one-sentence version: what you sell, to whom, and how (direct sales / channel / marketplace / subscription). If you're a private practice firm, the same applies to the clients you do most of your IP work for.

> Which IP areas do you actually work in? I'll skip questions in the ones you don't. (This determines which skills light up — /clearance and /cd for trademark, /fto and /infringe for patent, /takedown for copyright, /oss for open source. Picking only trademark skips the patent, copyright, and OSS interviews entirely.)
> Which IP areas do you actually work in? I'll skip questions in the ones you don't. (This determines which skills light up — /clearance and /cease-desist for trademark, /fto-triage and /infringement-triage for patent, /takedown for copyright, /oss-review for open source. Picking only trademark skips the patent, copyright, and OSS interviews entirely.)
>
> - **Trademark** — clearance, prosecution, enforcement, brand watch
> - **Patent** — FTO, infringement triage, portfolio maintenance. *(Not claim drafting — this plugin doesn't go there.)*
Expand All @@ -302,7 +302,7 @@ Record in the practice profile as context, not a gate. Volume affects the cadenc

### Part 2: Jurisdiction footprint (1-2 minutes)

> Where do you hold registrations and where do you enforce? (This feeds /clearance, /fto, /portfolio — every clearance check and FTO triage needs to know which jurisdictions matter, and the portfolio register tracks renewals in each one.)
> Where do you hold registrations and where do you enforce? (This feeds /clearance, /fto-triage, /portfolio — every clearance check and FTO triage needs to know which jurisdictions matter, and the portfolio register tracks renewals in each one.)
>
> - **Marks registered in:** US (USPTO)? EU (EUIPO)? UK (UKIPO)? Madrid member states — which? National filings elsewhere? Common-law only?
> - **Patents granted in:** US? EPO? PCT national phase countries? Any specific jurisdictions that matter (Germany, Japan, China)?
Expand All @@ -316,7 +316,7 @@ Record in `## IP practice profile` under `Registered in:`, and note enforcement

Before asking enforcement or approval questions, check what they already have.

> Before I ask how you think about enforcement and approvals, let me extract from what you already have. Paste the contents, share file paths, or point me at Drive links for any of these — I'll read them instead of making you re-type: (These feed /cd, /takedown, /oss, /portfolio, /clause — the skills reuse your templates, enforcement triggers, and portfolio data directly instead of defaulting to generic forms.)
> Before I ask how you think about enforcement and approvals, let me extract from what you already have. Paste the contents, share file paths, or point me at Drive links for any of these — I'll read them instead of making you re-type: (These feed /cease-desist, /takedown, /oss-review, /portfolio, /ip-clause-review — the skills reuse your templates, enforcement triggers, and portfolio data directly instead of defaulting to generic forms.)
>
> - **Portfolio list** (from your IP management system, or a spreadsheet) — mark / patent / copyright registrations with jurisdictions, status, renewal dates
> - **Brand guidelines** — the trademark-use guide, brand book, or house rules for external parties
Expand All @@ -336,7 +336,7 @@ Record the documents in `## IP practice profile` under a `Seed documents reviewe

### Part 4: Enforcement posture (2-3 minutes)

> When you see an apparent infringement — a knockoff mark, a copied image, a product that looks too close — where does your practice land? (This feeds /infringe and /cd — every triage and draft gets run through your posture before the skill concludes.)
> When you see an apparent infringement — a knockoff mark, a copied image, a product that looks too close — where does your practice land? (This feeds /infringement-triage and /cease-desist — every triage and draft gets run through your posture before the skill concludes.)
>
> - **Aggressive** — you send C&Ds early, you're willing to file.
> - **Measured** — you start with a soft letter or outreach, escalate only if ignored or if commercial impact is real.
Expand All @@ -352,7 +352,7 @@ Then drill in:

**Who approves sending?** Ask one batch:

> Who signs off on each of these before they go out? (This feeds /cd and /takedown — when you tell the skill to draft a letter, it runs the draft through the named approver and waits for sign-off before it goes anywhere.)
> Who signs off on each of these before they go out? (This feeds /cease-desist and /takedown — when you tell the skill to draft a letter, it runs the draft through the named approver and waits for sign-off before it goes anywhere.)
>
> - **DMCA takedown (ordinary):** often delegated to counsel or brand protection; who owns it on your team?
> - **Soft letter:** same question.
Expand Down Expand Up @@ -383,7 +383,7 @@ Record in `## Enforcement posture` as escalation routing, not as a separate sect

Skip if the user does not practice trademark.

> Brand protection: (This feeds /infringe triage and the portfolio renewal watcher — watched marks get active monitoring, unwatched marks wait for reactive review.)
> Brand protection: (This feeds /infringement-triage and the portfolio renewal watcher — watched marks get active monitoring, unwatched marks wait for reactive review.)
>
> - **Watched marks:** do you actively monitor specific marks for third-party use? List them, or say "none — reactive only."
> - **Watch jurisdictions:** US / EU / UK / global via watch service?
Expand Down
2 changes: 1 addition & 1 deletion legal-clinic/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,4 +185,4 @@ legal-clinic/

## Prerequisites

Some features reference external integrations (document management, launch trackers, eDiscovery, case management, regulatory feeds). These are not bundled — if you have an MCP server for one of these in your environment, the relevant features will use it. Without one, the plugin falls back to file upload and manual workflows. Run `/legal-clinicgrations` to see what's available in your environment.
Some features reference external integrations (document management, launch trackers, eDiscovery, case management, regulatory feeds). These are not bundled — if you have an MCP server for one of these in your environment, the relevant features will use it. Without one, the plugin falls back to file upload and manual workflows. Run `/legal-clinic:cold-start-interview --check-integrations` to see what's available in your environment.
2 changes: 1 addition & 1 deletion litigation-legal/skills/matter-intake/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ Behavior by status:
rationale: [why conflicts were bypassed — permanent record; does not auto-expire]
```

This field is visible in every `/portfolio-status`, every `/matter` briefing, and every `/matter-update` until removed. It is never removed by the skill — only by explicit user edit to `_log.yaml` after conflicts are actually cleared.
This field is visible in every `/portfolio-status`, every `/matter-briefing`, and every `/matter-update` until removed. It is never removed by the skill — only by explicit user edit to `_log.yaml` after conflicts are actually cleared.

**Do not proceed silently.** "I'll do it later" is not an acceptable response. One of Path 1/2/3 must be chosen, and the choice is captured in the record.

Expand Down
10 changes: 5 additions & 5 deletions managed-agent-cookbooks/diligence-grid/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ Same source as the [`corporate-legal`](../../corporate-legal) plugin — this di
export ANTHROPIC_API_KEY=sk-ant-...
export BOX_MCP_URL=...
export GDRIVE_MCP_URL=...
export IMANAGE_MCP_URL=... # optional; set the toolset default to enabled if used
export DEFINELY_MCP_URL=... # optional; for clause-structure QA of the normalizer pass
export IMANAGE_MCP_URL=... # optional; enable the toolset in subagents/doc-reader.yaml if used
../../scripts/deploy-managed-agent.sh diligence-grid
```

Expand All @@ -37,10 +36,11 @@ VDR documents — contracts, board minutes, side letters, counterparty uploads

| Tier | Touches untrusted docs? | Tools | Connectors |
|---|---|---|---|
| **`doc-reader`** | **Yes** (read-only) | `Read`, `Grep` | Box, Google Drive, iManage (read) |
| **`doc-reader`** | **Yes** (read-only) | `Read`, `Grep` | Box, Google Drive (read-only); iManage off by default |
| **`extractor`** | **Yes** (read-only) | `Read`, `Grep` | None |
| `normalizer` / Orchestrator | No | `Read`, `Grep`, `Glob`, `Agent` | None (definely optional, read-only) |
| `normalizer` | No | `Read`, `Grep` | None |
| **`grid-writer`** (Write-holder) | No | `Read`, `Write` | None |
| Orchestrator | No | `Read`, `Grep`, `Glob`, `Agent` | None |

`doc-reader` and `extractor` return length-capped, schema-validated JSON. The orchestrator and `normalizer` see only structured data. `grid-writer` produces `./out/diligence-grid-<date>.csv`, `./out/diligence-grid-<date>_sources.csv`, and `./out/diligence-grid-<date>-summary.md`.

Expand All @@ -52,7 +52,7 @@ VDR documents — contracts, board minutes, side letters, counterparty uploads

## Adaptation notes

- **VDR URL.** Set `BOX_MCP_URL` / `GDRIVE_MCP_URL` / `IMANAGE_MCP_URL` to match your data room. The default enables Box and Google Drive; flip the `default_config` in [`agent.yaml`](./agent.yaml) if you run iManage or Datasite as primary. If your VDR is Intralinks or Datasite, add an entry to `mcp_servers` and `tools` with the matching MCP URL.
- **VDR URL.** Set `BOX_MCP_URL` / `GDRIVE_MCP_URL` / `IMANAGE_MCP_URL` to match your data room. The default enables Box and Google Drive; flip the `default_config` on the `imanage` entry in [`subagents/doc-reader.yaml`](./subagents/doc-reader.yaml) if you run iManage as primary. If your VDR is Intralinks or Datasite, declare it in the orchestrator's `mcp_servers` and add the matching `mcp_toolset` to `doc-reader` — not to `agent.yaml`'s `tools`, which must stay local-only.
- **Column schema.** The M&A diligence standard in [`corporate-legal/skills/tabular-review/references/ma-diligence-columns.md`](../../corporate-legal/skills/tabular-review/references/ma-diligence-columns.md) is the default. Customize for your deal type — tech/IP, healthcare, real estate, government contractor, regulated financial — using the additions in that reference.
- **Output destination.** Outputs land in `./out/`. Wire them to your deal folder, Google Drive, iManage workspace, or Box folder through your deploy pipeline. Do not give `grid-writer` an MCP to upload them; a handoff to your upload step is cleaner and keeps the Write tier isolated.
- **Default mode.** Watch vs grid is selected per steering event. If your workflow is almost always one or the other, seed the steering event template in your orchestrator accordingly.
Expand Down
1 change: 0 additions & 1 deletion managed-agent-cookbooks/diligence-grid/agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ mcp_servers:
- { type: url, name: box, url: "${BOX_MCP_URL}" }
- { type: url, name: gdrive, url: "${GDRIVE_MCP_URL}" }
- { type: url, name: imanage, url: "${IMANAGE_MCP_URL}" }
- { type: url, name: definely, url: "${DEFINELY_MCP_URL}" }

skills:
- { from_plugin: ../../corporate-legal }
Expand Down
7 changes: 4 additions & 3 deletions managed-agent-cookbooks/docket-watcher/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ Same source as the [`docket-watcher`](../../litigation-legal/agents/docket-watch
export ANTHROPIC_API_KEY=sk-ant-...
export TRELLIS_MCP_URL=...
export COURTLISTENER_MCP_URL=...
export GDRIVE_MCP_URL=...
../../scripts/deploy-managed-agent.sh docket-watcher
```

Expand All @@ -34,16 +33,18 @@ Court filings are public records, but they are also UNTRUSTED INPUT. The filer c
| Tier | Touches filings? | Tools | Connectors |
|---|---|---|---|
| **`docket-reader`** | **Yes** | `Read`, `Grep` only | trellis, courtlistener (read-only) |
| `deadline-mapper` / Orchestrator | No — sees structured JSON only | `Read`, `Grep`, `Glob`, `Agent` | gdrive (jurisdiction config, read-only) |
| `deadline-mapper` | No — sees structured JSON only | `Read`, `Grep` | None |
| **`tracker-writer`** (Write-holder) | No | `Read`, `Write`, `Edit` | None |
| Orchestrator | No — sees structured JSON only | `Read`, `Grep`, `Glob`, `Agent` | None |

`docket-reader` returns length-capped, schema-validated JSON. `deadline-mapper` has no MCP and no web — it applies rules the deploying team has configured. `tracker-writer` produces `./out/docket-report-<date>.md` and `./out/deadlines.yaml` and never sees raw filings.

## Adaptation notes

This cookbook is a starting point. It will not work in production until you have done the following:

- **Set the MCP URLs.** `TRELLIS_MCP_URL` and `COURTLISTENER_MCP_URL` must point at your deployment's endpoints, with whatever authentication your platform requires. `GDRIVE_MCP_URL` (or a substitute) points at wherever your jurisdiction-rule tables live.
- **Set the MCP URLs.** `TRELLIS_MCP_URL` and `COURTLISTENER_MCP_URL` must point at your deployment's endpoints, with whatever authentication your platform requires. Both are granted to `docket-reader` only.
- **Supply the jurisdiction-rule tables locally.** `deadline-mapper` has no MCP and no network, so it reads the rule tables off the local filesystem. Sync them into the deploying team's litigation-legal config path before the first run — there is no connector that will fetch them at runtime.
- **Load the portfolio.** The agent reads `matters/_log.yaml` plus the per-matter `docket_id` and `court` from the deploying team's litigation-legal configuration. If your docketing system is the source of truth, front it with an MCP or a scheduled sync into the config path.
- **Configure jurisdiction rules.** Ship the deadline-mapper a local-rule table for every court in your portfolio. Federal rules you can encode once; state trial courts and individual judges are where the landmines live. An unknown court should produce `confidence: low` + `needs_verification: true`, never a silent default.
- **Wire delivery.** Decide where the output goes: your docketing system ingests `./out/deadlines.yaml`; the narrative report goes to Slack, email, or your matter management workspace; critical flags route to whoever you want woken up.
Expand Down
5 changes: 2 additions & 3 deletions managed-agent-cookbooks/docket-watcher/agent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ system:
read cleaner — loud is correct.

tools:
# Orchestrator is scoped to local-only tools; MCP and web_fetch are held by
# the subagent leaves (see callable_agents).
# Orchestrator is scoped to local-only tools; MCP is held by the
# subagent leaves (see callable_agents).
- type: agent_toolset_20260401
default_config: { enabled: false }
configs:
Expand All @@ -40,7 +40,6 @@ tools:
mcp_servers:
- { type: url, name: trellis, url: "${TRELLIS_MCP_URL}" }
- { type: url, name: courtlistener, url: "${COURTLISTENER_MCP_URL}" }
- { type: url, name: gdrive, url: "${GDRIVE_MCP_URL}" }

skills:
- { from_plugin: ../../litigation-legal }
Expand Down
7 changes: 4 additions & 3 deletions managed-agent-cookbooks/launch-radar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ This is a **cookbook, not a product.** It will not work out of the box. You need

```bash
export ANTHROPIC_API_KEY=sk-ant-...
export LINEAR_MCP_URL=... ATLASSIAN_MCP_URL=... ASANA_MCP_URL=... GDRIVE_MCP_URL=...
export LINEAR_MCP_URL=... ATLASSIAN_MCP_URL=... ASANA_MCP_URL=...
../../scripts/deploy-managed-agent.sh launch-radar
```

Only set the MCP URLs for the trackers you actually use. The orchestrator and `tracker-reader` skip MCPs that aren't configured.
Only set the MCP URLs for the trackers you actually use. `tracker-reader` — the only component with MCP access — skips MCPs that aren't configured.

## Steering events

Expand All @@ -34,8 +34,9 @@ Tracker tickets are untrusted input. A product manager can put arbitrary text in
| Tier | Touches untrusted tracker content? | Tools | Connectors |
|---|---|---|---|
| **`tracker-reader`** | **Yes** | `Read`, `Grep` only | Linear, Jira (atlassian), Asana (read-only) |
| `risk-classifier` / Orchestrator | No | `Read`, `Grep`, `Glob`, `Agent` | Orchestrator only: Linear / Jira / Asana / Drive (read-only) |
| `risk-classifier` | No | `Read`, `Grep` | None |
| **`memo-writer`** (Write-holder) | No | `Read`, `Write`, `Edit` | None |
| Orchestrator | No | `Read`, `Grep`, `Glob`, `Agent` | None |

`tracker-reader` returns a length-capped, schema-validated JSON list of launches. `risk-classifier` has no MCP and no network; it works from the validated list plus the user's calibration file. `memo-writer` is the only worker with Write, and produces `./out/launch-radar-<date>.md`. The orchestrator holds no Write and never parses raw ticket bodies itself.

Expand Down
Loading
Loading