thumbgate 1.23.0 → 1.23.1

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate-marketplace",
3
- "version": "1.23.0",
3
+ "version": "1.23.1",
4
4
  "owner": {
5
5
  "name": "Igor Ganapolsky",
6
6
  "email": "ig5973700@gmail.com"
@@ -14,7 +14,7 @@
14
14
  "source": "npm",
15
15
  "package": "thumbgate"
16
16
  },
17
- "version": "1.23.0",
17
+ "version": "1.23.1",
18
18
  "author": {
19
19
  "name": "Igor Ganapolsky",
20
20
  "email": "ig5973700@gmail.com",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "thumbgate",
3
3
  "description": "One šŸ‘Ž becomes a hard rule the agent cannot bypass. Captures thumbs-down feedback, distills it into PreToolUse Pre-Action Checks, enforced across every future Claude Code session.",
4
- "version": "1.23.0",
4
+ "version": "1.23.1",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky",
7
7
  "email": "ig5973700@gmail.com",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.23.0",
3
+ "version": "1.23.1",
4
4
  "description": "ThumbGate — šŸ‘šŸ‘Ž feedback that teaches your AI agent. Thumbs down a mistake, it never happens again.",
5
5
  "homepage": "https://thumbgate-production.up.railway.app",
6
6
  "transport": "stdio",
@@ -2,13 +2,13 @@
2
2
  "mcpServers": {
3
3
  "thumbgate": {
4
4
  "command": "npx",
5
- "args": ["--yes", "--package", "thumbgate@1.23.0", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.23.1", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.23.0", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.23.1", "thumbgate", "gate-check"]
12
12
  }
13
13
  }
14
14
  }
@@ -216,7 +216,7 @@ const {
216
216
  finalizeSession: finalizeFeedbackSession,
217
217
  } = require('../../scripts/feedback-session');
218
218
 
219
- const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.23.0' };
219
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.23.1' };
220
220
  const COMMERCE_CATEGORIES = [
221
221
  'product_recommendation',
222
222
  'brand_compliance',
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.23.0",
10
+ "thumbgate@1.23.1",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
package/bin/cli.js CHANGED
@@ -939,6 +939,17 @@ function capture() {
939
939
  }
940
940
  }
941
941
  console.log('');
942
+ try {
943
+ const { buildCaptureReceipt } = require(path.join(PKG_ROOT, 'scripts', 'commercial-offer'));
944
+ console.log(buildCaptureReceipt({
945
+ signal: normalized,
946
+ feedbackId: ev.id,
947
+ memoryId: mem.id,
948
+ actionType: ev.actionType,
949
+ }));
950
+ } catch (_) {
951
+ // Receipt is a conversion aid, not part of feedback persistence.
952
+ }
942
953
  proNudge();
943
954
  } else {
944
955
  if (args.json) {
@@ -1022,6 +1033,13 @@ function stats() {
1022
1033
  } else {
1023
1034
  console.log('\nāœ… System is currently high-reliability. No immediate revenue loss detected.');
1024
1035
  }
1036
+ try {
1037
+ const { buildStatsReceipt } = require(path.join(PKG_ROOT, 'scripts', 'commercial-offer'));
1038
+ const receipt = buildStatsReceipt(payload);
1039
+ if (receipt) console.log(receipt);
1040
+ } catch (_) {
1041
+ // Keep stats resilient if the receipt helper is unavailable in old installs.
1042
+ }
1025
1043
  proNudge();
1026
1044
  }
1027
1045
 
@@ -27,6 +27,11 @@
27
27
  "sentinel": "ThumbGate",
28
28
  "description": "First-party numbers / data transparency page"
29
29
  },
