thumbgate 1.23.0 → 1.23.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.claude-plugin/marketplace.json +5 -5
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/.well-known/llms.txt +26 -11
  4. package/.well-known/mcp/server-card.json +8 -8
  5. package/README.md +69 -34
  6. package/adapters/claude/.mcp.json +2 -2
  7. package/adapters/mcp/server-stdio.js +1 -1
  8. package/adapters/opencode/opencode.json +1 -1
  9. package/bin/cli.js +57 -16
  10. package/bin/postinstall.js +11 -22
  11. package/config/gate-templates.json +72 -0
  12. package/config/github-about.json +1 -1
  13. package/config/post-deploy-marketing-pages.json +10 -0
  14. package/package.json +6 -6
  15. package/public/agent-manager.html +3 -3
  16. package/public/agents-cost-savings.html +3 -3
  17. package/public/ai-malpractice-prevention.html +726 -149
  18. package/public/blog.html +3 -3
  19. package/public/codex-enterprise.html +3 -3
  20. package/public/codex-plugin.html +4 -4
  21. package/public/compare.html +6 -6
  22. package/public/dashboard.html +211 -126
  23. package/public/guide.html +5 -5
  24. package/public/index.html +187 -47
  25. package/public/learn.html +24 -10
  26. package/public/lessons.html +2 -2
  27. package/public/numbers.html +6 -6
  28. package/public/pricing.html +6 -5
  29. package/public/pro.html +23 -0
  30. package/scripts/billing.js +17 -0
  31. package/scripts/commercial-offer.js +75 -0
  32. package/scripts/dashboard.js +53 -1
  33. package/scripts/gates-engine.js +3 -3
  34. package/scripts/plausible-server-events.js +2 -1
  35. package/scripts/rate-limiter.js +16 -12
  36. package/scripts/seo-gsd.js +167 -1
  37. package/scripts/telemetry-analytics.js +310 -0
  38. package/scripts/visitor-journey.js +172 -0
  39. package/src/api/server.js +65 -29
  40. package/adapters/chatgpt/openapi.yaml +0 -1705
@@ -3,181 +3,758 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>AI Malpractice Prevention for Law Firms ThumbGate</title>
6
+ <title>Pre-Execution Controls for Legal AI Agents - ThumbGate</title>
7
7
  <script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
8
- <meta name="description" content="Your AI intake agent can commit unauthorized practice of law, miss a conflict, or breach privilege usually all three. ThumbGate physically blocks each at the tool-call boundary, with an audit trail your malpractice carrier can read.">
9
- <meta property="og:title" content="AI Malpractice Prevention for Law Firms">
10
- <meta property="og:description" content="Runtime governance for legal AI agents block UPL, miss-conflict, and privilege breach at the tool-call boundary. ABA Formal Op. 512-ready audit trail.">
8
+ <meta name="description" content="Pre-execution controls for law-firm AI agents: block unauthorized advice, conflict-check failures, privilege leaks, and unapproved model calls before an agent acts.">
9
+ <meta property="og:title" content="Pre-Execution Controls for Legal AI Agents">
10
+ <meta property="og:description" content="ThumbGate preloads firm-approved ground truth, checks legal AI actions before execution, and records audit evidence for law-firm innovation, risk, and pricing teams.">
11
11
  <meta property="og:type" content="article">
12
- <meta property="og:image" content="https://thumbgate-production.up.railway.app/og.png">
13
- <link rel="canonical" href="https://thumbgate-production.up.railway.app/ai-malpractice-prevention">
12
+ <meta property="og:image" content="https://thumbgate.ai/og.png">
13
+ <link rel="canonical" href="https://thumbgate.ai/ai-malpractice-prevention">
14
14
  <script type="application/ld+json">
15
15
  {
16
16
  "@context": "https://schema.org",
17
17
  "@type": "TechArticle",
18
- "headline": "AI Malpractice Prevention for Law Firms",
19
- "description": "ThumbGate is a runtime governance layer that physically blocks AI legal-assistant agents from committing unauthorized practice of law, missing conflicts, or breaching privilege.",
18
+ "headline": "Pre-Execution Controls for Legal AI Agents",
19
+ "description": "ThumbGate is a pre-execution control layer for law-firm AI intake workflows. It can preload firm-approved ground truth, evaluate proposed agent actions before execution, and produce audit evidence for human review.",
20
20
  "datePublished": "2026-05-21",
21
- "dateModified": "2026-05-21",
21
+ "dateModified": "2026-05-25",
22
22
  "author": { "@type": "Person", "name": "Igor Ganapolsky", "url": "https://github.com/IgorGanapolsky" },
23
- "publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate-production.up.railway.app" },
23
+ "publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
24
24
  "about": [
25
- { "@type": "Thing", "name": "Legal AI" },
25
+ { "@type": "Thing", "name": "Legal AI Governance" },
26
26
  { "@type": "Thing", "name": "Unauthorized Practice of Law" },
27
27
  { "@type": "Thing", "name": "Attorney-Client Privilege" },
28
- { "@type": "Thing", "name": "ABA Model Rules" },
28
+ { "@type": "Thing", "name": "ABA Formal Opinion 512" },
29
29
  { "@type": "Thing", "name": "Conflict of Interest Check" }
30
30
  ]
31
31
  }
32
32
  </script>
33
33
  <style>
