thumbgate 1.28.4 → 1.29.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/dashboard.md +11 -1
- package/.claude/commands/thumbgate-dashboard.md +23 -8
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/llms.txt +18 -10
- package/.well-known/mcp/server-card.json +1 -1
- package/README.md +66 -3
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/forge/forge.yaml +3 -3
- package/adapters/mcp/server-stdio.js +88 -2
- package/adapters/opencode/opencode.json +1 -1
- package/bin/cli.js +8 -8
- package/bin/postinstall.js +4 -13
- package/commands/dashboard.md +11 -1
- package/commands/thumbgate-dashboard.md +23 -8
- package/config/agent-outcome-monitor-thresholds.json +63 -0
- package/config/evals/agent-outcomes-baseline.json +17 -0
- package/config/evals/agent-outcomes-golden.json +412 -0
- package/config/evals/prompt-eval-baseline.json +23 -0
- package/config/github-about.json +5 -4
- package/config/post-deploy-marketing-pages.json +6 -6
- package/config/schemas/task-outcome-receipt.schema.json +296 -0
- package/docs/integrations/grafana/README.md +109 -0
- package/docs/integrations/grafana/thumbgate-revenue-evidence-dashboard.json +1930 -0
- package/openapi/openapi.yaml +475 -5
- package/package.json +75 -22
- package/public/agent-manager.html +10 -11
- package/public/agents-cost-savings.html +2 -2
- package/public/assets/brand/thumbgate-logo-transparent.svg +6 -11
- package/public/assets/brand/thumbgate-mark-inline-v3.svg +11 -10
- package/public/assets/brand/thumbgate-mark.svg +10 -11
- package/public/blog/inside-your-boundary.html +114 -0
- package/public/blog/process-over-outcome-gates.html +119 -0
- package/public/blog.html +296 -402
- package/public/brand/thumbgate-mark.svg +5 -9
- package/public/codex-enterprise.html +2 -2
- package/public/compare.html +12 -3
- package/public/diagnostic.html +79 -29
- package/public/guide.html +4 -4
- package/public/index.html +1090 -2098
- package/public/install.html +3 -3
- package/public/js/buyer-intent.js +33 -18
- package/public/numbers.html +2 -2
- package/public/pricing.html +268 -408
- package/public/pro.html +4 -4
- package/scripts/agent-outcome-eval.js +130 -0
- package/scripts/agent-outcome-monitor.js +261 -0
- package/scripts/agent-reasoning-traces.js +8 -9
- package/scripts/async-job-runner.js +107 -13
- package/scripts/billing.js +456 -126
- package/scripts/buyer-paths.js +102 -0
- package/scripts/cli-feedback.js +2 -2
- package/scripts/commercial-offer.js +18 -10
- package/scripts/durability/step.js +121 -12
- package/scripts/external-customer-audit.js +881 -0
- package/scripts/feedback-loop.js +26 -0
- package/scripts/gates-engine.js +554 -19
- package/scripts/grafana-revenue-evidence.js +856 -0
- package/scripts/human-escalation.js +265 -0
- package/scripts/hybrid-feedback-context.js +93 -50
- package/scripts/jsonl-window.js +89 -0
- package/scripts/judge-reward-function.js +30 -18
- package/scripts/lesson-embedding-index.js +3 -7
- package/scripts/meta-agent-loop.js +20 -2
- package/scripts/observability-env.js +139 -0
- package/scripts/observability-setup.js +55 -0
- package/scripts/plausible-domain-config.js +4 -0
- package/scripts/prompt-eval.js +81 -4
- package/scripts/provider-live-evidence.js +1290 -0
- package/scripts/provider-payment-reconciler.js +442 -0
- package/scripts/provider-revenue-evidence.js +249 -0
- package/scripts/rate-limiter.js +1 -5
- package/scripts/revenue-action-eligibility.js +414 -0
- package/scripts/revenue-evidence-remediation.js +694 -0
- package/scripts/revenue-offer-system.js +709 -0
- package/scripts/sales-pipeline.js +1117 -0
- package/scripts/schedule-manager.js +249 -0
- package/scripts/seo-gsd.js +8 -4
- package/scripts/stripe-credentials.js +37 -0
- package/scripts/stripe-revenue-catalog-audit.js +363 -0
- package/scripts/stripe-revenue-catalog.js +164 -0
- package/scripts/task-outcomes.js +425 -0
- package/scripts/telemetry-analytics.js +23 -3
- package/scripts/tool-contract-validator.js +287 -59
- package/scripts/tool-registry.js +143 -0
- package/scripts/vector-store.js +83 -7
- package/scripts/workflow-intake-queue.js +483 -0
- package/src/api/server.js +647 -118
package/public/blog.html
CHANGED
|
@@ -3,472 +3,366 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>ThumbGate Blog —
|
|
6
|
+
<title>ThumbGate Blog — Self-Improving Firewall Engineering</title>
|
|
7
7
|
<script defer data-domain="thumbgate.ai" src="https://plausible.io/js/script.js"></script>
|
|
8
8
|
<meta
|
|
9
9
|
name="description"
|
|
10
|
-
content="
|
|
11
|
-
/>
|
|
12
|
-
<link
|
|
13
|
-
rel="canonical"
|
|
14
|
-
href="https://thumbgate.ai/blog"
|
|
15
|
-
/>
|
|
16
|
-
<meta
|
|
17
|
-
property="og:title"
|
|
18
|
-
content="ThumbGate Blog — Agent Governance Engineering"
|
|
10
|
+
content="Engineering notes on pre-action checks, process-over-outcome gates, and local-first agent governance from the ThumbGate team."
|
|
19
11
|
/>
|
|
12
|
+
<link rel="canonical" href="https://thumbgate.ai/blog" />
|
|
13
|
+
<meta property="og:title" content="ThumbGate Blog — Self-Improving Firewall Engineering" />
|
|
20
14
|
<meta
|
|
21
15
|
property="og:description"
|
|
22
|
-
content="
|
|
16
|
+
content="Process-over-outcome gates, boundary-local enforcement, and release notes for ThumbGate."
|
|
23
17
|
/>
|
|
24
18
|
<meta property="og:type" content="website" />
|
|
25
|
-
<meta
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
/>
|
|
19
|
+
<meta property="og:url" content="https://thumbgate.ai/blog" />
|
|
20
|
+
<meta property="og:image" content="https://thumbgate.ai/og.png" />
|
|
21
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png" />
|
|
29
22
|
<script type="application/ld+json">
|
|
30
23
|
{
|
|
31
24
|
"@context": "https://schema.org",
|
|
32
25
|
"@type": "Blog",
|
|
33
26
|
"name": "ThumbGate Blog",
|
|
34
27
|
"url": "https://thumbgate.ai/blog",
|
|
35
|
-
"
|
|
28
|
+
"description": "Engineering notes on pre-action checks, process-over-outcome gates, and local-first agent governance.",
|
|
29
|
+
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
|
|
36
30
|
"blogPost": [
|
|
37
31
|
{
|
|
38
32
|
"@type": "BlogPosting",
|
|
39
|
-
"headline": "
|
|
40
|
-
"
|
|
41
|
-
"
|
|
33
|
+
"headline": "Process over outcome: gates for self-improving coding loops",
|
|
34
|
+
"url": "https://thumbgate.ai/blog/process-over-outcome-gates",
|
|
35
|
+
"datePublished": "2026-07-23",
|
|
36
|
+
"keywords": "reward hacking, autoresearch, process over outcome, self-improving agents, ThumbGate"
|
|
42
37
|
},
|
|
43
38
|
{
|
|
44
39
|
"@type": "BlogPosting",
|
|
45
|
-
"headline": "
|
|
46
|
-
"
|
|
47
|
-
"
|
|
40
|
+
"headline": "AI inside your boundary: governance without relaxing controls",
|
|
41
|
+
"url": "https://thumbgate.ai/blog/inside-your-boundary",
|
|
42
|
+
"datePublished": "2026-07-23",
|
|
43
|
+
"keywords": "local-first, security boundary, audit trail, enterprise agent governance, ThumbGate"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"@type": "BlogPosting",
|
|
47
|
+
"headline": "Your AI agent is a supply chain attack surface. Here's how to gate it.",
|
|
48
|
+
"url": "https://thumbgate.ai/blog#supply-chain",
|
|
49
|
+
"datePublished": "2026-04-10"
|
|
48
50
|
},
|
|
49
51
|
{
|
|
50
52
|
"@type": "BlogPosting",
|
|
51
|
-
"headline": "
|
|
52
|
-
"
|
|
53
|
+
"headline": "The Claude Code Leak Proves Why Pre-Action Checks Matter",
|
|
54
|
+
"url": "https://thumbgate.ai/blog#claude-code-leak",
|
|
55
|
+
"datePublished": "2026-04-01"
|
|
53
56
|
}
|
|
54
57
|
]
|
|
55
58
|
}
|
|
56
59
|
</script>
|
|
57
60
|
<style>
|
|
58
61
|
:root {
|
|
59
|
-
|
|
60
|
-
--
|
|
61
|
-
--
|
|
62
|
-
--text: #
|
|
63
|
-
--
|
|
64
|
-
--
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
padding: 0;
|
|
69
|
-
box-sizing: border-box;
|
|
62
|
+
color-scheme: dark;
|
|
63
|
+
--bg: #080b10;
|
|
64
|
+
--panel: #111722;
|
|
65
|
+
--text: #f5f7fb;
|
|
66
|
+
--muted: #9ca8ba;
|
|
67
|
+
--line: #273246;
|
|
68
|
+
--cyan: #38d7ff;
|
|
69
|
+
--green: #56e39f;
|
|
70
|
+
--max: 980px;
|
|
70
71
|
}
|
|
72
|
+
* { box-sizing: border-box; }
|
|
71
73
|
body {
|
|
72
|
-
|
|
73
|
-
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
74
|
-
background: var(--bg);
|
|
74
|
+
margin: 0;
|
|
75
75
|
color: var(--text);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
margin: 0 auto;
|
|
81
|
-
padding: 0 24px;
|
|
76
|
+
background:
|
|
77
|
+
radial-gradient(circle at 78% 0%, rgba(56, 215, 255, 0.12), transparent 28rem),
|
|
78
|
+
linear-gradient(180deg, #080b10 0%, #0b1018 50%, #080b10 100%);
|
|
79
|
+
font: 16px/1.65 Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
82
80
|
}
|
|
81
|
+
a { color: inherit; }
|
|
82
|
+
.shell { width: min(calc(100% - 40px), var(--max)); margin: 0 auto; }
|
|
83
83
|
header {
|
|
84
|
-
|
|
85
|
-
|
|
84
|
+
position: sticky;
|
|
85
|
+
top: 0;
|
|
86
|
+
z-index: 10;
|
|
87
|
+
border-bottom: 1px solid rgba(39, 50, 70, 0.75);
|
|
88
|
+
background: rgba(8, 11, 16, 0.9);
|
|
89
|
+
backdrop-filter: blur(14px);
|
|
86
90
|
}
|
|
87
|
-
|
|
88
|
-
|
|
91
|
+
.nav {
|
|
92
|
+
min-height: 68px;
|
|
93
|
+
display: flex;
|
|
94
|
+
align-items: center;
|
|
95
|
+
justify-content: space-between;
|
|
96
|
+
gap: 18px;
|
|
97
|
+
}
|
|
98
|
+
.brand {
|
|
99
|
+
display: inline-flex;
|
|
100
|
+
align-items: center;
|
|
101
|
+
gap: 10px;
|
|
102
|
+
font-weight: 850;
|
|
89
103
|
text-decoration: none;
|
|
90
|
-
font-weight: 600;
|
|
91
104
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
105
|
+
.brand img { width: 28px; height: 28px; }
|
|
106
|
+
.nav-links { display: flex; gap: 18px; align-items: center; }
|
|
107
|
+
.nav-links a { color: var(--muted); text-decoration: none; font-size: 14px; font-weight: 700; }
|
|
108
|
+
.nav-links a:hover { color: var(--text); }
|
|
109
|
+
.nav-buy {
|
|
110
|
+
display: inline-flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
min-height: 40px;
|
|
113
|
+
padding: 0 14px;
|
|
114
|
+
border-radius: 10px;
|
|
115
|
+
background: var(--green);
|
|
116
|
+
color: #06130d !important;
|
|
117
|
+
font-weight: 850;
|
|
118
|
+
text-decoration: none;
|
|
95
119
|
}
|
|
96
|
-
.
|
|
97
|
-
|
|
98
|
-
|
|
120
|
+
.hero { padding: 72px 0 28px; }
|
|
121
|
+
.eyebrow {
|
|
122
|
+
color: var(--green);
|
|
123
|
+
font: 800 12px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
124
|
+
letter-spacing: 0.12em;
|
|
125
|
+
text-transform: uppercase;
|
|
99
126
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
127
|
+
h1 {
|
|
128
|
+
max-width: 14em;
|
|
129
|
+
margin: 14px 0 12px;
|
|
130
|
+
font-size: clamp(36px, 6vw, 56px);
|
|
131
|
+
line-height: 1.02;
|
|
132
|
+
letter-spacing: -0.04em;
|
|
104
133
|
}
|
|
105
|
-
.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
margin
|
|
109
|
-
|
|
134
|
+
.lede { max-width: 42em; margin: 0; color: var(--muted); font-size: 18px; }
|
|
135
|
+
.series { padding: 28px 0 10px; }
|
|
136
|
+
.series-title {
|
|
137
|
+
margin: 0 0 14px;
|
|
138
|
+
color: var(--cyan);
|
|
139
|
+
font: 800 12px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
140
|
+
letter-spacing: 0.12em;
|
|
141
|
+
text-transform: uppercase;
|
|
110
142
|
}
|
|
111
|
-
.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
143
|
+
.cards { display: grid; gap: 12px; }
|
|
144
|
+
.card {
|
|
145
|
+
display: block;
|
|
146
|
+
padding: 22px 22px 20px;
|
|
147
|
+
border: 1px solid var(--line);
|
|
148
|
+
border-radius: 14px;
|
|
149
|
+
background: var(--panel);
|
|
150
|
+
text-decoration: none;
|
|
151
|
+
transition: border-color 0.15s, background 0.15s;
|
|
115
152
|
}
|
|
116
|
-
.
|
|
117
|
-
|
|
118
|
-
|
|
153
|
+
.card:hover {
|
|
154
|
+
border-color: rgba(56, 215, 255, 0.35);
|
|
155
|
+
background: #141c2a;
|
|
119
156
|
}
|
|
120
|
-
.
|
|
121
|
-
|
|
122
|
-
|
|
157
|
+
.card-meta {
|
|
158
|
+
display: flex;
|
|
159
|
+
flex-wrap: wrap;
|
|
160
|
+
gap: 10px;
|
|
161
|
+
margin-bottom: 10px;
|
|
162
|
+
color: var(--muted);
|
|
163
|
+
font: 700 12px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
164
|
+
letter-spacing: 0.04em;
|
|
165
|
+
text-transform: uppercase;
|
|
123
166
|
}
|
|
124
|
-
.
|
|
125
|
-
margin
|
|
167
|
+
.card h2 {
|
|
168
|
+
margin: 0 0 8px;
|
|
169
|
+
font-size: clamp(20px, 3vw, 26px);
|
|
170
|
+
line-height: 1.2;
|
|
171
|
+
letter-spacing: -0.03em;
|
|
126
172
|
}
|
|
127
|
-
.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
173
|
+
.card p { margin: 0; color: var(--muted); font-size: 15px; }
|
|
174
|
+
.card .arrow { display: inline-block; margin-top: 12px; color: var(--cyan); font-weight: 750; font-size: 14px; }
|
|
175
|
+
.archive { padding: 36px 0 72px; border-top: 1px solid rgba(39, 50, 70, 0.65); margin-top: 36px; }
|
|
176
|
+
.archive h2 {
|
|
177
|
+
margin: 0 0 16px;
|
|
178
|
+
font-size: 22px;
|
|
179
|
+
letter-spacing: -0.03em;
|
|
132
180
|
}
|
|
133
|
-
.
|
|
181
|
+
.archive-list { display: grid; gap: 10px; }
|
|
182
|
+
.archive a {
|
|
183
|
+
display: flex;
|
|
184
|
+
justify-content: space-between;
|
|
185
|
+
gap: 16px;
|
|
186
|
+
padding: 14px 0;
|
|
187
|
+
border-bottom: 1px solid rgba(39, 50, 70, 0.55);
|
|
134
188
|
color: var(--text);
|
|
135
|
-
}
|
|
136
|
-
.cta {
|
|
137
|
-
display: inline-block;
|
|
138
|
-
margin-top: 16px;
|
|
139
|
-
padding: 10px 20px;
|
|
140
|
-
background: var(--cyan);
|
|
141
|
-
color: #000;
|
|
142
|
-
border-radius: 6px;
|
|
143
189
|
text-decoration: none;
|
|
144
|
-
font-weight: 600;
|
|
145
|
-
font-size: 14px;
|
|
146
190
|
}
|
|
191
|
+
.archive a span { color: var(--muted); font-size: 13px; white-space: nowrap; }
|
|
147
192
|
footer {
|
|
148
|
-
padding:
|
|
149
|
-
|
|
150
|
-
color: var(--
|
|
193
|
+
padding: 28px 0 48px;
|
|
194
|
+
border-top: 1px solid var(--line);
|
|
195
|
+
color: var(--muted);
|
|
151
196
|
font-size: 13px;
|
|
152
197
|
}
|
|
153
|
-
footer a {
|
|
154
|
-
|
|
155
|
-
|
|
198
|
+
footer a { color: var(--cyan); text-decoration: none; }
|
|
199
|
+
@media (max-width: 640px) {
|
|
200
|
+
.shell { width: min(calc(100% - 24px), var(--max)); }
|
|
201
|
+
.nav-links a:not(.nav-buy) { display: none; }
|
|
202
|
+
.archive a { flex-direction: column; gap: 4px; }
|
|
156
203
|
}
|
|
157
204
|
</style>
|
|
158
205
|
</head>
|
|
159
206
|
<body>
|
|
160
207
|
<header>
|
|
161
|
-
<div
|
|
162
|
-
class="
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
208
|
+
<div class="shell nav">
|
|
209
|
+
<a class="brand" href="/">
|
|
210
|
+
<img src="/assets/brand/thumbgate-mark-inline-v3.svg" alt="" width="28" height="28" />
|
|
211
|
+
ThumbGate / Blog
|
|
212
|
+
</a>
|
|
213
|
+
<div class="nav-links">
|
|
214
|
+
<a href="/guide">Setup</a>
|
|
215
|
+
<a href="/learn">Learn</a>
|
|
216
|
+
<a href="/guides">Guides</a>
|
|
217
|
+
<a class="nav-buy" href="/#buy">Enterprise gate · $499</a>
|
|
218
|
+
</div>
|
|
171
219
|
</div>
|
|
172
220
|
</header>
|
|
173
221
|
|
|
174
|
-
<
|
|
175
|
-
<
|
|
176
|
-
<div class="
|
|
177
|
-
<
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
Your AI coding agent runs shell commands. It installs packages. It
|
|
181
|
-
modifies files, pushes commits, and calls external APIs — all
|
|
182
|
-
without requiring you to type a single character. That's the pitch.
|
|
183
|
-
That's also the attack surface.
|
|
184
|
-
</p>
|
|
185
|
-
|
|
186
|
-
<h3>The gap is pre-action enforcement</h3>
|
|
187
|
-
<p>
|
|
188
|
-
Static analysis catches known-bad patterns in code you've already
|
|
189
|
-
written. Dependency scanners audit lock files <em>after</em> packages
|
|
190
|
-
are installed. By the time your scanner flags a problem, the agent
|
|
191
|
-
already ran the command.
|
|
192
|
-
</p>
|
|
193
|
-
<p>
|
|
194
|
-
These tools operate on the <em>output</em> of agent actions. You need
|
|
195
|
-
something that operates on the <em>input</em> — before execution.
|
|
196
|
-
</p>
|
|
197
|
-
|
|
198
|
-
<h3>Pre-Action Checks via PreToolUse hooks</h3>
|
|
199
|
-
<p>
|
|
200
|
-
ThumbGate implements pre-action checks via <code>PreToolUse</code> hooks
|
|
201
|
-
— interception points that run before every tool invocation. No
|
|
202
|
-
action reaches execution without passing through the gate. Not Bash
|
|
203
|
-
commands, not file edits, not web fetches.
|
|
204
|
-
</p>
|
|
205
|
-
<p>
|
|
206
|
-
What makes this more than a static blocklist is the
|
|
207
|
-
<strong>feedback-to-enforcement pipeline</strong>. When something goes
|
|
208
|
-
wrong, you record a thumbs-down with context. That failure feeds a
|
|
209
|
-
promotion engine. One failure becomes a warning. Three confirmed
|
|
210
|
-
failures of the same pattern become a hard block.
|
|
211
|
-
</p>
|
|
212
|
-
|
|
213
|
-
<h3>Real examples</h3>
|
|
214
|
-
<ul>
|
|
215
|
-
<li>
|
|
216
|
-
<strong>Force-push to main</strong> — Gate fires and logs;
|
|
217
|
-
the agent is redirected to create a branch and open a PR. Hard-blocked
|
|
218
|
-
under strict enforcement.
|
|
219
|
-
</li>
|
|
220
|
-
<li>
|
|
221
|
-
<strong>Unknown dependency install</strong> — Flagged for human
|
|
222
|
-
review. Agent pauses until you approve.
|
|
223
|
-
</li>
|
|
224
|
-
<li>
|
|
225
|
-
<strong>Destructive shell command</strong> — Hard-blocked by a
|
|
226
|
-
prevention rule learned from a prior incident (destructive deletes are
|
|
227
|
-
a hard-block class by default).
|
|
228
|
-
</li>
|
|
229
|
-
</ul>
|
|
230
|
-
|
|
231
|
-
<h3>Five-minute setup</h3>
|
|
232
|
-
<p>
|
|
233
|
-
<code>npx thumbgate init</code> installs the PreToolUse hook and
|
|
234
|
-
generates a starter gate config. Gates are just JSON — commit
|
|
235
|
-
them, review them, share them across your team.
|
|
236
|
-
</p>
|
|
237
|
-
<p>
|
|
238
|
-
<strong>Human judgment leads. AI supports. ThumbGate enforces it.</strong>
|
|
239
|
-
</p>
|
|
240
|
-
|
|
241
|
-
<a class="cta" href="/guide">Full setup guide →</a>
|
|
242
|
-
</article>
|
|
243
|
-
|
|
244
|
-
<article class="post">
|
|
245
|
-
<div class="post-date">April 1, 2026</div>
|
|
246
|
-
<h2>Dual-Signal Feedback: Why "What Failed" Isn't Enough</h2>
|
|
247
|
-
|
|
248
|
-
<p>
|
|
249
|
-
Standard thumbs-down tells you <em>something</em> went wrong. But was
|
|
250
|
-
it a bad decision (wrong tool) or bad execution (right tool, wrong
|
|
251
|
-
parameters)?
|
|
222
|
+
<main class="shell">
|
|
223
|
+
<section class="hero">
|
|
224
|
+
<div class="eyebrow">Work in the open</div>
|
|
225
|
+
<h1>Engineering notes on the self-improving firewall.</h1>
|
|
226
|
+
<p class="lede">
|
|
227
|
+
How pre-action checks learn from feedback, when outcome metrics get gamed, and how to keep agent control inside your boundary—without a monorepo of product docs on every page.
|
|
252
228
|
</p>
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
>
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
</
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
<
|
|
346
|
-
|
|
347
|
-
<
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
</
|
|
356
|
-
|
|
357
|
-
<
|
|
358
|
-
>
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
</
|
|
373
|
-
|
|
374
|
-
<
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
</
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
<p>
|
|
384
|
-
Every gate block and warning now explains <strong>WHY</strong> it
|
|
385
|
-
fired. When ThumbGate blocks a <code>git push --force</code>, the
|
|
386
|
-
response includes:
|
|
387
|
-
</p>
|
|
388
|
-
<ul>
|
|
389
|
-
<li>Which pattern matched and what it matched against</li>
|
|
390
|
-
<li>Gate identity: ID, action, layer, severity</li>
|
|
391
|
-
<li>Source: manual policy rule vs auto-promoted from feedback</li>
|
|
392
|
-
<li>
|
|
393
|
-
How to bypass: <code>satisfy_gate("pr_threads_checked")</code>
|
|
394
|
-
</li>
|
|
395
|
-
<li>Historical fire count: "blocked 23x, warned 15x"</li>
|
|
396
|
-
</ul>
|
|
397
|
-
<p>
|
|
398
|
-
This was inspired by the neuro-symbolic explainability trend in
|
|
399
|
-
production AI systems. Gates are the symbolic rules; Thompson Sampling
|
|
400
|
-
provides the statistical confidence. The reasoning chain bridges both.
|
|
401
|
-
</p>
|
|
402
|
-
|
|
403
|
-
<h3>Multi-agent org dashboard</h3>
|
|
404
|
-
<p>
|
|
405
|
-
"I'm not going to have 10,000 agents running in the environment that I
|
|
406
|
-
don't know what they're doing." — CIO.com, March 2026
|
|
407
|
-
</p>
|
|
408
|
-
<p>
|
|
409
|
-
The new <code>org_dashboard</code> MCP tool aggregates gate decisions
|
|
410
|
-
across all registered agent sessions. CIOs and team leads see: total
|
|
411
|
-
active agents, org-wide adherence rate, top blocked gates, and risk
|
|
412
|
-
agents (those with the lowest adherence). Free tier shows 3 agents;
|
|
413
|
-
Pro shows the full org.
|
|
414
|
-
</p>
|
|
415
|
-
|
|
416
|
-
<h3>Multi-hop agentic retrieval</h3>
|
|
417
|
-
<p>
|
|
418
|
-
Inspired by Chroma's Context-1,
|
|
419
|
-
<code>constructMultiHopPack</code> iteratively retrieves context,
|
|
420
|
-
prunes weak chunks, refines the query with expansion terms, and checks
|
|
421
|
-
coverage — stopping when the coverage threshold (60%) is met or max
|
|
422
|
-
hops are reached. Each hop is logged.
|
|
423
|
-
</p>
|
|
424
|
-
|
|
425
|
-
<h3>Thompson Sampling calibration</h3>
|
|
426
|
-
<p>
|
|
427
|
-
<code>MIN_SAMPLES_THRESHOLD</code> (5) prevents low-sample
|
|
428
|
-
overconfidence. <code>getCalibration()</code> reports per-category
|
|
429
|
-
confidence tiers: none (0 samples), low (1-4), medium (5-19), high
|
|
430
|
-
(20+). Callers know when to trust the statistical arm vs fall back to
|
|
431
|
-
rules.
|
|
432
|
-
</p>
|
|
433
|
-
|
|
434
|
-
<h3>The funnel fix</h3>
|
|
435
|
-
<p>
|
|
436
|
-
Four touchpoints now put the checkout URL closer to the CLI workflow:
|
|
437
|
-
</p>
|
|
438
|
-
<ul>
|
|
439
|
-
<li>
|
|
440
|
-
<strong>Post-install banner</strong> — prints after
|
|
441
|
-
<code>npm install</code> (stderr, CI-safe)
|
|
442
|
-
</li>
|
|
443
|
-
<li>
|
|
444
|
-
<strong>Free-tier rate limits</strong> — power features capped,
|
|
445
|
-
upgrade URL in error
|
|
446
|
-
</li>
|
|
447
|
-
<li>
|
|
448
|
-
<strong>MCP enforceLimit</strong> — agents surface the checkout URL
|
|
449
|
-
when limits hit
|
|
450
|
-
</li>
|
|
451
|
-
<li>
|
|
452
|
-
<strong>CLI upgrade nudge</strong> — after <code>init</code>,
|
|
453
|
-
<code>capture</code>, <code>stats</code>
|
|
454
|
-
</li>
|
|
455
|
-
</ul>
|
|
456
|
-
<p>
|
|
457
|
-
13 funnel invariant CI tests prevent this blindspot from ever
|
|
458
|
-
regressing.
|
|
459
|
-
</p>
|
|
460
|
-
|
|
461
|
-
<a class="cta" href="https://www.npmjs.com/package/thumbgate"
|
|
462
|
-
>Install v0.8.5 on npm</a
|
|
463
|
-
>
|
|
464
|
-
</article>
|
|
465
|
-
</div>
|
|
229
|
+
</section>
|
|
230
|
+
|
|
231
|
+
<section class="series" aria-labelledby="series-reward">
|
|
232
|
+
<h2 class="series-title" id="series-reward">Process over outcome</h2>
|
|
233
|
+
<div class="cards">
|
|
234
|
+
<a class="card" href="/blog/process-over-outcome-gates">
|
|
235
|
+
<div class="card-meta"><span>2026-07-23</span><span>Self-improving loops</span></div>
|
|
236
|
+
<h2>Process over outcome: gates for self-improving coding loops</h2>
|
|
237
|
+
<p>
|
|
238
|
+
Reward hacks and metric gaming are not only a training problem. When coding agents optimize for “done,” the control layer has to inspect the process—holdouts, proof, and known-bad promotions—before the claim lands.
|
|
239
|
+
</p>
|
|
240
|
+
<span class="arrow">Read the post →</span>
|
|
241
|
+
</a>
|
|
242
|
+
<a class="card" href="/guides/autoresearch-agent-safety">
|
|
243
|
+
<div class="card-meta"><span>Guide</span><span>Autoresearch</span></div>
|
|
244
|
+
<h2>Autoresearch agent safety pack</h2>
|
|
245
|
+
<p>
|
|
246
|
+
Practical gates for holdout tests, proof trails, and unsafe self-improvement claims—the operational twin of the process-over-outcome essay.
|
|
247
|
+
</p>
|
|
248
|
+
<span class="arrow">Open the guide →</span>
|
|
249
|
+
</a>
|
|
250
|
+
</div>
|
|
251
|
+
</section>
|
|
252
|
+
|
|
253
|
+
<section class="series" aria-labelledby="series-boundary">
|
|
254
|
+
<h2 class="series-title" id="series-boundary">Inside your boundary</h2>
|
|
255
|
+
<div class="cards">
|
|
256
|
+
<a class="card" href="/blog/inside-your-boundary">
|
|
257
|
+
<div class="card-meta"><span>2026-07-23</span><span>Enterprise</span></div>
|
|
258
|
+
<h2>AI inside your boundary: governance without relaxing controls</h2>
|
|
259
|
+
<p>
|
|
260
|
+
Local pre-action checks, reviewable lessons, and one managed workflow gate—so teams do not have to trade security exceptions for agent speed.
|
|
261
|
+
</p>
|
|
262
|
+
<span class="arrow">Read the post →</span>
|
|
263
|
+
</a>
|
|
264
|
+
<a class="card" href="/diagnostic">
|
|
265
|
+
<div class="card-meta"><span>Offer</span><span>$499</span></div>
|
|
266
|
+
<h2>Land on one high-stakes workflow</h2>
|
|
267
|
+
<p>
|
|
268
|
+
The enterprise entry motion: one repeated failure, one configured local gate, one regression test, rollout and rollback proof within two business days.
|
|
269
|
+
</p>
|
|
270
|
+
<span class="arrow">See the offer →</span>
|
|
271
|
+
</a>
|
|
272
|
+
</div>
|
|
273
|
+
</section>
|
|
274
|
+
|
|
275
|
+
<section class="series" aria-labelledby="series-runtime">
|
|
276
|
+
<h2 class="series-title" id="series-runtime">Runtime enforcement</h2>
|
|
277
|
+
<div class="cards">
|
|
278
|
+
<a class="card" href="/learn/feedback-loop-vs-decision-layer">
|
|
279
|
+
<div class="card-meta"><span>Learn</span><span>Canonical loop</span></div>
|
|
280
|
+
<h2>Feedback loop vs decision layer</h2>
|
|
281
|
+
<p>
|
|
282
|
+
Capture → remember → re-rank → gate. Why memory alone is not enforcement, and how the decision layer stays inspectable.
|
|
283
|
+
</p>
|
|
284
|
+
<span class="arrow">Read →</span>
|
|
285
|
+
</a>
|
|
286
|
+
<a class="card" href="/guides/pretooluse-hooks-vs-advisory-prompt-rules">
|
|
287
|
+
<div class="card-meta"><span>Guide</span><span>PreToolUse</span></div>
|
|
288
|
+
<h2>PreToolUse hooks vs advisory prompt rules</h2>
|
|
289
|
+
<p>
|
|
290
|
+
Prompt rules are suggestions. Pre-action checks fire before the tool call and leave a decision trail.
|
|
291
|
+
</p>
|
|
292
|
+
<span class="arrow">Read →</span>
|
|
293
|
+
</a>
|
|
294
|
+
</div>
|
|
295
|
+
</section>
|
|
296
|
+
|
|
297
|
+
<section class="archive" id="archive">
|
|
298
|
+
<h2>Earlier notes</h2>
|
|
299
|
+
<div class="archive-list">
|
|
300
|
+
<a id="supply-chain" href="#supply-chain-body">
|
|
301
|
+
Your AI agent is a supply chain attack surface. Here's how to gate it.
|
|
302
|
+
<span>2026-04-10</span>
|
|
303
|
+
</a>
|
|
304
|
+
<a href="#dual-signal">
|
|
305
|
+
Dual-signal feedback: why “what failed” isn’t enough
|
|
306
|
+
<span>2026-04-01</span>
|
|
307
|
+
</a>
|
|
308
|
+
<a id="claude-code-leak" href="#claude-leak-body">
|
|
309
|
+
The Claude Code leak proves why pre-action checks matter
|
|
310
|
+
<span>2026-04-01</span>
|
|
311
|
+
</a>
|
|
312
|
+
<a href="#v085">
|
|
313
|
+
v0.8.5 release notes: reasoning chains and funnel fixes
|
|
314
|
+
<span>2026-03-31</span>
|
|
315
|
+
</a>
|
|
316
|
+
</div>
|
|
317
|
+
</section>
|
|
318
|
+
|
|
319
|
+
<!-- Full text retained for existing deep links and SEO; primary UX is the index above. -->
|
|
320
|
+
<section class="archive" style="border-top:0;padding-top:0;">
|
|
321
|
+
<article class="card" id="supply-chain-body" style="margin-bottom:12px;">
|
|
322
|
+
<div class="card-meta"><span>2026-04-10</span><span>Archive</span></div>
|
|
323
|
+
<h2>Your AI agent is a supply chain attack surface. Here's how to gate it.</h2>
|
|
324
|
+
<p>
|
|
325
|
+
Your AI coding agent runs shell commands, installs packages, modifies files, and calls external APIs. Static scanners audit output after the fact. ThumbGate runs pre-action checks via PreToolUse hooks so the action is inspected before execution. Thumbs-down feedback feeds a promotion path: repeated patterns can become warning or blocking gates.
|
|
326
|
+
</p>
|
|
327
|
+
<p style="margin-top:12px;color:var(--muted);">
|
|
328
|
+
Start with <code style="color:var(--cyan);">npx thumbgate init</code>. Gates are reviewable local policy—commit them, share them, tighten them from real incidents.
|
|
329
|
+
</p>
|
|
330
|
+
<a class="arrow" href="/guide">Full setup guide →</a>
|
|
331
|
+
</article>
|
|
332
|
+
|
|
333
|
+
<article class="card" id="dual-signal" style="margin-bottom:12px;">
|
|
334
|
+
<div class="card-meta"><span>2026-04-01</span><span>Archive</span></div>
|
|
335
|
+
<h2>Dual-signal feedback: why “what failed” isn’t enough</h2>
|
|
336
|
+
<p>
|
|
337
|
+
Optional <code style="color:var(--cyan);">failureType</code> on capture separates wrong decision from bad execution so reliability signals can diverge by dimension. Backward compatible with plain thumbs-down.
|
|
338
|
+
</p>
|
|
339
|
+
</article>
|
|
340
|
+
|
|
341
|
+
<article class="card" id="claude-leak-body" style="margin-bottom:12px;">
|
|
342
|
+
<div class="card-meta"><span>2026-04-01</span><span>Archive</span></div>
|
|
343
|
+
<h2>The Claude Code leak proves why pre-action checks matter</h2>
|
|
344
|
+
<p>
|
|
345
|
+
Permissions, hooks, retry loops, and local memory are product surfaces. Treat them as governed workflow boundaries. ThumbGate adds feedback-driven pre-action checks so repeated mistakes can be flagged—and catastrophic classes hard-blocked—before the next tool call.
|
|
346
|
+
</p>
|
|
347
|
+
<a class="arrow" href="https://www.npmjs.com/package/thumbgate">Install ThumbGate →</a>
|
|
348
|
+
</article>
|
|
349
|
+
|
|
350
|
+
<article class="card" id="v085">
|
|
351
|
+
<div class="card-meta"><span>2026-03-31</span><span>Archive</span></div>
|
|
352
|
+
<h2>v0.8.5: gate reasoning chains and funnel fixes</h2>
|
|
353
|
+
<p>
|
|
354
|
+
Blocks and warnings explain which pattern matched, the gate identity, and whether the source was manual policy or auto-promotion. CLI-first users get upgrade paths without relying only on the website checkout page.
|
|
355
|
+
</p>
|
|
356
|
+
</article>
|
|
357
|
+
</section>
|
|
358
|
+
</main>
|
|
466
359
|
|
|
467
360
|
<footer>
|
|
468
|
-
<div class="
|
|
361
|
+
<div class="shell">
|
|
469
362
|
<a href="/">Home</a> ·
|
|
470
|
-
<a href="
|
|
471
|
-
<a href="
|
|
363
|
+
<a href="/guide">Setup</a> ·
|
|
364
|
+
<a href="/diagnostic">$499 workflow gate</a> ·
|
|
365
|
+
<a href="https://github.com/IgorGanapolsky/ThumbGate">GitHub</a>
|
|
472
366
|
<br /><br />© 2026 ThumbGate · MIT License
|
|
473
367
|
</div>
|
|
474
368
|
</footer>
|