30
+ {
31
+ "route": "/ai-malpractice-prevention",
32
+ "sentinel": "AI Intake Risk Controls for Law Firms",
33
+ "description": "Legal AI intake risk-controls page for law-firm pilot conversations"
34
+ },
30
35
  {
31
36
  "route": "/llm-context.md",
32
37
  "sentinel": "## What ThumbGate Is",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.23.0",
3
+ "version": "1.23.1",
4
4
  "description": "ThumbGate self-improving agent governance: thumbs-up/down turns every mistake into a prevention rule and blocks repeat patterns. 33 pre-action checks, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
5
5
  "homepage": "https://thumbgate-production.up.railway.app",
6
6
  "repository": {
@@ -638,7 +638,7 @@
638
638
  "test:high-roi": "node --test tests/high-roi.test.js tests/model-candidates.test.js tests/autonomous-workflow.test.js tests/high-roi-agent-workflows.test.js tests/interaction-model.test.js tests/interaction-model-e2e.test.js tests/code-graph-guardrails.test.js tests/proxy-pointer-rag-guardrails.test.js tests/rag-precision-guardrails.test.js tests/ai-engineering-stack-guardrails.test.js tests/long-running-agent-context-guardrails.test.js tests/reasoning-efficiency-guardrails.test.js tests/deepseek-v4-runtime-guardrails.test.js tests/upstream-contribution-engine.test.js tests/proactive-agent-eval-guardrails.test.js tests/reward-hacking-guardrails.test.js tests/chatgpt-ads-readiness-pack.test.js tests/oss-pr-opportunity-scout.test.js tests/agent-design-governance.test.js tests/gemini-embedding-policy.test.js tests/openclaw-agent-governance-kit.test.js",
639
639
  "test:public-static-assets": "node --test tests/public-static-assets.test.js",
640
640
  "test:token-savings": "node --test tests/token-savings.test.js",
641
- "test:cost-cli": "node --test tests/cost-cli.test.js",
641
+ "test:cost-cli": "node --test tests/cost-cli.test.js tests/conversion-receipt.test.js",
642
642
  "test:numbers-page": "node --test tests/numbers-page.test.js",
643
643
  "test:workflow-gate-checkpoint": "node --test tests/workflow-gate-checkpoint.test.js tests/autonomous-workflow.test.js",
644
644
  "workflow:autonomous": "node scripts/autonomous-workflow.js",
@@ -3,11 +3,11 @@
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
12
  <meta property="og:image" content="https://thumbgate-production.up.railway.app/og.png">
13
13
  <link rel="canonical" href="https://thumbgate-production.up.railway.app/ai-malpractice-prevention">
@@ -15,52 +15,271 @@
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
23
  "publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate-production.up.railway.app" },
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
+ }
64
283
  </style>
65
284
  </head>
66
285
  <body>
@@ -69,115 +288,202 @@
69
288
  <a href="/agent-manager">Agent Manager</a>
70
289
  <a href="/codex-enterprise">Codex Enterprise</a>
71
290
  <a href="/agents-cost-savings">FinOps for Agents</a>
72
- <a href="/federal">Federal</a>
73
291
  <a href="/dashboard">Dashboard demo</a>
74
292
  <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
75
293
  </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
294
 
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>
295
+ <div class="wrap">
296
+ <header class="hero">
297
+ <div>
298
+ <span class="eyebrow">Pre-read for law-firm AI governance pilots</span>
299
+ <h1>Pre-execution controls for legal AI agents.</h1>
300
+ <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>
301
+ <div class="hero-actions">
302
+ <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>
303
+ <a class="ghost" href="#demo">View the 25-minute demo plan</a>
304
+ </div>
305
+ <div class="proof-row" aria-label="Key proof points">
306
+ <div class="proof"><strong>Preloaded controls</strong><span>Firm policy, approved disclaimers, adverse-party lists, routing rules, and model endpoint allowlists.</span></div>
307
+ <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>
308
+ <div class="proof"><strong>Reviewable evidence</strong><span>Every block, warning, override, and handoff becomes a structured audit event.</span></div>
309
+ </div>
310
+ <div class="trust-strip" aria-label="Trust and deployment assumptions">
311
+ <div class="trust-item">Local-first enforcement option</div>
312
+ <div class="trust-item">Works around Azure OpenAI, Claude, Gemini, and internal tools</div>
313
+ <div class="trust-item">ABA Formal Opinion 512 mapped to reviewable controls</div>
314
+ <div class="trust-item">No guaranteed-malpractice-prevention claim</div>
315
+ </div>
88
316
  </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>