34
- *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
35
- :root { --bg:#0a0a0b; --card:#161618; --border:#222225; --text:#e8e8ec; --muted:#8b8b94; --cyan:#22d3ee; --red:#f87171; --green:#34d399; }
36
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; }
37
- .container { max-width: 860px; margin: 0 auto; padding: 2rem 1.5rem 4rem; }
38
- nav { padding: 1rem 2rem; border-bottom: 1px solid var(--border); display:flex; gap:1.5rem; flex-wrap:wrap; }
39
- nav a { color: var(--muted); text-decoration:none; font-size:0.9rem; }
40
- nav .brand { color: var(--text); font-weight:700; }
41
- .pill { display:inline-block; font-size:0.75rem; letter-spacing:0.08em; text-transform:uppercase; color:var(--cyan); background:rgba(34,211,238,0.08); border:1px solid rgba(34,211,238,0.2); padding:4px 12px; border-radius:100px; margin-top:1.5rem; font-weight:600; }
42
- h1 { font-size:2.2rem; line-height:1.15; margin:1rem 0 1rem; }
43
- h2 { font-size:1.45rem; margin:2.2rem 0 1rem; color:var(--cyan); }
44
- h3 { margin:0.6rem 0; font-size:1rem; }
45
- p, li { margin-bottom:0.75rem; }
46
- ul, ol { padding-left:1.25rem; }
47
- .card { background: var(--card); border:1px solid var(--border); border-radius:12px; padding:1.25rem; margin:1rem 0; }
48
- .grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:1rem; margin:1rem 0; }
49
- .grid .card h3 { color:var(--cyan); }
50
- .scenario { border-left:3px solid var(--red); padding:0.9rem 1.1rem; margin:1rem 0; background:rgba(248,113,113,0.04); border-radius:6px; }
51
- .scenario .label { display:inline-block; font-size:0.7rem; letter-spacing:0.08em; text-transform:uppercase; color:var(--red); font-weight:700; margin-bottom:0.5rem; }
52
- .scenario .resolve { display:inline-block; font-size:0.7rem; letter-spacing:0.08em; text-transform:uppercase; color:var(--green); font-weight:700; margin:0.6rem 0 0.3rem; }
53
- .cta { display:inline-block; background:var(--cyan); color:#000; padding:0.8rem 1.2rem; border-radius:8px; text-decoration:none; font-weight:700; }
54
- .secondary { color:var(--cyan); text-decoration:underline; margin-left:1rem; }
55
- .quote { border-left:3px solid var(--cyan); padding:0.75rem 1rem; margin:1rem 0; color:var(--muted); font-style:italic; }
56
- code, pre { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; background:#0f0f11; border:1px solid var(--border); border-radius:6px; padding:0.15rem 0.4rem; font-size:0.9rem; }
57
- pre { padding:0.85rem 1rem; overflow-x:auto; }
58
- .footer-links { margin-top:2.5rem; padding-top:1.25rem; border-top:1px solid var(--border); color:var(--muted); font-size:0.9rem; }
59
- .footer-links a { color:var(--cyan); text-decoration:none; }
60
- table.compliance { width:100%; border-collapse:collapse; margin:1rem 0; font-size:0.95rem; }
61
- table.compliance th, table.compliance td { padding:0.6rem 0.8rem; border-bottom:1px solid var(--border); text-align:left; vertical-align:top; }
62
- table.compliance th { color:var(--cyan); font-size:0.8rem; text-transform:uppercase; letter-spacing:0.05em; }
63
- .rule-cite { color:var(--cyan); font-weight:600; }
34
+ *, *::before, *::after { box-sizing: border-box; }
35
+ :root {
36
+ --bg: #08090b;
37
+ --panel: #14161a;
38
+ --panel-2: #1b1f26;
39
+ --line: #2c313a;
40
+ --text: #f2f4f8;
41
+ --muted: #a7afbd;
42
+ --soft: #d8deea;
43
+ --blue: #62a4ff;
44
+ --cyan: #2dd4bf;
45
+ --amber: #f2bd5b;
46
+ --red: #fb7185;
47
+ --green: #72e3a5;
48
+ }
49
+ body {
50
+ margin: 0;
51
+ font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
52
+ background: var(--bg);
53
+ color: var(--text);
54
+ line-height: 1.58;
55
+ }
56
+ a { color: var(--blue); }
57
+ nav {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 1.1rem;
61
+ flex-wrap: wrap;
62
+ padding: 0.9rem clamp(1rem, 3vw, 2.25rem);
63
+ border-bottom: 1px solid var(--line);
64
+ background: rgba(8, 9, 11, 0.94);
65
+ position: sticky;
66
+ top: 0;
67
+ z-index: 10;
68
+ }
69
+ nav a { color: var(--muted); text-decoration: none; font-size: 0.9rem; }
70
+ nav .brand { color: var(--text); font-weight: 850; }
71
+ .wrap { max-width: 1120px; margin: 0 auto; padding: 0 clamp(1rem, 3vw, 2rem); }
72
+ .hero {
73
+ min-height: calc(100vh - 68px);
74
+ display: grid;
75
+ grid-template-columns: minmax(0, 1fr) minmax(320px, 0.9fr);
76
+ gap: clamp(2rem, 5vw, 4rem);
77
+ align-items: center;
78
+ padding: clamp(3rem, 6vw, 5rem) 0 2.2rem;
79
+ }
80
+ .eyebrow {
81
+ display: inline-flex;
82
+ color: var(--cyan);
83
+ border: 1px solid rgba(45, 212, 191, 0.24);
84
+ background: rgba(45, 212, 191, 0.08);
85
+ padding: 0.34rem 0.72rem;
86
+ border-radius: 999px;
87
+ font-size: 0.76rem;
88
+ font-weight: 850;
89
+ letter-spacing: 0.08em;
90
+ text-transform: uppercase;
91
+ }
92
+ h1 {
93
+ font-size: clamp(2.25rem, 4.1vw, 3.65rem);
94
+ line-height: 1.03;
95
+ letter-spacing: 0;
96
+ margin: 1.1rem 0 1rem;
97
+ max-width: 800px;
98
+ }
99
+ .lead {
100
+ color: var(--soft);
101
+ font-size: clamp(1.05rem, 1.65vw, 1.24rem);
102
+ max-width: 760px;
103
+ margin: 0 0 1.4rem;
104
+ }
105
+ .hero-actions { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin: 1.4rem 0; }
106
+ .cta {
107
+ display: inline-flex;
108
+ align-items: center;
109
+ justify-content: center;
110
+ min-height: 48px;
111
+ padding: 0.78rem 1.05rem;
112
+ border-radius: 8px;
113
+ background: var(--blue);
114
+ color: #06111f;
115
+ text-decoration: none;
116
+ font-weight: 850;
117
+ }
118
+ .ghost { color: var(--soft); text-decoration: none; border-bottom: 1px solid var(--line); padding-bottom: 0.1rem; }
119
+ .proof-row {
120
+ display: grid;
121
+ grid-template-columns: repeat(3, minmax(0, 1fr));
122
+ gap: 0.75rem;
123
+ margin-top: 1.2rem;
124
+ max-width: 820px;
125
+ }
126
+ .proof {
127
+ border: 1px solid var(--line);
128
+ border-radius: 8px;
129
+ padding: 0.82rem;
130
+ background: rgba(255, 255, 255, 0.03);
131
+ min-height: 92px;
132
+ }
133
+ .proof strong { display: block; color: var(--text); font-size: 0.94rem; }
134
+ .proof span { color: var(--muted); font-size: 0.85rem; }
135
+ .trust-strip {
136
+ display: grid;
137
+ grid-template-columns: repeat(4, minmax(0, 1fr));
138
+ gap: 0.7rem;
139
+ margin: 1.2rem 0 0;
140
+ max-width: 920px;
141
+ }
142
+ .trust-item {
143
+ border: 1px solid rgba(98, 164, 255, 0.24);
144
+ border-radius: 8px;
145
+ background: rgba(98, 164, 255, 0.07);
146
+ padding: 0.72rem;
147
+ color: var(--soft);
148
+ font-size: 0.82rem;
149
+ font-weight: 750;
150
+ }
151
+ .control-flow {
152
+ border: 1px solid #343a46;
153
+ background: #101318;
154
+ border-radius: 8px;
155
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.34);
156
+ padding: 1rem;
157
+ }
158
+ .flow-asset {
159
+ display: block;
160
+ width: 100%;
161
+ height: auto;
162
+ border: 1px solid var(--line);
163
+ border-radius: 8px;
164
+ margin: 0 0 0.9rem;
165
+ background: #08090b;
166
+ }
167
+ .control-flow h2 { font-size: 1rem; margin: 0 0 0.85rem; color: var(--soft); }
168
+ .flow-step {
169
+ display: grid;
170
+ grid-template-columns: 34px minmax(0, 1fr);
171
+ gap: 0.8rem;
172
+ align-items: start;
173
+ border: 1px solid var(--line);
174
+ border-radius: 8px;
175
+ background: var(--panel);
176
+ padding: 0.88rem;
177
+ margin: 0.72rem 0;
178
+ }
179
+ .num {
180
+ width: 34px;
181
+ height: 34px;
182
+ display: grid;
183
+ place-items: center;
184
+ border-radius: 8px;
185
+ font-weight: 850;
186
+ color: #06111f;
187
+ background: var(--cyan);
188
+ }
189
+ .flow-step h3 { margin: 0 0 0.24rem; font-size: 0.98rem; }
190
+ .flow-step p { margin: 0; color: var(--muted); font-size: 0.9rem; }
191
+ .blocked { border-color: rgba(251, 113, 133, 0.55); background: rgba(251, 113, 133, 0.08); }
192
+ .blocked .num { background: var(--red); color: #19070a; }
193
+ .cleared { border-color: rgba(114, 227, 165, 0.42); background: rgba(114, 227, 165, 0.08); }
194
+ .cleared .num { background: var(--green); color: #06120b; }
195
+ main section {
196
+ border-top: 1px solid var(--line);
197
+ padding: clamp(2.35rem, 5vw, 4rem) 0;
198
+ }
199
+ h2 {
200
+ font-size: clamp(1.75rem, 2.8vw, 2.5rem);
201
+ line-height: 1.15;
202
+ margin: 0 0 0.75rem;
203
+ letter-spacing: 0;
204
+ }
205
+ .section-lead { color: var(--muted); font-size: 1.05rem; max-width: 820px; margin: 0 0 1.35rem; }
206
+ .grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; }
207
+ .two { grid-template-columns: repeat(2, minmax(0, 1fr)); }
208
+ .card {
209
+ border: 1px solid var(--line);
210
+ background: var(--panel);
211
+ border-radius: 8px;
212
+ padding: 1rem;
213
+ }
214
+ .card h3 { margin: 0 0 0.5rem; font-size: 1.04rem; color: var(--text); }
215
+ .card p, .card li { color: var(--muted); margin: 0.42rem 0; }
216
+ .tag {
217
+ display: inline-flex;
218
+ color: #071116;
219
+ background: var(--cyan);
220
+ border-radius: 6px;
221
+ padding: 0.14rem 0.45rem;
222
+ font-size: 0.72rem;
223
+ font-weight: 850;
224
+ margin-bottom: 0.62rem;
225
+ }
226
+ .amber { background: var(--amber); }
227
+ .red { background: var(--red); color: #19070a; }
228
+ .blue { background: var(--blue); color: #06111f; }
229
+ .green { background: var(--green); color: #06120b; }
230
+ .matrix { width: 100%; border-collapse: collapse; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
231
+ .matrix th, .matrix td {
232
+ padding: 0.82rem;
233
+ border-bottom: 1px solid var(--line);
234
+ vertical-align: top;
235
+ text-align: left;
236
+ }
237
+ .matrix th { color: var(--cyan); background: #11151b; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; }
238
+ .matrix td { color: var(--muted); }
239
+ .callout {
240
+ background: #f2f4f8;
241
+ color: #111827;
242
+ border-radius: 8px;
243
+ padding: clamp(1.2rem, 3vw, 1.8rem);
244
+ }
245
+ .callout p, .callout li { color: #344054; }
246
+ .callout .cta { background: #111827; color: #fff; }
247
+ .footer {
248
+ color: var(--muted);
249
+ padding: 2.2rem 0 4rem;
250
+ border-top: 1px solid var(--line);
251
+ }
252
+ @media (max-width: 880px) {
253
+ .hero, .grid, .two, .proof-row, .trust-strip { grid-template-columns: 1fr; }
254
+ .hero { min-height: auto; padding-top: 2.4rem; }
255
+ nav { position: static; }
256
+ }
257
+ @media (max-width: 700px) {
258
+ .matrix, .matrix tbody, .matrix tr, .matrix td { display: block; width: 100%; }
259
+ .matrix { border: 0; }
260
+ .matrix thead { display: none; }
261
+ .matrix tr {
262
+ border: 1px solid var(--line);
263
+ border-radius: 8px;
264
+ margin-bottom: 0.85rem;
265
+ background: var(--panel);
266
+ overflow: hidden;
267
+ }
268
+ .matrix td { border-bottom: 1px solid var(--line); padding: 0.75rem 0.9rem; }
269
+ .matrix td:last-child { border-bottom: 0; }
270
+ .matrix td::before {
271
+ display: block;
272
+ color: var(--cyan);
273
+ font-size: 0.72rem;
274
+ font-weight: 850;
275
+ letter-spacing: 0.06em;
276
+ margin-bottom: 0.25rem;
277
+ text-transform: uppercase;
278
+ }
279
+ .matrix td:nth-child(1)::before { content: "Buyer question"; }
280
+ .matrix td:nth-child(2)::before { content: "Pilot answer"; }
281
+ .matrix td:nth-child(3)::before { content: "Evidence to bring"; }
282
+ }
283
+ .demo-result { margin-top:1rem; padding:1rem; border-radius:8px; font-size:0.95rem; }
284
+ .demo-blocked { background:rgba(248,113,113,0.1); border:1px solid var(--red); }
285
+ .demo-cleared { background:rgba(52,211,153,0.1); border:1px solid var(--green); }
286
+ .audit-log { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:0.85rem; background:#0f0f11; padding:0.75rem; border-radius:6px; margin-top:0.75rem; white-space:pre-wrap; color:var(--soft); }
64
287
  </style>
65
288
  </head>
66
289
  <body>
67
290
  <nav>
68
- <a href="/" class="brand">ThumbGate</a>
291
+ <a href="/ai-malpractice-prevention" class="brand">ThumbGate</a>
69
292
  <a href="/agent-manager">Agent Manager</a>
70
- <a href="/codex-enterprise">Codex Enterprise</a>
71
293
  <a href="/agents-cost-savings">FinOps for Agents</a>
72
- <a href="/federal">Federal</a>
73
294
  <a href="/dashboard">Dashboard demo</a>
74
295
  <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
75
296
  </nav>
76
- <div class="container">
77
- <span class="pill">AI Malpractice Prevention</span>
78
- <h1>Your AI intake agent can commit UPL, miss a conflict, or breach privilege — usually all three. ThumbGate prevents each at the tool-call boundary.</h1>
79
- <p>2025 produced <strong>66 documented court sanctions against attorneys</strong> for AI-generated fake citations and related failures, with fines up to $31,000. That is just the public surface. The internal events — UPL-shaped responses from intake bots, conflict misses, privilege leaks to external LLM processors — are happening at every firm that deployed generative AI in the last 18 months, and most of them are not yet surfacing in OPR review or malpractice claims because the audit trail to catch them doesn't exist.</p>
80
- <p>ThumbGate is the runtime layer that catches them <em>before</em> they happen. Every agent action — every API call, every document fetch, every drafted message passes through a PreToolUse gate that fires before the action executes. Known-bad shapes are blocked with the audit trail your malpractice carrier and your OPR review actually want to read.</p>
81
- <p>The framing matters: ThumbGate isn't another legal AI tool your innovation team has to vet. It's the <strong>vetting-collapse layer</strong> that sits between the agents you've already adopted — Harvey, Copilot, Legora, internal scripts, whatever a client mandates next quarter — and the tool calls those agents try to make. One control plane, every model, every matter, every output.</p>
82
-
83
- <h2>The three failure modes ThumbGate prevents</h2>
84
- <div class="grid">
85
- <div class="card">
86
- <h3>1. Unauthorized practice of law <span class="rule-cite">(Rule 5.5)</span></h3>
87
- <p>The AI intake bot tells a prospect <em>"based on what you've described, you have a strong case for breach of fiduciary duty."</em> That's legal advice from a non-lawyer. Under Rule 5.5 and under most state bar interpretations — the firm is on the hook. ThumbGate's UPL gate intercepts response candidates that match advice-shaped patterns (predictions, recommendations, outcome assertions) and replaces them with an intake hand-off to a licensed attorney.</p>
88
- </div>
89
- <div class="card">
90
- <h3>2. Missed conflicts <span class="rule-cite">(Rules 1.7, 1.9, 1.10)</span></h3>
91
- <p>The agent processes a new-client inquiry at 11pm on Sunday, schedules an intake call for Monday, sends a generic engagement letter — and only then runs the conflict check that finds the prospect is the opposing party in an existing matter. By then the firm has already received confidential information from the prospect. ThumbGate's conflict gate requires a positive clearance from the firm's adverse-parties list <em>before</em> the agent can accept any intake content beyond the initial routing question.</p>
92
- </div>
93
- <div class="card">
94
- <h3>3. Privilege breach <span class="rule-cite">(Rule 1.6 + state evidence rules)</span></h3>
95
- <p>An associate uses the firm's AI assistant to summarize a privileged deposition. The agent calls a public LLM endpoint to "improve the summary." Privileged content just left the firm's infrastructure to a third-party processor that has no equivalent privilege protection. ThumbGate's egress gate inspects every outbound API call from agents and blocks transmissions of content matching privilege-policy patterns (matter ID, client name, "Attorney Work Product" markers, custom firm classifiers) to non-approved processors.</p>
297
+
298
+ <div class="wrap">
299
+ <header class="hero">
300
+ <div>
301
+ <div style="display: inline-block; border-left: 3px solid #fbbf24; background: rgba(251, 191, 36, 0.08); padding: 0.7rem 1rem; margin-bottom: 1.25rem; border-radius: 0 6px 6px 0; max-width: 760px;">
302
+ <strong style="color: #fbbf24; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.08em; display: block; margin-bottom: 0.25rem;">Why this matters now &mdash; 2026</strong>
303
+ <span style="color: var(--text); font-size: 0.95rem; line-height: 1.55;">Sullivan &amp; Cromwell apologized to a federal judge for AI-hallucinated citations &mdash; despite policies, mandatory training, and verification requirements. Gordon Rees did the same on a bankruptcy filing. The <a href="https://www.damiencharlotin.com/hallucinations/" target="_blank" rel="noopener" style="color: #fbbf24">public hallucination-cases database</a> now catalogs <strong>1,369+ rulings</strong>. The firms with policies still got sanctioned. <em>Policies are not enforcement.</em> A runtime gate is.</span>
304
+ </div>
305
+ <span class="eyebrow">Pre-read for law-firm AI governance pilots</span>
306
+ <h1>Pre-execution controls for legal AI agents.</h1>
307
+ <p class="lead">Block unauthorized advice, conflict-check failures, privilege leaks, and unapproved model calls before an intake agent replies, fetches records, schedules a meeting, or sends data outside the firm's approved boundary.</p>
308
+ <p style="color: var(--soft); font-size: 0.98rem; max-width: 760px; margin: 0 0 1.1rem; padding: 0.7rem 1rem; border-left: 3px solid var(--green); background: rgba(114, 227, 165, 0.06); border-radius: 0 6px 6px 0;">
309
+ <strong style="color: var(--green)">Predictability you can put in front of a client.</strong>
310
+ Pre-execution controls aren't just defensive &mdash; they make agentic-AI deployment <em>predictable enough to sell</em>. Innovation teams at law firms have always had to choose between speed and certainty. The runtime gate lets you have both: the agent moves at machine speed, the gate enforces firm-specific policy deterministically, and every decision ships an audit log your pricing partners can underwrite. <strong style="color: var(--soft)">Predictability. Insights. Value.</strong> The three things your innovation team already promises clients &mdash; extended to the agentic surface.
311
+ </p>
312
+ <p style="color: var(--soft); font-size: 0.95rem; max-width: 760px; margin: 0 0 1rem; padding: 0.55rem 0.85rem; border-left: 3px solid var(--cyan); background: rgba(45, 212, 191, 0.05); border-radius: 0 6px 6px 0;">
313
+ <strong style="color: var(--cyan)">The gate learns from your attorneys.</strong>
314
+ Every 👍 / 👎 an attorney logs on an AI answer becomes a lesson in your firm's local DB. Recurring patterns promote to deterministic rules. The next time a similar action is proposed, the rule fires before any human is asked to approve.
315
+ <a href="/learn/feedback-loop-vs-decision-layer" style="color: var(--cyan); white-space: nowrap;">How the feedback loop works &rarr;</a>
316
+ </p>
317
+ <div class="hero-actions">
318
+ <a class="cta" href="mailto:iganapolsky@gmail.com?subject=ThumbGate%2025-minute%20legal%20AI%20pilot%20walkthrough&amp;body=Hi%20Igor%2C%0A%0AWe%27d%20like%20to%20review%20the%2025-minute%20ThumbGate%20legal%20AI%20intake%20pilot.%20Please%20send%20the%20meeting%20invite%20and%20demo%20materials.%0A%0ABest%2C">Book a 25-minute pilot walkthrough</a>
319
+ <a class="ghost" href="#live-gate-demos">Try the live gates &rarr;</a>
320
+ <a class="ghost" href="#demo">View the 25-minute demo plan</a>
321
+ </div>
322
+ <div class="proof-row" aria-label="Key proof points">
323
+ <div class="proof"><strong>Preloaded controls</strong><span>Firm policy, approved disclaimers, adverse-party lists, routing rules, and model endpoint allowlists.</span></div>
324
+ <div class="proof"><strong>Pre-action checks</strong><span>Controls run before the agent replies, fetches records, schedules intake, or calls an external model.</span></div>
325
+ <div class="proof"><strong>Reviewable evidence</strong><span>Every block, warning, override, and handoff becomes a structured audit event.</span></div>
326
+ </div>
327
+ <div class="trust-strip" aria-label="Trust and deployment assumptions">
328
+ <div class="trust-item">Local-first enforcement option</div>
329
+ <div class="trust-item">Works around Azure OpenAI, Claude, Gemini, and internal tools</div>
330
+ <div class="trust-item">ABA Formal Opinion 512 mapped to reviewable controls</div>
331
+ <div class="trust-item">No guaranteed-malpractice-prevention claim</div>
332
+ </div>
96
333
  </div>
97
- </div>
98
-
99
- <h2>How the prevention actually works</h2>
100
- <p>The mechanism is deliberately simple. ThumbGate sits between the agent and the world as a hook layer; every tool call the agent attempts (HTTP request, file read, database query, generated response delivery) passes through a <code>PreToolUse</code> gate first. The gate evaluates the proposed action against a lesson database built from your firm's own observed failures plus a library of legal-vertical defaults shipped with the product.</p>
101
- <ul>
102
- <li><strong>Promoted rules block known-bad shapes.</strong> When the same failure pattern recurs three or more times — silently, without a human even noticing — silent-failure clustering surfaces it as a candidate rule. A pre-promotion eval verifies precision before it joins the active gate set.</li>
103
- <li><strong>Every block is logged with provenance.</strong> What was attempted, what rule fired, what corrective action the agent was redirected to. That log is the artifact your malpractice carrier and your OPR review actually want — not a vendor's "trust me" assurance.</li>
104
- <li><strong>Nothing leaves your boundary.</strong> ThumbGate runs in-process or as a sidecar in your Azure / AWS tenant or on-prem. No client data, no privileged content, no matter metadata traverses our infrastructure. The hosted dashboard is optional and never receives privileged payloads — only counters and rule metadata.</li>
105
- </ul>
106
-
107
- <h2>Three scenarios from real firm pain</h2>
108
-
109
- <div class="scenario">
110
- <span class="label">Scenario 1 — after-hours UPL</span>
111
- <p><strong>Without ThumbGate:</strong> Saturday 11 PM. An estate-planning prospect uses the firm's website AI assistant to ask "if I name my brother as executor but he lives in another state, does that cause problems?" The assistant, trained on legal content, replies with a 4-paragraph explanation of out-of-state-executor bonds and tax implications. That's legal advice. The firm's malpractice carrier finds out 8 months later when the prospect (who hired a different firm) sues over an estate dispute and the deposition surfaces the chatbot transcript.</p>
112
- <span class="resolve">With ThumbGate</span>
113
- <p>The UPL gate matches the response shape (jurisdictional analysis + recommendation) against the promoted rule for "advice-shaped output from non-attorney source." The assistant's response is intercepted before delivery and replaced with: <em>"That's a legal question that needs a licensed attorney in your state. I can book you a 30-min consult with one of our estate-planning attorneys — would Monday at 10 AM work?"</em> The intake gets scheduled, the firm captures the lead, no UPL ever occurs, and the audit log shows the firm prevented the failure mode.</p>
114
- </div>
115
-
116
- <div class="scenario">
117
- <span class="label">Scenario 2 — adverse-party conflict miss</span>
118
- <p><strong>Without ThumbGate:</strong> A junior associate uses the firm's AI document-fetcher agent to pull "all recent filings involving Acme Corporation" for due diligence on a new M&A engagement. The agent retrieves dozens of documents — including filings from a matter where the firm represents Acme's largest competitor. Privileged work product from the existing matter now sits in the associate's local cache. The firm has just created a screen problem at minimum; at worst, a disqualification motion six weeks later.</p>
119
- <span class="resolve">With ThumbGate</span>
120
- <p>The conflict gate fires on every document-fetch tool call. Before the fetch executes, it cross-references the requesting matter ID against the firm's adverse-parties list. The Acme-competitor matter is flagged. The fetch is blocked and the agent is redirected to: <em>"Acme Corporation appears as an adverse party in matter [REDACTED]. This fetch is blocked. Contact [matter-attorney email] to discuss whether an ethics screen is needed before proceeding."</em> No cross-contamination, no waiver risk.</p>
121
- </div>
122
-
123
- <div class="scenario">
124
- <span class="label">Scenario 3 — egress privilege breach</span>
125
- <p><strong>Without ThumbGate:</strong> A partner pastes a 200-page deposition transcript into the firm's "AI Brief Assistant" and asks for a summary. The Brief Assistant, under the hood, calls an external LLM API for the long-context summarization step because the in-house model's context window is too short. Privileged deposition content just left the firm's network to a vendor whose terms of service include "we may use submitted content to improve our models." Privilege waiver argument waiting to happen.</p>
126
- <span class="resolve">With ThumbGate</span>
127
- <p>The egress gate inspects every outbound API call. The deposition's metadata header includes the firm's "Attorney Work Product" marker. The call to the external LLM is blocked. The agent is redirected to a privilege-safe alternative: in-tenant summarization via the firm's Azure OpenAI deployment (which carries the firm's BAA) or chunked summarization that stays inside the model's context window. The transcript never leaves the firm's boundary; the audit log records the block.</p>
128
- </div>
129
-
130
- <h2>Compliance matrix — what ThumbGate maps to</h2>
131
- <table class="compliance">
132
- <thead>
133
- <tr><th>Authority</th><th>Requirement</th><th>ThumbGate's mechanism</th></tr>
134
- </thead>
135
- <tbody>
136
- <tr><td>ABA Model Rule 1.1 + cmt. 8</td><td>Competence in the benefits and risks of relevant technology</td><td>Audit trail of every agent action gives partners evidence of supervision-grade understanding</td></tr>
137
- <tr><td>ABA Model Rule 1.6</td><td>Protect confidential information</td><td>Egress gate blocks outbound calls carrying client-confidential or privileged content to non-approved processors</td></tr>
138
- <tr><td>ABA Model Rule 5.3</td><td>Supervise non-lawyer assistance, including AI tools</td><td>Per-call evidence + per-rule provenance is the supervision artifact</td></tr>
139
- <tr><td>ABA Model Rule 5.5</td><td>No unauthorized practice of law</td><td>UPL gate intercepts advice-shaped output from non-attorney agents pre-delivery</td></tr>
140
- <tr><td>ABA Formal Op. 512 (Jul 2024)</td><td>Verify AI output, protect confidentiality, consider client disclosure</td><td>Audit trail covers the verification + disclosure questions in one artifact</td></tr>
141
- <tr><td>Rules 1.7 / 1.9 / 1.10</td><td>Conflict of interest screening</td><td>Conflict gate requires positive clearance against adverse-parties list before agent can accept intake content</td></tr>
142
- </tbody>
143
- </table>
144
-
145
- <h2>Why this is the Chief Pricing & Innovation Officer's problem (not just the GC's)</h2>
146
- <p>Every alternative-fee arrangement carries an implicit risk reserve against malpractice tail events. A single sanction, disqualification motion, or bar complaint compresses AFA margins for the entire vintage of matters affected. The events ThumbGate prevents are precisely the events that trigger reserves. Framed in pricing terms, the runtime gate is a <strong>reserve-cost reduction control</strong>: prevented sanctions are dollars not held against alternative-fee matter margins. The audit trail is the artifact the firm's malpractice carrier reads when arguing for a premium reduction at the next renewal.</p>
147
- <p>Standardization gets easier the same way. Each new client mandate ("you must use Tool X for our matters, you may not use Tool Y") becomes a policy update at the gate, not a per-tool re-vetting cycle. The vetting work that takes calendar weeks today becomes a one-line rule in the gate config — applied across every existing agent without re-implementation.</p>
148
-
149
- <h2>The deployment story (security committee's first objection answered first)</h2>
150
- <ul>
151
- <li><strong>Runs inside your boundary.</strong> ThumbGate is a Node.js process that runs as a sidecar in your Azure / AWS / on-prem environment. No client data, no privileged content, no matter metadata traverses our infrastructure.</li>
152
- <li><strong>Microsoft 365 / Azure OpenAI compatible.</strong> If your firm is on the Microsoft stack, ThumbGate gates calls to your Azure OpenAI endpoint just as cleanly as it gates Anthropic, OpenAI public API, or any other LLM.</li>
153
- <li><strong>BAA / DPA path.</strong> The optional hosted dashboard (analytics + rule library) carries a BAA. The runtime gate layer carries no BAA need because it never receives PHI / PII / privileged content — only counters and metadata.</li>
154
- <li><strong>SOC 2 Type II in progress.</strong> Audit underway; final report Q3 2026. Pilot engagements can proceed under SOC 2 Type I + a Vendor Security Questionnaire response on file.</li>
155
- <li><strong>No model lock-in.</strong> ThumbGate is vendor-neutral on the LLM. It works equally over Claude (Anthropic + AWS Bedrock), GPT-4 (OpenAI + Azure), Gemini, Llama-on-Mosaic, or any HTTP-callable model.</li>
156
- </ul>
157
-
158
- <h2>Pilot shape</h2>
159
- <p>The recommended first engagement is a 30-day pilot focused on a single intake-channel and a single practice-area-specific conflict-list. Two of your attorneys, two of your IT/innovation staff, and one ThumbGate engineer running biweekly sync calls. Pilot deliverable: a documented set of promoted gate rules specific to your firm's risk profile, the audit-trail format reviewed by your malpractice carrier or OPR liaison, and a written go/no-go recommendation on firm-wide rollout. Investment for the pilot is positioned as a Workflow Hardening Sprint — fixed-scope, fixed-price, no per-attorney metering during evaluation.</p>
160
-
161
- <div class="quote">"The job of legal-AI governance isn't 'tell the model to be more careful.' It's the tool-call boundary, with an audit trail that survives the deposition."</div>
162
-
163
- <div class="card">
164
- <p><strong>Next step: a 25-min walkthrough on a hypothetical intake-and-conflict scenario specific to your firm.</strong></p>
165
- <p>
166
- <a href="mailto:iganapolsky@gmail.com?subject=ThumbGate%20AI%20Malpractice%20Prevention%20-%20demo%20request&amp;body=Hi%20Igor%2C%0A%0AI%27m%20at%20%5Bfirm%5D%20and%20saw%20your%20AI%20malpractice%20prevention%20page.%20%0A%0AWe%27re%20evaluating%20how%20to%20govern%20our%20agentic%20legal-AI%20deployment%20and%20I%27d%20like%20to%20see%20a%20walkthrough.%20%0A%0AMy%20practice%20area%20is%3A%20%5B%5D%0AThe%20intake%20channel%20we%27re%20most%20worried%20about%3A%20%5B%5D%0A%0ABest%2C" class="cta">Book a 25-min walkthrough</a>
167
- <a href="/agent-manager" class="secondary">Or read the Agent Manager role framing →</a>
168
- </p>
169
- </div>
170
-
171
- <h2>Related reading</h2>
172
- <ul>
173
- <li><a href="/agents-cost-savings">FinOps for AI agents</a> — the cost-control composition for firms running multiple agents across matters.</li>
174
- <li><a href="/federal">Federal / regulated workloads</a> — the same compliance bones (deployable inside your tenant, audit trail, SOC 2 path) that work for federal also satisfy law-firm professional-responsibility committees.</li>
175
- <li><a href="/agent-manager">ThumbGate for the Agent Manager</a> — the role inside the firm that owns "what are our agents costing us, and what did we stop them from doing?"</li>
176
- </ul>
177
-
178
- <div class="footer-links">
179
- Built for law firms whose Innovation function has been told to "make AI work in intake and document review" but hasn't been given the safety net that lets their partners sign off without losing sleep. ABA Formal Op. 512 is the bar; ThumbGate is the floor.
180
- </div>
334
+
335
+ <aside class="control-flow" aria-label="ThumbGate pre-action control flow">
336
+ <img class="flow-asset" src="/assets/legal-intake-control-flow.svg" alt="Diagram of the ThumbGate legal intake pre-action control flow">
337
+ <h2>What the demo should show</h2>
338
+ <div class="flow-step">
339
+ <span class="num">1</span>
340
+ <div>
341
+ <h3>Prospect asks a risky intake question</h3>
342
+ <p>"Can I sue my former employer in Florida if they changed my commission plan?"</p>
343
+ </div>
344
+ </div>
345
+ <div class="flow-step blocked">
346
+ <span class="num">2</span>
347
+ <div>
348
+ <h3>Advice-shaped response is stopped</h3>
349
+ <p>Legal conclusion plus jurisdictional recommendation is routed to attorney review before delivery.</p>
350
+ </div>
351
+ </div>
352
+ <div class="flow-step cleared">
353
+ <span class="num">3</span>
354
+ <div>
355
+ <h3>Safe handoff is allowed</h3>
356
+ <p>The agent collects neutral routing details and schedules review without creating reliance.</p>
357
+ </div>
358
+ </div>
359
+ <div class="flow-step">
360
+ <span class="num">4</span>
361
+ <div>
362
+ <h3>Audit event is exportable</h3>
363
+ <p>Rule version, source policy, proposed action, outcome, reviewer, and timestamp are preserved.</p>
364
+ </div>
365
+ </div>
366
+ </aside>
367
+ </header>
368
+
369
+ <main>
370
+ <section>
371
+ <h2>Why this is credible now.</h2>
372
+ <p class="section-lead">The market is not waiting for perfect AI. Large firms are adopting legal AI while ethics, security, and innovation teams are still formalizing the controls around it. ThumbGate fits that gap: it is not another research assistant; it is a control point around the assistants and agents a firm already wants to evaluate. Governance has to live outside the model's context window. If the agent can reason around the rule, it is not really a rule.</p>
373
+ <div class="grid">
374
+ <div class="card">
375
+ <span class="tag blue">Governance</span>
376
+ <h3>ABA Formal Opinion 512 maps cleanly to controls</h3>
377
+ <p>Competence, confidentiality, supervision, verification, communication, and reasonable fees become concrete checks and review records.</p>
378
+ </div>
379
+ <div class="card">
380
+ <span class="tag amber">Adoption</span>
381
+ <h3>AI is entering normal workflows</h3>
382
+ <p>The practical buyer question is no longer "will lawyers use AI?" It is "which actions can an agent take without review?"</p>
383
+ </div>
384
+ <div class="card">
385
+ <span class="tag green">Positioning</span>
386
+ <h3>Vendor-neutral by design</h3>
387
+ <p>The pilot can sit around internal tools, Azure OpenAI, Claude, Gemini, document systems, or purpose-built legal AI products.</p>
388
+ </div>
389
+ </div>
390
+ </section>
391
+
392
+ <section>
393
+ <h2>The pilot is an AI-SDLC control layer, not a chatbot demo.</h2>
394
+ <p class="section-lead">The strongest buyer framing is simple: the firm may already have agents, copilots, research tools, and intake experiments. What it still needs is the system around those agents: triggers, isolated runs, approved context, visibility, and controls that live outside the model prompt.</p>
395
+ <div class="grid">
396
+ <div class="card">
397
+ <span class="tag blue">Trigger</span>
398
+ <h3>Define what starts legal AI work</h3>
399
+ <p>A pilot run should begin from a scoped intake event, not an open-ended prompt. The event carries practice area, jurisdiction, allowed tools, reviewer role, and done criteria.</p>
400
+ </div>
401
+ <div class="card">
402
+ <span class="tag amber">Context</span>
403
+ <h3>Load only approved firm ground truth</h3>
404
+ <p>Disclaimers, adverse-party fixtures, model allowlists, routing policy, and supervision rules should be versioned inputs, not improvised chat context.</p>
405
+ </div>
406
+ <div class="card">
407
+ <span class="tag green">Controls</span>
408
+ <h3>Block before the action happens</h3>
409
+ <p>Pre-action gates stop advice-shaped replies, conflict-precheck bypass, and confidential egress before the agent sends, fetches, schedules, or calls out.</p>
410
+ </div>
411
+ </div>
412
+ <div class="callout" style="margin-top:1rem;">
413
+ <p><strong>Executive takeaway:</strong> ThumbGate does not ask a law firm to trust a bigger prompt. It gives risk, innovation, and security teams a reviewable control point between the agent and the next privileged action.</p>
414
+ <p><a href="/learn/background-agent-control-layer">Read the background-agent control-layer brief &rarr;</a></p>
415
+ </div>
416
+ </section>
417
+
418
+ <section>
419
+ <h2>Yes, the pilot can start with preloaded ground truth.</h2>
420
+ <p class="section-lead">The first pilot should not ask the model to discover the firm's risk posture. ThumbGate should load the approved rule pack before the first intake simulation, then prove that the agent is physically stopped when a proposed action violates that pack.</p>
421
+ <div class="grid">
422
+ <div class="card">
423
+ <span class="tag green">Inputs</span>
424
+ <h3>Firm-approved source material</h3>
425
+ <p>Disclaimers, intake scripts, escalation rules, practice-area boundaries, jurisdiction notes, model endpoint policy, retention rules, and reviewer roles.</p>
426
+ </div>
427
+ <div class="card">
428
+ <span class="tag amber">Fixtures</span>
429
+ <h3>Adverse-party and matter examples</h3>
430
+ <p>A synthetic adverse-party list and red-team intake transcripts let the demo show conflict stops without exposing privileged or client data.</p>
431
+ </div>
432
+ <div class="card">
433
+ <span class="tag blue">Outputs</span>
434
+ <h3>Deterministic control evidence</h3>
435
+ <p>Each demo decision shows the matched rule, proposed action, allowed or blocked outcome, reviewer path, timestamp, and exportable audit record.</p>
436
+ </div>
437
+ </div>
438
+ </section>
439
+
440
+ <section>
441
+ <h2>Three failure modes the pilot should control.</h2>
442
+ <div class="grid">
443
+ <div class="card">
444
+ <span class="tag red">UPL</span>
445
+ <h3>Unauthorized-practice risk</h3>
446
+ <p>Block outcome predictions, jurisdictional recommendations, and advice-shaped responses from non-attorney intake agents. Allow neutral collection and attorney handoff.</p>
447
+ </div>
448
+ <div class="card">
449
+ <span class="tag amber">Conflicts</span>
450
+ <h3>Conflict preconditions</h3>
451
+ <p>Require configured adverse-party clearance before the agent continues intake or requests sensitive matter facts.</p>
452
+ </div>
453
+ <div class="card">
454
+ <span class="tag blue">Privilege</span>
455
+ <h3>Confidentiality and egress</h3>
456
+ <p>Block or reroute outbound calls that include privileged markers, matter identifiers, or firm-classified confidential content.</p>
457
+ </div>
458
+ </div>
459
+ </section>
460
+
461
+ <section id="demo">
462
+ <h2>25-minute walkthrough agenda.</h2>
463
+ <p class="section-lead">The call should be visual. The goal is not to prove every enterprise feature. It is to show a repeatable mechanism the innovation team can explain internally.</p>
464
+ <div class="two grid">
465
+ <div class="card">
466
+ <h3>Show these assets</h3>
467
+ <ul>
468
+ <li>One unsafe intake transcript and blocked response.</li>
469
+ <li>One conflict-precheck stop before sensitive facts are collected.</li>
470
+ <li>One egress block or safe in-tenant reroute.</li>
471
+ <li>One audit export with rule version, source, outcome, and reviewer.</li>
472
+ </ul>
473
+ </div>
474
+ <div class="card">
475
+ <h3>Skip these on the first call</h3>
476
+ <ul>
477
+ <li>Broad platform tour.</li>
478
+ <li>Pricing page or checkout flow.</li>
479
+ <li>Unverified sanctions statistics.</li>
480
+ <li>Claims about SOC 2, BAA, carrier discounts, or guaranteed malpractice prevention.</li>
481
+ </ul>
482
+ </div>
483
+ </div>
484
+ <div class="two grid" style="margin-top:1rem;">
485
+ <div class="card">
486
+ <h3>Suggested agenda</h3>
487
+ <ul>
488
+ <li>3 minutes: confirm the target workflow and risk owners.</li>
489
+ <li>7 minutes: show blocked unauthorized-advice and conflict examples.</li>
490
+ <li>7 minutes: show preloaded ground truth and audit evidence.</li>
491
+ <li>5 minutes: discuss deployment boundary, data handling, and reviewer roles.</li>
492
+ <li>3 minutes: agree on pilot inputs and next step.</li>
493
+ </ul>
494
+ </div>
495
+ <div class="card">
496
+ <h3>Recommended ask</h3>
497
+ <p>Ask for one practice-area workflow, one approved disclaimer, one synthetic adverse-party fixture, one security contact, and permission to build a no-client-data pilot pack.</p>
498
+ </div>
499
+ </div>
500
+ </section>
501
+
502
+ <section>
503
+ <h2>Procurement questions to answer early.</h2>
504
+ <table class="matrix">
505
+ <thead>
506
+ <tr><th>Buyer question</th><th>Pilot answer</th><th>Evidence to bring</th></tr>
507
+ </thead>
508
+ <tbody>
509
+ <tr><td>Will our data train models?</td><td>The pilot can run inside the firm's boundary. Hosted services should receive only counters and rule metadata unless explicitly approved.</td><td>Data-flow diagram, retention note, subprocessor list.</td></tr>
510
+ <tr><td>Who can see privileged data?</td><td>Default pilot design keeps privileged payloads in the firm's environment, with access governed by their controls.</td><td>Architecture note and access-control assumptions.</td></tr>
511
+ <tr><td>Can we reproduce a decision later?</td><td>Each event should preserve the rule version, source policy, proposed action, decision, reviewer, and timestamp.</td><td>Sample audit export.</td></tr>
512
+ <tr><td>How do we tune false positives?</td><td>Use hard block, review queue, warning, and allow modes. Promote rules only after test examples and attorney approval.</td><td>Rule lifecycle and override examples.</td></tr>
513
+ </tbody>
514
+ </table>
515
+ </section>
516
+
517
+ <section>
518
+ <div class="callout">
519
+ <h2>Recommended 30-day pilot.</h2>
520
+ <p>Start narrow: one intake channel, one practice-area workflow, one adverse-party fixture, one approved-model routing policy, and one audit export format.</p>
521
+ <p>Deliverables: preloaded rule pack, demo agent, screenshot set, 60-second walkthrough clip, security data-flow note, pilot metrics, and a go/no-go rollout recommendation.</p>
522
+ <p style="margin:1.2rem 0 0.6rem;color:var(--amber);font-size:1.1rem;font-weight:700;">Pilot setup fee: $2,500 &ndash; $7,500 flat (scope-dependent). No per-seat or per-query billing during the pilot.</p>
523
+ <div style="display:flex;gap:1rem;flex-wrap:wrap;margin-top:1rem;">
524
+ <a class="cta" href="mailto:iganapolsky@gmail.com?subject=ThumbGate%2025-minute%20legal%20AI%20pilot%20walkthrough&amp;body=Hi%20Igor%2C%0A%0AWe%27d%20like%20to%20review%20the%2025-minute%20ThumbGate%20legal%20AI%20intake%20pilot.%20Please%20send%20the%20meeting%20invite%20and%20demo%20materials.%0A%0ABest%2C">Book a 25-minute pilot walkthrough</a>
525
+ <a class="ghost" href="/dashboard">View the live dashboard demo</a>
526
+ </div>
527
+ </div>
528
+ </section>
529
+
530
+ <section id="live-gate-demos">
531
+ <h2>Live gate demos &mdash; try them yourself</h2>
532
+ <div style="border-left: 3px solid var(--cyan); background: rgba(34, 211, 238, 0.06); padding: 0.85rem 1.1rem; margin: 0 0 1.5rem; border-radius: 0 6px 6px 0;">
533
+ <strong style="color: var(--cyan)">Monitor vs enforce.</strong> <span style="color: var(--text)">Agent observability tools log what your agent <em>did</em>. ThumbGate gates what your agent is <em>about to do</em> &mdash; runtime block before execution, not retrospective alert after the harm. SIEM ingestion is the audit trail. The PreToolUse hook is the prevention.</span>
534
+ </div>
535
+ <p style="color:var(--muted); margin-bottom:1.5rem">These simulators use the exact same deterministic PreToolUse logic that runs in production. No LLM calls on the enforcement path &mdash; just fast, auditable pattern matching.</p>
536
+
537
+ <!-- UPL Gate Simulator -->
538
+ <div class="card" style="margin-bottom:2rem">
539
+ <h3 style="color:var(--cyan); margin-bottom:0.75rem">1. UPL Gate &mdash; advice-shaped output detector</h3>
540
+ <p style="font-size:0.95rem; color:var(--muted)">Type what a client might ask an intake bot. The gate detects predictions, recommendations, or jurisdictional legal analysis from a non-attorney source and blocks delivery.</p>
541
+ <textarea id="upl-input" placeholder="E.g. 'Based on the facts you described, you likely have a strong claim for breach of contract and could recover significant damages.'" style="width:100%; height:90px; background:#0f0f11; color:var(--text); border:1px solid var(--line); border-radius:8px; padding:0.75rem; font-size:0.95rem; resize:vertical; margin:0.75rem 0"></textarea>
542
+ <button onclick="runUPLDemo()" class="cta" style="padding:0.6rem 1.1rem; font-size:0.9rem">Run through UPL Gate</button>
543
+ <div id="upl-result" class="demo-result" style="display:none"></div>
544
+ </div>
545
+
546
+ <!-- Conflict Check Simulator -->
547
+ <div class="card" style="margin-bottom:2rem">
548
+ <h3 style="color:var(--cyan); margin-bottom:0.75rem">2. Conflict Gate &mdash; adverse party clearance</h3>
549
+ <p style="font-size:0.95rem; color:var(--muted)">Enter a prospective client or party name. The gate checks against a sample adverse-parties list (real firms maintain much larger lists).</p>
550
+ <div style="display:flex; gap:0.75rem; align-items:flex-end; margin:0.75rem 0; flex-wrap:wrap">
551
+ <div style="flex:1; min-width:240px">
552
+ <label style="font-size:0.8rem; color:var(--muted); display:block; margin-bottom:0.25rem">Party / Company Name</label>
553
+ <input id="conflict-input" type="text" placeholder="Latam Real Capital" value="Latam Real Capital S.A." style="width:100%; background:#0f0f11; color:var(--text); border:1px solid var(--line); border-radius:8px; padding:0.6rem; font-size:0.95rem">
554
+ </div>
555
+ <button onclick="runConflictDemo()" class="cta" style="padding:0.6rem 1.1rem; font-size:0.9rem; white-space:nowrap">Check Against Adverse List</button>
556
+ </div>
557
+ <div style="font-size:0.8rem; color:var(--muted); margin-bottom:0.5rem">Sample adverse list (synthetic, illustrative): Latam Real Capital S.A. (real estate #M-2847), Hospitalia Holdings (hospitality M&amp;A #M-2911), NovaIA Latam (AI venture #M-2755)</div>
558
+ <div id="conflict-result" class="demo-result" style="display:none"></div>
559
+ </div>
560
+
561
+ <!-- Privilege Egress Simulator -->
562
+ <div class="card">
563
+ <h3 style="color:var(--cyan); margin-bottom:0.75rem">3. Egress Gate &mdash; privilege marker detector</h3>
564
+ <p style="font-size:0.95rem; color:var(--muted)">Paste content an agent might try to send to an external LLM (e.g. deposition summary request). The gate blocks if it detects privilege markers.</p>
565
+ <textarea id="privilege-input" placeholder="Please summarize this deposition transcript. [Attorney Work Product - Matter M-2847 - Confidential]" style="width:100%; height:90px; background:#0f0f11; color:var(--text); border:1px solid var(--line); border-radius:8px; padding:0.75rem; font-size:0.95rem; resize:vertical; margin:0.75rem 0"></textarea>
566
+ <button onclick="runPrivilegeDemo()" class="cta" style="padding:0.6rem 1.1rem; font-size:0.9rem">Attempt External LLM Call</button>
567
+ <div id="privilege-result" class="demo-result" style="display:none"></div>
568
+ </div>
569
+
570
+ <script>
571
+ function escapeHtml(s) {
572
+ return String(s).replace(/[&<>"']/g, function(c) {
573
+ return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
574
+ });
575
+ }
576
+ // Produces the same JSON shape a production ThumbGate gate would stream to the firm's SIEM.
577
+ // Includes ISO 27001 control mapping so procurement can map evidence to controls without translation.
578
+ window.__thumbgateBuildAudit = function(args) {
579
+ return {
580
+ audit_id: args.audit_id,
581
+ timestamp_iso: args.timestamp_iso,
582
+ rule: { id: args.rule_id, version: args.rule_version, matched: args.matched },
583
+ blocked_call: {
584
+ agent: args.agent,
585
+ input_excerpt: String(args.input || '').slice(0, 280),
586
+ matter_context: args.matter_context
587
+ },
588
+ action: args.action,
589
+ reviewer: null,
590
+ iso_27001_controls: args.iso_controls,
591
+ generated_by: 'ThumbGate PreToolUse Gate (sample export — production version streams to your SIEM)',
592
+ sample_disclaimer: 'Synthetic audit record for evaluation. No real client data referenced.'
593
+ };
594
+ };
595
+ window.__thumbgateDownloadAudit = function(payload, filename) {
596
+ try {
597
+ var json = JSON.stringify(payload, null, 2);
598
+ var blob = new Blob([json], { type: 'application/json' });
599
+ var url = URL.createObjectURL(blob);
600
+ var a = document.createElement('a');
601
+ a.href = url; a.download = filename;
602
+ document.body.appendChild(a); a.click();
603
+ document.body.removeChild(a);
604
+ setTimeout(function() { URL.revokeObjectURL(url); }, 10000);
605
+ } catch (e) { console.error('audit download failed', e); }
606
+ };
607
+ window.__thumbgateAuditRegistry = {};
608
+ window.__thumbgateAuditByKey = function(key) {
609
+ var entry = window.__thumbgateAuditRegistry[key];
610
+ if (!entry) return;
611
+ window.__thumbgateDownloadAudit(entry.payload, entry.filename);
612
+ };
613
+ window.__thumbgateAuditButton = function(key, payload, filename) {
614
+ window.__thumbgateAuditRegistry[key] = { payload: payload, filename: filename };
615
+ return '<button class="cta" style="margin-top:0.5rem; padding:0.45rem 0.9rem; font-size:0.82rem; background:transparent; color:var(--cyan); border:1px solid var(--cyan)" ' +
616
+ 'onclick="__thumbgateAuditByKey(\'' + key + '\')">' +
617
+ 'Download audit JSON (sample) &darr;</button>';
618
+ };
619
+ function runUPLDemo() {
620
+ var input = document.getElementById('upl-input').value.trim();
621
+ var resultDiv = document.getElementById('upl-result');
622
+ if (!input) { resultDiv.style.display = 'none'; return; }
623
+ var advicePatterns = ['you have a strong case', 'likely to win', 'you should', 'recommend that you', 'based on the facts you described', 'in my opinion', 'the best course is', 'you are entitled to'];
624
+ var lower = input.toLowerCase();
625
+ var blocked = false;
626
+ var reason = '';
627
+ for (var i = 0; i < advicePatterns.length; i++) {
628
+ if (lower.indexOf(advicePatterns[i]) !== -1) { blocked = true; reason = advicePatterns[i]; break; }
629
+ }
630
+ if (blocked) {
631
+ var uplPayload = __thumbgateBuildAudit({
632
+ audit_id: 'UPL-2847-20260526-091204',
633
+ timestamp_iso: '2026-05-26T09:12:04Z',
634
+ rule_id: 'UPL_RULE_05.5_ADVICE_SHAPE',
635
+ rule_version: '3.2',
636
+ matched: 'advice-shaped output from non-attorney source ("' + reason + '")',
637
+ agent: 'website-intake-bot-v2',
638
+ input: input,
639
+ matter_context: 'New client intake (web)',
640
+ action: 'REPLACE + LOG + NOTIFY_ATTORNEY',
641
+ iso_controls: ['A.5.34 (Privacy & PII protection)', 'A.5.24 (Information security incident management)']
642
+ });
643
+ resultDiv.innerHTML =
644
+ '<div class="demo-blocked">' +
645
+ '<strong style="color:#f87171">BLOCKED &mdash; UPL Gate fired</strong><br>' +
646
+ 'Detected advice-shaped pattern: "' + escapeHtml(reason) + '"<br><br>' +
647
+ '<strong>Corrective action taken:</strong><br>' +
648
+ 'Response replaced with: <em>"That\'s a legal question best answered by a licensed attorney. I can schedule a 30-minute consultation with one of our [practice area] attorneys &mdash; would [time] work for you?"</em><br><br>' +
649
+ '<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: UPL_RULE_05.5_ADVICE_SHAPE v3.2\nRule matched: advice-shaped output from non-attorney source\nAction: REPLACE + LOG + NOTIFY_ATTORNEY\nAudit ID: UPL-2847-20260526-091204\nMatter context: New client intake (web)\nAgent: website-intake-bot-v2</div>' +
650
+ __thumbgateAuditButton('upl', uplPayload, 'ThumbGate-Audit-UPL-2847-2026-05-26.json') +
651
+ '</div>';
652
+ } else {
653
+ resultDiv.innerHTML =
654
+ '<div class="demo-cleared">' +
655
+ '<strong style="color:#34d399">CLEARED &mdash; no UPL pattern detected</strong><br>' +
656
+ 'Response would be delivered as-is. (In production this would still be logged for training.)' +
657
+ '</div>';
658
+ }
659
+ resultDiv.style.display = 'block';
660
+ }
661
+
662
+ function runConflictDemo() {
663
+ var party = document.getElementById('conflict-input').value.trim().toLowerCase();
664
+ var resultDiv = document.getElementById('conflict-result');
665
+ if (!party) { resultDiv.style.display = 'none'; return; }
666
+ var adverseList = ['latam real capital', 'latam real', 'hospitalia holdings', 'hospitalia', 'novaia latam', 'novaia'];
667
+ var isAdverse = adverseList.some(function(a) { return party.indexOf(a) !== -1; });
668
+ if (isAdverse) {
669
+ var conflictPayload = __thumbgateBuildAudit({
670
+ audit_id: 'CONF-2911-20260526-091204',
671
+ timestamp_iso: '2026-05-26T09:12:04Z',
672
+ rule_id: 'CONFLICT_RULE_1.7_ADVERSE',
673
+ rule_version: '4.1',
674
+ matched: 'adverse-parties list match for "' + party + '"',
675
+ agent: 'doc-fetch-agent-v1',
676
+ input: party,
677
+ matter_context: 'New M&A intake — preliminary conflict check',
678
+ action: 'BLOCK + REDIRECT + LOG',
679
+ iso_controls: ['A.5.10 (Acceptable use of information)', 'A.5.24 (Information security incident management)', 'A.8.10 (Information deletion)']
680
+ });
681
+ resultDiv.innerHTML =
682
+ '<div class="demo-blocked">' +
683
+ '<strong style="color:#f87171">BLOCKED &mdash; Conflict Gate fired</strong><br>' +
684
+ '"' + escapeHtml(party) + '" matches adverse party in existing matter.<br><br>' +
685
+ '<strong>Corrective action:</strong> Fetch blocked. Agent redirected to: <em>"This party appears as adverse in matter M-2847. Contact ethics screen lead before proceeding."</em><br><br>' +
686
+ '<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: CONFLICT_RULE_1.7_ADVERSE v4.1\nMatched: adverse-parties list\nAction: BLOCK + REDIRECT + LOG\nAudit ID: CONF-2911-20260526-091204\nRequesting matter: New M&amp;A intake\nAgent: doc-fetch-agent-v1</div>' +
687
+ __thumbgateAuditButton('conflict', conflictPayload, 'ThumbGate-Audit-CONF-2911-2026-05-26.json') +
688
+ '</div>';
689
+ } else {
690
+ resultDiv.innerHTML =
691
+ '<div class="demo-cleared">' +
692
+ '<strong style="color:#34d399">CLEARED &mdash; no conflict found</strong><br>' +
693
+ 'Positive clearance recorded. Agent may proceed with intake.<br><br>' +
694
+ '<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: CONFLICT_RULE_1.7_ADVERSE v4.1\nResult: CLEAR (no match in adverse list)\nAction: ALLOW + LOG\nAudit ID: CONF-2912-20260526-091204</div>' +
695
+ '</div>';
696
+ }
697
+ resultDiv.style.display = 'block';
698
+ }
699
+
700
+ function runPrivilegeDemo() {
701
+ var input = document.getElementById('privilege-input').value.trim();
702
+ var resultDiv = document.getElementById('privilege-result');
703
+ if (!input) { resultDiv.style.display = 'none'; return; }
704
+ var privMarkers = ['attorney work product', 'privileged', 'confidential - attorney client', 'matter m-', 'm-2847', 'm-2911'];
705
+ var lower = input.toLowerCase();
706
+ var blocked = false;
707
+ var marker = '';
708
+ for (var i = 0; i < privMarkers.length; i++) {
709
+ if (lower.indexOf(privMarkers[i]) !== -1) { blocked = true; marker = privMarkers[i]; break; }
710
+ }
711
+ if (blocked) {
712
+ var privilegePayload = __thumbgateBuildAudit({
713
+ audit_id: 'PRIV-2755-20260526-091204',
714
+ timestamp_iso: '2026-05-26T09:12:04Z',
715
+ rule_id: 'EGRESS_RULE_1.6_PRIVILEGE',
716
+ rule_version: '2.8',
717
+ matched: 'privilege marker in outbound payload ("' + marker + '")',
718
+ agent: 'brief-assistant-v3',
719
+ input: input,
720
+ matter_context: 'Outbound LLM call from attorney workspace',
721
+ action: 'BLOCK + REDIRECT_TO_TENANT_LLM + LOG',
722
+ iso_controls: ['A.5.34 (Privacy & PII protection)', 'A.5.14 (Information transfer)', 'A.8.24 (Use of cryptography)']
723
+ });
724
+ resultDiv.innerHTML =
725
+ '<div class="demo-blocked">' +
726
+ '<strong style="color:#f87171">BLOCKED &mdash; Egress Gate fired</strong><br>' +
727
+ 'Detected privilege marker: "' + escapeHtml(marker) + '"<br><br>' +
728
+ '<strong>Corrective action:</strong> Outbound call to external LLM blocked. Redirected to in-tenant Azure OpenAI (BAA-protected) or internal summarizer.<br><br>' +
729
+ '<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: EGRESS_RULE_1.6_PRIVILEGE v2.8\nRule matched: privilege marker in outbound payload\nAction: BLOCK + REDIRECT_TO_TENANT_LLM + LOG\nAudit ID: PRIV-2755-20260526-091204\nContent hash: sha256:7f3a... (truncated)\nAgent: brief-assistant-v3</div>' +
730
+ __thumbgateAuditButton('privilege', privilegePayload, 'ThumbGate-Audit-PRIV-2755-2026-05-26.json') +
731
+ '</div>';
732
+ } else {
733
+ resultDiv.innerHTML =
734
+ '<div class="demo-cleared">' +
735
+ '<strong style="color:#34d399">CLEARED &mdash; no privilege markers detected</strong><br>' +
736
+ 'Content would be sent to external LLM (in production this would still trigger logging + optional human review flag).' +
737
+ '</div>';
738
+ }
739
+ resultDiv.style.display = 'block';
740
+ }
741
+
742
+ // Keyboard support: Enter submits, Shift+Enter inserts newline
743
+ var uplEl = document.getElementById('upl-input');
744
+ if (uplEl) uplEl.addEventListener('keydown', function(e) {
745
+ if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); runUPLDemo(); }
746
+ });
747
+ var privEl = document.getElementById('privilege-input');
748
+ if (privEl) privEl.addEventListener('keydown', function(e) {
749
+ if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); runPrivilegeDemo(); }
750
+ });
751
+ </script>
752
+ </section>
753
+ </main>
754
+
755
+ <footer class="footer">
756
+ <p>ThumbGate is a software control layer, not legal advice. This page is intended for pilot scoping with law-firm innovation, technology, risk, and pricing teams. Final policy choices should be reviewed by the firm's attorneys and security team.</p>
757
+ </footer>
181
758
  </div>
182
759
  </body>
183
760
  </html>