| """ |
| Playbook rules, fallback positions, and risk flags for contract drafting. |
| Hard-coded expert knowledge — not model memory. |
| """ |
|
|
| from typing import List, Dict, Optional |
|
|
| |
| |
| |
| CONTRACT_REQUIRED_CLAUSES: Dict[str, List[str]] = { |
| "saas_agreement": [ |
| "scope_of_services", "subscription_term", "fees_and_payment", |
| "data_protection", "limitation_of_liability", "indemnification", |
| "intellectual_property", "termination", "service_level_agreement", |
| "confidentiality", "governing_law", "assignment", |
| ], |
| "msa": [ |
| "scope_of_work", "fees_and_payment", "term_and_termination", |
| "intellectual_property", "confidentiality", "limitation_of_liability", |
| "indemnification", "warranty", "insurance", "governing_law", |
| "dispute_resolution", "assignment", "subcontracting", |
| ], |
| "nda": [ |
| "definition_of_confidential_information", "obligations_of_receiving_party", |
| "permitted_disclosures", "term", "return_of_information", |
| "remedies", "governing_law", "no_license", |
| ], |
| "sow": [ |
| "scope_of_services", "deliverables", "timeline_and_milestones", |
| "fees_and_payment", "acceptance_criteria", "change_order", |
| "intellectual_property", "confidentiality", "limitation_of_liability", |
| "indemnification", "governing_law", "termination", |
| ], |
| "dpa": [ |
| "definitions_and_roles", "data_processing", "subprocessors", |
| "data_subject_rights", "security_measures", "audit_rights", |
| "data_transfer", "breach_notification", "liability", |
| "term_and_termination", "governing_law", "confidentiality", |
| ], |
| "vendor_agreement": [ |
| "scope_of_goods", "purchase_orders", "pricing_and_payment", |
| "delivery_and_inspection", "warranty", "limitation_of_liability", |
| "indemnification", "intellectual_property", "confidentiality", |
| "termination", "governing_law", "assignment", |
| ], |
| "consulting_agreement": [ |
| "scope_of_services", "fees_and_expenses", "term_and_termination", |
| "intellectual_property", "confidentiality", "non_solicitation", |
| "limitation_of_liability", "indemnification", "independent_contractor", |
| "governing_law", "dispute_resolution", "assignment", |
| ], |
| "ip_assignment": [ |
| "assignment_of_rights", "moral_rights", "warranty_of_title", |
| "consideration", "future_works", "confidentiality", |
| "representation_and_warranty", "indemnification", "governing_law", |
| "further_assurances", "recordation", "survival", |
| ], |
| "employment_agreement": [ |
| "position_and_duties", "compensation", "benefits", |
| "term_and_termination", "confidentiality", "intellectual_property", |
| "non_compete", "non_solicitation", "dispute_resolution", |
| "governing_law", "assignment", "at_will_employment", |
| ], |
| } |
|
|
| |
| |
| |
| FALLBACK_POSITIONS: Dict[str, Dict[str, str]] = { |
| "limitation_of_liability": { |
| "pro_company": "Consequential damages excluded; cap at annual fees.", |
| "balanced": "Consequential damages excluded; cap at fees paid.", |
| "pro_counterparty": "No exclusion of consequential damages; cap at 12-month fees.", |
| }, |
| "indemnification": { |
| "pro_company": "Mutual indemnification; narrow scope for company.", |
| "balanced": "Mutual indemnification for IP and data breach.", |
| "pro_counterparty": "Broad company indemnification; carve-outs for counterparty.", |
| }, |
| "termination": { |
| "pro_company": "Company may terminate for convenience with 30 days notice.", |
| "balanced": "Either party may terminate for convenience with 60 days notice.", |
| "pro_counterparty": "Termination for convenience requires 90 days notice; auto-renewal.", |
| }, |
| "intellectual_property": { |
| "pro_company": "Company retains all IP; grant of limited license to counterparty.", |
| "balanced": "Each party retains pre-existing IP; new IP assigned per SOW.", |
| "pro_counterparty": "Counterparty retains IP; broad license back to company.", |
| }, |
| "confidentiality": { |
| "pro_company": "Broad definition; 3-year survival; standard exceptions.", |
| "balanced": "Standard definition; 3-year survival; standard exceptions.", |
| "pro_counterparty": "Narrow definition; 5-year survival; broad exceptions.", |
| }, |
| "governing_law": { |
| "pro_company": "Delaware law; company-friendly venue.", |
| "balanced": "Delaware law; neutral venue.", |
| "pro_counterparty": "Counterparty's state law; counterparty-friendly venue.", |
| }, |
| "data_protection": { |
| "pro_company": "Standard security; no DPA required under threshold.", |
| "balanced": "Standard security; DPA required for regulated data.", |
| "pro_counterparty": "Enhanced security; mandatory DPA; audit rights.", |
| }, |
| "warranty": { |
| "pro_company": "AS IS; limited warranty; disclaimer of implied warranties.", |
| "balanced": "Limited warranty; disclaimer of consequential warranties.", |
| "pro_counterparty": "Robust warranty; retention of all implied warranties.", |
| }, |
| "non_compete": { |
| "pro_company": "Broad non-compete; 12-month; wide geographic scope.", |
| "balanced": "Limited non-compete; 6-month; narrow scope.", |
| "pro_counterparty": "No non-compete; or 3-month with narrow scope.", |
| }, |
| } |
|
|
|
|
| def get_required_clauses(contract_type: str) -> List[str]: |
| """Return required clauses for a contract type.""" |
| return CONTRACT_REQUIRED_CLAUSES.get(contract_type, []) |
|
|
|
|
| def get_fallback_position(clause_name: str, party_position: str) -> Optional[str]: |
| """Return fallback language for a clause when no template matches.""" |
| fb = FALLBACK_POSITIONS.get(clause_name, {}) |
| return fb.get(party_position) |
|
|
|
|
| def list_contract_types() -> List[str]: |
| return list(CONTRACT_REQUIRED_CLAUSES.keys()) |
|
|
|
|
| def list_clauses_for(contract_type: str) -> List[str]: |
| return CONTRACT_REQUIRED_CLAUSES.get(contract_type, []) |
|
|