Tw Legal RAG
aa0101181514/tw-legal-rag
Retrieve real Taiwan court judgments with verifiable citations before answering any question about Taiwan law or case law.
Compliant, retrieval-grounded research over investor-State dispute settlement (ISDS) awards and decisions.
$ npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install lawve-ai/awesome-legal-skills isds-research --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/lawve-ai/awesome-legal-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/isds-research-cameron-russell .claude/skills/isds-research && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "isds-research" agent skill from https://github.com/lawve-ai/awesome-legal-skills/tree/main/skills/isds-research-cameron-russell into .claude/skills/isds-research/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "isds-research", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/lawve-ai/awesome-legal-skills/tree/main/skills/isds-research-cameron-russellType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install lawve-ai/awesome-legal-skills isds-research --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lawve-ai/awesome-legal-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/isds-research-cameron-russell .agents/skills/isds-research && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "isds-research" agent skill from https://github.com/lawve-ai/awesome-legal-skills/tree/main/skills/isds-research-cameron-russell into .agents/skills/isds-research/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "isds-research", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install lawve-ai/awesome-legal-skills isds-research --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lawve-ai/awesome-legal-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/isds-research-cameron-russell .cursor/skills/isds-research && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "isds-research" agent skill from https://github.com/lawve-ai/awesome-legal-skills/tree/main/skills/isds-research-cameron-russell into .cursor/skills/isds-research/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "isds-research", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/lawve-ai/awesome-legal-skills.git --path skills/isds-research-cameron-russell--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install lawve-ai/awesome-legal-skills isds-research --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lawve-ai/awesome-legal-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/isds-research-cameron-russell .gemini/skills/isds-research && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "isds-research" agent skill from https://github.com/lawve-ai/awesome-legal-skills/tree/main/skills/isds-research-cameron-russell into .gemini/skills/isds-research/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "isds-research", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install lawve-ai/awesome-legal-skills isds-researchInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/lawve-ai/awesome-legal-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/isds-research-cameron-russell .github/skills/isds-research && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "isds-research" agent skill from https://github.com/lawve-ai/awesome-legal-skills/tree/main/skills/isds-research-cameron-russell into .github/skills/isds-research/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "isds-research", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install lawve-ai/awesome-legal-skills isds-research --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/lawve-ai/awesome-legal-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/isds-research-cameron-russell .opencode/skills/isds-research && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "isds-research" agent skill from https://github.com/lawve-ai/awesome-legal-skills/tree/main/skills/isds-research-cameron-russell into .opencode/skills/isds-research/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "isds-research", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
isds-researchCompliant, retrieval-grounded research over investor-State dispute settlement (ISDS) awards and decisions.
Isds Research is an agent skill from lawve-ai/awesome-legal-skills. Compliant, retrieval-grounded research over investor-State dispute settlement (ISDS) awards and decisions. Use when the user asks about ICSID / investment-treaty arbitration cases, awards, or doctrines (fair and equitable treatment, expropriation, jurisdiction, costs, annulment, etc.) and wants answers grounded in the actual document text with pinpoint citations. Identifies the correct document on the case page, confirms it against the PDF's own first pages, retrieves primary documents on demand from ICSID, PCA…
Its SKILL.md is about 13k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts (for example `README.md`, `WRITEUP.md` and `scripts/fetch_icsid_award.py`).
It sits in Legal & Compliance, covering Dispute resolution, Web scraping and Citation management. The repository describes itself as: A curated list of awesome Agent Skills for automating legal work. The licence is AGPL-3.0-only.
8 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 045f738. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 2 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
pythonqpdfpdftoppmFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
icsid.worldbank.orgpca-cpa.orgAlso links to:
investmentpolicy.unctad.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Isds Research loads about 13k tokens when it runs. Until then it costs about 159 tokens; SKILL.md has 7,410 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from lawve-ai/awesome-legal-skills at commit 045f738, republished under its AGPL-3.0-only licence (© lawve-ai). 7,410 words, ~13,172 tokens.
.claude/skills/isds-research/SKILL.md (or your agent's skills folder). This skill also uses 6 other files; get the full folder from GitHub.Answer questions about ISDS cases by retrieving the primary documents on demand and grounding every legal statement in the retrieved text, with pinpoint (paragraph / page) citations. This is a research aid, not legal advice.
Intended users: lawyers, arbitration practitioners, academics, and students who need verifiable ISDS research — every output is research support for the user's own professional judgment: the tool retrieves, cites, and discloses; the user analyzes and concludes.
icsid.worldbank.org / icsidfiles.worldbank.org) — primary text. Permissive robots; Terms allow viewing/downloading for personal, non-commercial use. Do not redistribute; attribute (below).pca-cpa.org; documents on docs.pca-cpa.org) — primary text for PCA-administered cases (many UNCITRAL investor-State arbitrations). Robots + Terms verified 2026-07-02: the main site's robots is default-only — no bot-specific groups, disallowing only /wp-admin/ (verified 2026-07-02 for Claude-User; re-verified 2026-07-18, incl. ChatGPT-User); the document host returns S3 AccessDenied for robots.txt (no robots file → no crawl restriction; a 4xx robots response is treated as "allow"); PCA's Terms of Use bar only commercial use without permission and impose no automated-access restriction. Fetch specific documents on demand for non-commercial research; attribute; do not republish; honor any case-specific restriction (Terms cl.1 — many PCA/UNCITRAL matters are confidential or only partially published). No PCA helper script yet: locate the document on the PCA case page and fetch that URL, then extract as for ICSID.Claude-User, ChatGPT-User). Robots re-verified 2026-07-18: investmentpolicy.unctad.org currently publishes no robots.txt and unctad.org's is default-only with no bot-specific rules (an earlier verification, c. 2026-07-01, recorded an explicit ClaudeBot disallow — robots files change; re-verify periodically). Permission therefore rests on UNCTAD's Terms, which permit personal, non-commercial use — the absence of robots restrictions is NOT a licence for bulk collection. Do not scrape or paginate the UI; link and attribute, never republish it. Reliable path for complete category-filtering: use UNCTAD's official full-data Excel export (structured; all filter fields) — that's the intended public data product, not scraping (local non-commercial filtering only; don't republish or build a public derivative DB). Individual Navigator case pages are server-rendered and load fine via web_fetch (good for targeted single-case metadata — which also carries the ICSID case number for grounding); it's the filtered search/list views that are JS-rendered and time out, so enumerate via the Excel export (or a browser render), not by scraping search pages. Freshness: the data is dated snapshots refreshed ~1–2×/year and, per UNCTAD, "cannot be deemed exhaustive" (publicly-known cases only; confidential ones excluded) — state the snapshot date and this caveat.italaw.com) — last-resort, per-case-confirmed primary-text fallback. Reach italaw only after ICSID / PCA / other official sources are exhausted for the specific document. Default route: the user obtains the document manually and supplies the file (--pdf-file) — italaw's Terms §4.2 expressly permit manual human browsing. An automated fetch is the fallback only, and only under all of these conditions: (i) per-document human confirmation — show the case + exact italaw URL and obtain an affirmative approval each time; no "approve all", no persistent auto-yes; (ii) the platform's own user-initiated agent token only (e.g. Claude-User on Claude, ChatGPT-User on ChatGPT) — never spoof a human-browser user-agent; (iii) one document per approval — never bulk, batch, loop, or deep-link lists; (iv) reference, don't reproduce — short pinpoint quotes + cite/link back to the italaw case page; no wholesale reproduction or AI summary substituting for the source; (v) log each approval (document, URL, timestamp) in the run log. Keep italaw content out of any build/test corpus (Terms §4.1); non-commercial use only (§§4.3/5.1); re-check robots.txt + Terms periodically (§8.1 lets italaw change them without notice). A single, per-document, human-confirmed fetch is not prohibited under §4.2 of italaw's terms as it does not constitute bulk access or circumvent any italaw access controls. Robots re-verified 2026-07-18: italaw's robots.txt operatively disallows bulk crawlers (ClaudeBot, GPTBot) but names no user-initiated agent — Claude-User and ChatGPT-User fall under the permissive * rules (crawl-delay 10, trivially satisfied by one-document-per-approval) — and now carries Content-Signals (search=yes, ai-train=no, use=reference, framed as an express rights reservation under art. 4 of EU Directive 2019/790): use=reference matches condition (iv) exactly, and ai-train=no is honored by keeping italaw content out of any build/test corpus. The gate above remains in force unchanged.python scripts/query_unctad_excel.py (filters, ICSID-case-number extraction, and the mandatory data-freshness footer). Do not substitute ICSID, WebSearch, or memory to enumerate cases — ICSID doesn't tag issues, WebSearch isn't exhaustive, and memory hallucinates and is bound by a training cut-off, so each silently misses cases. If you can't reach UNCTAD data, say the set can't be completed and scope the answer; note results are current only to UNCTAD's last snapshot and are non-exhaustive per UNCTAD; indicate to users when answers may be impacted by known data gaps.Enumeration ("which cases") questions need UNCTAD's full-data Excel in the skill's data/ folder. If scripts/query_unctad_excel.py prints DATA_MISSING (or before the first enumeration question, if data/ has no .xlsx), do NOT try to fetch the file yourself and do NOT answer from memory. Instead, tell the user — in your own words, covering all four points:
data/ folder — that way it persists and is reused in every later session without re-uploading. (Users running locally can just place the file in data/ themselves.) When you receive the upload, save it to data/ and confirm.Award retrieval works without the Excel; only enumeration needs it.
Before the first retrieval, check whether preferences are on record:
python scripts/fetch_icsid_award.py --show-configThis prints CONFIG_PATH (where the script is looking), CONFIG_DIR_WRITABLE (whether that location can store preferences), and the stored preferences or NO_CONFIG.
On a platform where this skill has not run before, also run python scripts/fetch_icsid_award.py --check-env (dependencies, network egress to the source hosts, config writability — see Platform notes) before the first retrieval.
Look for an existing config before treating this as a first run. Installed skill folders are commonly mounted read-only, so the config may live outside the skill folder: if the default path prints NO_CONFIG, check the root of the user's ISDS research area (where earlier research folders were saved) for isds-research-config.json; if found, pass it on every call: --config "<research area>/isds-research-config.json".
If no config exists anywhere, this is the first run: ask the user two questions in one interview, telling them the answers are stored so they are asked once:
I'll (i) default to providing decisions in your preferred language; (ii) indicate when the original version is in a different language; and (iii) if a decision is not available in your preferred language, tell you which languages it is available in on the ICSID website and ask how you'd like to proceed — read one of those versions (e.g. an existing ICSID translation), or have me translate the original myself, flagged as my own, non-authoritative translation.
research_root — never a sandbox or session path — and deliver the files for download per Research folders item 6.Then record both. If CONFIG_DIR_WRITABLE=yes, the default location (inside the skill folder) works:
python scripts/fetch_icsid_award.py --set-prefer-lang "English" --set-research-root "<research area path>"If CONFIG_DIR_WRITABLE=no (read-only skill folder), ask the user where preferences should live (suggested default: the root of the research area they just chose — fold this into the same interview), then record with an explicit path and pass the same --config on every later call, in this and future sessions:
python scripts/fetch_icsid_award.py --config "<research area>/isds-research-config.json" \
--set-prefer-lang "English" --set-research-root "<research area path>"A failed config write never tracebacks: the script prints a CONFIG NOT SAVED block with these same instructions and exits with code 3. Never drop the user's answer or silently fall back to re-asking next session — store it at the writable location the user chose.
Before you answer — the workflow gate (applies to every request, including one-paragraph lookups).
A request that names a case or passage is a retrieval task, not a question you may answer from the document text — or from memory, a search snippet, or a copy you already have — directly. The brevity of the request never shortens the workflow: "just quote paragraph 154" is still a grounded retrieval that must be configured, filed, and logged. Before you deliver any case text, in order:
--show-config (and, on first use per platform, --check-env). A config that has a language but no research_root is incomplete — you must still ask the research-folder half of the first-run interview. If nothing is on record, run the full interview. Do not infer a research location, and do not proceed on a language-only config.--pdf-file route or a documented degraded mode and disclose it. Never bypass the script to fetch a document by hand: an ad-hoc download skips the CONFIRM identity check and may pull a non-canonical copy (an exhibit filed in another case, a mirror) instead of the official document.research_root, retrieve and CONFIRM the document, save the PDF, and write the memo (or, for a repeat-topic quick lookup, follow Research folders item 5).If you are about to quote the document before steps 1–3 are done, stop: you are not using the skill, only imitating its output.
Identify the case (or discover cases). Get the ICSID case number (e.g. ARB(AF)/00/2) or name. For cross-institution or "which cases" discovery, follow the discovery ladder (degrade gracefully, disclose at each step):
python scripts/query_unctad_excel.py … gives the complete UNCTAD-tagged set up to the snapshot date (see Source routing below).web_fetch times out on them — so live filtered discovery needs a JS-capable render (an optional prerequisite — Claude in Chrome on Claude, or the platform's browsing/agent mode elsewhere), keeping to the specific searches the request needs; never bulk-crawl.WebSearch — but present these as non-exhaustive pointers, never as the complete set (golden rule 7).Then hand each ICSID case off to the retrieval steps below for grounded text. For non-ICSID cases: PCA-administered, published matters are groundable too (fetch the specific document — see Sources); other forums (e.g. SCC) yield metadata + the official link only.
List the documents on the case page:
python scripts/fetch_icsid_award.py --case "ARB(AF)/00/2" --listThis prints every published document — proceeding, title, date, and one row per available language + URL — plus a machine-readable JSON_DOCS= line.
Choose the target document by title + date + proceeding (e.g. "Award of the Tribunal (May 29, 2003)", not the "Introductory Note"; the right proceeding if there was an annulment). If the choice is unambiguous, pick it. If several documents plausibly match, ask the user which one rather than guessing.
Retrieve + CONFIRM. Download the chosen document and read its first page(s):
python scripts/fetch_icsid_award.py --case "ARB(AF)/00/2" --select 1 --query "fair and equitable treatment"The script prints a CONFIRM block (case-page label, detected case number, first-page text). Verify the title, parties, case number, and date match the document you intended. If they don't, stop and re-select. Language selection follows the policy below; the script downloads full text (not truncated) and extracts paragraph-aware passages.
Apply the language policy. If the document is available in the user's preferred language, the script retrieves it and proceeds. If it is not, the script stops and does NOT substitute another language — it prints LANGUAGE CHOICE NEEDED with the languages the document is available in. Tell the user those languages and ask how they want to proceed: you often cannot tell from the ICSID page whether one language is authoritative or both are equally authoritative, and the user may prefer an existing ICSID translation (e.g. the English translation of a Spanish original) over a translation you produce. Only after the user chooses do you retrieve that version: --select N --lang "<choice>". In your answer: always state which language you retrieved and whether the page labels it original or translation; note that exact wording is authoritative only in the original where one is indicated; and if the user asks you to translate the original yourself, label it clearly as your own, non-authoritative translation.
Answer, grounded. Quote the relevant passage; give the paragraph number (and page). Page convention: when the document's printed page numbers diverge from the PDF's page indices (common in ICSID Reports reprints and repaginated scans), cite both in the format "p. X (PDF p. Y)" — printed page first, PDF page in parentheses; when they coincide, a single page number suffices. If the user's point isn't in the retrieved text, say so plainly.
Verify (required). Before sending, confirm each quote and paragraph number actually appears in the retrieved text. If you cannot verify it, remove it.
Attribute + disclaim.
Question: "How did the tribunal in Tecmed v. Mexico articulate the fair and equitable treatment standard?"
python scripts/fetch_icsid_award.py --case "ARB(AF)/00/2" --list
# → structured document table, e.g.:
# [1] Award of the Tribunal — May 29, 2003 — Original proceeding — Spanish, English
# [2] Introductory Note — …
python scripts/fetch_icsid_award.py --case "ARB(AF)/00/2" --select 1 --query "fair and equitable treatment"The script prints a CONFIRM block (case-page label; detected case number ARB(AF)/00/2; first-page text showing Técnicas Medioambientales Tecmed, S.A. v. United Mexican States, Award, May 29, 2003) — verify title, parties, case number, and date before relying on it — then the matching passages with para N (p.M) locators.
Expected answer shape (abbreviated):
The tribunal articulated the FET standard as requiring "…exact passage quoted verbatim from the text retrieved this session…" (Award, ¶154 (p. 61)). Retrieved: English version; the ICSID page also carries the Spanish original — exact wording is authoritative in the original where one is indicated.
Source: International Centre for Settlement of Investment Disputes. Available at https://icsid.worldbank.org. For research only; not legal advice. Verify against the official primary source.
This example deliberately does not reproduce the ¶154 text: under golden rule 1, the quote must come from the document retrieved in your session — never from this file, and never from memory.
This tool has deliberate limits: it holds no scraped corpus and has no access to subscription research databases (Investor-State LawGuide (ISLG), Jus Mundi) and no full-text search over italaw (single-document retrieval only, under the last-resort gate in Sources). Acknowledging those limits is part of the design — never paper over them. Classify each question and disclose accordingly:
WebSearch, consider whether a full treatment of the topic would implicate other cases, lines of authority, or materials you cannot access — and list them as unexamined leads, expressly not analyzed. Never let a synthesis generalize from the bounded set to "the law" without this step. (A bounded set can read as a settled trend when the set happens to sit on one side of a doctrinal split — most contested doctrines have a competing line of authority the named cases exclude; the completeness check exists to surface it.)Framing for users: what this tool does well is verifiable research — primary-text retrieval with pinpoint cites and honest provenance. What it deliberately does not do is pretend to database-completeness it doesn't have.
Every research question on a new topic gets a local folder in the user's project (workspace), so the memo and the primary documents survive the session and follow-ups build on prior work:
research_root, set in the first-run interview; if it is missing, or the stored path no longer exists or is not writable, ask the user where research folders should go and update the config with --set-research-root — never guess). Name it YYYY-MM-DD <topic> (today's date + a short topic label), e.g. 2026-01-15 FET legitimate expectations. Never create it in a temporary, hidden, or sandbox-scratch location: the folder must be somewhere the user can see and keep.--save-pdf on the fetch script, named:
<Short case name>, <Institution> <case number>, <Short doc title>, <YYYY-MM-DD decision date>.pdf
e.g. Tecmed v Mexico, ICSID ARB(AF)-00-2, Award, 2003-05-29.pdf
(Hyphens replace / in case numbers — slashes are illegal in filenames.)_run-log.md (the passage, its voice attribution, the pinpoint cite, and how it was verified). Then place the substantive result by whether it answers a new question or re-touches one an existing memo already covers: if no memo in the folder covers this question, write a short new dated memo in the same folder (brief is fine, but the always-required memo parts — house-style scope rule — still apply); if an existing memo covers it, update that memo in place (extend, correct, add a dated note). Reserve run-log-only (no memo) for genuinely ephemeral checks that yield no quotable work product (e.g. confirming whether a paragraph mentions a term). A quick lookup on a genuinely new topic still gets its own folder and memo.Structure every research memo as follows:
Scope — which parts apply (by deliverable class): parts 1, 2, 3, 7, 8 and 9 (header; bottom line; how-to-read & data freshness; cross-check with training data; retrieval trail and weak points; sources & attribution + disclaimer) are required for every memo, whatever the question class — for enumeration-only answers each may be brief, but none may be omitted (the training-data cross-check doubles as a sanity check on a surprising count). Parts 4, 5 and 6 are conditional on the question class: per-case grounded sections (4) whenever holdings or decisions are discussed; the enumeration section (5) whenever a count or case-set is given; the completeness check (6) whenever the answer rests on a bounded set of authorities. Charts and tables follow the non-memo deliverables rules in the next section.
Drafting checklist — verify before saving: (a) every quote and pinpoint appears in the retrieved text (golden rule 1; workflow step 7); (b) voice correctly attributed throughout — tribunal/committee finding vs. party argument (golden rule 2(a)); (c) unanimity/majority stated for each holding where the record shows it (golden rule 2(b)); (d) the bottom line is consistent with the grounded sections; (e) every statement not grounded in retrieved primary text carries its flag (secondary-sourced status items use the standard [LIVE / secondary …] tag — see the labeling rule in Source routing); (f) any disagreement between sources encountered during the run is surfaced with both values and both sources — never silently resolved (see the Conflict rule in Source routing).
The grounding discipline is format-independent: a chart is a set of factual claims, and every rule above applies to it. For any non-memo deliverable (chart, timeline, table, dataset extract):
<desc>/footnote, table caption) listing the sources used and which data each supports. Approximations and metadata-only data points are disclosed on the artifact, not only in a log — a chart travels without its folder.[LIVE / secondary …] tag, or "per <metadata source>"), per the Labeling rule._run-log.md: each data series → its source (with pinpoint or field name), what was verified and how, and what is approximate or unresolved (including any source conflicts, per the Conflict rule).The UNCTAD Excel snapshot in data/ is dated (31/12/2023); the live Navigator is itself only refreshed ~biannually (a dated snapshot too); only the institutions' own pages are current. Route by question type:
python scripts/query_unctad_excel.py --respondent Argentina --status "favour of investor"
python scripts/query_unctad_excel.py --breach-found "Umbrella clause" --count-only
python scripts/query_unctad_excel.py --list-values STATUSweb_fetch times out on them; or ICSID's live list for the ICSID subset), disclosing coverage limits.LIVE_CHECK need this. Named-case verification needs no browser: Navigator case pages are server-rendered and web_fetch-able, and resolve by numeric id with any slug (/investment-dispute-settlement/cases/{id}/x). Cross-check the institution's live page (ICSID case-detail / PCA). Order matters: attempt the institution's page and the Navigator case page BEFORE falling back to WebSearch for follow-on status, and log each attempt (success, block, or not-found) in the run log — a successful institutional fetch upgrades the item from secondary reporting to institutional metadata; a logged block is itself the documented degradation path. Obtain a Navigator case id compliantly — from a targeted WebSearch for the case's Navigator URL or from the Excel's link/DECISIONS fields — never by guessing or incrementing ids (a wrong id silently resolves to a different case).[LIVE / secondary — as of <YYYY-MM-DD>, per <source type>; verify at <institutional page>]. Where the authoritative source is not an arbitral-institution or UNCTAD page — e.g. a national-court follow-on such as a set-aside by the courts of the seat — the verify element instead names the primary decision and a concrete locator: verify against <primary judgment cite> at <locator>, the locator being the court's own website or a public law database (e.g. CanLII, BAILII); never leave the verify element without a locator. Any money figure drawn from secondary reporting additionally carries "figure not verified against primary text" — amounts are what secondary reporting most often gets wrong. The tag applies equally to any post-snapshot count or projection — including the query helper's cached freshness figures (e.g. a "+N cases since the snapshot" delta derived from the DATA FRESHNESS footer): carry the footer's own "NOT verified now — last known observation <date>" qualifier into the deliverable, and never restate a cached or shipped-default figure as current fact — the freshness cache is machine-local and the script's fallback constant ages, so neither is evidence of the Navigator's state today.Conflict rule (required): when two retrieved or authoritative sources disagree on a fact — a date, an amount, a count, a status, or a legal characterization (a Convention or treaty article number, an annulment ground, a cause of action) — do not silently select one. Legal characterizations also get a domain sanity check before being carried: if a secondary source's article label contradicts the provision's settled content (e.g. "improper constitution" labeled Art. 52(1)(d) when that is the 52(1)(a) ground), treat that as a source conflict even if only one source states it. Surface both values in the deliverable itself, identify each source and its class (retrieved primary text / institutional page or document list / dataset metadata / secondary reporting), and flag the conflict as unresolved unless a retrieved primary document settles it. Where the fact matters to the answer, say which value the answer provisionally follows and why (primary text outranks institutional metadata; institutional metadata outranks secondary reporting).
Note: the Excel names follow-on decisions but carries no links to the decision documents — for follow-on document retrieval use the case's Navigator page or route to ICSID/PCA.
Try each rung in order; in the memo, disclose which rung produced each document. Never fill from memory.
--case/--case-url + --list). If the document list is empty, do NOT guess URLs; diagnose the cause (JS-rendered page — rung 2 fixes it — vs. "no documents published by the institution") before proceeding.--doc-url. ICSID case pages are inconsistently server-rendered per case; a real browser resolves the JS ones. Open the case page, identify the document row (title + date + proceeding + language, per golden rule 3), copy the exact PDF href, and pass it to the script with --doc-url (the CONFIRM check still runs). Prerequisites vary by platform: on Claude, the Claude in Chrome extension must be installed, signed in, and have site access enabled (a "blocked by your organization's policy" error means site access is off; a Chrome restart may be needed after enabling it); on other platforms, use the assistant's browsing/agent mode where it can render JS pages. If the rendered page also lists no documents, the institution publishes none for this case — rung 2 cannot help; record that finding and move to rung 3.--pdf-file --source-url). Ask the user to obtain the document manually and supply the file — from the institution if they can reach it, or from a source whose terms permit manual access (italaw permits manual human browsing — manual supply is the default route for italaw documents). Harvest a concrete URL first (required): before (or at) the rung-3 stop, check UNCTAD's metadata for a per-document link — the Navigator case page's decisions/documents fields and the Excel's DECISIONS field often carry one. If it points at italaw, hand that exact URL to the user for manual download; if it points at an institution, use --doc-url directly instead. If the user declines to download manually, an automated italaw fetch of that single document is permitted as the fallback — but only under the per-document confirmation gate in the italaw entry under Sources (golden rule 6): re-present the exact URL, obtain a fresh affirmative approval, fetch under the platform's own user-initiated agent token (never a spoofed browser UA), and log the approval; the CONFIRM check still runs. In a non-interactive run where no user can be asked, record the harvested URL in the memo's unretrieved-lead entry so the user can act on it later — a concrete link, not a generic "e.g., italaw". Record provenance with --source-url; corroborate identity via the CONFIRM block plus an independent cross-check where available (e.g., the URL's presence in UNCTAD's dataset). Malformed-PDF guard: third-party copies may crash pdfplumber (xref RecursionError) — sanity-check with pdftotext, repair with qpdf <in> <out> before extraction, save the original as the archival copy, and note the repair in the memo's retrieval note.--list returns nothing, do not guess a PDF URL — follow the Retrieval fallback ladder above. Two distinct causes, diagnosed per case, not per site: some ICSID case pages inject the document list client-side via JavaScript (rung 2 resolves them), while for others the institution publishes no documents at all (a rendered browser shows the same empty list — no amount of rendering helps; go to rung 3). In a headless/unaided run with no JS render and no user available, the correct terminal outcome is rung 5: record the document as an unretrieved lead.docs.pca-cpa.org), do NOT substitute an unofficial mirror. Ask the user to download the document from the official case page themselves and upload it; then process it with --pdf-file <path> (confirmed and extracted exactly like a download) and save it into the research folder under the naming convention. A failed fetch never tracebacks: the script prints a FETCH FAILED block naming the URL, the error, and the fallback routes, and exits with code 5.page.images), cumulated across body pages, maps paragraph numbers to pages — use it to estimate the target page instead of rasterizing hundreds of pages. Then verify visually: rasterize the estimated page plus neighbours from the saved PDF (pdftoppm -png -r 110 -f <first> -l <last> <pdf> <prefix>), read the printed margin numbers (a consecutive run around the target pins it unambiguously), and match each quoted passage to the paragraph number you can see, cross-checking the transcription against the PDF's extractable text layer. Cite ¶ + page, and disclose in the memo that the ¶ numbers were read visually from the rendered pages.PART IV - CHAPTER D, para 7 (p.278)); when it reports restarts, always give the section alongside the ¶ number in the memo and verify each heading against the document. The script also auto-detects the document's marker convention — 154. or bracketed [324] (e.g. Iberdrola v. Guatemala) — and matches only the dominant one. If it instead warns that most blocks are unnumbered and markers follow a convention it does not recognize, do not trust ¶ cites from the extraction: fall back to page-based cites or the rasterize-and-read guard above.CLA-xxx on ICSID's server) may be commentary or a partial copy — the CONFIRM block will reveal a book chapter or excerpt. Never rely on it without confirming it is the full primary text; prefer the issuing institution's own copy.This skill follows the open Agent Skills standard (SKILL.md + scripts/) and is designed to run on any platform that implements it. Everything above is platform-neutral unless it names a platform expressly. Differences that matter:
python scripts/fetch_icsid_award.py --check-env before the first retrieval: it reports the Python version, dependencies (requests and pdfplumber required; openpyxl for enumeration), network egress to each source host, and the config location and writability, ending in a PASS / DEGRADED verdict. Choose the full pipeline or a degraded mode from the result — and disclose the mode in the answer.--pdf-file — fully offline, preserving the whole pipeline (CONFIRM, extraction, verification). Never present a truncated fetch as full coverage.data/ to need re-uploading per session. Mitigation: keep isds-research-config.json at the root of the user's research area and have the user re-supply it at session start (passed via --config), so the stored answers are confirmed rather than re-asked.Claude-User and ChatGPT-User, was verified 2026-07-18 and is recorded in the per-source entries above (Sources, golden rule 6): as of that date every source permits both tokens; italaw operatively disallows only the bulk crawlers ClaudeBot/GPTBot, which this skill never uses. On any other platform, verify that platform's user-initiated token against each source's robots.txt before automated fetching; never spoof a human-browser user-agent; and do not rely on any platform's position that robots may not bind user-initiated agents (OpenAI states this for ChatGPT-User) — this skill treats robots as binding. Site Terms obligations (non-commercial use, no redistribution, italaw's manual-default and per-document gate) are platform-agnostic. The helper scripts always send their own declared user-agent (isds-research-skill/<version>). Robots files change — re-verify periodically and re-date these notes.Source: International Centre for Settlement of Investment Disputes. Available at https://icsid.worldbank.org.Source: Permanent Court of Arbitration. Available at https://pca-cpa.org. Used for non-commercial research.For research only; not legal advice. Verify against the official primary source.web_fetch or the platform's equivalent) on a confirmed PDF URL works but truncates very long PDFs (~120k chars ≈ 38 pp), so it can silently drop later paragraphs (e.g. a holding at ¶154 / p.61). Prefer the script for full coverage; if you must use web_fetch, say that coverage may be partial.© lawve-ai, AGPL-3.0-only. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 6 other files (scripts) in skills/isds-research-cameron-russell of lawve-ai/awesome-legal-skills.
Open the folder on GitHubat commit 045f738
Isds Research next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Isds Research this skilllawve-ai/awesome-legal-skills | 847 | — | ~13k | Automated safety check: Pass | AGPL-3.0-only | |
| Tw Legal RAGaa0101181514/tw-legal-rag | 328 | — | ~580 | Automated safety check: Pass | Custom licence | |
| Action Items From Client AlertLegalQuants/lq-ai | 150 | — | ~4k | Automated safety check: Pass | Apache-2.0 | |
| Answer From Sourcesstella/stella | 259 | — | ~735 | Automated safety check: Pass | Apache-2.0 | |
| Moot Court Simulation Buildercat-xierluo/legal-skills | 721 | — | ~1.4k | Automated safety check: Pass | CC-BY-NC-4.0 | |
| Intake To Draftstella/stella | 259 | — | ~537 | Automated safety check: Pass | Apache-2.0 |
aa0101181514/tw-legal-rag
Retrieve real Taiwan court judgments with verifiable citations before answering any question about Taiwan law or case law.
LegalQuants/lq-ai
A skill your agent uses when the user provides a client alert, regulatory bulletin, law firm memo, or similar legal update and wants the time-sensitive action items, deadlines, and obligations…
stella/stella
Answers data-protection (GDPR) questions grounded in the regulation and supervisory guidance, with a citation for every claim.
cat-xierluo/legal-skills
Chinese-language skill that organizes a case file into a multi-role mock trial with judge, parties and clerk, producing a transcript, issue review and a to-strengthen list.
stella/stella
Collects the facts of an unpaid invoice, then drafts a payment demand letter.
joshzyj/open-scholar-skill
Comprehensive causal inference toolkit for social science research.
lawve-ai/awesome-legal-skills
U.S. An agent skill from lawve-ai/awesome-legal-skills.
lawve-ai/awesome-legal-skills
Practitioner skill for advising on EU Regulation 2023/2854 (Data Act).
lawve-ai/awesome-legal-skills
Calendar litigation and arbitration deadlines from a scheduling order.
lawve-ai/awesome-legal-skills
Read, search, and download emails and attachments from Microsoft Outlook via OAuth2.
lawve-ai/awesome-legal-skills
Turn an interpretive-ambiguity audit of a legal text — contract, statute, regulation, or judicial opinion — into a polished deliverable.
lawve-ai/awesome-legal-skills
Audits a website for compliance with Azerbaijan's Law on Personal Data No.
Categories
Compliant, retrieval-grounded research over investor-State dispute settlement (ISDS) awards and decisions. Isds Research is an agent skill from lawve-ai/awesome-legal-skills. Compliant, retrieval-grounded research over investor-State dispute settlement (ISDS) awards and decisions.
Isds Research fits situations like: the user asks about ICSID / investment-treaty arbitration cases; doctrines (fair and equitable treatment; etc.) and wants answers grounded in the actual document text with pinpoint citations.
Run `npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a claude-code`. Or copy the skill folder (skills/isds-research-cameron-russell in lawve-ai/awesome-legal-skills) into .claude/skills/isds-research in your project. Claude Code loads it when a task matches its description.
Run `npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a codex`. Or copy the skill folder (skills/isds-research-cameron-russell in lawve-ai/awesome-legal-skills) into .agents/skills/isds-research in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add lawve-ai/awesome-legal-skills --skill isds-research -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/isds-research, .gemini/skills/isds-research, .github/skills/isds-research and .opencode/skills/isds-research in your project.
Going by SKILL.md and its folder, Isds Research needs Python for the scripts in its folder and the command-line tools its instructions call (python, qpdf and pdftoppm). Our summary lists: Python 3.
SKILL.md names 3 domains. In commands or code: icsid.worldbank.org and pca-cpa.org; the agent is likely to contact these when it follows the instructions. As links in the text: investmentpolicy.unctad.org. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Isds Research is published under the AGPL-3.0-only licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 13k tokens (SKILL.md is roughly 53k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Isds Research: Tw Legal RAG (aa0101181514/tw-legal-rag, 328 stars), Action Items From Client Alert (LegalQuants/lq-ai, 150 stars), Answer From Sources (stella/stella, 259 stars) and Moot Court Simulation Builder (cat-xierluo/legal-skills, 721 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
lawve-ai (a GitHub organization) maintains it in lawve-ai/awesome-legal-skills, which has 847 GitHub stars. The repository holds 154 skills in this directory. The repository was last updated on October 2, 2026.
Source: lawve-ai/awesome-legal-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.