thumbgate 1.22.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.
@@ -0,0 +1,151 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>FinOps for AI Agents — ThumbGate prevents the spend FinOps tools just report on</title>
7
+ <script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
8
+ <meta name="description" content="Most FinOps platforms report on AI agent spend after it happens. ThumbGate is the runtime layer that prevents the wasted tool calls in the first place — and prints the dollar amount you saved.">
9
+ <meta property="og:title" content="FinOps for AI Agents — Prevention, Not Reporting">
10
+ <meta property="og:description" content="Cost dashboards tell you what your agents wasted last week. ThumbGate's PreToolUse gates stop the wasted tool calls before they fire — and `thumbgate cost` shows you the dollar amount.">
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/agents-cost-savings">
14
+ <script type="application/ld+json">
15
+ {
16
+ "@context": "https://schema.org",
17
+ "@type": "TechArticle",
18
+ "headline": "FinOps for AI Agents — Prevention vs. Reporting",
19
+ "description": "Cost dashboards report agent spend after it happens. ThumbGate's runtime gates prevent the wasted tool calls in the first place, and `thumbgate cost` prints the dollar amount saved.",
20
+ "datePublished": "2026-05-21",
21
+ "dateModified": "2026-05-21",
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" },
24
+ "about": [
25
+ { "@type": "Thing", "name": "FinOps for AI" },
26
+ { "@type": "Thing", "name": "Agent Cost Optimization" },
27
+ { "@type": "Thing", "name": "LLM Token Savings" },
28
+ { "@type": "Thing", "name": "PreToolUse Gates" }
29
+ ]
30
+ }
31
+ </script>
32
+ <style>
33
+ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
34
+ :root { --bg:#0a0a0b; --card:#161618; --border:#222225; --text:#e8e8ec; --muted:#8b8b94; --cyan:#22d3ee; --green:#34d399; }
35
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; }
36
+ .container { max-width: 860px; margin: 0 auto; padding: 2rem 1.5rem 4rem; }
37
+ nav { padding: 1rem 2rem; border-bottom: 1px solid var(--border); display:flex; gap:1.5rem; flex-wrap:wrap; }
38
+ nav a { color: var(--muted); text-decoration:none; font-size:0.9rem; }
39
+ nav .brand { color: var(--text); font-weight:700; }
40
+ .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; }
41
+ h1 { font-size:2.2rem; line-height:1.15; margin:1rem 0 1rem; }
42
+ h2 { font-size:1.45rem; margin:2.2rem 0 1rem; color:var(--cyan); }
43
+ h3 { margin:0.6rem 0; font-size:1rem; }
44
+ p, li { margin-bottom:0.75rem; }
45
+ ul, ol { padding-left:1.25rem; }
46
+ .card { background: var(--card); border:1px solid var(--border); border-radius:12px; padding:1.25rem; margin:1rem 0; }
47
+ .grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:1rem; margin:1rem 0; }
48
+ .grid .card h3 { color:var(--cyan); }
49
+ .cta { display:inline-block; background:var(--cyan); color:#000; padding:0.8rem 1.2rem; border-radius:8px; text-decoration:none; font-weight:700; }
50
+ .secondary { color:var(--cyan); text-decoration:underline; margin-left:1rem; }
51
+ .quote { border-left:3px solid var(--cyan); padding:0.75rem 1rem; margin:1rem 0; color:var(--muted); font-style:italic; }
52
+ 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; }
53
+ pre { padding:0.85rem 1rem; overflow-x:auto; }
54
+ .footer-links { margin-top:2.5rem; padding-top:1.25rem; border-top:1px solid var(--border); color:var(--muted); font-size:0.9rem; }
55
+ .footer-links a { color:var(--cyan); text-decoration:none; }
56
+ table.compare { width:100%; border-collapse:collapse; margin:1rem 0; }
57
+ table.compare th, table.compare td { padding:0.6rem 0.8rem; border-bottom:1px solid var(--border); text-align:left; vertical-align:top; }
58
+ table.compare th { color:var(--cyan); font-size:0.85rem; text-transform:uppercase; letter-spacing:0.05em; }
59
+ .savings-num { color:var(--green); font-weight:700; }
60
+ </style>
61
+ </head>
62
+ <body>
63
+ <nav>
64
+ <a href="/" class="brand">ThumbGate</a>
65
+ <a href="/guide">Guide</a>
66
+ <a href="/agent-manager">Agent Manager</a>
67
+ <a href="/codex-enterprise">Codex Enterprise</a>
68
+ <a href="/dashboard">Dashboard demo</a>
69
+ <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
70
+ </nav>
71
+ <div class="container">
72
+ <span class="pill">FinOps for AI agents</span>
73
+ <h1>Cost dashboards tell you what your agents wasted last week. ThumbGate stops the waste before it fires.</h1>
74
+ <p>Most AI-spend platforms — Finout, Vantage, the new "AI FinOps Assistant" wave — focus on <em>showing you the bill after the agent ran</em>: cost allocation, anomaly detection, unit economics finance can trust. A few (Helicone's rate limits, Revenium's Economic Control) add coarse runtime enforcement keyed off $ thresholds or request counts. None of them stop the wasted tool call by understanding <em>why</em> it would have failed.</p>
75
+ <p>That's the layer ThumbGate occupies. Every PreToolUse gate that fires is a Claude / GPT call your agent <em>did not</em> make — input tokens you didn't spend, output tokens you didn't spend, retry loop you didn't trigger. The savings are computable, conservative, and now surfaced as a number on your CLI.</p>
76
+
77
+ <div class="quote">"74% of CIOs say their role will be at risk if their company does not deliver measurable business gains from AI within the next two years." — <a href="https://www.cio.com/article/4172555/how-it-teams-are-putting-ai-agents-to-work.html" target="_blank" rel="noopener" style="color:var(--cyan);font-style:normal;">CIO Online, 2026</a></div>
78
+ <p>"Measurable" is the operative word. A token-spend dashboard tells finance how much got burned; it doesn't tell the CIO board what was averted. <code>thumbgate cost</code> prints a single conservative dollar figure backed by the gate-block count from <em>your</em> machine — not "what enterprises like you saved." That's the artifact that survives a 2026 budget review.</p>
79
+
80
+ <h2>One command, one number</h2>
81
+ <p>Once ThumbGate is installed and gates have been firing, this is what an operator sees:</p>
82
+ <pre><code>$ thumbgate cost
83
+
84
+ 💰 ThumbGate cost-savings — cumulative
85
+ ──────────────────────────────────────────────────
86
+ Tool calls blocked : 247
87
+ Tool calls warned : 12
88
+ Tool calls passed : 3,401
89
+ Top blocker : no-mocked-db (138 blocks)
90
+
91
+ Tokens you did NOT spend
92
+ Input : 494K
93
+ Output : 148K
94
+ Total : 642K
95
+
96
+ Estimated <span class="savings-num">$ saved : $3.95</span></code></pre>
97
+ <p>The methodology is intentionally conservative: 2,000 input + 600 output tokens per blocked call, a Sonnet-heavy model mix (80% Sonnet 4.5, 15% Opus 4.6, 5% Haiku 4.5), Anthropic published prices. The goal is "you almost certainly saved at least this much" — not "let's flatter ourselves." Override the mix with <code>--mix '&#123;"claude-sonnet-4-5":1.0&#125;'</code> if your stack is different.</p>
98
+
99
+ <h2>Prevention vs. reporting</h2>
100
+ <table class="compare">
101
+ <thead>
102
+ <tr><th>Capability</th><th>Reporting-layer FinOps</th><th>ThumbGate (runtime gates)</th></tr>
103
+ </thead>
104
+ <tbody>
105
+ <tr><td>See what agents spent last week</td><td>✅</td><td>Partial (via dashboard)</td></tr>
106
+ <tr><td>Allocate spend to teams / features</td><td>✅</td><td>Per-gate breakdown via <code>byGate</code></td></tr>
107
+ <tr><td>Stop a known-bad tool call before it hits the model</td><td>❌</td><td>✅ — PreToolUse gate fires, no API call made</td></tr>
108
+ <tr><td>Promote a one-off failure into a permanent gate</td><td>❌</td><td>✅ — feedback loop + lesson DB</td></tr>
109
+ <tr><td>Print conservative $ saved per day</td><td>❌</td><td>✅ — <code>thumbgate cost</code></td></tr>
110
+ <tr><td>K8s pod-level allocation, finance-grade reporting</td><td>✅ (that's their core)</td><td>❌ (not our layer)</td></tr>
111
+ </tbody>
112
+ </table>
113
+ <p>The two layers compose. ThumbGate prevents the wasted spend; a reporting FinOps tool tells finance what the remaining spend was for. Picking ThumbGate doesn't mean you don't also need cost visibility — it means the visibility number gets smaller.</p>
114
+
115
+ <h2>Why the savings are real, not theoretical</h2>
116
+ <ol>
117
+ <li><strong>Every block is one fewer round trip.</strong> A blocked tool call doesn't reach the model. There's no "ThumbGate intercepted but the request still cost you" — the agent's tool-call execution is replaced with the gate's verdict, and the agent's next reasoning step takes the verdict as context instead of the failed result.</li>
118
+ <li><strong>The avoided retry loop is the bulk of the saving.</strong> Failed tool calls don't just cost the call — they cost the model's next reasoning turn (which sees the failure and tries again), and often a third turn (which tries a different approach). Conservative 2k input + 600 output assumes one retry; in practice it's often more.</li>
119
+ <li><strong>The numbers come from your local <code>gate-stats.json</code>.</strong> Not from a marketing model, not from "what enterprises like you saved." Your machine, your gates, your blocks.</li>
120
+ </ol>
121
+
122
+ <h2>Get the number on your machine</h2>
123
+ <pre><code>npx thumbgate init # wire the PreToolUse hook
124
+ # ...let your agent run for a few hours...
125
+ npx thumbgate cost # see what the gates were worth</code></pre>
126
+ <p>Or as JSON, if you want to ship it to a dashboard:</p>
127
+ <pre><code>npx thumbgate cost --json | jq .savings.dollarsSaved</code></pre>
128
+
129
+ <div class="quote">"The category isn't 'FinOps for AI' — it's 'gates that stop the spend so FinOps has less to report on.' One sits behind the other."</div>
130
+
131
+ <div class="card">
132
+ <p><strong>The free CLI is real. The paid tier is the hosted dashboard, org-wide rule library, and the operator the Agent Manager doesn't have to be themselves.</strong></p>
133
+ <p>
134
+ <a href="/#workflow-sprint-intake?utm_source=website&amp;utm_medium=agents_cost_savings_page&amp;utm_campaign=finops_sprint&amp;cta_id=agents_cost_savings_sprint_intake&amp;cta_placement=agents_cost_savings_page" class="cta">Start the Workflow Hardening Sprint</a>
135
+ <a href="/checkout/pro?utm_source=website&amp;utm_medium=agents_cost_savings_page&amp;utm_campaign=pro_upgrade&amp;cta_id=agents_cost_savings_pro_checkout&amp;cta_placement=agents_cost_savings_page&amp;plan_id=pro" class="secondary">Or start Pro at $19/mo →</a>
136
+ </p>
137
+ </div>
138
+
139
+ <h2>Related reading</h2>
140
+ <ul>
141
+ <li><a href="/codex-enterprise">ThumbGate for Codex in the Enterprise</a> — the same prevention story for the OpenAI×Dell distribution wave.</li>
142
+ <li><a href="/agent-manager">ThumbGate for the Agent Manager</a> — the role inside the org that owns "what are our agents costing us."</li>
143
+ <li><a href="/dashboard">Dashboard demo</a> — the $ saved number rendered against demo data, so you can see the shape before installing.</li>
144
+ </ul>
145
+
146
+ <div class="footer-links">
147
+ Built for teams who watched their Claude bill spike, installed a FinOps dashboard, and realized the dashboard only told them <em>which</em> failed agent loop ran the meter — not how to stop it.
148
+ </div>
149
+ </div>
150
+ </body>
151
+ </html>
@@ -0,0 +1,489 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Pre-Execution Controls for Legal AI Agents - ThumbGate</title>
7
+ <script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
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
+ <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">
14
+ <script type="application/ld+json">
15
+ {
16
+ "@context": "https://schema.org",
17
+ "@type": "TechArticle",
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
+ "datePublished": "2026-05-21",
21
+ "dateModified": "2026-05-25",
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" },
24
+ "about": [
25
+ { "@type": "Thing", "name": "Legal AI Governance" },
26
+ { "@type": "Thing", "name": "Unauthorized Practice of Law" },
27
+ { "@type": "Thing", "name": "Attorney-Client Privilege" },
28
+ { "@type": "Thing", "name": "ABA Formal Opinion 512" },
29
+ { "@type": "Thing", "name": "Conflict of Interest Check" }
30
+ ]
31
+ }
32
+ </script>
33
+ <style>
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
+ </style>
284
+ </head>
285
+ <body>
286
+ <nav>
287
+ <a href="/" class="brand">ThumbGate</a>
288
+ <a href="/agent-manager">Agent Manager</a>
289
+ <a href="/codex-enterprise">Codex Enterprise</a>
290
+ <a href="/agents-cost-savings">FinOps for Agents</a>
291
+ <a href="/dashboard">Dashboard demo</a>
292
+ <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
293
+ </nav>
294
+
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>
316
+ </div>
317
+
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>
351
+
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>
374
+
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>
396
+
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>
417
+
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>
458
+
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>
473
+
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>
483
+
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>
487
+ </div>
488
+ </body>
489
+ </html>
@@ -12,7 +12,7 @@
12
12
  <meta property="og:type" content="website">
13
13
  <meta property="og:url" content="https://thumbgate-production.up.railway.app/codex-plugin">
14
14
  <link rel="canonical" href="https://thumbgate-production.up.railway.app/codex-plugin">
15
- <link rel="llm-context" href="/public/llm-context.md" type="text/markdown">
15
+ <link rel="llm-context" href="/llm-context.md" type="text/markdown">
16
16
 
17
17
  <script type="application/ld+json">
18
18
  {