96
- </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
317
 
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>
318
+ <aside class="control-flow" aria-label="ThumbGate pre-action control flow">
319
+ <img class="flow-asset" src="/assets/legal-intake-control-flow.svg" alt="Diagram of the ThumbGate legal intake pre-action control flow">
320
+ <h2>What the demo should show</h2>
321
+ <div class="flow-step">
322
+ <span class="num">1</span>
323
+ <div>
324
+ <h3>Prospect asks a risky intake question</h3>
325
+ <p>"Can I sue my former employer in Florida if they changed my commission plan?"</p>
326
+ </div>
327
+ </div>
328
+ <div class="flow-step blocked">
329
+ <span class="num">2</span>
330
+ <div>
331
+ <h3>Advice-shaped response is stopped</h3>
332
+ <p>Legal conclusion plus jurisdictional recommendation is routed to attorney review before delivery.</p>
333
+ </div>
334
+ </div>
335
+ <div class="flow-step cleared">
336
+ <span class="num">3</span>
337
+ <div>
338
+ <h3>Safe handoff is allowed</h3>
339
+ <p>The agent collects neutral routing details and schedules review without creating reliance.</p>
340
+ </div>
341
+ </div>
342
+ <div class="flow-step">
343
+ <span class="num">4</span>
344
+ <div>
345
+ <h3>Audit event is exportable</h3>
346
+ <p>Rule version, source policy, proposed action, outcome, reviewer, and timestamp are preserved.</p>
347
+ </div>
348
+ </div>
349
+ </aside>
350
+ </header>
144
351
 
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>
352
+ <main>
353
+ <section>
354
+ <h2>Why this is credible now.</h2>
355
+ <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.</p>
356
+ <div class="grid">
357
+ <div class="card">
358
+ <span class="tag blue">Governance</span>
359
+ <h3>ABA Formal Opinion 512 maps cleanly to controls</h3>
360
+ <p>Competence, confidentiality, supervision, verification, communication, and reasonable fees become concrete checks and review records.</p>
361
+ </div>
362
+ <div class="card">
363
+ <span class="tag amber">Adoption</span>
364
+ <h3>AI is entering normal workflows</h3>
365
+ <p>The practical buyer question is no longer "will lawyers use AI?" It is "which actions can an agent take without review?"</p>
366
+ </div>
367
+ <div class="card">
368
+ <span class="tag green">Positioning</span>
369
+ <h3>Vendor-neutral by design</h3>
370
+ <p>The pilot can sit around internal tools, Azure OpenAI, Claude, Gemini, document systems, or purpose-built legal AI products.</p>
371
+ </div>
372
+ </div>
373
+ </section>
148
374
 
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>
375
+ <section>
376
+ <h2>Yes, the pilot can start with preloaded ground truth.</h2>
377
+ <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>
378
+ <div class="grid">
379
+ <div class="card">
380
+ <span class="tag green">Inputs</span>
381
+ <h3>Firm-approved source material</h3>
382
+ <p>Disclaimers, intake scripts, escalation rules, practice-area boundaries, jurisdiction notes, model endpoint policy, retention rules, and reviewer roles.</p>
383
+ </div>
384
+ <div class="card">
385
+ <span class="tag amber">Fixtures</span>
386
+ <h3>Adverse-party and matter examples</h3>
387
+ <p>A synthetic adverse-party list and red-team intake transcripts let the demo show conflict stops without exposing privileged or client data.</p>
388
+ </div>
389
+ <div class="card">
390
+ <span class="tag blue">Outputs</span>
391
+ <h3>Deterministic control evidence</h3>
392
+ <p>Each demo decision shows the matched rule, proposed action, allowed or blocked outcome, reviewer path, timestamp, and exportable audit record.</p>
393
+ </div>
394
+ </div>
395
+ </section>
157
396
 
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>
397
+ <section>
398
+ <h2>Three failure modes the pilot should control.</h2>
399
+ <div class="grid">
400
+ <div class="card">
401
+ <span class="tag red">UPL</span>
402
+ <h3>Unauthorized-practice risk</h3>
403
+ <p>Block outcome predictions, jurisdictional recommendations, and advice-shaped responses from non-attorney intake agents. Allow neutral collection and attorney handoff.</p>
404
+ </div>
405
+ <div class="card">
406
+ <span class="tag amber">Conflicts</span>
407
+ <h3>Conflict preconditions</h3>
408
+ <p>Require configured adverse-party clearance before the agent continues intake or requests sensitive matter facts.</p>
409
+ </div>
410
+ <div class="card">
411
+ <span class="tag blue">Privilege</span>
412
+ <h3>Confidentiality and egress</h3>
413
+ <p>Block or reroute outbound calls that include privileged markers, matter identifiers, or firm-classified confidential content.</p>
414
+ </div>
415
+ </div>
416
+ </section>
160
417
 
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>
418
+ <section id="demo">
419
+ <h2>25-minute walkthrough agenda.</h2>
420
+ <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>
421
+ <div class="two grid">
422
+ <div class="card">
423
+ <h3>Show these assets</h3>
424
+ <ul>
425
+ <li>One unsafe intake transcript and blocked response.</li>
426
+ <li>One conflict-precheck stop before sensitive facts are collected.</li>
427
+ <li>One egress block or safe in-tenant reroute.</li>
428
+ <li>One audit export with rule version, source, outcome, and reviewer.</li>
429
+ </ul>
430
+ </div>
431
+ <div class="card">
432
+ <h3>Skip these on the first call</h3>
433
+ <ul>
434
+ <li>Broad platform tour.</li>
435
+ <li>Pricing page or checkout flow.</li>
436
+ <li>Unverified sanctions statistics.</li>
437
+ <li>Claims about SOC 2, BAA, carrier discounts, or guaranteed malpractice prevention.</li>
438
+ </ul>
439
+ </div>
440
+ </div>
441
+ <div class="two grid" style="margin-top:1rem;">
442
+ <div class="card">
443
+ <h3>Suggested agenda</h3>
444
+ <ul>
445
+ <li>3 minutes: confirm the target workflow and risk owners.</li>
446
+ <li>7 minutes: show blocked unauthorized-advice and conflict examples.</li>
447
+ <li>7 minutes: show preloaded ground truth and audit evidence.</li>
448
+ <li>5 minutes: discuss deployment boundary, data handling, and reviewer roles.</li>
449
+ <li>3 minutes: agree on pilot inputs and next step.</li>
450
+ </ul>
451
+ </div>
452
+ <div class="card">
453
+ <h3>Recommended ask</h3>
454
+ <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>
455
+ </div>
456
+ </div>
457
+ </section>
162
458
 
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>
459
+ <section>
460
+ <h2>Procurement questions to answer early.</h2>
461
+ <table class="matrix">
462
+ <thead>
463
+ <tr><th>Buyer question</th><th>Pilot answer</th><th>Evidence to bring</th></tr>
464
+ </thead>
465
+ <tbody>
466
+ <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>
467
+ <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>
468
+ <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>
469
+ <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>
470
+ </tbody>
471
+ </table>
472
+ </section>
170
473
 
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>
474
+ <section>
475
+ <div class="callout">
476
+ <h2>Recommended 30-day pilot.</h2>
477
+ <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>
478
+ <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>
479
+ <p><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></p>
480
+ </div>
481
+ </section>
482
+ </main>
177
483
 
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>
484
+ <footer class="footer">
485
+ <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>
486
+ </footer>
181
487
  </div>
