Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Analyze contracts for risks, check completeness, and provide actionable recommendations. Use when a user asks to review a contract, check an agreement for red flags, analyze contract terms, find risky clauses, review an NDA, evaluate a service agreement, or audit employment contract terms. Supports employment contracts, NDAs, service agreements, and vendor contracts.
.claude/skills/terminalskills-contract-review/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 44 |
| gemini-3.1-pro-preview | 100% | 1 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-10 | ✓→✓ | = Same ✓ | 22% | 0% |
| case-11 | ✓→✓ | = Same ✓ | 25% | 0% |
Analyze legal contracts and agreements to identify risks, missing clauses, unfavorable terms, and compliance issues. This skill reads contract documents, categorizes clauses, flags potential problems, and produces a structured risk report with actionable recommendations.
When a user asks you to review, analyze, or check a contract, follow these steps:
Read the contract file. Supported formats include PDF, DOCX, TXT, and Markdown.
For PDF files, extract text using pdfplumber:
pythonimport pdfplumber def load_contract(pdf_path): full_text = "" with pdfplumber.open(pdf_path) as pdf: for page in pdf.pages: text = page.extract_text() if text: full_text += text + "\n\n" return full_text
For DOCX files, use python-docx:
pythonfrom docx import Document def load_docx(docx_path): doc = Document(docx_path) return "\n\n".join([p.text for p in doc.paragraphs if p.text.strip()])
Determine the contract type from the content:
Identify and extract these critical sections:
For each clause, assess:
Flag these common red flags:
Produce a structured report with:
User request: "Review my employment contract at ~/contracts/offer.pdf for any red flags"
Actions taken:
Output:
CONTRACT REVIEW REPORT
======================
Type: Employment Contract
Parties: Jane Doe (Employee) <-> Acme Corp (Employer)
Term: Indefinite, starting March 1, 2025
RISK ANALYSIS:
-------------------------------------------------
| Clause | Risk | Issue |
|---------------------|--------|------------------------------------------|
| Non-compete | HIGH | 24-month duration, nationwide scope |
| Termination | MEDIUM | No severance terms specified |
| IP Assignment | HIGH | Covers all work, including personal projects |
| Benefits | LOW | Standard package, clearly defined |
| Confidentiality | LOW | Reasonable scope and 2-year duration |
MISSING CLAUSES:
- No remote work policy or location flexibility terms
- No bonus or equity vesting schedule details
TOP RECOMMENDATIONS:
1. Negotiate non-compete down to 6-12 months with limited geography
2. Add carve-out for personal projects in IP assignment clause
3. Request explicit severance terms (e.g., 2 weeks per year of service)
OVERALL RISK: HIGH - Address non-compete and IP clauses before signingUser request: "Check this vendor agreement for our SaaS tool. Flag anything we should push back on."
Actions taken:
Output:
CONTRACT REVIEW REPORT
======================
Type: SaaS Service Agreement
Parties: Your Company <-> CloudTool Inc.
Term: 12 months, auto-renews
RISK ANALYSIS:
-------------------------------------------------
| Clause | Risk | Issue |
|---------------------|----------|----------------------------------------|
| SLA / Uptime | HIGH | No uptime guarantee or credits defined |
| Data Processing | HIGH | No DPA or GDPR compliance language |
| Liability Cap | MEDIUM | Capped at 1 month of fees (very low) |
| Termination | MEDIUM | 90-day notice required to cancel |
| Auto-renewal | LOW | 30-day opt-out window before renewal |
TOP RECOMMENDATIONS:
1. Require a 99.9% uptime SLA with service credits
2. Add a Data Processing Agreement as an appendix
3. Negotiate liability cap to at least 12 months of fees
4. Reduce cancellation notice to 30 days| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-10 | pass→pass | 12,488 | 6,866 | -45% | 1 | 1 | 0% | 2,083 | 2,535 | +22% | 0 | 0 | — |
case-11 | pass→pass | 11,629 | 7,555 | -35% | 1 | 1 | 0% | 2,260 | 2,821 | +25% | 0 | 0 | — |
case-12 | pass→pass | 10,405 | 6,810 | -35% | 1 | 1 | 0% | 1,806 | 2,685 | +49% | 0 | 0 | — |
case-01 | fail→fail | 5,300 | 11,156 | +110% | 1 | 1 | 0% | 939 | 2,433 | +159% | 0 | 0 | — |
case-02 | fail→fail | 5,979 | 13,423 | +125% | 1 | 1 | 0% | 988 | 1,887 | +91% | 0 | 0 | — |
case-03 | fail→fail | 22,955 | 15,226 | -34% | 1 | 1 | 0% | 3,763 | 3,488 | -7% | 0 | 0 | — |
case-04 | pass→pass | 33,847 | 29,210 | -14% | 1 | 1 | 0% | 6,171 | 6,392 | +4% | 0 | 0 | — |
case-05 | pass→pass | 20,209 | 18,975 | -6% | 1 | 1 | 0% | 3,763 | 4,890 | +30% | 0 | 0 | — |
case-06 | pass→pass | 4,680 | 3,601 | -23% | 1 | 1 | 0% | 1,001 | 2,174 | +117% | 0 | 0 | — |
case-07 | fail→pass | 11,053 | 10,825 | -2% | 1 | 1 | 0% | 2,172 | 2,640 | +22% | 0 | 0 | — |
case-08 | pass→pass | 8,235 | 5,858 | -29% | 1 | 1 | 0% | 1,582 | 2,551 | +61% | 0 | 0 | — |
case-09 | pass→pass | 9,903 | 5,856 | -41% | 1 | 1 | 0% | 1,655 | 2,616 | +58% | 0 | 0 | — |
case-13 | pass→pass | 9,592 | 5,941 | -38% | 1 | 1 | 0% | 1,619 | 2,520 | +56% | 0 | 0 | — |
case-14 | pass→pass | 10,098 | 7,069 | -30% | 1 | 1 | 0% | 1,722 | 2,614 | +52% | 0 | 0 | — |
case-15 | pass→pass | 4,352 | 3,492 | -20% | 1 | 1 | 0% | 763 | 2,084 | +173% | 0 | 0 | — |
case-16 | pass→pass | 4,047 | 3,335 | -18% | 1 | 1 | 0% | 602 | 2,081 | +246% | 0 | 0 | — |
case-17 | fail→pass | 12,752 | 8,257 | -35% | 1 | 1 | 0% | 1,916 | 2,827 | +48% | 0 | 0 | — |
case-18 | pass→pass | 10,889 | 8,175 | -25% | 1 | 1 | 0% | 1,844 | 2,895 | +57% | 0 | 0 | — |
case-19 | pass→pass | 15,177 | 17,140 | +13% | 1 | 1 | 0% | 2,377 | 3,413 | +44% | 0 | 0 | — |
case-20 | pass→pass | 10,014 | 6,912 | -31% | 1 | 1 | 0% | 1,708 | 2,588 | +52% | 0 | 0 | — |
case-21 | pass→pass | 8,543 | 6,214 | -27% | 1 | 1 | 0% | 1,421 | 2,487 | +75% | 0 | 0 | — |
case-22 | fail→pass | 6,464 | 2,439 | -62% | 1 | 1 | 0% | 972 | 1,867 | +92% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +14 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.