Snow Compliance DemoBoard review · v1

Phase 3

Contract risk analysis

CUAD's annotated clause categories feed a transparent, rule-based risk rubric. Rules are data, so the board can inspect and adjust them.

Simulated legal review This rubric is a demonstration of analytics mechanics, not legal advice. It encodes a plausible but simplified set of review criteria and must be labeled as simulated everywhere it appears.
Inputs

Clause categories used

A subset of CUAD's actual 41 categories carries the contract-risk story. Weights are stored as data, not hard-coded.

Corrected against the real dataset CUAD v1 has no "Indemnification" or "Limitation of Liability" category. Liability exposure is expressed as Uncapped Liability / Cap On Liability. The rubric below uses CUAD's real category names (see findings).
CUAD clause categoryRisk themeWeight
Uncapped LiabilityUncapped exposure presentHigh
Cap On Liability (absent)No cap on liabilityHigh
Termination For ConvenienceCounterparty may exit at willMedium
Anti-AssignmentAssignment restrictedMedium
Change Of ControlOwnership-change triggerMedium
Minimum CommitmentMinimum purchase/volumeMedium
Governing Law (absent)No forum specifiedMedium
Non-Compete / ExclusivityRestrictive scopeLow
Renewal Term / Notice PeriodAuto-renewal notice windowsLow
Rubric

Rule-based scoring

Each rule evaluates an annotation (presence, absence, or a keyword signal) and contributes points. Scores roll up per contract and per matter.

CREATE TABLE core.ref_risk_rule (
  rule_id     STRING,
  clause_category STRING,
  signal      STRING,   -- PRESENT | ABSENT | KEYWORD
  pattern     STRING,
  points      INT,
  rationale   STRING
);

-- Examples
-- ('R1','Limitation of liability','ABSENT', NULL, 40,'No cap on liability')
-- ('R2','Indemnification','PRESENT', NULL, 25,'Indemnity present; review scope')
-- ('R3','Governing law','KEYWORD','foreign|arbitration', 10,'Offshore forum')

Risk bands: High ≥ 60 Medium 30–59 Low < 30.

Outputs

Analytics views

CREATE OR REPLACE VIEW marts.mart_matter_risk AS
SELECT m.matter_id, m.matter_name, c.contract_id, c.contract_type,
       SUM(CASE WHEN r.signal='ABSENT'  AND f.answer='No'  THEN r.points
                WHEN r.signal='PRESENT' AND f.answer='Yes' THEN r.points
                WHEN r.signal='KEYWORD' AND f.clause_text ILIKE '%'||r.pattern||'%'
                     THEN r.points ELSE 0 END) AS risk_score
FROM core.dim_matter m
JOIN core.bridge_matter_contract b USING (matter_id)
JOIN core.dim_contract c USING (contract_id)
JOIN core.fact_clause f ON f.contract_id = c.contract_id
JOIN core.ref_risk_rule r ON r.clause_category = f.clause_category
GROUP BY 1,2,3,4;

Because dim_matter and fact_clause carry matter_id, the same row access policy scopes these analytics — an attorney's risk report only covers their authorized matters.

Full SQL: sql/04_risk_views.sql.

Illustration

Illustrative output

MatterContract typeScoreBandDriving clauses
SYN-1042Service Agreement72HighNo liability cap; broad indemnity
SYN-1088License Agreement45MediumAuto-renewal; assignment consent
SYN-1103NDA18LowResiduals clause

Values are illustrative; the demo generates them from the loaded contracts.