Legal Research: You Discover, the Harness Grounds
A Relex draft may only cite law whose verbatim text sits in the global cache
— the server's verifier rejects anything else. Your web results and memory can
never ground a citation; they only find what to ground. So:
discover (you: web + public legal MCPs)
→ directive (POST /research/scrape — the harness caches VERBATIM text)
→ ground (the case agent cites the cached text; verifier enforces)
Epistemic discipline while discovering is relex-citations — in short: no
docket numbers, margin numbers or quotes from model memory, ever.
Step 1 — know what the harness can fetch
execute GET /research/sources — the live registry. enabled: true sources
can be fetched-and-cached by directive. Everything else is discovery-only:
you research it yourself and pass the best official URL as sourceHint, or the
harness falls back to its generic fetch ladder.
Step 2 — discover (your job)
Use your own WebSearch/WebFetch and, when connected, public legal MCPs. Prefer
official/free sources; identify the authority in anchor form — topic, court/
bench, date if known, official source to verify in — never a memorized citation.
| Jurisdiction |
Best discovery channels |
| US |
CourtListener official MCP (mcp.courtlistener.com) — case law, dockets, citation check; GovInfo/eCFR for federal statutes/regs; LOCUS for local ordinances (below) |
| DE |
NeuRIS (rechtsinformationen.bund.de) — new official statutes+case-law API; gesetze-im-internet |
| CH |
entscheidsuche.ch (+ its MCP) — BGer + all cantons; Fedlex |
| UK |
legislation.gov.uk (open API); Find Case Law (National Archives) |
| FR |
justicelibre MCP (no key, ~3M decisions); Légifrance |
| IT |
normattiva.it / dati.normattiva.it; SentenzeWeb (last ~5y Cassazione, free) |
| ES |
BOE consolidated-law API (statutes) |
| RO |
legislatie.just.ro; rejust.ro (decisions); portal.just.ro (dockets) |
| EU |
EUR-Lex + CELLAR SPARQL (no auth); CURIA via ECLI |
| CA |
CanLII (metadata/citator via API), laws-lois.justice.gc.ca |
| JP |
e-Gov Laws API; courts.go.jp (selected decisions) |
| AU |
AustLII (read, don't bulk-scrape); legislation.gov.au |
Per-jurisdiction method, citation schema and source whitelists live in the
../jurisdictions/<XX>.md packs when installed.
Compliance limits you must respect during discovery (encode in your plan):
UK Find Case Law bulk/computational use needs a licence — read individual
decisions, let the harness handle caching lawfully; Spain CENDOJ prohibits bulk
reuse (read single decisions only); CanLII full text is site-only per its terms;
AustLII discourages scraping. When a channel is restricted, discovery stays
manual-and-targeted and the sourceHint you pass is the official page.
Step 3 — directive (the harness's job)
POST /research/scrape grounds one authority — params via search
(jurisdiction, code, article, authorityType = statute | case_law |
regulator, sourceHint?, caseId? for provenance; results are a shared cache).
- Cache-first:
status: "cached" means it's already grounded — done.
status: "enqueued" → poll GET /research/scrape/{jobId} until ingested,
then trigger a case-agent re-reason turn so it locks the issue to the text.
status: "cooldown" → a recent fetch failed; give a better sourceHint later.
- Targeted only: directives are for the citations a draft actually needs
(the case's
pending_citations / your audit's grounding gaps). Never bulk.
There's a modest daily cap; case law behind rate-limited APIs (CourtListener
free tier) makes every directive count.
- US case law is now harness-groundable:
us_courtlistener is a provisioned
source, so POST /research/scrape with authorityType: "case_law" fetches the
opinion's verbatim text directly (no HTML-ladder fallback). Always re-check
GET /research/sources for the live enabled set rather than assuming.
- Shared quota, not per-user: the CourtListener token is ONE credential for
the whole deployment — every directive across every user draws from the same
free-tier bucket (as of the May 2026 policy change: 5/min, 50/hr, 125/day).
This is a stronger reason to keep directives targeted (above): a burst of
bulk requests from one case can throttle every other case's case-law
grounding for the rest of the day.
- For case law, put court in
code and docket/ECLI/reporter cite in article
(e.g. code: "Cass. 1re civ.", article: "21-12.345"), authorityType: "case_law", and the decision URL you found as sourceHint.
LOCUS — US local ordinances (two vantage points, one corpus)
- Grounding path (backend):
execute GET /research/locus?state=CA&city=…&query=…
→ discovery results with coverage: matched / covered_no_match (broaden
terms) / not_in_locus (fall back to web; NEVER invent an ordinance). Then
GET /research/locus?locusId=… fetches the section's verbatim public-domain
text for citation-grade grounding.
- Analysis path (yours, optional): the LOCUS dataset
(
huggingface.co/datasets/LocalLaws/LOCUS-v1, paper "Freeing the Law with
LOCUS") also carries analytical layers (topic, function, enforcement-
discretion, opacity, paternalism scores) under CC-BY-NC-4.0. You may read
those yourself (HF datasets-server /rows) to shape strategy — keep that
analysis on your side (it is non-commercial-licensed; the Relex backend never
serves it), attribute the corpus, and still ground any citation through the
backend path above.
- The case agent runs its own LOCUS search on local-law questions; read its
coverage verdicts from the case before duplicating a search.
Anti-patterns
- Citing from your web page reads ("the court held… [link]") in a draft — the
verifier will reject it; issue the directive and cite the cached text.
- Directive-spamming a jurisdiction "to have it all" — targeted grounding only.
- Treating a refused/blocked source as an error — restricted sources are
discovery-only by design; route around with
sourceHint.
1---2name: relex-research3description: Use when a Relex case needs legal authority — statutes, case law, regulator guidance, local ordinances — in ANY jurisdiction. Teaches the division of labour — you DISCOVER authorities with your own search and public legal MCPs; the Relex harness FETCHES-AND-CACHES verbatim text so drafts can cite it — plus per-jurisdiction channels and compliance limits.4---56# Legal Research: You Discover, the Harness Grounds78A Relex draft may only cite law whose **verbatim text sits in the global cache**9— the server's verifier rejects anything else. Your web results and memory can10never ground a citation; they only *find* what to ground. So:1112```13discover (you: web + public legal MCPs)14 → directive (POST /research/scrape — the harness caches VERBATIM text)15 → ground (the case agent cites the cached text; verifier enforces)16```1718Epistemic discipline while discovering is `relex-citations` — in short: no19docket numbers, margin numbers or quotes from model memory, ever.2021## Step 1 — know what the harness can fetch2223`execute GET /research/sources` — the live registry. `enabled: true` sources24can be fetched-and-cached by directive. Everything else is **discovery-only**:25you research it yourself and pass the best official URL as `sourceHint`, or the26harness falls back to its generic fetch ladder.2728## Step 2 — discover (your job)2930Use your own WebSearch/WebFetch and, when connected, public legal MCPs. Prefer31official/free sources; identify the authority in **anchor form** — topic, court/32bench, date if known, official source to verify in — never a memorized citation.3334| Jurisdiction | Best discovery channels |35|---|---|36| US | CourtListener official MCP (mcp.courtlistener.com) — case law, dockets, citation check; GovInfo/eCFR for federal statutes/regs; LOCUS for local ordinances (below) |37| DE | NeuRIS (rechtsinformationen.bund.de) — new official statutes+case-law API; gesetze-im-internet |38| CH | entscheidsuche.ch (+ its MCP) — BGer + all cantons; Fedlex |39| UK | legislation.gov.uk (open API); Find Case Law (National Archives) |40| FR | justicelibre MCP (no key, ~3M decisions); Légifrance |41| IT | normattiva.it / dati.normattiva.it; SentenzeWeb (last ~5y Cassazione, free) |42| ES | BOE consolidated-law API (statutes) |43| RO | legislatie.just.ro; rejust.ro (decisions); portal.just.ro (dockets) |44| EU | EUR-Lex + CELLAR SPARQL (no auth); CURIA via ECLI |45| CA | CanLII (metadata/citator via API), laws-lois.justice.gc.ca |46| JP | e-Gov Laws API; courts.go.jp (selected decisions) |47| AU | AustLII (read, don't bulk-scrape); legislation.gov.au |4849Per-jurisdiction method, citation schema and source whitelists live in the50`../jurisdictions/<XX>.md` packs when installed.5152**Compliance limits you must respect during discovery** (encode in your plan):53UK Find Case Law bulk/computational use needs a licence — read individual54decisions, let the harness handle caching lawfully; Spain CENDOJ prohibits bulk55reuse (read single decisions only); CanLII full text is site-only per its terms;56AustLII discourages scraping. When a channel is restricted, discovery stays57manual-and-targeted and the `sourceHint` you pass is the official page.5859## Step 3 — directive (the harness's job)6061`POST /research/scrape` grounds one authority — params via `search`62(`jurisdiction`, `code`, `article`, `authorityType` = statute | case_law |63regulator, `sourceHint?`, `caseId?` for provenance; results are a shared cache).6465- **Cache-first**: `status: "cached"` means it's already grounded — done.66- `status: "enqueued"` → poll `GET /research/scrape/{jobId}` until `ingested`,67 then trigger a case-agent re-reason turn so it locks the issue to the text.68- `status: "cooldown"` → a recent fetch failed; give a better `sourceHint` later.69- **Targeted only**: directives are for the citations a draft actually needs70 (the case's `pending_citations` / your audit's grounding gaps). Never bulk.71 There's a modest daily cap; case law behind rate-limited APIs (CourtListener72 free tier) makes every directive count.73- **US case law is now harness-groundable**: `us_courtlistener` is a provisioned74 source, so `POST /research/scrape` with `authorityType: "case_law"` fetches the75 opinion's verbatim text directly (no HTML-ladder fallback). Always re-check76 `GET /research/sources` for the live enabled set rather than assuming.77- **Shared quota, not per-user**: the CourtListener token is ONE credential for78 the whole deployment — every directive across every user draws from the same79 free-tier bucket (as of the May 2026 policy change: 5/min, 50/hr, 125/day).80 This is a stronger reason to keep directives targeted (above): a burst of81 bulk requests from one case can throttle every other case's case-law82 grounding for the rest of the day.83- For case law, put court in `code` and docket/ECLI/reporter cite in `article`84 (e.g. `code: "Cass. 1re civ.", article: "21-12.345"`), `authorityType:85 "case_law"`, and the decision URL you found as `sourceHint`.8687## LOCUS — US local ordinances (two vantage points, one corpus)8889- **Grounding path (backend)**: `execute GET /research/locus?state=CA&city=…&query=…`90 → discovery results with `coverage`: `matched` / `covered_no_match` (broaden91 terms) / `not_in_locus` (fall back to web; NEVER invent an ordinance). Then92 `GET /research/locus?locusId=…` fetches the section's verbatim public-domain93 text for citation-grade grounding.94- **Analysis path (yours, optional)**: the LOCUS dataset95 (`huggingface.co/datasets/LocalLaws/LOCUS-v1`, paper "Freeing the Law with96 LOCUS") also carries analytical layers (topic, function, enforcement-97 discretion, opacity, paternalism scores) under **CC-BY-NC-4.0**. You may read98 those yourself (HF datasets-server `/rows`) to shape strategy — keep that99 analysis on your side (it is non-commercial-licensed; the Relex backend never100 serves it), attribute the corpus, and still ground any citation through the101 backend path above.102- The case agent runs its own LOCUS search on local-law questions; read its103 coverage verdicts from the case before duplicating a search.104105## Anti-patterns106107- Citing from your web page reads ("the court held… [link]") in a draft — the108 verifier will reject it; issue the directive and cite the cached text.109- Directive-spamming a jurisdiction "to have it all" — targeted grounding only.110- Treating a refused/blocked source as an error — restricted sources are111 discovery-only by design; route around with `sourceHint`.