thumbgate 1.27.7 → 1.27.9
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.
- package/.well-known/llms.txt +1 -2
- package/README.md +0 -2
- package/bin/cli.js +259 -78
- package/package.json +12 -18
- package/public/blog.html +30 -0
- package/public/compare/adopt-ai.html +219 -0
- package/public/compare/agentix-labs.html +197 -0
- package/public/compare/ai-experience-orchestration.html +216 -0
- package/public/compare/anthropic-claude-for-legal.html +260 -0
- package/public/compare/anthropic-containment.html +280 -0
- package/public/compare/arcade.html +175 -0
- package/public/compare/arcjet.html +239 -0
- package/public/compare/bumblebee.html +307 -0
- package/public/compare/claude-code-hooks.html +294 -0
- package/public/compare/databricks-unity-ai-gateway.html +215 -0
- package/public/compare/fallow.html +351 -0
- package/public/compare/heidi.html +233 -0
- package/public/compare/mem0.html +342 -0
- package/public/compare/oak-and-sparrow-gatekeeper.html +289 -0
- package/public/compare/rein.html +236 -0
- package/public/compare/sigmashake.html +256 -0
- package/public/compare/speclock.html +342 -0
- package/public/compare.html +2 -0
- package/public/guides/agent-harness-optimization.html +342 -0
- package/public/guides/agentic-web-governance.html +406 -0
- package/public/guides/ai-agent-governance-sprint.html +415 -0
- package/public/guides/ai-agent-pre-action-approval-gates.html +401 -0
- package/public/guides/ai-agent-workflow-migration-checklist.html +392 -0
- package/public/guides/ai-deployment-readiness.html +415 -0
- package/public/guides/ai-mode-ads-agent-governance.html +401 -0
- package/public/guides/ai-search-topical-presence.html +342 -0
- package/public/guides/autoresearch-agent-safety.html +342 -0
- package/public/guides/background-agent-governance.html +358 -0
- package/public/guides/best-tools-stop-ai-agents-breaking-production.html +363 -0
- package/public/guides/browser-automation-safety.html +342 -0
- package/public/guides/chatgpt-ads-trust.html +353 -0
- package/public/guides/claude-code-feedback.html +339 -0
- package/public/guides/claude-code-prevent-repeated-mistakes.html +161 -0
- package/public/guides/claude-code-skills-guardrails.html +343 -0
- package/public/guides/claude-desktop.html +356 -0
- package/public/guides/code-knowledge-graph-guardrails.html +365 -0
- package/public/guides/codex-cli-guardrails.html +339 -0
- package/public/guides/cursor-agent-guardrails.html +339 -0
- package/public/guides/cursor-prevent-repeated-mistakes.html +161 -0
- package/public/guides/database-agent-safety.html +406 -0
- package/public/guides/deepseek-v4-runtime-guardrails.html +346 -0
- package/public/guides/developer-machine-supply-chain-guardrails.html +358 -0
- package/public/guides/gcp-mcp-guardrails.html +147 -0
- package/public/guides/gemini-cli-feedback-memory.html +339 -0
- package/public/guides/gpt-5-5-model-evaluation.html +358 -0
- package/public/guides/internal-ai-engineering-stack-guardrails.html +348 -0
- package/public/guides/long-running-agent-context-management.html +346 -0
- package/public/guides/mcp-tool-governance.html +401 -0
- package/public/guides/multica-thumbgate-setup.html +134 -0
- package/public/guides/native-messaging-host-security.html +342 -0
- package/public/guides/policy-engine-pre-action-gates.html +346 -0
- package/public/guides/pre-action-checks.html +342 -0
- package/public/guides/pretooluse-hooks-vs-advisory-prompt-rules.html +342 -0
- package/public/guides/prompt-tricks-to-workflow-rules.html +365 -0
- package/public/guides/proxy-pointer-rag-guardrails.html +352 -0
- package/public/guides/rag-precision-tuning-guardrails.html +352 -0
- package/public/guides/reasoning-compression-guardrails.html +346 -0
- package/public/guides/relational-knowledge-ai-recommendations.html +342 -0
- package/public/guides/roo-code-alternative-cline.html +339 -0
- package/public/guides/semantic-programmatic-seo-guardrails.html +352 -0
- package/public/guides/seo-agent-skills-guardrails.html +344 -0
- package/public/guides/stop-repeated-ai-agent-mistakes.html +342 -0
- package/public/index.html +10 -48
- package/public/learn/ac-dc-runtime-enforcement.html +277 -0
- package/public/learn/agent-harness-pattern.html +181 -0
- package/public/learn/agent-swarms-shared-gates.html +173 -0
- package/public/learn/agentic-enterprise-context-brain.html +117 -0
- package/public/learn/agentic-os-team-governance.html +146 -0
- package/public/learn/ai-agent-governance.html +158 -0
- package/public/learn/ai-agent-persistent-memory.html +211 -0
- package/public/learn/background-agent-control-layer.html +184 -0
- package/public/learn/claude-code-goal-with-rubrics.html +205 -0
- package/public/learn/codex-role-plugins-need-governance.html +125 -0
- package/public/learn/cost-aware-agent-gate-routing.html +173 -0
- package/public/learn/databricks-unity-ai-gateway-runtime-governance.html +157 -0
- package/public/learn/deterministic-agent-workflows.html +185 -0
- package/public/learn/feedback-loop-vs-decision-layer.html +283 -0
- package/public/learn/from-prototype-to-production.html +223 -0
- package/public/learn/learn.css +51 -0
- package/public/learn/mcp-pre-action-checks-explained.html +172 -0
- package/public/learn/pretix-stripe-connect-marketplaces.html +161 -0
- package/public/learn/regulated-agent-execution-boundary.html +196 -0
- package/public/learn/spec-driven-development.html +168 -0
- package/public/learn/stop-ai-agent-force-push.html +134 -0
- package/public/learn/vibe-coding-safety-net.html +142 -0
- package/public/learn.html +6 -50
- package/public/pro.html +6 -6
- package/scripts/cli-schema.js +10 -22
- package/scripts/dashboard-chat.js +1 -2
- package/scripts/document-intake.js +49 -1
- package/scripts/gemini-embedding-policy.js +1 -2
- package/scripts/hosted-config.js +12 -0
- package/scripts/plausible-domain-config.js +1 -3
- package/scripts/reddit-browser-notification-watch.js +230 -0
- package/scripts/seo-gsd.js +0 -239
- package/scripts/vector-store.js +0 -44
- package/scripts/workspace-evolver.js +2 -62
- package/src/api/server.js +124 -335
- package/adapters/policy-engine/ethicore-guardian-client.js +0 -68
- package/adapters/policy-engine/thumbgate-policy-engine-adapter.js +0 -260
- package/scripts/hook-stop-anti-claim.js +0 -227
|
@@ -0,0 +1,342 @@
|
|
|
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>Native Messaging Host Security | Audit Browser Bridges Before They Expand</title>
|
|
7
|
+
<meta name="description" content="Native messaging hosts let browser extensions talk to local executables. That can be useful, but it also creates a persistent bridge outside the browser sand..." />
|
|
8
|
+
<meta property="og:title" content="Native Messaging Host Security | Audit Browser Bridges Before They Expand" />
|
|
9
|
+
<meta property="og:description" content="Native messaging hosts let browser extensions talk to local executables. That can be useful, but it also creates a persistent bridge outside the browser sand..." />
|
|
10
|
+
<meta property="og:type" content="article" />
|
|
11
|
+
<meta property="og:url" content="https://thumbgate.ai/guides/native-messaging-host-security" />
|
|
12
|
+
<link rel="canonical" href="https://thumbgate.ai/guides/native-messaging-host-security" />
|
|
13
|
+
<link rel="llm-context" href="/llm-context.md" type="text/markdown" />
|
|
14
|
+
<link rel="icon" type="image/svg+xml" href="/thumbgate-icon.png" />
|
|
15
|
+
<link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg" />
|
|
16
|
+
<meta property="og:image" content="/og.png" />
|
|
17
|
+
<style>
|
|
18
|
+
:root {
|
|
19
|
+
--bg: #0a0a0b;
|
|
20
|
+
--bg-raised: #111113;
|
|
21
|
+
--bg-card: #161618;
|
|
22
|
+
--line: #222225;
|
|
23
|
+
--text: #e8e8ec;
|
|
24
|
+
--muted: #8b8b96;
|
|
25
|
+
--cyan: #22d3ee;
|
|
26
|
+
--green: #4ade80;
|
|
27
|
+
--red: #f87171;
|
|
28
|
+
}
|
|
29
|
+
* { box-sizing: border-box; }
|
|
30
|
+
body {
|
|
31
|
+
margin: 0;
|
|
32
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
33
|
+
background: var(--bg);
|
|
34
|
+
color: var(--text);
|
|
35
|
+
line-height: 1.65;
|
|
36
|
+
}
|
|
37
|
+
a { color: var(--cyan); text-decoration: none; }
|
|
38
|
+
a:hover { text-decoration: underline; }
|
|
39
|
+
.container { max-width: 980px; margin: 0 auto; padding: 0 24px; }
|
|
40
|
+
.topbar {
|
|
41
|
+
position: sticky;
|
|
42
|
+
top: 0;
|
|
43
|
+
z-index: 20;
|
|
44
|
+
backdrop-filter: blur(12px);
|
|
45
|
+
background: rgba(10, 10, 11, 0.88);
|
|
46
|
+
border-bottom: 1px solid var(--line);
|
|
47
|
+
}
|
|
48
|
+
.topbar .container {
|
|
49
|
+
display: flex;
|
|
50
|
+
justify-content: space-between;
|
|
51
|
+
align-items: center;
|
|
52
|
+
padding-top: 14px;
|
|
53
|
+
padding-bottom: 14px;
|
|
54
|
+
}
|
|
55
|
+
.brand {
|
|
56
|
+
font-weight: 700;
|
|
57
|
+
color: var(--text);
|
|
58
|
+
display: inline-flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 8px;
|
|
61
|
+
text-decoration: none;
|
|
62
|
+
}
|
|
63
|
+
.brand .logo-mark { width: 28px; height: 28px; display: block; }
|
|
64
|
+
.hero { padding: 72px 0 32px; }
|
|
65
|
+
.eyebrow {
|
|
66
|
+
display: inline-flex;
|
|
67
|
+
align-items: center;
|
|
68
|
+
gap: 8px;
|
|
69
|
+
padding: 6px 12px;
|
|
70
|
+
border-radius: 999px;
|
|
71
|
+
border: 1px solid rgba(34, 211, 238, 0.22);
|
|
72
|
+
background: rgba(34, 211, 238, 0.1);
|
|
73
|
+
color: var(--cyan);
|
|
74
|
+
text-transform: uppercase;
|
|
75
|
+
letter-spacing: 0.08em;
|
|
76
|
+
font-size: 12px;
|
|
77
|
+
font-weight: 700;
|
|
78
|
+
}
|
|
79
|
+
h1 {
|
|
80
|
+
font-size: clamp(34px, 5vw, 56px);
|
|
81
|
+
line-height: 1.06;
|
|
82
|
+
letter-spacing: -0.04em;
|
|
83
|
+
margin: 16px 0;
|
|
84
|
+
max-width: 760px;
|
|
85
|
+
}
|
|
86
|
+
.hero p {
|
|
87
|
+
max-width: 720px;
|
|
88
|
+
color: var(--muted);
|
|
89
|
+
font-size: 18px;
|
|
90
|
+
}
|
|
91
|
+
.signal-row {
|
|
92
|
+
display: flex;
|
|
93
|
+
flex-wrap: wrap;
|
|
94
|
+
gap: 12px;
|
|
95
|
+
margin: 28px 0 0;
|
|
96
|
+
}
|
|
97
|
+
.signal-pill {
|
|
98
|
+
display: inline-flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
gap: 8px;
|
|
101
|
+
padding: 10px 14px;
|
|
102
|
+
border-radius: 999px;
|
|
103
|
+
border: 1px solid var(--line);
|
|
104
|
+
background: var(--bg-raised);
|
|
105
|
+
font-weight: 600;
|
|
106
|
+
font-size: 14px;
|
|
107
|
+
}
|
|
108
|
+
.signal-pill.up {
|
|
109
|
+
border-color: rgba(74, 222, 128, 0.28);
|
|
110
|
+
color: #b8f7c8;
|
|
111
|
+
background: rgba(74, 222, 128, 0.1);
|
|
112
|
+
}
|
|
113
|
+
.signal-pill.down {
|
|
114
|
+
border-color: rgba(248, 113, 113, 0.28);
|
|
115
|
+
color: #ffc0c0;
|
|
116
|
+
background: rgba(248, 113, 113, 0.1);
|
|
117
|
+
}
|
|
118
|
+
.grid {
|
|
119
|
+
display: grid;
|
|
120
|
+
grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr);
|
|
121
|
+
gap: 24px;
|
|
122
|
+
padding-bottom: 72px;
|
|
123
|
+
}
|
|
124
|
+
.card, .detail-section, .sidebar-card {
|
|
125
|
+
background: var(--bg-card);
|
|
126
|
+
border: 1px solid var(--line);
|
|
127
|
+
border-radius: 16px;
|
|
128
|
+
}
|
|
129
|
+
.card { padding: 24px; }
|
|
130
|
+
.detail-section { padding: 24px; margin-bottom: 18px; }
|
|
131
|
+
.detail-section h2 { margin: 0 0 12px; font-size: 24px; letter-spacing: -0.03em; }
|
|
132
|
+
.detail-section p { color: var(--muted); }
|
|
133
|
+
.detail-section ul, .card ul { padding-left: 18px; color: var(--muted); }
|
|
134
|
+
.card h2 { margin-top: 0; }
|
|
135
|
+
.sidebar {
|
|
136
|
+
display: flex;
|
|
137
|
+
flex-direction: column;
|
|
138
|
+
gap: 18px;
|
|
139
|
+
}
|
|
140
|
+
.sidebar-card {
|
|
141
|
+
padding: 20px;
|
|
142
|
+
}
|
|
143
|
+
/* Only the first sidebar card sticks. Stacking multiple stickies at the
|
|
144
|
+
same top offset makes them overlap each other on scroll. The related-
|
|
145
|
+
pages card flows normally below. */
|
|
146
|
+
.sidebar-card:first-child {
|
|
147
|
+
position: sticky;
|
|
148
|
+
top: 84px;
|
|
149
|
+
max-height: calc(100vh - 104px);
|
|
150
|
+
overflow-y: auto;
|
|
151
|
+
-webkit-overflow-scrolling: touch;
|
|
152
|
+
}
|
|
153
|
+
.proof-links {
|
|
154
|
+
display: flex;
|
|
155
|
+
flex-wrap: wrap;
|
|
156
|
+
gap: 12px;
|
|
157
|
+
margin-top: 16px;
|
|
158
|
+
}
|
|
159
|
+
.cta-button {
|
|
160
|
+
display: inline-flex;
|
|
161
|
+
align-items: center;
|
|
162
|
+
justify-content: center;
|
|
163
|
+
margin-top: 18px;
|
|
164
|
+
padding: 12px 16px;
|
|
165
|
+
border-radius: 10px;
|
|
166
|
+
background: var(--cyan);
|
|
167
|
+
color: #071116;
|
|
168
|
+
font-weight: 700;
|
|
169
|
+
text-decoration: none;
|
|
170
|
+
}
|
|
171
|
+
.faq-item {
|
|
172
|
+
border-top: 1px solid var(--line);
|
|
173
|
+
padding: 14px 0;
|
|
174
|
+
}
|
|
175
|
+
.faq-item summary {
|
|
176
|
+
cursor: pointer;
|
|
177
|
+
font-weight: 600;
|
|
178
|
+
}
|
|
179
|
+
.faq-item p {
|
|
180
|
+
color: var(--muted);
|
|
181
|
+
}
|
|
182
|
+
.related-card {
|
|
183
|
+
display: block;
|
|
184
|
+
padding: 14px;
|
|
185
|
+
border-radius: 12px;
|
|
186
|
+
border: 1px solid var(--line);
|
|
187
|
+
background: var(--bg-raised);
|
|
188
|
+
margin-top: 12px;
|
|
189
|
+
color: var(--text);
|
|
190
|
+
}
|
|
191
|
+
.related-label {
|
|
192
|
+
display: block;
|
|
193
|
+
color: var(--muted);
|
|
194
|
+
font-size: 12px;
|
|
195
|
+
text-transform: uppercase;
|
|
196
|
+
letter-spacing: 0.08em;
|
|
197
|
+
margin-bottom: 4px;
|
|
198
|
+
}
|
|
199
|
+
@media (max-width: 860px) {
|
|
200
|
+
.grid {
|
|
201
|
+
grid-template-columns: 1fr;
|
|
202
|
+
}
|
|
203
|
+
.sidebar-card:first-child {
|
|
204
|
+
position: static;
|
|
205
|
+
max-height: none;
|
|
206
|
+
overflow: visible;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
</style>
|
|
210
|
+
<script type="application/ld+json">
|
|
211
|
+
{
|
|
212
|
+
"@context": "https://schema.org",
|
|
213
|
+
"@type": "TechArticle",
|
|
214
|
+
"headline": "Native messaging host security for AI browser bridges",
|
|
215
|
+
"description": "Native messaging hosts let browser extensions talk to local executables. That can be useful, but it also creates a persistent bridge outside the browser sand...",
|
|
216
|
+
"about": [
|
|
217
|
+
"claude code masterclass guardrails",
|
|
218
|
+
"cursor prevent repeated mistakes",
|
|
219
|
+
"claude code prevent repeated mistakes",
|
|
220
|
+
"codex cli guardrails"
|
|
221
|
+
],
|
|
222
|
+
"url": "https://thumbgate.ai/guides/native-messaging-host-security",
|
|
223
|
+
"publisher": {
|
|
224
|
+
"@type": "Organization",
|
|
225
|
+
"name": "ThumbGate",
|
|
226
|
+
"url": "https://thumbgate.ai"
|
|
227
|
+
},
|
|
228
|
+
"mainEntityOfPage": "https://thumbgate.ai/guides/native-messaging-host-security"
|
|
229
|
+
}
|
|
230
|
+
</script>
|
|
231
|
+
<script type="application/ld+json">
|
|
232
|
+
{
|
|
233
|
+
"@context": "https://schema.org",
|
|
234
|
+
"@type": "FAQPage",
|
|
235
|
+
"mainEntity": [
|
|
236
|
+
{
|
|
237
|
+
"@type": "Question",
|
|
238
|
+
"name": "Why does native messaging deserve a separate security review?",
|
|
239
|
+
"acceptedAnswer": {
|
|
240
|
+
"@type": "Answer",
|
|
241
|
+
"text": "Because it lets a browser extension hand work to a local executable outside the browser sandbox. That is a different trust boundary than ordinary page automation or side-panel UI access."
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"@type": "Question",
|
|
246
|
+
"name": "How does ThumbGate help with native messaging host security?",
|
|
247
|
+
"acceptedAnswer": {
|
|
248
|
+
"@type": "Answer",
|
|
249
|
+
"text": "ThumbGate audits known host locations, highlights AI/browser bridges, flags stale or missing host binaries, and gives teams an enforcement layer so future connector expansion requires explicit approval."
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
]
|
|
253
|
+
}
|
|
254
|
+
</script>
|
|
255
|
+
</head>
|
|
256
|
+
<body>
|
|
257
|
+
<div class="topbar">
|
|
258
|
+
<div class="container">
|
|
259
|
+
<a class="brand" href="/"><img src="/assets/brand/thumbgate-mark-inline.svg" alt="ThumbGate" class="logo-mark" width="28" height="28"><span class="logo-text">ThumbGate</span></a>
|
|
260
|
+
<a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md" target="_blank" rel="noopener">Verification evidence</a>
|
|
261
|
+
</div>
|
|
262
|
+
</div>
|
|
263
|
+
|
|
264
|
+
<main class="container">
|
|
265
|
+
<section class="hero">
|
|
266
|
+
<div class="eyebrow">guide | native messaging host security</div>
|
|
267
|
+
<h1>Native messaging host security for AI browser bridges</h1>
|
|
268
|
+
<p>Native messaging hosts let browser extensions talk to local executables. That can be useful, but it also creates a persistent bridge outside the browser sandbox. ThumbGate audits those registrations and helps teams require explicit approval before they become part of the workflow.</p>
|
|
269
|
+
<div class="signal-row">
|
|
270
|
+
<div class="signal-pill up">👍 Thumbs up reinforces good behavior</div>
|
|
271
|
+
<div class="signal-pill down">👎 Thumbs down blocks repeated mistakes</div>
|
|
272
|
+
</div>
|
|
273
|
+
</section>
|
|
274
|
+
|
|
275
|
+
<section class="grid">
|
|
276
|
+
<div>
|
|
277
|
+
<div class="card">
|
|
278
|
+
<h2>Why this page exists</h2>
|
|
279
|
+
<ul><li>Native messaging is a real local capability boundary, not a harmless implementation detail.</li><li>A manifest can pre-authorize extension origins long before a human operator understands the blast radius.</li><li>ThumbGate turns native messaging review into an auditable operator workflow instead of an invisible local side effect.</li></ul>
|
|
280
|
+
</div>
|
|
281
|
+
|
|
282
|
+
<section class="detail-section">
|
|
283
|
+
<h2>What native messaging hosts actually do</h2>
|
|
284
|
+
<p>A native messaging host is a local manifest that tells a browser extension which executable it may launch on the operator machine. That bridge sits outside the browser sandbox, so it deserves the same review discipline teams use for deploy credentials or production write access.</p><p>The risk is not only the host binary itself. It is the combination of extension permissions, allowed origins, and whether the host remains registered for browsers the operator did not intentionally connect.</p>
|
|
285
|
+
|
|
286
|
+
</section>
|
|
287
|
+
<section class="detail-section">
|
|
288
|
+
<h2>Signals ThumbGate audits</h2>
|
|
289
|
+
|
|
290
|
+
<ul><li>Manifest files under browser-specific NativeMessagingHosts directories on macOS and Linux.</li><li>Allowed extension origins and extension-id fan-out per host registration.</li><li>Host binaries that are missing on disk, which leaves stale or broken registrations behind.</li><li>AI/browser bridge manifests registered for browsers not detected in the usual local install paths.</li></ul>
|
|
291
|
+
</section>
|
|
292
|
+
<section class="detail-section">
|
|
293
|
+
<h2>The fastest operator action</h2>
|
|
294
|
+
<p>Run npx thumbgate native-messaging-audit --json in the repo or workstation you govern. Review every AI browser bridge, remove anything you did not intentionally integrate, and keep browser-use in ask-before-acting mode until connector scope is explicit and revocable.</p>
|
|
295
|
+
|
|
296
|
+
</section>
|
|
297
|
+
<div class="detail-section">
|
|
298
|
+
<h2>FAQ</h2>
|
|
299
|
+
|
|
300
|
+
<details class="faq-item">
|
|
301
|
+
<summary>Why does native messaging deserve a separate security review?</summary>
|
|
302
|
+
<p>Because it lets a browser extension hand work to a local executable outside the browser sandbox. That is a different trust boundary than ordinary page automation or side-panel UI access.</p>
|
|
303
|
+
</details>
|
|
304
|
+
<details class="faq-item">
|
|
305
|
+
<summary>How does ThumbGate help with native messaging host security?</summary>
|
|
306
|
+
<p>ThumbGate audits known host locations, highlights AI/browser bridges, flags stale or missing host binaries, and gives teams an enforcement layer so future connector expansion requires explicit approval.</p>
|
|
307
|
+
</details>
|
|
308
|
+
</div>
|
|
309
|
+
</div>
|
|
310
|
+
|
|
311
|
+
<aside class="sidebar">
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
<div class="sidebar-card">
|
|
317
|
+
<h2>GSD execution brief</h2>
|
|
318
|
+
<p>This page was prioritized because it captures high-intent demand around native messaging host security and feeds directly into ThumbGate's proof-led conversion path.</p>
|
|
319
|
+
<p><strong>Opportunity score:</strong> 75</p>
|
|
320
|
+
<p><strong>Primary persona:</strong> ai-engineer</p>
|
|
321
|
+
<p><strong>Keyword cluster:</strong> claude code masterclass guardrails, cursor prevent repeated mistakes, claude code prevent repeated mistakes, codex cli guardrails</p>
|
|
322
|
+
<p><strong>Pricing:</strong> Pro $19/mo or $149/yr. Team $49/seat/mo.</p>
|
|
323
|
+
<div class="proof-links"><a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md" target="_blank" rel="noopener">Verification evidence</a><a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/proof/automation/report.json" target="_blank" rel="noopener">Automation proof</a><a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub repository</a></div>
|
|
324
|
+
<a class="cta-button" href="/checkout/pro?utm_source=website&utm_medium=seo_page&utm_campaign=guides_native-messaging-host-security&cta_placement=seo_brief&plan_id=pro" target="_blank" rel="noopener">Go Pro — $19/mo</a>
|
|
325
|
+
</div>
|
|
326
|
+
<div class="sidebar-card">
|
|
327
|
+
<h2>Related pages</h2>
|
|
328
|
+
|
|
329
|
+
<a class="related-card" href="/guides/browser-automation-safety">
|
|
330
|
+
<span class="related-label">Related page</span>
|
|
331
|
+
<strong>Browser automation safety needs explicit approval boundaries</strong>
|
|
332
|
+
</a>
|
|
333
|
+
<a class="related-card" href="/guides/pre-action-checks">
|
|
334
|
+
<span class="related-label">Related page</span>
|
|
335
|
+
<strong>What Are Pre-Action Checks?</strong>
|
|
336
|
+
</a>
|
|
337
|
+
</div>
|
|
338
|
+
</aside>
|
|
339
|
+
</section>
|
|
340
|
+
</main>
|
|
341
|
+
</body>
|
|
342
|
+
</html>
|
|
@@ -0,0 +1,346 @@
|
|
|
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>Policy Engines Need Pre-Action Gates for AI Agents | ThumbGate</title>
|
|
7
|
+
<meta name="description" content="Policy engines, guardrail SDKs, and compliance APIs can decide whether an AI-agent action is allowed. ThumbGate enforces that decision locally before the tool runs." />
|
|
8
|
+
<meta property="og:title" content="Policy Engines Need Pre-Action Gates for AI Agents | ThumbGate" />
|
|
9
|
+
<meta property="og:description" content="Policy engines decide. ThumbGate enforces before shell, file, MCP, browser, deploy, or API actions run." />
|
|
10
|
+
<meta property="og:type" content="article" />
|
|
11
|
+
<meta property="og:url" content="https://thumbgate.ai/guides/policy-engine-pre-action-gates" />
|
|
12
|
+
<link rel="canonical" href="https://thumbgate.ai/guides/policy-engine-pre-action-gates" />
|
|
13
|
+
<link rel="llm-context" href="/llm-context.md" type="text/markdown" />
|
|
14
|
+
<link rel="icon" type="image/svg+xml" href="/thumbgate-icon.png" />
|
|
15
|
+
<link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg" />
|
|
16
|
+
<meta property="og:image" content="/og.png" />
|
|
17
|
+
<style>
|
|
18
|
+
:root {
|
|
19
|
+
--bg: #0a0a0b;
|
|
20
|
+
--bg-raised: #111113;
|
|
21
|
+
--bg-card: #161618;
|
|
22
|
+
--line: #222225;
|
|
23
|
+
--text: #e8e8ec;
|
|
24
|
+
--muted: #9b9ba6;
|
|
25
|
+
--cyan: #22d3ee;
|
|
26
|
+
--green: #4ade80;
|
|
27
|
+
--red: #f87171;
|
|
28
|
+
}
|
|
29
|
+
* { box-sizing: border-box; }
|
|
30
|
+
body {
|
|
31
|
+
margin: 0;
|
|
32
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
33
|
+
background: var(--bg);
|
|
34
|
+
color: var(--text);
|
|
35
|
+
line-height: 1.65;
|
|
36
|
+
}
|
|
37
|
+
a { color: var(--cyan); text-decoration: none; }
|
|
38
|
+
a:hover { text-decoration: underline; }
|
|
39
|
+
.container { max-width: 980px; margin: 0 auto; padding: 0 24px; }
|
|
40
|
+
.topbar {
|
|
41
|
+
position: sticky;
|
|
42
|
+
top: 0;
|
|
43
|
+
z-index: 20;
|
|
44
|
+
backdrop-filter: blur(12px);
|
|
45
|
+
background: rgba(10, 10, 11, 0.88);
|
|
46
|
+
border-bottom: 1px solid var(--line);
|
|
47
|
+
}
|
|
48
|
+
.topbar .container {
|
|
49
|
+
display: flex;
|
|
50
|
+
justify-content: space-between;
|
|
51
|
+
align-items: center;
|
|
52
|
+
padding-top: 14px;
|
|
53
|
+
padding-bottom: 14px;
|
|
54
|
+
}
|
|
55
|
+
.brand {
|
|
56
|
+
display: inline-flex;
|
|
57
|
+
gap: 8px;
|
|
58
|
+
align-items: center;
|
|
59
|
+
color: var(--text);
|
|
60
|
+
font-weight: 700;
|
|
61
|
+
}
|
|
62
|
+
.logo-mark { width: 28px; height: 28px; display: block; }
|
|
63
|
+
.hero { padding: 72px 0 32px; }
|
|
64
|
+
.eyebrow {
|
|
65
|
+
display: inline-flex;
|
|
66
|
+
padding: 6px 12px;
|
|
67
|
+
border-radius: 999px;
|
|
68
|
+
border: 1px solid rgba(34, 211, 238, 0.22);
|
|
69
|
+
background: rgba(34, 211, 238, 0.1);
|
|
70
|
+
color: var(--cyan);
|
|
71
|
+
text-transform: uppercase;
|
|
72
|
+
letter-spacing: 0.08em;
|
|
73
|
+
font-size: 12px;
|
|
74
|
+
font-weight: 700;
|
|
75
|
+
}
|
|
76
|
+
h1 {
|
|
77
|
+
max-width: 820px;
|
|
78
|
+
margin: 16px 0;
|
|
79
|
+
font-size: clamp(34px, 5vw, 56px);
|
|
80
|
+
line-height: 1.06;
|
|
81
|
+
letter-spacing: -0.04em;
|
|
82
|
+
}
|
|
83
|
+
.hero p {
|
|
84
|
+
max-width: 760px;
|
|
85
|
+
color: var(--muted);
|
|
86
|
+
font-size: 18px;
|
|
87
|
+
}
|
|
88
|
+
.signal-row { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 28px; }
|
|
89
|
+
.signal-pill {
|
|
90
|
+
padding: 10px 14px;
|
|
91
|
+
border-radius: 999px;
|
|
92
|
+
border: 1px solid var(--line);
|
|
93
|
+
background: var(--bg-raised);
|
|
94
|
+
font-size: 14px;
|
|
95
|
+
font-weight: 700;
|
|
96
|
+
}
|
|
97
|
+
.signal-pill.up { border-color: rgba(74, 222, 128, 0.28); color: #b8f7c8; background: rgba(74, 222, 128, 0.1); }
|
|
98
|
+
.signal-pill.down { border-color: rgba(248, 113, 113, 0.28); color: #ffc0c0; background: rgba(248, 113, 113, 0.1); }
|
|
99
|
+
.grid {
|
|
100
|
+
display: grid;
|
|
101
|
+
grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr);
|
|
102
|
+
gap: 24px;
|
|
103
|
+
padding-bottom: 72px;
|
|
104
|
+
}
|
|
105
|
+
.card, .detail-section, .sidebar-card {
|
|
106
|
+
background: var(--bg-card);
|
|
107
|
+
border: 1px solid var(--line);
|
|
108
|
+
border-radius: 16px;
|
|
109
|
+
}
|
|
110
|
+
.card, .detail-section, .sidebar-card { padding: 24px; }
|
|
111
|
+
.detail-section { margin-bottom: 18px; }
|
|
112
|
+
.detail-section h2, .card h2, .sidebar-card h2 { margin: 0 0 12px; letter-spacing: -0.03em; }
|
|
113
|
+
.detail-section p, .card p, .sidebar-card p, li { color: var(--muted); }
|
|
114
|
+
ul { padding-left: 18px; }
|
|
115
|
+
table { width: 100%; border-collapse: collapse; margin-top: 16px; }
|
|
116
|
+
th, td { border: 1px solid var(--line); padding: 12px; vertical-align: top; text-align: left; }
|
|
117
|
+
th { color: var(--text); background: var(--bg-raised); }
|
|
118
|
+
code, pre {
|
|
119
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
120
|
+
background: #0d1117;
|
|
121
|
+
color: #d6deff;
|
|
122
|
+
border: 1px solid var(--line);
|
|
123
|
+
border-radius: 10px;
|
|
124
|
+
}
|
|
125
|
+
code { padding: 2px 6px; }
|
|
126
|
+
pre { overflow-x: auto; padding: 16px; }
|
|
127
|
+
.sidebar { display: flex; flex-direction: column; gap: 18px; }
|
|
128
|
+
.sidebar-card:first-child {
|
|
129
|
+
position: sticky;
|
|
130
|
+
top: 84px;
|
|
131
|
+
max-height: calc(100vh - 104px);
|
|
132
|
+
overflow-y: auto;
|
|
133
|
+
}
|
|
134
|
+
.cta-button {
|
|
135
|
+
display: inline-flex;
|
|
136
|
+
justify-content: center;
|
|
137
|
+
margin-top: 18px;
|
|
138
|
+
padding: 12px 16px;
|
|
139
|
+
border-radius: 10px;
|
|
140
|
+
background: var(--cyan);
|
|
141
|
+
color: #071116;
|
|
142
|
+
font-weight: 700;
|
|
143
|
+
}
|
|
144
|
+
.related-card {
|
|
145
|
+
display: block;
|
|
146
|
+
padding: 14px;
|
|
147
|
+
margin-top: 12px;
|
|
148
|
+
border: 1px solid var(--line);
|
|
149
|
+
border-radius: 12px;
|
|
150
|
+
background: var(--bg-raised);
|
|
151
|
+
color: var(--text);
|
|
152
|
+
}
|
|
153
|
+
.related-label {
|
|
154
|
+
display: block;
|
|
155
|
+
color: var(--muted);
|
|
156
|
+
font-size: 12px;
|
|
157
|
+
text-transform: uppercase;
|
|
158
|
+
letter-spacing: 0.08em;
|
|
159
|
+
}
|
|
160
|
+
.faq-item { border-top: 1px solid var(--line); padding: 14px 0; }
|
|
161
|
+
.faq-item summary { cursor: pointer; font-weight: 700; }
|
|
162
|
+
@media (max-width: 860px) {
|
|
163
|
+
.grid { grid-template-columns: 1fr; }
|
|
164
|
+
.sidebar-card:first-child { position: static; max-height: none; }
|
|
165
|
+
}
|
|
166
|
+
</style>
|
|
167
|
+
<script type="application/ld+json">
|
|
168
|
+
{
|
|
169
|
+
"@context": "https://schema.org",
|
|
170
|
+
"@type": "TechArticle",
|
|
171
|
+
"headline": "Policy Engines Need Pre-Action Gates for AI Agents",
|
|
172
|
+
"description": "Policy engines, guardrail SDKs, and compliance APIs can decide whether an AI-agent action is allowed. ThumbGate enforces that decision locally before the tool runs.",
|
|
173
|
+
"about": [
|
|
174
|
+
"AI agent policy engine",
|
|
175
|
+
"pre-action gates",
|
|
176
|
+
"OPA agent guardrails",
|
|
177
|
+
"Bedrock Guardrails agent tools",
|
|
178
|
+
"Guardian SDK agent governance"
|
|
179
|
+
],
|
|
180
|
+
"url": "https://thumbgate.ai/guides/policy-engine-pre-action-gates",
|
|
181
|
+
"publisher": {
|
|
182
|
+
"@type": "Organization",
|
|
183
|
+
"name": "ThumbGate",
|
|
184
|
+
"url": "https://thumbgate.ai"
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
</script>
|
|
188
|
+
<script type="application/ld+json">
|
|
189
|
+
{
|
|
190
|
+
"@context": "https://schema.org",
|
|
191
|
+
"@type": "FAQPage",
|
|
192
|
+
"mainEntity": [
|
|
193
|
+
{
|
|
194
|
+
"@type": "Question",
|
|
195
|
+
"name": "Does ThumbGate replace a policy engine?",
|
|
196
|
+
"acceptedAnswer": {
|
|
197
|
+
"@type": "Answer",
|
|
198
|
+
"text": "No. A policy engine decides whether an action is allowed. ThumbGate enforces that decision before the agent executes a shell, file, MCP, browser, deploy, or API action."
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"@type": "Question",
|
|
203
|
+
"name": "Can ThumbGate use Guardian SDK, Ethicore, OPA, or Bedrock Guardrails decisions?",
|
|
204
|
+
"acceptedAnswer": {
|
|
205
|
+
"@type": "Answer",
|
|
206
|
+
"text": "Yes. ThumbGate's policy-engine adapter normalizes allow, block, and approval-required outputs from external policy engines, then applies local pre-action gates before execution."
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"@type": "Question",
|
|
211
|
+
"name": "Why not just log policy violations after the run?",
|
|
212
|
+
"acceptedAnswer": {
|
|
213
|
+
"@type": "Answer",
|
|
214
|
+
"text": "Post-run logging proves what happened after damage is possible. Pre-action gates stop the risky action before it runs and preserve the evidence for audit."
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
</script>
|
|
220
|
+
</head>
|
|
221
|
+
<body>
|
|
222
|
+
<header class="topbar">
|
|
223
|
+
<div class="container">
|
|
224
|
+
<a class="brand" href="/"><img class="logo-mark" src="/assets/brand/thumbgate-mark.svg" alt="" /> ThumbGate</a>
|
|
225
|
+
<a href="/pricing">Pricing</a>
|
|
226
|
+
</div>
|
|
227
|
+
</header>
|
|
228
|
+
|
|
229
|
+
<main class="container">
|
|
230
|
+
<section class="hero">
|
|
231
|
+
<span class="eyebrow">Policy engine adapter</span>
|
|
232
|
+
<h1>Policy engines decide. ThumbGate enforces before the agent acts.</h1>
|
|
233
|
+
<p>Guardian SDK, Ethicore-style policy layers, OPA, Bedrock Guardrails, and custom compliance APIs are useful decision systems. The missing piece is a deterministic local gate that catches the actual command, file edit, MCP call, browser action, deployment, or API request before it executes.</p>
|
|
234
|
+
<div class="signal-row">
|
|
235
|
+
<span class="signal-pill up">Use existing policy engines</span>
|
|
236
|
+
<span class="signal-pill up">Normalize allow/block/review</span>
|
|
237
|
+
<span class="signal-pill down">Do not rely on after-the-fact logs</span>
|
|
238
|
+
</div>
|
|
239
|
+
</section>
|
|
240
|
+
|
|
241
|
+
<section class="grid">
|
|
242
|
+
<div>
|
|
243
|
+
<div class="card">
|
|
244
|
+
<h2>The buyer objection</h2>
|
|
245
|
+
<p>"We already have a policy engine." Good. ThumbGate should sit underneath it, not compete with it. Policy engines answer whether an action is compliant. ThumbGate makes that answer operational at the exact moment an AI agent is about to touch a real system.</p>
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
<section class="detail-section">
|
|
249
|
+
<h2>Policy reasoning vs execution enforcement</h2>
|
|
250
|
+
<table>
|
|
251
|
+
<thead>
|
|
252
|
+
<tr>
|
|
253
|
+
<th>Layer</th>
|
|
254
|
+
<th>What it does</th>
|
|
255
|
+
<th>Failure if used alone</th>
|
|
256
|
+
</tr>
|
|
257
|
+
</thead>
|
|
258
|
+
<tbody>
|
|
259
|
+
<tr>
|
|
260
|
+
<td>Policy engine</td>
|
|
261
|
+
<td>Evaluates a rule, ontology, risk model, or compliance policy.</td>
|
|
262
|
+
<td>The agent can still execute if the decision is not wired into the tool boundary.</td>
|
|
263
|
+
</tr>
|
|
264
|
+
<tr>
|
|
265
|
+
<td>Audit log</td>
|
|
266
|
+
<td>Records what the agent did and why it was allowed or denied.</td>
|
|
267
|
+
<td>The record arrives after the risky action may already have run.</td>
|
|
268
|
+
</tr>
|
|
269
|
+
<tr>
|
|
270
|
+
<td>ThumbGate</td>
|
|
271
|
+
<td>Intercepts the concrete action locally before shell, file, MCP, deploy, browser, or API execution.</td>
|
|
272
|
+
<td>It needs policy input for teams that already maintain centralized governance models.</td>
|
|
273
|
+
</tr>
|
|
274
|
+
</tbody>
|
|
275
|
+
</table>
|
|
276
|
+
</section>
|
|
277
|
+
|
|
278
|
+
<section class="detail-section">
|
|
279
|
+
<h2>Adapter contract</h2>
|
|
280
|
+
<p>The adapter normalizes common policy-engine outputs into ThumbGate's enforcement shape.</p>
|
|
281
|
+
<pre><code>{
|
|
282
|
+
"decision": "block",
|
|
283
|
+
"reason": "off-scope network egress",
|
|
284
|
+
"policyId": "egress-001",
|
|
285
|
+
"evidence": [
|
|
286
|
+
{ "ruleId": "egress-001", "reason": "curl to unknown host" }
|
|
287
|
+
]
|
|
288
|
+
}</code></pre>
|
|
289
|
+
<p>ThumbGate then treats that as a pre-action decision. If the policy says block, the wrapped tool does not execute. If the policy says allow but a local thumbs-down rule catches a repeated mistake, ThumbGate can still hard-block locally.</p>
|
|
290
|
+
</section>
|
|
291
|
+
|
|
292
|
+
<section class="detail-section">
|
|
293
|
+
<h2>Where this helps teams</h2>
|
|
294
|
+
<ul>
|
|
295
|
+
<li>Enterprises that already have compliance policies but no AI-agent tool boundary.</li>
|
|
296
|
+
<li>Platform teams exposing internal MCP tools to Claude Code, Cursor, Codex, Gemini CLI, OpenCode, or Letta agents.</li>
|
|
297
|
+
<li>Security teams that need proof that a risky command was stopped before execution.</li>
|
|
298
|
+
<li>Teams comparing policy SDKs, guardrails, and agent firewalls for production rollouts.</li>
|
|
299
|
+
</ul>
|
|
300
|
+
</section>
|
|
301
|
+
|
|
302
|
+
<section class="detail-section">
|
|
303
|
+
<h2>FAQ</h2>
|
|
304
|
+
<details class="faq-item">
|
|
305
|
+
<summary>Does ThumbGate replace a policy engine?</summary>
|
|
306
|
+
<p>No. A policy engine decides whether an action is allowed. ThumbGate enforces that decision before the agent executes a shell, file, MCP, browser, deploy, or API action.</p>
|
|
307
|
+
</details>
|
|
308
|
+
<details class="faq-item">
|
|
309
|
+
<summary>Can ThumbGate use Guardian SDK, Ethicore, OPA, or Bedrock Guardrails decisions?</summary>
|
|
310
|
+
<p>Yes. The policy-engine adapter normalizes allow, block, and approval-required outputs from external policy engines, then applies local pre-action gates before execution.</p>
|
|
311
|
+
</details>
|
|
312
|
+
<details class="faq-item">
|
|
313
|
+
<summary>Why not just log policy violations after the run?</summary>
|
|
314
|
+
<p>Post-run logging proves what happened after damage is possible. Pre-action gates stop the risky action before it runs and preserve the evidence for audit.</p>
|
|
315
|
+
</details>
|
|
316
|
+
</section>
|
|
317
|
+
</div>
|
|
318
|
+
|
|
319
|
+
<aside class="sidebar">
|
|
320
|
+
<div class="sidebar-card">
|
|
321
|
+
<h2>Implementation path</h2>
|
|
322
|
+
<p>Install ThumbGate, wrap the policy decision, and enforce the result before the agent's tool call runs.</p>
|
|
323
|
+
<pre><code>npx thumbgate init</code></pre>
|
|
324
|
+
<p><strong>Pricing:</strong> Pro $19/mo or $149/yr. Team $49/seat/mo.</p>
|
|
325
|
+
<a class="cta-button" href="/checkout/pro?utm_source=website&utm_medium=seo_page&utm_campaign=guides_policy_engine_pre_action_gates&cta_placement=seo_brief&plan_id=pro">Go Pro - $19/mo</a>
|
|
326
|
+
</div>
|
|
327
|
+
<div class="sidebar-card">
|
|
328
|
+
<h2>Related pages</h2>
|
|
329
|
+
<a class="related-card" href="/guides/mcp-tool-governance">
|
|
330
|
+
<span class="related-label">Related page</span>
|
|
331
|
+
<strong>MCP Tool Governance</strong>
|
|
332
|
+
</a>
|
|
333
|
+
<a class="related-card" href="/guides/ai-agent-pre-action-approval-gates">
|
|
334
|
+
<span class="related-label">Related page</span>
|
|
335
|
+
<strong>AI Agent Pre-Action Approval Gates</strong>
|
|
336
|
+
</a>
|
|
337
|
+
<a class="related-card" href="/guides/pretooluse-hooks-vs-advisory-prompt-rules">
|
|
338
|
+
<span class="related-label">Related page</span>
|
|
339
|
+
<strong>PreToolUse Hooks vs Advisory Prompt Rules</strong>
|
|
340
|
+
</a>
|
|
341
|
+
</div>
|
|
342
|
+
</aside>
|
|
343
|
+
</section>
|
|
344
|
+
</main>
|
|
345
|
+
</body>
|
|
346
|
+
</html>
|