182
488
  </body>
183
489
  </html>
package/public/index.html CHANGED
@@ -19,7 +19,7 @@ __GOOGLE_SITE_VERIFICATION_META__
19
19
  <meta property="og:image" content="https://thumbgate-production.up.railway.app/og.png">
20
20
  <meta name="twitter:card" content="summary_large_image">
21
21
  <meta name="twitter:image" content="https://thumbgate-production.up.railway.app/og.png">
22
- <meta name="thumbgate-version" content="1.23.0">
22
+ <meta name="thumbgate-version" content="1.23.1">
23
23
  <meta name="keywords" content="ThumbGate, thumbgate, AI agent orchestration, AI experience orchestration, agent enforcement layer, save LLM tokens, reduce Claude API cost, reduce OpenAI cost, AI agent token savings, prevent LLM retries, prevent hallucination retries, stop AI token waste, pre-action checks, agent governance, Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode, workflow hardening, context engineering, AI authenticity, brand authenticity AI">
24
24
  <link rel="apple-touch-icon" href="/apple-touch-icon.png">
25
25
 
@@ -817,6 +817,37 @@ __GA_BOOTSTRAP__
817
817
  </div>
818
818
  </section>
819
819
 
820
+ <section class="compatibility" id="deterministic-prevention">
821
+ <div class="container">
822
+ <div class="section-label">Deterministic Prevention</div>
823
+ <h2 class="section-title">Native thumbs are a black box. ThumbGate is the inspectable control layer.</h2>
824
+ <p style="text-align:center;font-size:16px;color:var(--text-muted);max-width:900px;margin:0 auto 28px;line-height:1.7;">Codex, Claude Code, ChatGPT, and other agent surfaces can collect preference signals, but you usually cannot see exactly what changed, which rule will fire, or why a future tool call is allowed. ThumbGate keeps the prevention layer outside the model: typed feedback becomes a local lesson, repeated mistakes become explicit rules, and every block names the matched rule, source lesson, tool call, and audit event.</p>
825
+ <div class="agent-grid">
826
+ <div class="agent-card">
827
+ <h3>Black-box memory</h3>
828
+ <p>Native thumbs and vendor memories may improve future behavior, but they do not give teams a deterministic allow/block contract at the moment an agent touches files, terminals, APIs, or CI.</p>
829
+ </div>
830
+ <div class="agent-card">
831
+ <h3>Inspectable ThumbGate memory</h3>
832
+ <p>Lessons live in your ThumbGate store, can be searched, exported as JSONL or DPO pairs, and traced back to the exact correction that created the rule.</p>
833
+ </div>
834
+ <div class="agent-card">
835
+ <h3>Rules before execution</h3>
836
+ <p>The final decision is not another model opinion. ThumbGate checks tool name, arguments, working directory, command shape, confidence, and required evidence before the action runs.</p>
837
+ </div>
838
+ </div>
839
+ <div style="margin:26px auto 0;max-width:960px;border:1px solid rgba(34,211,238,0.18);border-radius:8px;background:rgba(34,211,238,0.05);padding:18px 20px;">
840
+ <h3 style="margin:0 0 10px;color:var(--text);font-size:18px;">Why this matters now</h3>
841
+ <ul style="margin:0;padding-left:20px;color:var(--text-muted);line-height:1.7;">
842
+ <li><strong>Agent security is now mainstream risk.</strong> Coding agents run shell commands, write files, query databases, and chain actions with developer permissions, so unattended autonomy needs a local policy boundary.</li>
843
+ <li><strong>MCP adoption is accelerating.</strong> More tools are becoming agent-callable through shared protocols, which means one cross-agent governance layer beats one-off prompt rules per app.</li>
844
+ <li><strong>Repeated failures waste cash and trust.</strong> Every repeat burns tokens, review time, and release confidence. ThumbGate turns the first correction into a reusable prevention check.</li>
845
+ </ul>
846
+ <p style="margin:12px 0 0;font-size:13px;color:var(--text-dim);">Sources to verify the market timing: <a href="https://www.docker.com/blog/ai-coding-agent-horror-stories-security-risks/" target="_blank" rel="noopener" style="color:var(--cyan);">Docker on AI coding agent security risks</a>, <a href="https://www.techradar.com/pro/how-ai-agents-are-wrecking-havoc-in-legacy-security-setups-and-enterprises-are-catching-up" target="_blank" rel="noopener" style="color:var(--cyan);">TechRadar on enterprise agent security pressure</a>, and <a href="https://www.techradar.com/pro/zendesk-becomes-the-latest-to-adopt-mcp-to-futureproof-customers-in-the-ai-first-era" target="_blank" rel="noopener" style="color:var(--cyan);">current MCP adoption coverage</a>.</p>
847
+ </div>
848
+ </div>
849
+ </section>
850
+
820
851
  <section class="marketing-deep-dive" style="padding:28px 0 10px;">
