Update to LibreJustice
Snapshot Oct 24, 2026 · 12:54 UTC · version 1.18.0
Collection source: downloaded plugin package. These snapshots do not have a confirmed matching collection source. Differences in file lists alone do not establish changes to the package.
Instructions updated for recherche-jurisprudence
Full description — Now says: and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel,...
Observed in instructions or declared skills. Runtime behavior has not been tested.
Up to 3 plugins free · no card required.
All fields and original values.
Full description
Sep 30, 2026 · 22:52 UTC
case law and statutes with the LibreJustice MCP tools. Use whenever the user asks about French or European court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs ...
Oct 24, 2026 · 12:54 UTC
and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a b...
Skill instructions
Sep 30, 2026 · 22:52 UTC
case law and statutes with the LibreJustice MCP tools. Use whenever the user asks about French or European court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs ...
Oct 24, 2026 · 12:54 UTC
and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a b...
Supporting files
Sep 30, 2026 · 22:52 UTC
[]
Oct 24, 2026 · 12:54 UTC
[{"relative_path":"agents/openai.yaml","size_in_bytes":295},{"relative_path":"references/install-mcp.md","size_in_bytes":1196}]
Compare saved observations
Download comparison JSONSKILL.md text changes
− removed · + added
--- before +++ after @@ -1,303 +1,88 @@ --- name: recherche-jurisprudence -description: Search and cite French case law and statutes with the LibreJustice MCP tools. Use whenever the user asks about French or European court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, needs counts of decisions on a point, or asks what a code article says at a given date, even if they never mention LibreJustice. +description: Search and cite French and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, or needs counts of decisions on a point, even if they never mention LibreJustice. --- # French and European case-law research (LibreJustice) -The user is typically a litigator: they need decisions whose reasoning -states a precise proposition, applicable to their configuration, with -an excerpt quotable in a brief. +The user needs decisions whose reasoning states a precise proposition, applicable to the situation at hand, with a quotable excerpt. + +The tools come from the LibreJustice MCP server; if `search_decisions` is missing from your session, connect it first: [references/install-mcp.md](references/install-mcp.md). Five rules dominate everything: -1. **No decision appears in the answer — as support, contrary - authority, analogy, or lead — unless you read its full text with - `get_decision`.** An `aiSummary` or a `snippet` is not reading. -2. **Quotation marks quote a text you fetched, nothing else.** A - hit's `aiSummary` is a machine paraphrase — never the court's - words, however fluent it sounds; a `snippet` is verbatim but torn - from context. Every quoted string in the answer is copied - character-for-character from a `get_decision` or - `get_legal_text` text of this session — not opened means not - quotable. A quotation is **one continuous span of one single - text**, cuts marked « […] » : merging passages — or decisions — - into one pair of quotation marks is fabrication, one source per - quote, two passages are two quotes. A sentence reporting a - decision in your own voice (« la cour retient que… » followed by - your summary or a parenthesized list) is prose, never a - quotation. -3. **Every decision named anywhere is a markdown link** to its `url` - verbatim — `[CA Paris, 10 janv. 2024, n° 21/22203](https://librejustice.fr/decision/…)`. - Never reconstruct or shorten a URL. -4. **The exact object of the question is a hard filter.** The most - quotable sentence in the corpus routinely concerns a near-twin - object one word apart — another mention, another délai, another - clause. A decision whose decisive sentence names a different - object is an analogy, never an authority, however perfectly its - words match. When the decisive sentence leaves the object - unqualified (« l'heure », « ce délai », « cette mention »), its - object is the one in the moyen it answers — find the party - critique above it; the sentence inherits *that* object. -5. **The first and last lines of every `get_decision` text are the - decision's fate on appeal.** A `[SORT DE CETTE DÉCISION SUR - RECOURS : …]` banner (also served as the `appellateFate` field) - states what became of it on review. Copy it into the answer. It - overrides your own docket sweep: a sweep that found nothing while - the text carries a banner means the sweep missed the arrêt, never - that none exists. - -A `get_decision` response may also carry `commentaires` — the court's -own analysis served inline (`body`) and outbound links (`url`) to the -rapporteur public's conclusions or related court documents. They are -context and cite as commentary, never as the ruling: only the decision -text quotes as the court's words. +1. **No decision appears in the answer (as support, contrary authority, analogy, or lead) unless you read its full text with `get_decision`.** An `aiSummary` or a `snippet` is not reading. +2. **Quotation marks quote a text you fetched, nothing else.** A hit's `aiSummary` is a machine paraphrase, never the court's words; a `snippet` is verbatim but torn from context. Every quoted string in the answer is copied character-for-character from a `get_decision` or `get_norm` text of this session: not opened means not quotable. A quotation is **one continuous span of one single text**, cuts marked « […] » : merging passages, or decisions, into one pair of quotation marks is fabrication, one source per quote, two passages are two quotes. A sentence reporting a decision in your own voice (« la cour retient que… » followed by your summary or a parenthesized list) is prose, never a quotation. +3. **Every decision named anywhere is a markdown link** to its `url` verbatim: `[CA Paris, 10 janv. 2024, n° 21/22203](https://librejustice.fr/decision/…)`. Never reconstruct or shorten a URL. +4. **The exact object of the question is a hard filter.** The most quotable sentence in the corpus routinely concerns a near-twin object one word apart: another mention, another délai, another clause. A decision whose decisive sentence names a different object is an analogy, never an authority. When the decisive sentence leaves the object unqualified (« l'heure », « ce délai », « cette mention »), its object is the one in the moyen it answers: find the party critique above it; the sentence inherits *that* object. +5. **The first and last lines of every `get_decision` text are the decision's fate on appeal.** A `[SORT DE CETTE DÉCISION SUR RECOURS : …]` banner (also served as the `appellateFate` field) states what became of it on review. Copy it into the answer. It overrides your own docket sweep: a sweep that found nothing while the text carries a banner means the sweep missed the arrêt, never that none exists. + +A `get_decision` response may also carry `commentaires`, the court's own analysis served inline (`body`) and outbound links (`url`) to the rapporteur public's conclusions or related court documents. They are context and cite as commentary, never as the ruling: only the decision text quotes as the court's words. -## Protocol — run the steps in order +## Protocol: run the steps in order ### 1. Frame -Pin down (ask when the request leaves them open): the proposition in -one sentence; who demands what and what winning means; the legally -relevant date; the target courts; the exclusions; the proximity axes -that decide transposability. **A legal assertion inside the question -(« c'est bien uniquement devant telle juridiction ? », « cet acte est -nul, non ? ») is a claim to research, never an input**: the -complement of the assertion gets its own step-2 sweeps — its own -queries and filters, including the courts or outcomes the assertion -excludes — and the answer's opening sentence states your verified -verdict, never an echo of the premise. An answer built on the user's -false premise fails whole. Follow-ups refine, they never reset: -« d'autres ? » = new decisions, same bar; « tu peux vérifier ? » = -reopen the source, never restate with more confidence. - -### 2. Sweep — three passes, all mandatory - -1. **One `solution`-filtered sweep per side — your first two - `search_decisions` calls.** Map each direction of the holding to - outcomes, then run the same query twice with opposite `solution` - filters, e.g. `{"query": "convention de forfait en jours privée - d'effet", "jurisdiction_code": ["ca_versailles"], "solution": - ["SATISFACTION_TOTALE", "SATISFACTION_PARTIELLE"]}` then the same - with `["REJET"]`. This is the only lever that separates the two - directions of a line. +Pin down (ask when the request leaves them open): the proposition in one sentence; who demands what and what winning means; the legally relevant date; the target courts; the exclusions; the proximity axes that decide transposability. **A legal assertion inside the question (« c'est bien uniquement devant telle juridiction ? », « cet acte est nul, non ? ») is a claim to research, never an input**: the complement of the assertion gets its own step-2 sweeps (its own queries and filters, including the courts or outcomes the assertion excludes), and the answer's opening sentence states your verified verdict, never an echo of the premise. Follow-ups refine, they never reset: « d'autres ? » = new decisions, same bar; « tu peux vérifier ? » = reopen the source, never restate with more confidence. + +### 2. Sweep: three passes, all mandatory + +1. **One `solution`-filtered sweep per side, your first two `search_decisions` calls.** Map each direction of the holding to outcomes, then run the same query twice with opposite `solution` filters, e.g. `{"query": "convention de forfait en jours privée d'effet", "jurisdiction_code": ["ca_versailles"], "solution": ["SATISFACTION_TOTALE", "SATISFACTION_PARTIELLE"]}` then the same with `["REJET"]`. This is the only lever that separates the two directions of a line. 2. **The consecrated formula, quoted, in each phrasing.** 3. **A plain full-sentence query** (no quotes). Engine facts: -- **Ranking is direction-blind** — semantic matching ignores - negations, and summaries surface the side that won. Never read - direction or absence in an order, an `aiSummary` or a `snippet`. -- **A lexical list (quotes/operators) is a set, not a ranking**: read - it whole or partition it, never skim its top. -- **The window is `limit` (max 20), no pagination.** Read the - `date_lecture_year` facet on every sweep: a year newer than the - newest hit you opened, with a nonzero count, is unswept — re-run - with `date_from`/`date_to` on that year before concluding. -- **`date_from` is the filter that silently hides a line's founding - arrêt** — often decades old. Bound dates only when the question - itself is time-bounded or a facet year needs re-sweeping, never by - default. -- Filter tokens (« ca_paris », « REJET ») poison the query text — - filters carry constraints, the query carries only words a court - would write. After two queries with no new candidate, change one - real axis or start opening. +- **Ranking is direction-blind**: semantic matching ignores negations, and summaries surface the side that won. Never read direction or absence in an order, an `aiSummary` or a `snippet`. +- **A lexical list (quotes/operators) is a set, not a ranking**: read it whole or partition it, never skim its top. +- **A lexical query is a conjunction**, and nothing recovers a miss: a quoted formula followed by context words returns zero unless one decision carries all of it. Quote the formula alone, or ask plainly. +- **A docket number goes in bare**: `21PA01295`, `19-20.682`, matched by exact key whatever the spelling, and served alone. A number or a case name inside a question (`387763 Czabaj délai raisonnable`, `Danthony vice de procédure`) keeps the question's `hits` and surfaces the designated decision in `pinned`: open it from there, never look for it in the ranking. `pinned` exists in `auto` only; a stated `mode` is served as stated. +- **The window is `limit` (max 20), no pagination.** Read the `date_lecture_year` facet on every sweep: a year newer than the newest hit you opened, with a nonzero count, is unswept. Re-run with `date_from`/`date_to` on that year before concluding. +- **`date_from` is the filter that silently hides a line's founding arrêt**, often decades old. Bound dates only when the question itself is time-bounded or a facet year needs re-sweeping, never by default. +- **A specialised contentieux has its own axis, and no query wording replaces it**: `legal_domain` for the subject (`PUBLIC_DROIT_ETRANGERS_NATIONALITE`, `SOCIAL_DROIT_TRAVAIL`, `COMMERCIAL_DROIT_ENTREPRISES_DIFFICULTE`…), where a root covers its leaves (`CIVIL` also returns `CIVIL_DROIT_LOCATIF`, `CIVIL_DROIT_PERSONNES_FAMILLE`), `office` for the single-judge courts (`JLD`, `JAF`, `JCP`, `JEX`…), `legal_article` for the decisions citing one article (`"code-civil|1240"`). Each cuts the corpus before ranking. +- **`seat` is the court unit itself, from its type down to its room**: a dotted path, one segment per level (`"CC"`, `"CC.SOCIALE"`, `"CA.PARIS"`, `"CA.PARIS.P5.C6"`). A path matches itself and everything under it, so `"CC.SOCIALE"` also returns the sections of that chamber and `"CA"` returns every cour d'appel. It says on one key what `jurisdiction_type` and `jurisdiction_code` say on two, and those two stay accepted. Take the paths from `facets.seat`, which serves the tree of the result set in hand: search, read the facet, then filter. Crossing a path with a period is how a line of one chamber is followed across a reorganisation. +- Filter tokens (« ca_paris », « REJET ») poison the query text: filters carry constraints, the query carries only words a court would write. After two queries with no new candidate, change one real axis or start opening. ### 3. Read everything you might cite -Open every hit of the target court that touches the issue. Open -first, and always, every hit whose served `solution` sits on the -user's side: a directional question answered without opening a -single same-side hit is the run's defining failure. Fewer than -eight decisions opened by the end of this step means the research -has not happened: go back to step 2 and change a real axis (court -level, phrasing, dates) until eight full texts are read or the -target courts' relevant hits are exhausted — the corpus almost -always holds more than one screen of them. Five verdicts per -decision: - -- **Who speaks.** Court's motifs, or a party's argument (« il - soutient que… ») ? Cross-check the dispositif and who succombe — - the loser's phrase is contrary authority under a favorable label. - In a cassation arrêt the moyen (« alors que… ») is the loser's - text even when it reads like a holding; the Cour speaks in « Mais - attendu » / « Réponse de la Cour », and « par les motifs reproduits - au moyen » attributes those motifs to the court below. Quote each - voice separately — one clause of the moyen imported into the - Cour's motif turns the quote into fabrication. -- **Exact object.** Near-twins one word apart have opposite regimes - (forclusion/prescription, faute grave/lourde, nullité - relative/absolue) — and snippets truncate, summaries smooth over, - exactly the deciding word. -- **Appellate fate** (dominant rule 5). `INFIRMATION` kills the - decision as support. `CONFIRMATION` = open that arrêt and cite the - pair; the arrêt holds what the judgment held, never the opposite - line's direction. No banner served = run the judgment's docket - number, quoted, filtered to the appellate court. **A sweep hit is - the same case only if its « Décision déférée » header names your - judgment — same court, same date** : RG numbers collide across - courts, and a hit from another ressort or another date is noise, - never the fate. No banner and no sweep = « aucun recours lié dans - le corpus » — that sentence describes the served data and is true - by construction; « balayé » or « vérifié » may only be written - when the docket-number query is in this session. Never - « définitif ». -- **Legal basis.** Decision texts carry inline `/texte/` links; open - them with `get_legal_text` at the facts' date. A failed tool call - (bad URL format, unknown code) is retried with the corrected - argument, never silently dropped: an article the question turns on - that you never managed to read voids every claim about it. -- **The quotable sentence.** While the text is in front of you, copy - the exact sentence(s) of the motifs you would quote in a brief. - The writing stage may only put between quotation marks strings - collected this way — a quote reconstructed at writing time from - memory or from an `aiSummary` is where fabrication happens. +Open every hit of the target court that touches the issue. Open first, and always, every hit whose served `solution` sits on the user's side. Fewer than eight decisions opened by the end of this step means the research has not happened: go back to step 2 and change a real axis (court level, phrasing, dates) until eight full texts are read or the target courts' relevant hits are exhausted. Five verdicts per decision: + +- **Who speaks.** Court's motifs, or a party's argument (« il soutient que… ») ? Cross-check the dispositif and who succombe: the loser's phrase is contrary authority under a favorable label. In a cassation arrêt the moyen (« alors que… ») is the loser's text even when it reads like a holding; the Cour speaks in « Mais attendu » / « Réponse de la Cour », and « par les motifs reproduits au moyen » attributes those motifs to the court below. Quote each voice separately: one clause of the moyen imported into the Cour's motif turns the quote into fabrication. +- **Exact object.** Near-twins one word apart have opposite regimes (forclusion/prescription, faute grave/lourde, nullité relative/absolue), and snippets truncate, summaries smooth over, exactly the deciding word. +- **Appellate fate** (dominant rule 5). `INFIRMATION` kills the decision as support. `CONFIRMATION` = open that arrêt and cite the pair; the arrêt holds what the judgment held, never the opposite line's direction. No banner served = run the judgment's docket number, bare and unquoted, filtered to the appellate court: a number is matched by exact key, and quoting it drops the fallback. **A sweep hit is the same case only if its « Décision déférée » header names your judgment, same court, same date** : RG numbers collide across courts, and a hit from another ressort or another date is noise, never the fate. No banner and no sweep = « aucun recours lié dans le corpus ». +- **Legal basis.** Decision texts carry inline `/norm/` links; open them with `get_norm` at the facts' date. A failed tool call (bad URL format, unknown code) is retried with the corrected argument, never silently dropped: an article the question turns on that you never managed to read voids every claim about it. +- **The quotable sentence.** While the text is in front of you, copy the exact sentence(s) of the motifs you would quote in a brief. The writing stage may only put between quotation marks strings collected this way. ### 4. Map the line -Re-run the winning query with `sort: "date_desc"` — **once per -direction, with that side's `solution` filter, per target court** — -and read the most recent decisions of each. When a court ruled both -ways, the deliverable is a dated timeline, never a flat « court X -says P »: either side of a flip, presented alone, misleads. A hit -newer than every decision the answer names, seen in *any* list this -session, is either opened and cited or excluded for a stated -reason — never silently dropped. +Re-run the winning query with `sort: "date_desc"`, **once per direction, with that side's `solution` filter, per target court**, and read the most recent decisions of each. When a court ruled both ways, the deliverable is a dated timeline, never a flat « court X says P »: either side of a flip, presented alone, misleads. A hit newer than every decision the answer names, seen in *any* list this session, is either opened and cited or excluded for a stated reason, never silently dropped. ### 5. Absence claims and counts -« No decision of court X states P » is falsifiable with one -citation. Before writing it: exact formula (both phrasings) + a -descriptive query under the court filter; a `solution`-filtered -sweep on P's outcomes; `date_from` widened; facets read. Last: -re-scan the hits you did NOT open across every list of the session — -one unopened hit whose `solution` sits on P's side voids the claim -until opened. Counts: define the corpus; keep raw hits, deduplicated -decisions and verified holdings apart. A counting table is built -from the facets of **one named query per column** — never merge -facets from different queries into one series. Facets count the same -candidate set as `total` — the engine's best few hundred matches — -not the whole corpus: for a corpus-wide count, narrow with filters -(court, dates) until `total` itself is the count. A yearly series -that starts or jumps abruptly usually marks the edge of source -coverage, not the birth of the contentieux: say so instead of -narrating the jump. - -## The answer — always these four blocks, in this order - -Exact French headings: « État du droit », « Autorités pour la -position recherchée », « Autorités contraires et risques », -« Périmètre de la recherche ». - -1. **« État du droit »**: the direct answer, then per target court - the most recent decision in *each* direction, named with its - date. Naming a court's latest word requires having run the - `date_desc` + `solution` query of step 4 for that court and - direction. -2. **« Autorités pour la position recherchée »** — a table when - three or more, with exactly these columns: Décision | Extrait des - motifs | Proximité (objet exact) | Sort en appel | Limite. - - The citation cell is itself the markdown link — never a - separate « lien » column. - - The **excerpt** cell carries either a quotation collected at - read time (the quotable sentence of step 3) or — when none was - collected for that decision — a plain-prose description with NO - quotation marks, marked « (résumé — citation non collectée) ». - An honest unquoted summary always beats quotation marks around - anything not copied verbatim; a passage from the exposé of a - party's moyens is that party's argument, not the court's. - - The **proximity** cell quotes the object words of the decisive - sentence; when they name a different object than the user's, - the row moves to the analogies section, whatever its direction. - - The **fate** cell copies the served banner — « infirmé - par [linked arrêt] » / « confirmé par [linked arrêt] » — or, when - no banner was served, says « aucun recours lié dans le corpus » : - that sentence describes the served data and needs no further - proof. The words « balayé » / « vérifié » may appear only when - the docket-number query is in this session's searches — claiming - a check that never ran is the worst lie this answer can carry. - Any other wording (« à vérifier », « définitif »…) is a failed - check. An arrêt cited for its confirmation names and - links the judgment it confirms in the same row — the pair cites - together. - - A thin side stays thin: when a court offers a single decision, - present it alone and say so — padding the table with non-ruling - or off-direction rows is worse than a one-row table. -3. **« Autorités contraires et risques »**: what opposing counsel - will plead — the recent contrary line, infirmations, reversals, - dated, and **per target court**: a first-instance court has its - own contrary decisions, and calling its line « constante » while - the opposite-`solution` sweep never ran for it is the check that - fails most. -4. **« Périmètre de la recherche »**: a table with one row per - `search_decisions` call of this session — Requête | Filtres - (`solution`, dates, cours) | Tri | Hits ouverts. Build it the way - excerpts are built: append the row when the query is sent, then - paste the table into the answer — a table reconstructed from - memory at drafting time is where fabricated rows come from. - The block carries a **second table, « Décisions ouvertes »** : one - row per `get_decision` of this session, in call order — the linked - citation. Built the same way, one row appended per returned text. - This table is the answer's whitelist: every decision link anywhere - else in the answer is a copy of one of its rows, and a row for a - call that never returned a text is the same lie as a fabricated - quote. Every - cell copies a parameter actually sent or a uid actually opened; a - row whose query never ran is the same lie as a fabricated - citation, and a search that ran but is missing (including failed - ones) is a hole in the audit trail. A direction of the holding - with no `solution`-filtered row is unresearched: run it now, or - write « non recherché » under the table — that plain sentence is - always available and always true. Analogies in their own clearly - separated section. +« No decision of court X states P » is falsifiable with one citation. Before writing it: exact formula (both phrasings) + a descriptive query under the court filter; a `solution`-filtered sweep on P's outcomes; `date_from` widened; facets read. Last: re-scan the hits you did NOT open across every list of the session: one unopened hit whose `solution` sits on P's side voids the claim until opened. Counts: define the corpus; keep raw hits, deduplicated decisions and verified holdings apart. A counting table is built from the facets of **one named query per column**: never merge facets from different queries into one series. `total` and the facets count every decision matched under the current filters, not the page served: neither a count of the corpus nor a count of the hits. Two things distort that number. A multi-word query matches on ANY of its tokens, so its total counts whatever carries one word of it: it counts something only under a quoted formula, or under filters (court, dates, solution) narrow enough to define the corpus. And a decision found by meaning alone is counted only inside the window served, so the total of a purely descriptive query is a floor. A yearly series that starts or jumps abruptly usually marks the edge of source coverage, not the birth of the contentieux: say so instead of narrating the jump. -Cite only decisions returned by the tools. +## The answer + +The shape is the user's: the format they asked for, or the one their earlier answers were in. What follows is what the answer has to carry, never how it looks. None of it is wording to reproduce: these are things to say, said in the language the user writes in, under whatever headings that language and that format call for. -## Final check — verify each item against the draft, fix before sending +- **Give the verdict first**, then, per target court, the most recent decision in *each* direction, named and dated. Naming a court's latest word requires having run the `date_desc` + `solution` query of step 4 for that court and that direction. +- **Say the same five things of every authority**: cite it and link it, quote it, say what its decisive sentence was about, say how it fared on appeal, say where it stops. The quotation is one collected at read time (the quotable sentence of step 3); when none was collected for that decision, write plain prose with NO quotation marks, marked « (résumé, citation non collectée) ». A passage from the exposé of a party's moyens is that party's argument, not the court's. +- **Say how a decision fared on appeal in closed words**: the served banner, copied (« infirmé par [arrêt lié] », « confirmé par [arrêt lié] », and the pair cites together), or, when no banner was served, « aucun recours lié dans le corpus ». The words « balayé » / « vérifié » may appear only when the docket-number query is in this session's searches; any other wording (« à vérifier », « définitif »…) is a failed check. +- **Say what opposing counsel will plead, per target court**: the recent contrary line, infirmations, reversals, dated. A first-instance court has its own contrary decisions, and calling its line « constante » while the opposite-`solution` sweep never ran for it is the check that fails most. +- **Leave a thin side thin**: when a court offers a single decision, present it alone and say so. +- **Give the perimeter, from two lists kept as you go.** One entry per `search_decisions` call of this session: the query, the filters (`solution`, dates, courts), the sort, the hits opened. One entry per `get_decision`, in call order: the linked citation. Append the entry when the call is sent, then paste both lists into the answer. An entry for a call that never ran, or a filter listed but never sent, is fabrication; a search that ran but is missing (including a failed one) is a hole in the audit trail. Every decision link anywhere else in the answer copies an entry of the list of opened decisions, and no other count of decisions read is ever stated. A direction of the holding with no `solution`-filtered entry is unresearched: run it now, or write « non recherché » next to the list, a sentence always available and always true. + +Cite only decisions returned by the tools. -- Four blocks present, in order, exact headings; table carries its - five columns. -- No row whose Proximité cell names a different object stays in the - authorities table — it moves to the analogies section. -- Every Sort en appel cell is verbatim one of: the copied banner - (« infirmé par… » / « confirmé par… », pair linked in the row) or - « aucun recours lié dans le corpus ». Re-read the first line of - each cited decision's text now — a banner you saw and did not copy - is the worst chronology error. The words « balayé » / « vérifié » - survive only if you can point to the search of this session whose - query was that docket number; otherwise rewrite the cell to the - default formula. -- Point each Périmètre row to the `search_decisions` call of this - session it copies — delete any row you cannot point to, add any - search you ran but did not list. Filters that appear in a row but - were never sent (a `solution`, a court, a date) are fabrication. -- Cross the draft against the « Décisions ouvertes » table: every - decision link elsewhere in the answer has its row there; a link - without a row is opened now (row added) or deleted with every - claim resting on it. Never state a number of decisions read other - than that table's row count. -- Search every quoted string of the draft, **as one continuous - block**, in the `get_decision` / `get_legal_text` texts of this - session. A string found only in separate pieces is a splice — - re-cut it into one quote per source, « […] » for internal cuts. A - string you can only find in a hit's `aiSummary` or `snippet`, or - nowhere, is rewritten from the fetched text or unquoted. Then - check who speaks: the motifs of the decision it is attributed - to — not a party's argument or moyen, not another decision. -- Weight adjectives (« isolé », « constant ») consistent with the - decisions the answer itself lists; the answer states which way the - most recent decisions of each target court go; an infirmed - judgment never stands as support. -- Every « no decision » claim earned under step 5. +## Final check, fix rather than flag -A failed item is fixed before sending, not flagged. +- Every decision link in the answer has its entry in the list of opened decisions; a link without one is opened now (entry added) or deleted, along with every claim resting on it. +- Every quoted string, searched **as one continuous block** in this session's `get_decision` / `get_norm` texts. Found only in separate pieces, it is a splice: re-cut it into one quote per source, « […] » for internal cuts. Found only in a hit's `aiSummary` or `snippet`, or nowhere: rewritten from the fetched text, or unquoted. Then who speaks: the motifs of the decision it is attributed to, not a party's argument or moyen, not another decision. +- How each decision fared on appeal is verbatim one of two wordings: the copied banner, or « aucun recours lié dans le corpus ». Re-read the first line of each cited decision's text now. « balayé » / « vérifié » survives only when this session's searches carry that docket number, and any other wording (« définitif », « à vérifier ») is rewritten to the default formula. +- Every perimeter entry pointed at the call of this session it copies: delete what you cannot point at, add the searches you ran and did not list. +- No decision whose decisive sentence names another object left standing as an authority. +- Weight adjectives (« isolé », « constant ») consistent with the decisions the answer itself lists; the answer states which way the most recent decisions of each target court go; an infirmed judgment never stands as support; every « no decision » claim earned under step 5. ## Statutes -Quick lookups only — anything deeper (treaties, EU law, versions -across recodifications) is the recherche-normes skill's job. -`get_legal_text` returns an article as it read on a given date: -pass `date` and say which version you quote. `list_my_activity` -(signed-in account) lists recent searches, bookmarks and reading -history — useful to resume ongoing work. +Quick lookups only: anything deeper (treaties, EU law, versions across recodifications) is the recherche-normes skill's job. `get_norm` returns an article as it stood on a given date: pass `date` and say which version you quote.
Full technical diff · 3 changed fields
changed /description
"Search and cite French case law and statutes with the LibreJustice MCP tools. Use whenever the user asks about French or European court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, needs counts of decisions on a point, or asks what a code article says at a given date, even if they never mention LibreJustice."
"Search and cite French and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, or needs counts of decisions on a point, even if they never mention LibreJustice."
changed /included_files
[]
[
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 295
},
{
"relative_path": "references/install-mcp.md",
"size_in_bytes": 1196
}
]changed /skill_md_contents
"---\nname: recherche-jurisprudence\ndescription: Search and cite French case law and statutes with the LibreJustice MCP tools. Use whenever the user asks about French or European court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, needs counts of decisions on a point, or asks what a code article says at a given date, even if they never mention LibreJustice.\n---\n\n# French and European case-law research (LibreJustice)\n\nThe user is typically a litigator: they need decisions whose reasoning\nstates a precise proposition, applicable to their configuration, with\nan excerpt quotable in a brief.\n\nFive rules dominate everything:\n\n1. **No decision appears in the answer — as support, contrary\n authority, analogy, or lead — unless you read its full text with\n `get_decision`.** An `aiSummary` or a `snippet` is not reading.\n2. **Quotation marks quote a text you fetched, nothing else.** A\n hit's `aiSummary` is a machine paraphrase — never the court's\n words, however fluent it sounds; a `snippet` is verbatim but torn\n from context. Every quoted string in the answer is copied\n character-for-character from a `get_decision` or\n `get_legal_text` text of this session — not opened means not\n quotable. A quotation is **one continuous span of one single\n text**, cuts marked « […] » : merging passages — or decisions —\n into one pair of quotation marks is fabrication, one source per\n quote, two passages are two quotes. A sentence reporting a\n decision in your own voice (« la cour retient que… » followed by\n your summary or a parenthesized list) is prose, never a\n quotation.\n3. **Every decision named anywhere is a markdown link** to its `url`\n verbatim — `[CA Paris, 10 janv. 2024, n° 21/22203](https://librejustice.fr/decision/…)`.\n Never reconstruct or shorten a URL.\n4. **The exact object of the question is a hard filter.** The most\n quotable sentence in the corpus routinely concerns a near-twin\n object one word apart — another mention, another délai, another\n clause. A decision whose decisive sentence names a different\n object is an analogy, never an authority, however perfectly its\n words match. When the decisive sentence leaves the object\n unqualified (« l'heure », « ce délai », « cette mention »), its\n object is the one in the moyen it answers — find the party\n critique above it; the sentence inherits *that* object.\n5. **The first and last lines of every `get_decision` text are the\n decision's fate on appeal.** A `[SORT DE CETTE DÉCISION SUR\n RECOURS : …]` banner (also served as the `appellateFate` field)\n states what became of it on review. Copy it into the answer. It\n overrides your own docket sweep: a sweep that found nothing while\n the text carries a banner means the sweep missed the arrêt, never\n that none exists.\n\nA `get_decision` response may also carry `commentaires` — the court's\nown analysis served inline (`body`) and outbound links (`url`) to the\nrapporteur public's conclusions or related court documents. They are\ncontext and cite as commentary, never as the ruling: only the decision\ntext quotes as the court's words.\n\n## Protocol — run the steps in order\n\n### 1. Frame\n\nPin down (ask when the request leaves them open): the proposition in\none sentence; who demands what and what winning means; the legally\nrelevant date; the target courts; the exclusions; the proximity axes\nthat decide transposability. **A legal assertion inside the question\n(« c'est bien uniquement devant telle juridiction ? », « cet acte est\nnul, non ? ») is a claim to research, never an input**: the\ncomplement of the assertion gets its own step-2 sweeps — its own\nqueries and filters, including the courts or outcomes the assertion\nexcludes — and the answer's opening sentence states your verified\nverdict, never an echo of the premise. An answer built on the user's\nfalse premise fails whole. Follow-ups refine, they never reset:\n« d'autres ? » = new decisions, same bar; « tu peux vérifier ? » =\nreopen the source, never restate with more confidence.\n\n### 2. Sweep — three passes, all mandatory\n\n1. **One `solution`-filtered sweep per side — your first two\n `search_decisions` calls.** Map each direction of the holding to\n outcomes, then run the same query twice with opposite `solution`\n filters, e.g. `{\"query\": \"convention de forfait en jours privée\n d'effet\", \"jurisdiction_code\": [\"ca_versailles\"], \"solution\":\n [\"SATISFACTION_TOTALE\", \"SATISFACTION_PARTIELLE\"]}` then the same\n with `[\"REJET\"]`. This is the only lever that separates the two\n directions of a line.\n2. **The consecrated formula, quoted, in each phrasing.**\n3. **A plain full-sentence query** (no quotes).\n\nEngine facts:\n\n- **Ranking is direction-blind** — semantic matching ignores\n negations, and summaries surface the side that won. Never read\n direction or absence in an order, an `aiSummary` or a `snippet`.\n- **A lexical list (quotes/operators) is a set, not a ranking**: read\n it whole or partition it, never skim its top.\n- **The window is `limit` (max 20), no pagination.** Read the\n `date_lecture_year` facet on every sweep: a year newer than the\n newest hit you opened, with a nonzero count, is unswept — re-run\n with `date_from`/`date_to` on that year before concluding.\n- **`date_from` is the filter that silently hides a line's founding\n arrêt** — often decades old. Bound dates only when the question\n itself is time-bounded or a facet year needs re-sweeping, never by\n default.\n- Filter tokens (« ca_paris », « REJET ») poison the query text —\n filters carry constraints, the query carries only words a court\n would write. After two queries with no new candidate, change one\n real axis or start opening.\n\n### 3. Read everything you might cite\n\nOpen every hit of the target court that touches the issue. Open\nfirst, and always, every hit whose served `solution` sits on the\nuser's side: a directional question answered without opening a\nsingle same-side hit is the run's defining failure. Fewer than\neight decisions opened by the end of this step means the research\nhas not happened: go back to step 2 and change a real axis (court\nlevel, phrasing, dates) until eight full texts are read or the\ntarget courts' relevant hits are exhausted — the corpus almost\nalways holds more than one screen of them. Five verdicts per\ndecision:\n\n- **Who speaks.** Court's motifs, or a party's argument (« il\n soutient que… ») ? Cross-check the dispositif and who succombe —\n the loser's phrase is contrary authority under a favorable label.\n In a cassation arrêt the moyen (« alors que… ») is the loser's\n text even when it reads like a holding; the Cour speaks in « Mais\n attendu » / « Réponse de la Cour », and « par les motifs reproduits\n au moyen » attributes those motifs to the court below. Quote each\n voice separately — one clause of the moyen imported into the\n Cour's motif turns the quote into fabrication.\n- **Exact object.** Near-twins one word apart have opposite regimes\n (forclusion/prescription, faute grave/lourde, nullité\n relative/absolue) — and snippets truncate, summaries smooth over,\n exactly the deciding word.\n- **Appellate fate** (dominant rule 5). `INFIRMATION` kills the\n decision as support. `CONFIRMATION` = open that arrêt and cite the\n pair; the arrêt holds what the judgment held, never the opposite\n line's direction. No banner served = run the judgment's docket\n number, quoted, filtered to the appellate court. **A sweep hit is\n the same case only if its « Décision déférée » header names your\n judgment — same court, same date** : RG numbers collide across\n courts, and a hit from another ressort or another date is noise,\n never the fate. No banner and no sweep = « aucun recours lié dans\n le corpus » — that sentence describes the served data and is true\n by construction; « balayé » or « vérifié » may only be written\n when the docket-number query is in this session. Never\n « définitif ».\n- **Legal basis.** Decision texts carry inline `/texte/` links; open\n them with `get_legal_text` at the facts' date. A failed tool call\n (bad URL format, unknown code) is retried with the corrected\n argument, never silently dropped: an article the question turns on\n that you never managed to read voids every claim about it.\n- **The quotable sentence.** While the text is in front of you, copy\n the exact sentence(s) of the motifs you would quote in a brief.\n The writing stage may only put between quotation marks strings\n collected this way — a quote reconstructed at writing time from\n memory or from an `aiSummary` is where fabrication happens.\n\n### 4. Map the line\n\nRe-run the winning query with `sort: \"date_desc\"` — **once per\ndirection, with that side's `solution` filter, per target court** —\nand read the most recent decisions of each. When a court ruled both\nways, the deliverable is a dated timeline, never a flat « court X\nsays P »: either side of a flip, presented alone, misleads. A hit\nnewer than every decision the answer names, seen in *any* list this\nsession, is either opened and cited or excluded for a stated\nreason — never silently dropped.\n\n### 5. Absence claims and counts\n\n« No decision of court X states P » is falsifiable with one\ncitation. Before writing it: exact formula (both phrasings) + a\ndescriptive query under the court filter; a `solution`-filtered\nsweep on P's outcomes; `date_from` widened; facets read. Last:\nre-scan the hits you did NOT open across every list of the session —\none unopened hit whose `solution` sits on P's side voids the claim\nuntil opened. Counts: define the corpus; keep raw hits, deduplicated\ndecisions and verified holdings apart. A counting table is built\nfrom the facets of **one named query per column** — never merge\nfacets from different queries into one series. Facets count the same\ncandidate set as `total` — the engine's best few hundred matches —\nnot the whole corpus: for a corpus-wide count, narrow with filters\n(court, dates) until `total` itself is the count. A yearly series\nthat starts or jumps abruptly usually marks the edge of source\ncoverage, not the birth of the contentieux: say so instead of\nnarrating the jump.\n\n## The answer — always these four blocks, in this order\n\nExact French headings: « État du droit », « Autorités pour la\nposition recherchée », « Autorités contraires et risques »,\n« Périmètre de la recherche ».\n\n1. **« État du droit »**: the direct answer, then per target court\n the most recent decision in *each* direction, named with its\n date. Naming a court's latest word requires having run the\n `date_desc` + `solution` query of step 4 for that court and\n direction.\n2. **« Autorités pour la position recherchée »** — a table when\n three or more, with exactly these columns: Décision | Extrait des\n motifs | Proximité (objet exact) | Sort en appel | Limite.\n - The citation cell is itself the markdown link — never a\n separate « lien » column.\n - The **excerpt** cell carries either a quotation collected at\n read time (the quotable sentence of step 3) or — when none was\n collected for that decision — a plain-prose description with NO\n quotation marks, marked « (résumé — citation non collectée) ».\n An honest unquoted summary always beats quotation marks around\n anything not copied verbatim; a passage from the exposé of a\n party's moyens is that party's argument, not the court's.\n - The **proximity** cell quotes the object words of the decisive\n sentence; when they name a different object than the user's,\n the row moves to the analogies section, whatever its direction.\n - The **fate** cell copies the served banner — « infirmé\n par [linked arrêt] » / « confirmé par [linked arrêt] » — or, when\n no banner was served, says « aucun recours lié dans le corpus » :\n that sentence describes the served data and needs no further\n proof. The words « balayé » / « vérifié » may appear only when\n the docket-number query is in this session's searches — claiming\n a check that never ran is the worst lie this answer can carry.\n Any other wording (« à vérifier », « définitif »…) is a failed\n check. An arrêt cited for its confirmation names and\n links the judgment it confirms in the same row — the pair cites\n together.\n - A thin side stays thin: when a court offers a single decision,\n present it alone and say so — padding the table with non-ruling\n or off-direction rows is worse than a one-row table.\n3. **« Autorités contraires et risques »**: what opposing counsel\n will plead — the recent contrary line, infirmations, reversals,\n dated, and **per target court**: a first-instance court has its\n own contrary decisions, and calling its line « constante » while\n the opposite-`solution` sweep never ran for it is the check that\n fails most.\n4. **« Périmètre de la recherche »**: a table with one row per\n `search_decisions` call of this session — Requête | Filtres\n (`solution`, dates, cours) | Tri | Hits ouverts. Build it the way\n excerpts are built: append the row when the query is sent, then\n paste the table into the answer — a table reconstructed from\n memory at drafting time is where fabricated rows come from.\n The block carries a **second table, « Décisions ouvertes »** : one\n row per `get_decision` of this session, in call order — the linked\n citation. Built the same way, one row appended per returned text.\n This table is the answer's whitelist: every decision link anywhere\n else in the answer is a copy of one of its rows, and a row for a\n call that never returned a text is the same lie as a fabricated\n quote. Every\n cell copies a parameter actually sent or a uid actually opened; a\n row whose query never ran is the same lie as a fabricated\n citation, and a search that ran but is missing (including failed\n ones) is a hole in the audit trail. A direction of the holding\n with no `solution`-filtered row is unresearched: run it now, or\n write « non recherché » under the table — that plain sentence is\n always available and always true. Analogies in their own clearly\n separated section.\n\nCite only decisions returned by the tools.\n\n## Final check — verify each item against the draft, fix before sending\n\n- Four blocks present, in order, exact headings; table carries its\n five columns.\n- No row whose Proximité cell names a different object stays in the\n authorities table — it moves to the analogies section.\n- Every Sort en appel cell is verbatim one of: the copied banner\n (« infirmé par… » / « confirmé par… », pair linked in the row) or\n « aucun recours lié dans le corpus ». Re-read the first line of\n each cited decision's text now — a banner you saw and did not copy\n is the worst chronology error. The words « balayé » / « vérifié »\n survive only if you can point to the search of this session whose\n query was that docket number; otherwise rewrite the cell to the\n default formula.\n- Point each Périmètre row to the `search_decisions` call of this\n session it copies — delete any row you cannot point to, add any\n search you ran but did not list. Filters that appear in a row but\n were never sent (a `solution`, a court, a date) are fabrication.\n- Cross the draft against the « Décisions ouvertes » table: every\n decision link elsewhere in the answer has its row there; a link\n without a row is opened now (row added) or deleted with every\n claim resting on it. Never state a number of decisions read other\n than that table's row count.\n- Search every quoted string of the draft, **as one continuous\n block**, in the `get_decision` / `get_legal_text` texts of this\n session. A string found only in separate pieces is a splice —\n re-cut it into one quote per source, « […] » for internal cuts. A\n string you can only find in a hit's `aiSummary` or `snippet`, or\n nowhere, is rewritten from the fetched text or unquoted. Then\n check who speaks: the motifs of the decision it is attributed\n to — not a party's argument or moyen, not another decision.\n- Weight adjectives (« isolé », « constant ») consistent with the\n decisions the answer itself lists; the answer states which way the\n most recent decisions of each target court go; an infirmed\n judgment never stands as support.\n- Every « no decision » claim earned under step 5.\n\nA failed item is fixed before sending, not flagged.\n\n## Statutes\n\nQuick lookups only — anything deeper (treaties, EU law, versions\nacross recodifications) is the recherche-normes skill's job.\n`get_legal_text` returns an article as it read on a given date:\npass `date` and say which version you quote. `list_my_activity`\n(signed-in account) lists recent searches, bookmarks and reading\nhistory — useful to resume ongoing work.\n""---\nname: recherche-jurisprudence\ndescription: Search and cite French and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, or needs counts of decisions on a point, even if they never mention LibreJustice.\n---\n\n# French and European case-law research (LibreJustice)\n\nThe user needs decisions whose reasoning states a precise proposition, applicable to the situation at hand, with a quotable excerpt.\n\nThe tools come from the LibreJustice MCP server; if `search_decisions` is missing from your session, connect it first: [references/install-mcp.md](references/install-mcp.md).\n\nFive rules dominate everything:\n\n1. **No decision appears in the answer (as support, contrary authority, analogy, or lead) unless you read its full text with `get_decision`.** An `aiSummary` or a `snippet` is not reading.\n2. **Quotation marks quote a text you fetched, nothing else.** A hit's `aiSummary` is a machine paraphrase, never the court's words; a `snippet` is verbatim but torn from context. Every quoted string in the answer is copied character-for-character from a `get_decision` or `get_norm` text of this session: not opened means not quotable. A quotation is **one continuous span of one single text**, cuts marked « […] » : merging passages, or decisions, into one pair of quotation marks is fabrication, one source per quote, two passages are two quotes. A sentence reporting a decision in your own voice (« la cour retient que… » followed by your summary or a parenthesized list) is prose, never a quotation.\n3. **Every decision named anywhere is a markdown link** to its `url` verbatim: `[CA Paris, 10 janv. 2024, n° 21/22203](https://librejustice.fr/decision/…)`. Never reconstruct or shorten a URL.\n4. **The exact object of the question is a hard filter.** The most quotable sentence in the corpus routinely concerns a near-twin object one word apart: another mention, another délai, another clause. A decision whose decisive sentence names a different object is an analogy, never an authority. When the decisive sentence leaves the object unqualified (« l'heure », « ce délai », « cette mention »), its object is the one in the moyen it answers: find the party critique above it; the sentence inherits *that* object.\n5. **The first and last lines of every `get_decision` text are the decision's fate on appeal.** A `[SORT DE CETTE DÉCISION SUR RECOURS : …]` banner (also served as the `appellateFate` field) states what became of it on review. Copy it into the answer. It overrides your own docket sweep: a sweep that found nothing while the text carries a banner means the sweep missed the arrêt, never that none exists.\n\nA `get_decision` response may also carry `commentaires`, the court's own analysis served inline (`body`) and outbound links (`url`) to the rapporteur public's conclusions or related court documents. They are context and cite as commentary, never as the ruling: only the decision text quotes as the court's words.\n\n## Protocol: run the steps in order\n\n### 1. Frame\n\nPin down (ask when the request leaves them open): the proposition in one sentence; who demands what and what winning means; the legally relevant date; the target courts; the exclusions; the proximity axes that decide transposability. **A legal assertion inside the question (« c'est bien uniquement devant telle juridiction ? », « cet acte est nul, non ? ») is a claim to research, never an input**: the complement of the assertion gets its own step-2 sweeps (its own queries and filters, including the courts or outcomes the assertion excludes), and the answer's opening sentence states your verified verdict, never an echo of the premise. Follow-ups refine, they never reset: « d'autres ? » = new decisions, same bar; « tu peux vérifier ? » = reopen the source, never restate with more confidence.\n\n### 2. Sweep: three passes, all mandatory\n\n1. **One `solution`-filtered sweep per side, your first two `search_decisions` calls.** Map each direction of the holding to outcomes, then run the same query twice with opposite `solution` filters, e.g. `{\"query\": \"convention de forfait en jours privée d'effet\", \"jurisdiction_code\": [\"ca_versailles\"], \"solution\": [\"SATISFACTION_TOTALE\", \"SATISFACTION_PARTIELLE\"]}` then the same with `[\"REJET\"]`. This is the only lever that separates the two directions of a line.\n2. **The consecrated formula, quoted, in each phrasing.**\n3. **A plain full-sentence query** (no quotes).\n\nEngine facts:\n\n- **Ranking is direction-blind**: semantic matching ignores negations, and summaries surface the side that won. Never read direction or absence in an order, an `aiSummary` or a `snippet`.\n- **A lexical list (quotes/operators) is a set, not a ranking**: read it whole or partition it, never skim its top.\n- **A lexical query is a conjunction**, and nothing recovers a miss: a quoted formula followed by context words returns zero unless one decision carries all of it. Quote the formula alone, or ask plainly.\n- **A docket number goes in bare**: `21PA01295`, `19-20.682`, matched by exact key whatever the spelling, and served alone. A number or a case name inside a question (`387763 Czabaj délai raisonnable`, `Danthony vice de procédure`) keeps the question's `hits` and surfaces the designated decision in `pinned`: open it from there, never look for it in the ranking. `pinned` exists in `auto` only; a stated `mode` is served as stated.\n- **The window is `limit` (max 20), no pagination.** Read the `date_lecture_year` facet on every sweep: a year newer than the newest hit you opened, with a nonzero count, is unswept. Re-run with `date_from`/`date_to` on that year before concluding.\n- **`date_from` is the filter that silently hides a line's founding arrêt**, often decades old. Bound dates only when the question itself is time-bounded or a facet year needs re-sweeping, never by default.\n- **A specialised contentieux has its own axis, and no query wording replaces it**: `legal_domain` for the subject (`PUBLIC_DROIT_ETRANGERS_NATIONALITE`, `SOCIAL_DROIT_TRAVAIL`, `COMMERCIAL_DROIT_ENTREPRISES_DIFFICULTE`…), where a root covers its leaves (`CIVIL` also returns `CIVIL_DROIT_LOCATIF`, `CIVIL_DROIT_PERSONNES_FAMILLE`), `office` for the single-judge courts (`JLD`, `JAF`, `JCP`, `JEX`…), `legal_article` for the decisions citing one article (`\"code-civil|1240\"`). Each cuts the corpus before ranking.\n- **`seat` is the court unit itself, from its type down to its room**: a dotted path, one segment per level (`\"CC\"`, `\"CC.SOCIALE\"`, `\"CA.PARIS\"`, `\"CA.PARIS.P5.C6\"`). A path matches itself and everything under it, so `\"CC.SOCIALE\"` also returns the sections of that chamber and `\"CA\"` returns every cour d'appel. It says on one key what `jurisdiction_type` and `jurisdiction_code` say on two, and those two stay accepted. Take the paths from `facets.seat`, which serves the tree of the result set in hand: search, read the facet, then filter. Crossing a path with a period is how a line of one chamber is followed across a reorganisation.\n- Filter tokens (« ca_paris », « REJET ») poison the query text: filters carry constraints, the query carries only words a court would write. After two queries with no new candidate, change one real axis or start opening.\n\n### 3. Read everything you might cite\n\nOpen every hit of the target court that touches the issue. Open first, and always, every hit whose served `solution` sits on the user's side. Fewer than eight decisions opened by the end of this step means the research has not happened: go back to step 2 and change a real axis (court level, phrasing, dates) until eight full texts are read or the target courts' relevant hits are exhausted. Five verdicts per decision:\n\n- **Who speaks.** Court's motifs, or a party's argument (« il soutient que… ») ? Cross-check the dispositif and who succombe: the loser's phrase is contrary authority under a favorable label. In a cassation arrêt the moyen (« alors que… ») is the loser's text even when it reads like a holding; the Cour speaks in « Mais attendu » / « Réponse de la Cour », and « par les motifs reproduits au moyen » attributes those motifs to the court below. Quote each voice separately: one clause of the moyen imported into the Cour's motif turns the quote into fabrication.\n- **Exact object.** Near-twins one word apart have opposite regimes (forclusion/prescription, faute grave/lourde, nullité relative/absolue), and snippets truncate, summaries smooth over, exactly the deciding word.\n- **Appellate fate** (dominant rule 5). `INFIRMATION` kills the decision as support. `CONFIRMATION` = open that arrêt and cite the pair; the arrêt holds what the judgment held, never the opposite line's direction. No banner served = run the judgment's docket number, bare and unquoted, filtered to the appellate court: a number is matched by exact key, and quoting it drops the fallback. **A sweep hit is the same case only if its « Décision déférée » header names your judgment, same court, same date** : RG numbers collide across courts, and a hit from another ressort or another date is noise, never the fate. No banner and no sweep = « aucun recours lié dans le corpus ».\n- **Legal basis.** Decision texts carry inline `/norm/` links; open them with `get_norm` at the facts' date. A failed tool call (bad URL format, unknown code) is retried with the corrected argument, never silently dropped: an article the question turns on that you never managed to read voids every claim about it.\n- **The quotable sentence.** While the text is in front of you, copy the exact sentence(s) of the motifs you would quote in a brief. The writing stage may only put between quotation marks strings collected this way.\n\n### 4. Map the line\n\nRe-run the winning query with `sort: \"date_desc\"`, **once per direction, with that side's `solution` filter, per target court**, and read the most recent decisions of each. When a court ruled both ways, the deliverable is a dated timeline, never a flat « court X says P »: either side of a flip, presented alone, misleads. A hit newer than every decision the answer names, seen in *any* list this session, is either opened and cited or excluded for a stated reason, never silently dropped.\n\n### 5. Absence claims and counts\n\n« No decision of court X states P » is falsifiable with one citation. Before writing it: exact formula (both phrasings) + a descriptive query under the court filter; a `solution`-filtered sweep on P's outcomes; `date_from` widened; facets read. Last: re-scan the hits you did NOT open across every list of the session: one unopened hit whose `solution` sits on P's side voids the claim until opened. Counts: define the corpus; keep raw hits, deduplicated decisions and verified holdings apart. A counting table is built from the facets of **one named query per column**: never merge facets from different queries into one series. `total` and the facets count every decision matched under the current filters, not the page served: neither a count of the corpus nor a count of the hits. Two things distort that number. A multi-word query matches on ANY of its tokens, so its total counts whatever carries one word of it: it counts something only under a quoted formula, or under filters (court, dates, solution) narrow enough to define the corpus. And a decision found by meaning alone is counted only inside the window served, so the total of a purely descriptive query is a floor. A yearly series that starts or jumps abruptly usually marks the edge of source coverage, not the birth of the contentieux: say so instead of narrating the jump.\n\n## The answer\n\nThe shape is the user's: the format they asked for, or the one their earlier answers were in. What follows is what the answer has to carry, never how it looks. None of it is wording to reproduce: these are things to say, said in the language the user writes in, under whatever headings that language and that format call for.\n\n- **Give the verdict first**, then, per target court, the most recent decision in *each* direction, named and dated. Naming a court's latest word requires having run the `date_desc` + `solution` query of step 4 for that court and that direction.\n- **Say the same five things of every authority**: cite it and link it, quote it, say what its decisive sentence was about, say how it fared on appeal, say where it stops. The quotation is one collected at read time (the quotable sentence of step 3); when none was collected for that decision, write plain prose with NO quotation marks, marked « (résumé, citation non collectée) ». A passage from the exposé of a party's moyens is that party's argument, not the court's.\n- **Say how a decision fared on appeal in closed words**: the served banner, copied (« infirmé par [arrêt lié] », « confirmé par [arrêt lié] », and the pair cites together), or, when no banner was served, « aucun recours lié dans le corpus ». The words « balayé » / « vérifié » may appear only when the docket-number query is in this session's searches; any other wording (« à vérifier », « définitif »…) is a failed check.\n- **Say what opposing counsel will plead, per target court**: the recent contrary line, infirmations, reversals, dated. A first-instance court has its own contrary decisions, and calling its line « constante » while the opposite-`solution` sweep never ran for it is the check that fails most.\n- **Leave a thin side thin**: when a court offers a single decision, present it alone and say so.\n- **Give the perimeter, from two lists kept as you go.** One entry per `search_decisions` call of this session: the query, the filters (`solution`, dates, courts), the sort, the hits opened. One entry per `get_decision`, in call order: the linked citation. Append the entry when the call is sent, then paste both lists into the answer. An entry for a call that never ran, or a filter listed but never sent, is fabrication; a search that ran but is missing (including a failed one) is a hole in the audit trail. Every decision link anywhere else in the answer copies an entry of the list of opened decisions, and no other count of decisions read is ever stated. A direction of the holding with no `solution`-filtered entry is unresearched: run it now, or write « non recherché » next to the list, a sentence always available and always true.\n\nCite only decisions returned by the tools.\n\n## Final check, fix rather than flag\n\n- Every decision link in the answer has its entry in the list of opened decisions; a link without one is opened now (entry added) or deleted, along with every claim resting on it.\n- Every quoted string, searched **as one continuous block** in this session's `get_decision` / `get_norm` texts. Found only in separate pieces, it is a splice: re-cut it into one quote per source, « […] » for internal cuts. Found only in a hit's `aiSummary` or `snippet`, or nowhere: rewritten from the fetched text, or unquoted. Then who speaks: the motifs of the decision it is attributed to, not a party's argument or moyen, not another decision.\n- How each decision fared on appeal is verbatim one of two wordings: the copied banner, or « aucun recours lié dans le corpus ». Re-read the first line of each cited decision's text now. « balayé » / « vérifié » survives only when this session's searches carry that docket number, and any other wording (« définitif », « à vérifier ») is rewritten to the default formula.\n- Every perimeter entry pointed at the call of this session it copies: delete what you cannot point at, add the searches you ran and did not list.\n- No decision whose decisive sentence names another object left standing as an authority.\n- Weight adjectives (« isolé », « constant ») consistent with the decisions the answer itself lists; the answer states which way the most recent decisions of each target court go; an infirmed judgment never stands as support; every « no decision » claim earned under step 5.\n\n## Statutes\n\nQuick lookups only: anything deeper (treaties, EU law, versions across recodifications) is the recherche-normes skill's job. `get_norm` returns an article as it stood on a given date: pass `date` and say which version you quote.\n"Full snapshot data
{
"description": "Search and cite French and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, or needs counts of decisions on a point, even if they never mention LibreJustice.",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 295
},
{
"relative_path": "references/install-mcp.md",
"size_in_bytes": 1196
}
],
"name": "recherche-jurisprudence",
"skill_md_contents": "---\nname: recherche-jurisprudence\ndescription: Search and cite French and European case law with the LibreJustice MCP tools. Use whenever the user asks about court decisions (Cour de cassation, Conseil d'État, cours d'appel, TJ/TA, CNDA, Conseil constitutionnel, CNIL, CEDH, CJUE), needs authorities for a brief, requête, référé or consultation, wants to check how courts rule on an issue, or needs counts of decisions on a point, even if they never mention LibreJustice.\n---\n\n# French and European case-law research (LibreJustice)\n\nThe user needs decisions whose reasoning states a precise proposition, applicable to the situation at hand, with a quotable excerpt.\n\nThe tools come from the LibreJustice MCP server; if `search_decisions` is missing from your session, connect it first: [references/install-mcp.md](references/install-mcp.md).\n\nFive rules dominate everything:\n\n1. **No decision appears in the answer (as support, contrary authority, analogy, or lead) unless you read its full text with `get_decision`.** An `aiSummary` or a `snippet` is not reading.\n2. **Quotation marks quote a text you fetched, nothing else.** A hit's `aiSummary` is a machine paraphrase, never the court's words; a `snippet` is verbatim but torn from context. Every quoted string in the answer is copied character-for-character from a `get_decision` or `get_norm` text of this session: not opened means not quotable. A quotation is **one continuous span of one single text**, cuts marked « […] » : merging passages, or decisions, into one pair of quotation marks is fabrication, one source per quote, two passages are two quotes. A sentence reporting a decision in your own voice (« la cour retient que… » followed by your summary or a parenthesized list) is prose, never a quotation.\n3. **Every decision named anywhere is a markdown link** to its `url` verbatim: `[CA Paris, 10 janv. 2024, n° 21/22203](https://librejustice.fr/decision/…)`. Never reconstruct or shorten a URL.\n4. **The exact object of the question is a hard filter.** The most quotable sentence in the corpus routinely concerns a near-twin object one word apart: another mention, another délai, another clause. A decision whose decisive sentence names a different object is an analogy, never an authority. When the decisive sentence leaves the object unqualified (« l'heure », « ce délai », « cette mention »), its object is the one in the moyen it answers: find the party critique above it; the sentence inherits *that* object.\n5. **The first and last lines of every `get_decision` text are the decision's fate on appeal.** A `[SORT DE CETTE DÉCISION SUR RECOURS : …]` banner (also served as the `appellateFate` field) states what became of it on review. Copy it into the answer. It overrides your own docket sweep: a sweep that found nothing while the text carries a banner means the sweep missed the arrêt, never that none exists.\n\nA `get_decision` response may also carry `commentaires`, the court's own analysis served inline (`body`) and outbound links (`url`) to the rapporteur public's conclusions or related court documents. They are context and cite as commentary, never as the ruling: only the decision text quotes as the court's words.\n\n## Protocol: run the steps in order\n\n### 1. Frame\n\nPin down (ask when the request leaves them open): the proposition in one sentence; who demands what and what winning means; the legally relevant date; the target courts; the exclusions; the proximity axes that decide transposability. **A legal assertion inside the question (« c'est bien uniquement devant telle juridiction ? », « cet acte est nul, non ? ») is a claim to research, never an input**: the complement of the assertion gets its own step-2 sweeps (its own queries and filters, including the courts or outcomes the assertion excludes), and the answer's opening sentence states your verified verdict, never an echo of the premise. Follow-ups refine, they never reset: « d'autres ? » = new decisions, same bar; « tu peux vérifier ? » = reopen the source, never restate with more confidence.\n\n### 2. Sweep: three passes, all mandatory\n\n1. **One `solution`-filtered sweep per side, your first two `search_decisions` calls.** Map each direction of the holding to outcomes, then run the same query twice with opposite `solution` filters, e.g. `{\"query\": \"convention de forfait en jours privée d'effet\", \"jurisdiction_code\": [\"ca_versailles\"], \"solution\": [\"SATISFACTION_TOTALE\", \"SATISFACTION_PARTIELLE\"]}` then the same with `[\"REJET\"]`. This is the only lever that separates the two directions of a line.\n2. **The consecrated formula, quoted, in each phrasing.**\n3. **A plain full-sentence query** (no quotes).\n\nEngine facts:\n\n- **Ranking is direction-blind**: semantic matching ignores negations, and summaries surface the side that won. Never read direction or absence in an order, an `aiSummary` or a `snippet`.\n- **A lexical list (quotes/operators) is a set, not a ranking**: read it whole or partition it, never skim its top.\n- **A lexical query is a conjunction**, and nothing recovers a miss: a quoted formula followed by context words returns zero unless one decision carries all of it. Quote the formula alone, or ask plainly.\n- **A docket number goes in bare**: `21PA01295`, `19-20.682`, matched by exact key whatever the spelling, and served alone. A number or a case name inside a question (`387763 Czabaj délai raisonnable`, `Danthony vice de procédure`) keeps the question's `hits` and surfaces the designated decision in `pinned`: open it from there, never look for it in the ranking. `pinned` exists in `auto` only; a stated `mode` is served as stated.\n- **The window is `limit` (max 20), no pagination.** Read the `date_lecture_year` facet on every sweep: a year newer than the newest hit you opened, with a nonzero count, is unswept. Re-run with `date_from`/`date_to` on that year before concluding.\n- **`date_from` is the filter that silently hides a line's founding arrêt**, often decades old. Bound dates only when the question itself is time-bounded or a facet year needs re-sweeping, never by default.\n- **A specialised contentieux has its own axis, and no query wording replaces it**: `legal_domain` for the subject (`PUBLIC_DROIT_ETRANGERS_NATIONALITE`, `SOCIAL_DROIT_TRAVAIL`, `COMMERCIAL_DROIT_ENTREPRISES_DIFFICULTE`…), where a root covers its leaves (`CIVIL` also returns `CIVIL_DROIT_LOCATIF`, `CIVIL_DROIT_PERSONNES_FAMILLE`), `office` for the single-judge courts (`JLD`, `JAF`, `JCP`, `JEX`…), `legal_article` for the decisions citing one article (`\"code-civil|1240\"`). Each cuts the corpus before ranking.\n- **`seat` is the court unit itself, from its type down to its room**: a dotted path, one segment per level (`\"CC\"`, `\"CC.SOCIALE\"`, `\"CA.PARIS\"`, `\"CA.PARIS.P5.C6\"`). A path matches itself and everything under it, so `\"CC.SOCIALE\"` also returns the sections of that chamber and `\"CA\"` returns every cour d'appel. It says on one key what `jurisdiction_type` and `jurisdiction_code` say on two, and those two stay accepted. Take the paths from `facets.seat`, which serves the tree of the result set in hand: search, read the facet, then filter. Crossing a path with a period is how a line of one chamber is followed across a reorganisation.\n- Filter tokens (« ca_paris », « REJET ») poison the query text: filters carry constraints, the query carries only words a court would write. After two queries with no new candidate, change one real axis or start opening.\n\n### 3. Read everything you might cite\n\nOpen every hit of the target court that touches the issue. Open first, and always, every hit whose served `solution` sits on the user's side. Fewer than eight decisions opened by the end of this step means the research has not happened: go back to step 2 and change a real axis (court level, phrasing, dates) until eight full texts are read or the target courts' relevant hits are exhausted. Five verdicts per decision:\n\n- **Who speaks.** Court's motifs, or a party's argument (« il soutient que… ») ? Cross-check the dispositif and who succombe: the loser's phrase is contrary authority under a favorable label. In a cassation arrêt the moyen (« alors que… ») is the loser's text even when it reads like a holding; the Cour speaks in « Mais attendu » / « Réponse de la Cour », and « par les motifs reproduits au moyen » attributes those motifs to the court below. Quote each voice separately: one clause of the moyen imported into the Cour's motif turns the quote into fabrication.\n- **Exact object.** Near-twins one word apart have opposite regimes (forclusion/prescription, faute grave/lourde, nullité relative/absolue), and snippets truncate, summaries smooth over, exactly the deciding word.\n- **Appellate fate** (dominant rule 5). `INFIRMATION` kills the decision as support. `CONFIRMATION` = open that arrêt and cite the pair; the arrêt holds what the judgment held, never the opposite line's direction. No banner served = run the judgment's docket number, bare and unquoted, filtered to the appellate court: a number is matched by exact key, and quoting it drops the fallback. **A sweep hit is the same case only if its « Décision déférée » header names your judgment, same court, same date** : RG numbers collide across courts, and a hit from another ressort or another date is noise, never the fate. No banner and no sweep = « aucun recours lié dans le corpus ».\n- **Legal basis.** Decision texts carry inline `/norm/` links; open them with `get_norm` at the facts' date. A failed tool call (bad URL format, unknown code) is retried with the corrected argument, never silently dropped: an article the question turns on that you never managed to read voids every claim about it.\n- **The quotable sentence.** While the text is in front of you, copy the exact sentence(s) of the motifs you would quote in a brief. The writing stage may only put between quotation marks strings collected this way.\n\n### 4. Map the line\n\nRe-run the winning query with `sort: \"date_desc\"`, **once per direction, with that side's `solution` filter, per target court**, and read the most recent decisions of each. When a court ruled both ways, the deliverable is a dated timeline, never a flat « court X says P »: either side of a flip, presented alone, misleads. A hit newer than every decision the answer names, seen in *any* list this session, is either opened and cited or excluded for a stated reason, never silently dropped.\n\n### 5. Absence claims and counts\n\n« No decision of court X states P » is falsifiable with one citation. Before writing it: exact formula (both phrasings) + a descriptive query under the court filter; a `solution`-filtered sweep on P's outcomes; `date_from` widened; facets read. Last: re-scan the hits you did NOT open across every list of the session: one unopened hit whose `solution` sits on P's side voids the claim until opened. Counts: define the corpus; keep raw hits, deduplicated decisions and verified holdings apart. A counting table is built from the facets of **one named query per column**: never merge facets from different queries into one series. `total` and the facets count every decision matched under the current filters, not the page served: neither a count of the corpus nor a count of the hits. Two things distort that number. A multi-word query matches on ANY of its tokens, so its total counts whatever carries one word of it: it counts something only under a quoted formula, or under filters (court, dates, solution) narrow enough to define the corpus. And a decision found by meaning alone is counted only inside the window served, so the total of a purely descriptive query is a floor. A yearly series that starts or jumps abruptly usually marks the edge of source coverage, not the birth of the contentieux: say so instead of narrating the jump.\n\n## The answer\n\nThe shape is the user's: the format they asked for, or the one their earlier answers were in. What follows is what the answer has to carry, never how it looks. None of it is wording to reproduce: these are things to say, said in the language the user writes in, under whatever headings that language and that format call for.\n\n- **Give the verdict first**, then, per target court, the most recent decision in *each* direction, named and dated. Naming a court's latest word requires having run the `date_desc` + `solution` query of step 4 for that court and that direction.\n- **Say the same five things of every authority**: cite it and link it, quote it, say what its decisive sentence was about, say how it fared on appeal, say where it stops. The quotation is one collected at read time (the quotable sentence of step 3); when none was collected for that decision, write plain prose with NO quotation marks, marked « (résumé, citation non collectée) ». A passage from the exposé of a party's moyens is that party's argument, not the court's.\n- **Say how a decision fared on appeal in closed words**: the served banner, copied (« infirmé par [arrêt lié] », « confirmé par [arrêt lié] », and the pair cites together), or, when no banner was served, « aucun recours lié dans le corpus ». The words « balayé » / « vérifié » may appear only when the docket-number query is in this session's searches; any other wording (« à vérifier », « définitif »…) is a failed check.\n- **Say what opposing counsel will plead, per target court**: the recent contrary line, infirmations, reversals, dated. A first-instance court has its own contrary decisions, and calling its line « constante » while the opposite-`solution` sweep never ran for it is the check that fails most.\n- **Leave a thin side thin**: when a court offers a single decision, present it alone and say so.\n- **Give the perimeter, from two lists kept as you go.** One entry per `search_decisions` call of this session: the query, the filters (`solution`, dates, courts), the sort, the hits opened. One entry per `get_decision`, in call order: the linked citation. Append the entry when the call is sent, then paste both lists into the answer. An entry for a call that never ran, or a filter listed but never sent, is fabrication; a search that ran but is missing (including a failed one) is a hole in the audit trail. Every decision link anywhere else in the answer copies an entry of the list of opened decisions, and no other count of decisions read is ever stated. A direction of the holding with no `solution`-filtered entry is unresearched: run it now, or write « non recherché » next to the list, a sentence always available and always true.\n\nCite only decisions returned by the tools.\n\n## Final check, fix rather than flag\n\n- Every decision link in the answer has its entry in the list of opened decisions; a link without one is opened now (entry added) or deleted, along with every claim resting on it.\n- Every quoted string, searched **as one continuous block** in this session's `get_decision` / `get_norm` texts. Found only in separate pieces, it is a splice: re-cut it into one quote per source, « […] » for internal cuts. Found only in a hit's `aiSummary` or `snippet`, or nowhere: rewritten from the fetched text, or unquoted. Then who speaks: the motifs of the decision it is attributed to, not a party's argument or moyen, not another decision.\n- How each decision fared on appeal is verbatim one of two wordings: the copied banner, or « aucun recours lié dans le corpus ». Re-read the first line of each cited decision's text now. « balayé » / « vérifié » survives only when this session's searches carry that docket number, and any other wording (« définitif », « à vérifier ») is rewritten to the default formula.\n- Every perimeter entry pointed at the call of this session it copies: delete what you cannot point at, add the searches you ran and did not list.\n- No decision whose decisive sentence names another object left standing as an authority.\n- Weight adjectives (« isolé », « constant ») consistent with the decisions the answer itself lists; the answer states which way the most recent decisions of each target court go; an infirmed judgment never stands as support; every « no decision » claim earned under step 5.\n\n## Statutes\n\nQuick lookups only: anything deeper (treaties, EU law, versions across recodifications) is the recherche-normes skill's job. `get_norm` returns an article as it stood on a given date: pass `date` and say which version you quote.\n"
}SHA-256 of public snapshot: 830538d5a20076f4901619069aa04e82a8bea2c9828991e139c4e4dcab1450a4