821
852
  <div class="container" style="max-width:1240px;">
822
853
  <div class="section-label">Status bar proof</div>
@@ -1492,7 +1523,7 @@ __GA_BOOTSTRAP__
1492
1523
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
1493
1524
  <a href="/blog">Blog</a>
1494
1525
  </div>
1495
- <span class="footer-copy">Ā© 2026 ThumbGate Ā· MIT License Ā· npm v1.23.0</span>
1526
+ <span class="footer-copy">Ā© 2026 ThumbGate Ā· MIT License Ā· npm v1.23.1</span>
1496
1527
  </div>
1497
1528
  </footer>
1498
1529
 
@@ -25,7 +25,7 @@
25
25
  "alternateName": "thumbgate",
26
26
  "applicationCategory": "DeveloperApplication",
27
27
  "operatingSystem": "Cross-platform, Node.js >=18.18.0",
28
- "softwareVersion": "1.23.0",
28
+ "softwareVersion": "1.23.1",
29
29
  "url": "https://thumbgate-production.up.railway.app/numbers",
30
30
  "dateModified": "2026-05-07",
31
31
  "creator": {
@@ -202,7 +202,7 @@
202
202
  <main class="container">
203
203
  <h1>The Numbers</h1>
204
204
  <p class="subtitle">Generated first-party operational snapshot from the ThumbGate runtime. This is not customer traction, install volume, revenue, or proof that a configured gate has fired.</p>
205
- <div class="freshness">Updated: 2026-05-07 Ā· Version 1.23.0</div>
205
+ <div class="freshness">Updated: 2026-05-07 Ā· Version 1.23.1</div>
206
206
  <div class="truth-note"><strong>Read this first:</strong> configured checks are inventory. Recorded blocks and warnings are usage evidence. This snapshot currently reports 0 recorded hard-block event(s) and 0 recorded warning event(s).</div>
207
207
 
208
208
  <h2>Gate enforcement</h2>
package/public/pro.html CHANGED
@@ -815,6 +815,28 @@ __GA_BOOTSTRAP__
815
815
  </div>
816
816
  </section>
817
817
 
818
+ <section class="section" id="deterministic-loop">
819
+ <div class="container">
820
+ <div class="section-label">Why Pro now</div>
821
+ <h2 class="section-title">Black-box thumbs do not prove prevention. Pro gives the operator an audit loop.</h2>
822
+ <p class="section-intro">Native rating buttons can tell a vendor that an answer felt wrong. ThumbGate Pro gives you the operational record: the correction, the lesson, the rule, the blocked tool call, and the export path.</p>
823
+ <div class="grid-3">
824
+ <div class="feature-card">
825
+ <h3>Inspectable memory</h3>
826
+ <p>Search the exact lesson that came from a thumbs-down and see whether it is still active, warning-only, or blocking.</p>
827
+ </div>
828
+ <div class="feature-card">
829
+ <h3>Deterministic checks</h3>
830
+ <p>The enforcement layer evaluates tool name, arguments, working directory, command shape, confidence, and required evidence before the action runs.</p>
831
+ </div>
832
+ <div class="feature-card">
833
+ <h3>Exportable proof</h3>
834
+ <p>Take the same correction history into JSONL, DPO export, review packets, and team rollout conversations instead of trusting hidden memory.</p>
835
+ </div>
836
+ </div>
837
+ </div>
838
+ </section>
839
+
818
840
  <section class="section" id="why-pay">
819
841
  <div class="container">
820
842
  <div class="section-label">Why operators pay</div>
@@ -35,6 +35,75 @@ function normalizeSeatCount(value, fallback = TEAM_MIN_SEATS) {
35
35
  return Math.max(TEAM_MIN_SEATS, Math.round(parsed));
36
36
  }
37
37
 
38
+ function trackedProUrl(source = 'cli_receipt', content = 'value_receipt') {
39
+ try {
40
+ const url = new URL(PRO_MONTHLY_PAYMENT_LINK);
41
+ url.searchParams.set('utm_source', source);
42
+ url.searchParams.set('utm_medium', 'cli');
43
+ url.searchParams.set('utm_campaign', 'pro_conversion');
44
+ url.searchParams.set('utm_content', content);
45
+ return url.toString();
46
+ } catch (_) {
47
+ return PRO_MONTHLY_PAYMENT_LINK;
48
+ }
49
+ }
50
+
51
+ function pluralize(count, singular, plural = `${singular}s`) {
52
+ return Number(count) === 1 ? singular : plural;
53
+ }
54
+
55
+ function buildCaptureReceipt({ signal, feedbackId, memoryId, actionType } = {}) {
56
+ const normalizedSignal = String(signal || '').toUpperCase() || 'UNKNOWN';
57
+ const lines = [
58
+ '',
59
+ 'Value receipt',
60
+ '─'.repeat(50),
61
+ ` Stored proof : ${normalizedSignal} feedback${feedbackId ? ` (${feedbackId})` : ''}`,
62
+ memoryId ? ` Local memory : ${memoryId}` : ' Local memory : saved locally',
63
+ actionType ? ` Rule pressure : ${actionType}` : ' Rule pressure : available for promotion',
64
+ ' Next proof : npx thumbgate stats',
65
+ ' Cost proof : npx thumbgate cost',
66
+ '',
67
+ ` Solo Pro : ${PRO_PRICE_LABEL} for dashboard, search, exports, sync`,
68
+ ` Upgrade : ${trackedProUrl('cli_capture_receipt', actionType || normalizedSignal.toLowerCase())}`,
69
+ ` Team path : ${TEAM_PRICE_LABEL}; start with one repeated workflow failure`,
70
+ ' https://thumbgate.ai/#workflow-sprint-intake',
71
+ '',
72
+ ];
73
+ return lines.join('\n');
74
+ }
75
+
76
+ function buildStatsReceipt(stats = {}) {
77
+ const negatives = Number(stats.negatives || stats.totalNegative || 0);
78
+ const blocked = Number(stats.gatesBlocked || stats.blocked || 0);
79
+ const warned = Number(stats.gatesWarned || stats.warned || 0);
80
+ const gates = Number(stats.totalGates || 0);
81
+ const autoPromoted = Number(stats.autoPromotedGates || 0);
82
+ const hasFriction = negatives > 0 || blocked > 0 || warned > 0 || gates > 0;
83
+ if (!hasFriction) return '';
84
+
85
+ const interventions = blocked + warned;
86
+ const lines = [
87
+ '',
88
+ 'Paid-intent next step',
89
+ '─'.repeat(50),
90
+ ];
91
+ if (interventions > 0) {
92
+ lines.push(` Proof already seen : ${interventions} gate ${pluralize(interventions, 'intervention')}`);
93
+ }
94
+ if (gates > 0) {
95
+ lines.push(` Active prevention : ${gates} ${pluralize(gates, 'gate')} (${autoPromoted} auto-promoted)`);
96
+ }
97
+ if (negatives > 0) {
98
+ lines.push(` Failure pressure : ${negatives} negative ${pluralize(negatives, 'signal')}`);
99
+ }
100
+ lines.push(' Show the buyer : npx thumbgate cost');
101
+ lines.push(` Solo Pro : ${trackedProUrl('cli_stats_receipt', 'proof_seen')}`);
102
+ lines.push(' Team workflow : https://thumbgate.ai/#workflow-sprint-intake');
103
+ lines.push('');
104
+ return lines.join('\n');
105
+ }
106
+
38
107
  module.exports = {
39
108
  PRO_MONTHLY_PAYMENT_LINK,
40
109
  PRO_ANNUAL_PAYMENT_LINK,
@@ -51,4 +120,7 @@ module.exports = {
51
120
  normalizePlanId,
52
121
  normalizeBillingCycle,
53
122
  normalizeSeatCount,
123
+ buildCaptureReceipt,
124
+ buildStatsReceipt,
125
+ trackedProUrl,
54
126
  };