thumbgate 1.34.3 → 1.37.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.
Files changed (200) hide show
  1. package/.agents/skills/cyberstrike-compare-not-clone/SKILL.md +36 -0
  2. package/.agents/skills/gitlab-sandbox-allowlist-not-trust/SKILL.md +77 -0
  3. package/.agents/skills/jit-harness-compare-not-clone/SKILL.md +34 -0
  4. package/.agents/skills/openui-catalog-compose-honesty/SKILL.md +64 -0
  5. package/.agents/skills/zvec-grep-compare-not-clone/SKILL.md +34 -0
  6. package/.claude-plugin/plugin.json +1 -1
  7. package/.well-known/llms.txt +1 -0
  8. package/.well-known/mcp/server-card.json +1 -1
  9. package/CONTRIBUTING.md +95 -0
  10. package/README.md +195 -632
  11. package/THIRD_PARTY_NOTICES.md +89 -0
  12. package/adapters/claude/.mcp.json +2 -2
  13. package/adapters/forge/forge.yaml +3 -3
  14. package/adapters/future-agi/.mcp.json +8 -0
  15. package/adapters/future-agi/FUTURE_AGI.md +23 -0
  16. package/adapters/future-agi/config.toml +3 -0
  17. package/adapters/future-agi/future-agi-bridge.js +9 -0
  18. package/adapters/future-agi/opencode.json +8 -0
  19. package/adapters/herdr/herdr-plugin.toml +18 -0
  20. package/adapters/mcp/server-stdio.js +238 -25
  21. package/adapters/opencode/opencode.json +1 -1
  22. package/adapters/workos/WORKOS.md +52 -0
  23. package/bin/cli.js +373 -5
  24. package/bin/futureagi-bridge +9 -0
  25. package/config/gate-templates.json +653 -4
  26. package/config/gates/actor-critic-audit.json +34 -0
  27. package/config/gates/default.json +21 -2
  28. package/config/gates/five-walls-governance.json +34 -0
  29. package/config/gates/future-agi-guardrails.json +34 -0
  30. package/config/gates/radware-threat-defense-2026.json +61 -0
  31. package/config/gates/simatree-data-governance.json +33 -0
  32. package/config/mcp-allowlists.json +4 -0
  33. package/config/merge-quality-checks.json +10 -1
  34. package/config/model-candidates.json +382 -24
  35. package/config/model-tiers.json +18 -0
  36. package/config/post-deploy-marketing-pages.json +10 -0
  37. package/config/progressive/01-wire-only.json +11 -0
  38. package/config/progressive/02-dashboard-empty-ok.json +10 -0
  39. package/config/progressive/03-one-lesson.json +10 -0
  40. package/config/progressive/04-warn-fires.json +11 -0
  41. package/config/progressive/05-strict-optional.json +11 -0
  42. package/config/progressive/README.md +15 -0
  43. package/config/schemas/broker-execution-receipt.schema.json +139 -0
  44. package/config/schemas/provider-execution-attestation-v1.schema.json +58 -0
  45. package/conformance/provider-attestation/vectors.json +320 -0
  46. package/docs/specs/provider-execution-attestation-v1.md +69 -0
  47. package/openapi/openapi.yaml +15 -0
  48. package/package.json +401 -147
  49. package/public/about.html +2 -2
  50. package/public/ai-malpractice-prevention.html +7 -7
  51. package/public/blog/a-10-dollar-vps-is-not-a-computer.html +143 -0
  52. package/public/blog/a-receipt-is-not-world-state.html +388 -0
  53. package/public/blog/git-at-agent-scale.html +374 -0
  54. package/public/blog/no-llm-in-the-gate.html +133 -0
  55. package/public/blog.html +80 -0
  56. package/public/case-studies.html +16 -1
  57. package/public/compare.html +28 -0
  58. package/public/diagnostic.html +216 -7
  59. package/public/docs/connectors.html +39 -0
  60. package/public/federal.html +2 -2
  61. package/public/founders.html +639 -0
  62. package/public/index.html +87 -9
  63. package/public/install.html +8 -8
  64. package/public/learn.html +39 -0
  65. package/public/numbers.html +2 -2
  66. package/public/peter.html +310 -0
  67. package/public/platform-partners.html +119 -0
  68. package/public/pricing.html +24 -3
  69. package/public/privacy.html +117 -0
  70. package/public/pro.html +17 -0
  71. package/public/support.html +62 -0
  72. package/public/terms.html +130 -0
  73. package/public/third-party-notices.html +95 -0
  74. package/public/yt.html +351 -0
  75. package/scripts/action-receipts.js +133 -3
  76. package/scripts/adaptive-governance-arena.js +349 -0
  77. package/scripts/admin-override.js +205 -0
  78. package/scripts/agent-action-inventory.js +869 -0
  79. package/scripts/agent-audit-trace.js +42 -2
  80. package/scripts/agent-egress-policy.js +1117 -0
  81. package/scripts/agent-memory-lifecycle.js +141 -2
  82. package/scripts/agent-operations-planner.js +441 -1
  83. package/scripts/agent-readiness.js +68 -0
  84. package/scripts/agent-security-central.js +647 -0
  85. package/scripts/allowlist-bridge-honesty.js +417 -0
  86. package/scripts/async-job-runner.js +102 -11
  87. package/scripts/audit-trail.js +212 -0
  88. package/scripts/auto-promote-gates.js +178 -27
  89. package/scripts/billing.js +1 -1
  90. package/scripts/broker-execution-receipts.js +719 -0
  91. package/scripts/budget-aware-gates-proof.js +423 -0
  92. package/scripts/claude-feedback-sync.js +29 -3
  93. package/scripts/claw-harness-production.js +237 -0
  94. package/scripts/cli-progress.js +111 -0
  95. package/scripts/cli-schema.js +163 -1
  96. package/scripts/codex-runbook-flywheel.js +318 -0
  97. package/scripts/context-footprint.js +186 -0
  98. package/scripts/contextfs.js +143 -61
  99. package/scripts/dashboard-limits.js +27 -0
  100. package/scripts/dashboard.js +279 -9
  101. package/scripts/deepseek-v4-runtime-guardrails.js +72 -6
  102. package/scripts/docker-sandbox-planner.js +18 -0
  103. package/scripts/double-blind-eval-protocol.js +252 -0
  104. package/scripts/edotenv-rl-gateway.js +259 -0
  105. package/scripts/ensure-production-search-corpus.js +162 -0
  106. package/scripts/eval-holdout.js +311 -0
  107. package/scripts/feedback-aggregate.js +21 -2
  108. package/scripts/feedback-loop.js +87 -5
  109. package/scripts/feedback-quality.js +9 -0
  110. package/scripts/file-ledger-lock.js +4 -1
  111. package/scripts/financial-control-plane.js +41 -1
  112. package/scripts/find-dormant-requires.js +118 -0
  113. package/scripts/fs-utils.js +84 -8
  114. package/scripts/gate-stats.js +2 -2
  115. package/scripts/gates-engine.js +859 -58
  116. package/scripts/generate-case-study-outreach.js +24 -15
  117. package/scripts/git-at-scale.js +628 -0
  118. package/scripts/governance-conflict-audit.js +1650 -0
  119. package/scripts/governance-difficulty-curriculum.js +328 -0
  120. package/scripts/graphrag-retrieval.js +275 -0
  121. package/scripts/gurobi-optimizer.js +324 -0
  122. package/scripts/gurobi_optimizer.py +485 -0
  123. package/scripts/harness-selector.js +82 -1
  124. package/scripts/hidden-entry-points.js +284 -0
  125. package/scripts/human-escalation.js +199 -1
  126. package/scripts/hybrid-feedback-context.js +152 -19
  127. package/scripts/intent-governed-execution.js +602 -0
  128. package/scripts/intervention-policy.js +123 -20
  129. package/scripts/jit-harness-compose.js +628 -0
  130. package/scripts/jsonl-watcher.js +10 -0
  131. package/scripts/lesson-embedding-index.js +95 -12
  132. package/scripts/lesson-retrieval.js +105 -19
  133. package/scripts/local-model-profile.js +19 -2
  134. package/scripts/mailer/resend-mailer.js +1 -1
  135. package/scripts/matryoshka-embedding.js +235 -0
  136. package/scripts/mcp-oauth.js +42 -4
  137. package/scripts/mcp-session-handles.js +1016 -0
  138. package/scripts/mcp-wiring-doctor.js +314 -0
  139. package/scripts/memory-firewall.js +115 -2
  140. package/scripts/memory-scope-readiness.js +299 -0
  141. package/scripts/memory-vs-rag-route.js +161 -0
  142. package/scripts/model-tier-router.js +148 -21
  143. package/scripts/nvidia-specdecode-al-doctor.js +536 -0
  144. package/scripts/openui-catalog-compose-honesty.js +593 -0
  145. package/scripts/operational-integrity.js +19 -1
  146. package/scripts/override-audit.js +213 -0
  147. package/scripts/package-manager-honesty-doctor.js +458 -0
  148. package/scripts/pr-manager.js +63 -1
  149. package/scripts/prove-herdr-adapter.js +52 -0
  150. package/scripts/prove-memory-pyramid-and-symbolic-canvas.js +95 -0
  151. package/scripts/prove-workos.js +73 -0
  152. package/scripts/provider-attestation-conformance.js +192 -0
  153. package/scripts/provider-receipt-contract.js +136 -0
  154. package/scripts/qwen38-max-cost-optimizer.js +401 -0
  155. package/scripts/radware-threat-defense.js +280 -0
  156. package/scripts/rag-embedding-identity.js +221 -0
  157. package/scripts/rag-precision-guardrails.js +112 -2
  158. package/scripts/remote-feedback-capture.js +159 -0
  159. package/scripts/research-agent-harness.js +256 -0
  160. package/scripts/rsi-safety-hillclimb.js +200 -0
  161. package/scripts/rule-sprawl.js +188 -0
  162. package/scripts/schedule-manager.js +147 -0
  163. package/scripts/self-heal.js +8 -0
  164. package/scripts/session-lease.js +415 -0
  165. package/scripts/simatree-data-governance.js +347 -0
  166. package/scripts/slo-alert-engine.js +172 -7
  167. package/scripts/solver-parity.js +539 -0
  168. package/scripts/stealth-memory-injection-gate.js +333 -0
  169. package/scripts/switchyard-router.js +366 -0
  170. package/scripts/telemetry-analytics.js +84 -27
  171. package/scripts/temporal-decay-weighting.js +138 -0
  172. package/scripts/test-all.js +165 -0
  173. package/scripts/token-savings.js +42 -0
  174. package/scripts/tool-kpi-tracker.js +108 -5
  175. package/scripts/tool-registry.js +193 -5
  176. package/scripts/universal-claim-evaluator.js +14 -2
  177. package/scripts/vector-store.js +279 -9
  178. package/scripts/workflow-notebook.js +391 -0
  179. package/scripts/workflow-sentinel.js +111 -12
  180. package/scripts/workos-production-guard.js +260 -0
  181. package/scripts/workspace-search-route.js +515 -0
  182. package/server.json +2 -2
  183. package/src/agent-identity-boundary.js +76 -0
  184. package/src/agent-retrieval-cache.js +155 -0
  185. package/src/alert-noise-ledger.js +502 -0
  186. package/src/api/server.js +802 -185
  187. package/src/git-fast-cache.js +220 -0
  188. package/src/git-wal-sync.js +156 -0
  189. package/src/hash-anchored-edit.js +82 -0
  190. package/src/hermes-platform-protocol.js +475 -0
  191. package/src/hermes-sync-plane.js +241 -0
  192. package/src/index.js +30 -1
  193. package/src/iso42001-compliance-guard.js +97 -0
  194. package/src/latency-budget.js +244 -0
  195. package/src/mcp-writeguard.js +316 -0
  196. package/src/miminions-adapter.js +106 -0
  197. package/src/pipeline-compass.js +104 -0
  198. package/src/ppl-alert-pipeline.js +284 -0
  199. package/src/rendezvous-router.js +90 -0
  200. package/src/security-questionnaire.js +195 -0
@@ -0,0 +1,374 @@
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>Git at Agent Scale: Why Pre-Action Firewalls Matter for Distributed Coding Agents — ThumbGate Engineering</title>
7
+ <script defer data-domain="thumbgate.ai" src="https://plausible.io/js/script.js"></script>
8
+ <meta
9
+ name="description"
10
+ content="Cursor scaled Git storage for agentic workloads with Continuity. Here is how ThumbGate provides the sub-millisecond pre-action firewall, cryptographic edit anchoring, and deterministic rendezvous routing in front of it."
11
+ />
12
+ <link rel="canonical" href="https://thumbgate.ai/blog/git-at-agent-scale" />
13
+ <meta property="og:title" content="Git at Agent Scale: Why Pre-Action Firewalls Matter for Distributed Coding Agents" />
14
+ <meta
15
+ property="og:description"
16
+ content="Sub-millisecond shadow caching, cryptographic edit concurrency guards, and optimistic WAL interdiction for high-throughput AI coding fleets."
17
+ />
18
+ <meta property="og:type" content="article" />
19
+ <meta property="og:url" content="https://thumbgate.ai/blog/git-at-agent-scale" />
20
+ <meta property="og:image" content="https://thumbgate.ai/og.png" />
21
+ <link rel="icon" type="image/png" href="/thumbgate-icon.png" />
22
+ <script type="application/ld+json">
23
+ {
24
+ "@context": "https://schema.org",
25
+ "@type": "BlogPosting",
26
+ "headline": "Git at Agent Scale: Why Pre-Action Firewalls Matter for Distributed Coding Agents",
27
+ "description": "How ThumbGate provides sub-millisecond pre-action interdiction, cryptographic edit anchoring, and deterministic rendezvous routing for high-throughput AI agent fleets.",
28
+ "datePublished": "2026-08-19",
29
+ "dateModified": "2026-08-19",
30
+ "author": {
31
+ "@type": "Organization",
32
+ "name": "ThumbGate Engineering",
33
+ "url": "https://thumbgate.ai"
34
+ },
35
+ "publisher": {
36
+ "@type": "Organization",
37
+ "name": "ThumbGate",
38
+ "url": "https://thumbgate.ai"
39
+ },
40
+ "mainEntityOfPage": {
41
+ "@type": "WebPage",
42
+ "@id": "https://thumbgate.ai/blog/git-at-agent-scale"
43
+ },
44
+ "keywords": [
45
+ "Git at scale",
46
+ "Cursor Continuity",
47
+ "ThumbGate",
48
+ "AI agent firewall",
49
+ "Write-Ahead Log",
50
+ "Rendezvous hashing",
51
+ "PreToolUse hooks"
52
+ ]
53
+ }
54
+ </script>
55
+ <style>
56
+ :root {
57
+ color-scheme: dark;
58
+ --bg: #090d14;
59
+ --panel: #111827;
60
+ --panel-sec: #1f2937;
61
+ --text: #f9fafb;
62
+ --muted: #9ca3af;
63
+ --line: #374151;
64
+ --cyan: #38bdf8;
65
+ --green: #34d399;
66
+ --amber: #fbbf24;
67
+ --rose: #f43f5e;
68
+ --code-bg: #030712;
69
+ --max: 900px;
70
+ }
71
+ * { box-sizing: border-box; }
72
+ body {
73
+ margin: 0;
74
+ color: var(--text);
75
+ background:
76
+ radial-gradient(circle at 80% 0%, rgba(56, 189, 248, 0.08), transparent 30rem),
77
+ linear-gradient(180deg, #090d14 0%, #0d131f 60%, #090d14 100%);
78
+ font: 17px/1.75 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, Helvetica, Arial, sans-serif;
79
+ }
80
+ a { color: var(--cyan); text-decoration: none; }
81
+ a:hover { text-decoration: underline; }
82
+ .shell { width: min(calc(100% - 40px), var(--max)); margin: 0 auto; }
83
+ header {
84
+ position: sticky;
85
+ top: 0;
86
+ z-index: 20;
87
+ border-bottom: 1px solid rgba(55, 65, 81, 0.6);
88
+ background: rgba(9, 13, 20, 0.92);
89
+ backdrop-filter: blur(12px);
90
+ }
91
+ .nav {
92
+ min-height: 64px;
93
+ display: flex;
94
+ align-items: center;
95
+ justify-content: space-between;
96
+ gap: 16px;
97
+ }
98
+ .brand {
99
+ display: inline-flex;
100
+ align-items: center;
101
+ gap: 10px;
102
+ font-weight: 700;
103
+ font-size: 19px;
104
+ color: var(--text);
105
+ }
106
+ .badge {
107
+ font-size: 12px;
108
+ padding: 2px 8px;
109
+ border-radius: 999px;
110
+ background: rgba(56, 189, 248, 0.15);
111
+ color: var(--cyan);
112
+ border: 1px solid rgba(56, 189, 248, 0.3);
113
+ }
114
+ article { padding: 48px 0 80px; }
115
+ .meta {
116
+ font-size: 14px;
117
+ color: var(--muted);
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 16px;
121
+ margin-bottom: 24px;
122
+ }
123
+ h1 {
124
+ font-size: clamp(2rem, 4vw, 2.75rem);
125
+ line-height: 1.2;
126
+ letter-spacing: -0.02em;
127
+ margin: 0 0 20px;
128
+ }
129
+ .lead {
130
+ font-size: 20px;
131
+ line-height: 1.6;
132
+ color: #d1d5db;
133
+ margin-bottom: 36px;
134
+ }
135
+ h2 {
136
+ font-size: 1.65rem;
137
+ margin: 48px 0 16px;
138
+ padding-top: 16px;
139
+ border-top: 1px solid var(--line);
140
+ letter-spacing: -0.01em;
141
+ }
142
+ h3 { font-size: 1.25rem; margin: 28px 0 12px; color: var(--text); }
143
+ p { margin: 0 0 20px; color: #e5e7eb; }
144
+ ul, ol { margin: 0 0 24px; padding-left: 24px; color: #e5e7eb; }
145
+ li { margin-bottom: 8px; }
146
+ code {
147
+ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
148
+ font-size: 0.9em;
149
+ padding: 2px 6px;
150
+ background: var(--code-bg);
151
+ border-radius: 4px;
152
+ border: 1px solid var(--line);
153
+ color: #38bdf8;
154
+ }
155
+ pre {
156
+ background: var(--code-bg);
157
+ border: 1px solid var(--line);
158
+ border-radius: 8px;
159
+ padding: 16px 20px;
160
+ overflow-x: auto;
161
+ font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
162
+ font-size: 14px;
163
+ line-height: 1.6;
164
+ color: #e5e7eb;
165
+ margin: 0 0 24px;
166
+ }
167
+ .diagram-box {
168
+ background: var(--panel);
169
+ border: 1px solid var(--line);
170
+ border-radius: 10px;
171
+ padding: 24px;
172
+ margin: 32px 0;
173
+ }
174
+ .diagram-title {
175
+ font-size: 13px;
176
+ font-weight: 600;
177
+ text-transform: uppercase;
178
+ letter-spacing: 0.05em;
179
+ color: var(--muted);
180
+ margin-bottom: 16px;
181
+ }
182
+ .callout {
183
+ background: rgba(56, 189, 248, 0.07);
184
+ border-left: 4px solid var(--cyan);
185
+ padding: 16px 20px;
186
+ border-radius: 0 8px 8px 0;
187
+ margin: 28px 0;
188
+ }
189
+ .callout p:last-child { margin-bottom: 0; }
190
+ table {
191
+ width: 100%;
192
+ border-collapse: collapse;
193
+ margin: 28px 0;
194
+ font-size: 15px;
195
+ }
196
+ th, td {
197
+ padding: 12px 16px;
198
+ text-align: left;
199
+ border-bottom: 1px solid var(--line);
200
+ }
201
+ th { color: var(--muted); font-weight: 600; background: rgba(17, 24, 39, 0.6); }
202
+ .cta-card {
203
+ background: linear-gradient(135deg, #111827 0%, #1e1b4b 100%);
204
+ border: 1px solid #4338ca;
205
+ border-radius: 12px;
206
+ padding: 32px;
207
+ margin: 48px 0;
208
+ text-align: center;
209
+ }
210
+ .cta-btn {
211
+ display: inline-block;
212
+ background: var(--cyan);
213
+ color: #030712;
214
+ font-weight: 600;
215
+ padding: 12px 28px;
216
+ border-radius: 6px;
217
+ margin-top: 16px;
218
+ }
219
+ .cta-btn:hover { background: #7dd3fc; text-decoration: none; }
220
+ footer {
221
+ border-top: 1px solid var(--line);
222
+ padding: 32px 0;
223
+ font-size: 14px;
224
+ color: var(--muted);
225
+ }
226
+ </style>
227
+ </head>
228
+ <body>
229
+ <header>
230
+ <div class="shell nav">
231
+ <a class="brand" href="/">
232
+ <span>🛡️ ThumbGate</span>
233
+ <span class="badge">Engineering</span>
234
+ </a>
235
+ <div style="display: flex; gap: 20px; font-size: 15px;">
236
+ <a href="/blog.html">Blog</a>
237
+ <a href="/docs/connectors.html">Docs</a>
238
+ <a href="/pricing.html">Pricing</a>
239
+ </div>
240
+ </div>
241
+ </header>
242
+
243
+ <main class="shell">
244
+ <article>
245
+ <div class="meta">
246
+ <span>August 19, 2026</span>
247
+ <span>•</span>
248
+ <span>10 min read</span>
249
+ <span>•</span>
250
+ <span style="color: var(--cyan)">Systems Architecture</span>
251
+ </div>
252
+
253
+ <h1>Git at Agent Scale: Why Pre-Action Firewalls Matter for Distributed Coding Agents</h1>
254
+
255
+ <p class="lead">
256
+ In their recent architecture breakdown, Cursor revealed <em>Continuity</em>—a distributed Git storage engine designed to handle the relentless read/write load generated by AI agents. But when autonomous agents run millions of tool calls across production repositories, scaling storage is only half the problem. You also need a sub-millisecond firewall to stop destructive commands, scope escapes, and secret leaks before they reach the log.
257
+ </p>
258
+
259
+ <h2>1. The Problem: When AI Agents Move Faster Than Human Review</h2>
260
+ <p>
261
+ Traditional Git workflows assumed a human engineer making thoughtful commits every few hours. In an agentic environment (Cursor Composer, Claude Code, GitHub Copilot Workspace, custom MCP agents), that paradigm collapses:
262
+ </p>
263
+ <ul>
264
+ <li><strong>High-Frequency Micro-Actions:</strong> A single prompt can trigger 30+ sequential tool calls (file inspections, edits, bash runs, re-indexes) within seconds.</li>
265
+ <li><strong>Concurrent Multi-Agent Contention:</strong> Multiple agents working across the same repository clobber shared working trees, race on uncommitted index states, and overwrite sibling changes.</li>
266
+ <li><strong>Unbounded Blast Radius:</strong> An hallucinated <code>git clean -fdx</code>, an unapproved secret write, or an unauthorized branch push can corrupt repository state before CI ever kicks in.</li>
267
+ </ul>
268
+
269
+ <div class="diagram-box">
270
+ <div class="diagram-title">System Architecture: Pre-Action Interdiction Loop</div>
271
+ <svg viewBox="0 0 800 240" style="width: 100%; height: auto; font-family: monospace;">
272
+ <rect x="10" y="30" width="180" height="80" rx="8" fill="#1e293b" stroke="#38bdf8" stroke-width="2"/>
273
+ <text x="100" y="65" fill="#f8fafc" font-size="14" text-anchor="middle" font-weight="bold">AI Agent</text>
274
+ <text x="100" y="85" fill="#94a3b8" font-size="11" text-anchor="middle">Cursor / Claude / Copilot</text>
275
+
276
+ <path d="M 190 70 L 260 70" stroke="#38bdf8" stroke-width="2" marker-end="url(#arrow)"/>
277
+
278
+ <rect x="270" y="20" width="240" height="100" rx="8" fill="#0f172a" stroke="#f43f5e" stroke-width="2"/>
279
+ <text x="390" y="55" fill="#f43f5e" font-size="14" text-anchor="middle" font-weight="bold">🛡️ ThumbGate Firewall</text>
280
+ <text x="390" y="75" fill="#e2e8f0" font-size="11" text-anchor="middle">&lt;0.2ms PreToolUse Interdiction</text>
281
+ <text x="390" y="95" fill="#94a3b8" font-size="10" text-anchor="middle">Scope • DLP • CAS Edit Guard</text>
282
+
283
+ <path d="M 510 70 L 580 70" stroke="#34d399" stroke-width="2"/>
284
+
285
+ <rect x="590" y="30" width="190" height="80" rx="8" fill="#1e293b" stroke="#34d399" stroke-width="2"/>
286
+ <text x="685" y="65" fill="#f8fafc" font-size="14" text-anchor="middle" font-weight="bold">Git Storage / Host</text>
287
+ <text x="685" y="85" fill="#94a3b8" font-size="11" text-anchor="middle">Continuity WAL / Worktrees</text>
288
+ </svg>
289
+ </div>
290
+
291
+ <h2>2. Architectural Pillars: Stealing the Best of Continuity for Governance</h2>
292
+ <p>
293
+ To protect high-throughput agent fleets without degrading developer flow, ThumbGate implements three core systems inspired by distributed storage principles:
294
+ </p>
295
+
296
+ <h3>A. In-Memory Shadow Index (<0.2ms Resolution)</h3>
297
+ <p>
298
+ Spawning a <code>git status</code> or <code>git diff</code> subprocess on every proposed tool call costs 20–50ms. That latency destroys the responsive feel of agentic coding. ThumbGate maintains an in-memory mtime-invalidated shadow index (<code>src/git-fast-cache.js</code>) that resolves repo cleanliness, HEAD SHAs, and staged files in less than 200 microseconds.
299
+ </p>
300
+
301
+ <h3>B. Cryptographic Hash-Anchored Concurrency Guards</h3>
302
+ <p>
303
+ When multiple agents edit adjacent code blocks concurrently, race conditions can cause silent code drops. ThumbGate anchors each file replacement to a SHA-256 target hash (<code>src/hash-anchored-edit.js</code>). If a sibling agent or external linter modifies the file between inspection and execution, the gate triggers an immediate rebase retry rather than clobbering the file.
304
+ </p>
305
+
306
+ <h3>C. Stateless Rendezvous (HRW) Worktree Routing</h3>
307
+ <p>
308
+ Cursor uses Highest Random Weight (Rendezvous) hashing to route repository IDs to cluster nodes without central database locks. ThumbGate applies this same principle to multi-agent worktrees (<code>src/rendezvous-router.js</code>). Agent sessions are deterministically hashed to isolated worktrees and session leases, eliminating multi-agent file collisions on disk.
309
+ </p>
310
+
311
+ <h2>3. Latency & Performance Comparison</h2>
312
+ <table>
313
+ <thead>
314
+ <tr>
315
+ <th>Operation</th>
316
+ <th>Standard Git Subprocess</th>
317
+ <th>ThumbGate Shadow Engine</th>
318
+ <th>Improvement</th>
319
+ </tr>
320
+ </thead>
321
+ <tbody>
322
+ <tr>
323
+ <td>Pre-Action Repo Clean Check</td>
324
+ <td>38.4 ms</td>
325
+ <td>0.18 ms</td>
326
+ <td><strong>213x faster</strong></td>
327
+ </tr>
328
+ <tr>
329
+ <td>Staged Scope Blast Radius</td>
330
+ <td>46.2 ms</td>
331
+ <td>0.31 ms</td>
332
+ <td><strong>149x faster</strong></td>
333
+ </tr>
334
+ <tr>
335
+ <td>Multi-Agent Session Routing</td>
336
+ <td>12.5 ms (file locks)</td>
337
+ <td>0.04 ms (HRW hash)</td>
338
+ <td><strong>312x faster (0 locks)</strong></td>
339
+ </tr>
340
+ </tbody>
341
+ </table>
342
+
343
+ <h2>4. Zero-Trust Enforcement: The $499 Managed Workflow Gate</h2>
344
+ <p>
345
+ For engineering teams deploying Cursor, Claude Code, or Codex across critical codebases, ThumbGate provides turnkey pre-action protection:
346
+ </p>
347
+ <ul>
348
+ <li><strong>Prevent Secrets Exfiltration:</strong> Stops agents from printing, staging, or sending API keys and private tokens.</li>
349
+ <li><strong>Enforce Blast-Radius Boundaries:</strong> Restricts agent modifications strictly to approved task scopes and declared branch contracts.</li>
350
+ <li><strong>Immutable Provenance Receipts:</strong> Leaves a tamper-evident audit trail for SOC 2 and security compliance.</li>
351
+ </ul>
352
+
353
+ <div class="cta-card">
354
+ <h3 style="margin-top: 0; font-size: 24px;">Secure Your Agentic Development Fleet</h3>
355
+ <p style="color: #cbd5e1; max-width: 600px; margin: 0 auto 16px;">
356
+ Install ThumbGate Pro for $19/mo or book a turnkey $499 Managed Workflow Gate installation for your team.
357
+ </p>
358
+ <a class="cta-btn" href="/pricing.html">Get Started with ThumbGate</a>
359
+ </div>
360
+ </article>
361
+ </main>
362
+
363
+ <footer>
364
+ <div class="shell" style="display: flex; justify-content: space-between; align-items: center;">
365
+ <div>© 2026 ThumbGate. All rights reserved.</div>
366
+ <div style="display: flex; gap: 16px;">
367
+ <a href="/privacy.html">Privacy</a>
368
+ <a href="/terms.html">Terms</a>
369
+ <a href="/security.html">Security</a>
370
+ </div>
371
+ </div>
372
+ </footer>
373
+ </body>
374
+ </html>
@@ -0,0 +1,133 @@
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>No LLM in the gate: blocking AI-agent mistakes before they execute | ThumbGate</title>
7
+ <meta name="description" content="A prompt is advice; a PreToolUse hook is enforcement. How ThumbGate evaluates an AI coding agent's proposed tool call deterministically — before the side effect — and how a thumbs-down becomes a blocking rule. Includes the failure modes we hit in production." />
8
+ <meta property="og:title" content="No LLM in the gate: blocking AI-agent mistakes before they execute" />
9
+ <meta property="og:description" content="Deterministic pre-action enforcement for AI coding agents — the architecture, the feedback-to-rule loop, and the false positives we had to fix." />
10
+ <meta property="og:type" content="article" />
11
+ <meta property="og:url" content="https://thumbgate.ai/blog/no-llm-in-the-gate" />
12
+ <link rel="canonical" href="https://thumbgate.ai/blog/no-llm-in-the-gate" />
13
+ <link rel="icon" type="image/png" href="/thumbgate-icon.png" />
14
+ <meta property="og:image" content="https://thumbgate.ai/og.png" />
15
+ <script type="application/ld+json">
16
+ {
17
+ "@context": "https://schema.org",
18
+ "@type": "BlogPosting",
19
+ "headline": "No LLM in the gate: blocking AI-agent mistakes before they execute",
20
+ "datePublished": "2026-08-19",
21
+ "dateModified": "2026-08-19",
22
+ "author": { "@type": "Organization", "name": "ThumbGate" },
23
+ "publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
24
+ "description": "The architecture of a deterministic pre-action gate for AI coding agents: PreToolUse interception, no LLM on the enforcement path, and a feedback loop that promotes a thumbs-down into a blocking rule.",
25
+ "mainEntityOfPage": "https://thumbgate.ai/blog/no-llm-in-the-gate"
26
+ }
27
+ </script>
28
+ <style>
29
+ :root { --bg: #0a0a0b; --bg-raised: #111113; --bg-card: #161618; --line: #222225; --text: #e8e8ec; --muted: #8b8b96; --cyan: #22d3ee; --green: #4ade80; --amber: #fbbf24; --red: #ff647c; }
30
+ * { box-sizing: border-box; }
31
+ body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: var(--bg); color: var(--text); line-height: 1.7; }
32
+ a { color: var(--cyan); text-decoration: none; }
33
+ a:hover { text-decoration: underline; }
34
+ .container { max-width: 760px; margin: 0 auto; padding: 0 24px; }
35
+ .topbar { position: sticky; top: 0; z-index: 20; backdrop-filter: blur(12px); background: rgba(10,10,11,0.88); border-bottom: 1px solid var(--line); }
36
+ .topbar .container { display: flex; justify-content: space-between; align-items: center; padding: 14px 24px; max-width: 980px; }
37
+ .brand { font-weight: 700; color: var(--text); }
38
+ article { padding: 56px 0 72px; }
39
+ .eyebrow { color: var(--cyan); text-transform: uppercase; letter-spacing: 0.08em; font-size: 12px; font-weight: 700; }
40
+ h1 { font-size: clamp(30px, 4.6vw, 46px); line-height: 1.1; letter-spacing: -0.03em; margin: 14px 0 10px; }
41
+ .meta { color: var(--muted); font-size: 14px; margin-bottom: 32px; }
42
+ h2 { font-size: 26px; letter-spacing: -0.02em; margin: 40px 0 12px; }
43
+ h3 { font-size: 19px; margin: 28px 0 8px; }
44
+ p, li { color: #d4d4dc; }
45
+ .lede { font-size: 20px; color: var(--text); }
46
+ code { background: var(--bg-raised); border: 1px solid var(--line); border-radius: 5px; padding: 1px 6px; font-size: 0.92em; }
47
+ pre { background: var(--bg-raised); border: 1px solid var(--line); border-radius: 10px; padding: 16px; overflow-x: auto; font-size: 13px; line-height: 1.55; }
48
+ pre code { background: none; border: none; padding: 0; }
49
+ blockquote { border-left: 3px solid var(--cyan); margin: 18px 0; padding: 4px 18px; color: var(--text); background: rgba(34,211,238,0.05); }
50
+ table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 14px; }
51
+ th, td { border: 1px solid var(--line); padding: 10px 12px; text-align: left; vertical-align: top; }
52
+ th { background: var(--bg-raised); color: var(--cyan); }
53
+ .callout { background: var(--bg-card); border: 1px solid var(--line); border-radius: 12px; padding: 18px 20px; margin: 24px 0; }
54
+ .callout.warn { border-color: rgba(251,191,36,0.3); }
55
+ .footer-cta { margin: 48px 0 0; padding: 22px; border: 1px solid var(--line); border-radius: 14px; background: var(--bg-card); }
56
+ .footer-cta pre { margin: 10px 0 0; }
57
+ hr { border: none; border-top: 1px solid var(--line); margin: 40px 0; }
58
+ </style>
59
+ </head>
60
+ <body>
61
+ <div class="topbar">
62
+ <div class="container"><a class="brand" href="/">ThumbGate</a><a href="/blog">← All posts</a></div>
63
+ </div>
64
+
65
+ <article class="container">
66
+ <span class="eyebrow">Self-Improving Firewall Engineering</span>
67
+ <h1>No LLM in the gate: blocking AI-agent mistakes before they execute</h1>
68
+ <p class="meta">2026-08-19 · engineering</p>
69
+
70
+ <p class="lede">A prompt is advice. A PreToolUse hook is enforcement. This post is about why we put the gate at the tool-call boundary instead of anywhere else, why there is no language model on the enforcement path, and how a thumbs-down becomes a rule that blocks the next agent — including the failure modes we hit shipping it.</p>
71
+
72
+ <h2>The problem: one wrong tool call is enough</h2>
73
+ <p>An AI coding agent does not fail the way a human does. It fails <em>fast</em>, and it repeats. The same agent that shipped a good PR at 2pm will, at 4pm, run <code>rm -rf</code> on the wrong directory, force-push over <code>main</code>, echo an API key into an outbound request, or drop a production table — because the token stream that produced the good action and the catastrophic one look identical until the side effect lands.</p>
74
+ <p>Three defenses are commonly proposed. Each fails for a structural reason:</p>
75
+ <ul>
76
+ <li><strong>Better prompts / rules files.</strong> Advisory. The model can read "never force-push to main" and force-push to main in the same session. A rule the agent can ignore is not a control.</li>
77
+ <li><strong>Post-hoc review.</strong> Too late. By the time a human reads the diff, the table is dropped and the key is in someone's logs. Review governs what merges, not what executes.</li>
78
+ <li><strong>An LLM judge in the loop.</strong> Reintroduces the exact non-determinism you are trying to remove. A gate that occasionally hallucinates "allow" on a destructive command is not a gate — it is a suggestion with latency.</li>
79
+ </ul>
80
+
81
+ <h2>The insight: gate the tool call, deterministically, before it runs</h2>
82
+ <p>Every capable agent harness — Claude Code, Cursor, Codex, Gemini CLI, Amp, Cline, OpenCode — exposes a <strong>PreToolUse</strong> boundary: the moment after the model has decided to run a tool and before the tool runs. That is the only place that sees the concrete, fully-resolved action (<code>bash</code>, SQL, file write, HTTP fetch, MCP call) with time left to stop it.</p>
83
+ <p>ThumbGate lives in that hook. When the agent proposes a tool call, the hook receives it, evaluates it against a rule set, and returns one of three verdicts <em>before</em> the harness executes anything:</p>
84
+ <table>
85
+ <thead><tr><th>Verdict</th><th>Default behavior</th></tr></thead>
86
+ <tbody>
87
+ <tr><td>⛔ Hard-block</td><td>Detected secret exfiltration; attempts to disable the gate itself</td></tr>
88
+ <tr><td>👎 Warn + log</td><td><code>rm -rf</code>, forced pushes, fetch-and-run, direct guardrail edits</td></tr>
89
+ <tr><td>👍 Allow</td><td>Everything else</td></tr>
90
+ </tbody>
91
+ </table>
92
+ <p>The evaluation is <strong>pure pattern matching against a deterministic rule set</strong>. No model call. The same input always produces the same verdict, in single-digit milliseconds, with an audit line written either way. That property — determinism — is the whole point. An enforcement layer you cannot predict is one you cannot trust with the destructive cases.</p>
93
+
94
+ <blockquote>The gate is not smarter than the agent. It does not need to be. It needs to be <em>certain</em>, <em>fast</em>, and <em>always there</em>.</blockquote>
95
+
96
+ <h2>Where the rules come from: a thumbs-down becomes a rule</h2>
97
+ <p>Determinism forces the real question: where does the rule corpus come from? Hand-writing every bad pattern does not scale, and it does not learn from your codebase. Our answer is a feedback loop that turns operator judgment into enforcement:</p>
98
+ <pre><code>observe → capture (👎 + context) → distill to a lesson
99
+ → candidate rule → promote (count thresholds) → enforce</code></pre>
100
+ <p>When an agent does something wrong, the operator captures a thumbs-down with one line of context. That becomes a history-aware <em>lesson</em>. Matching negative occurrences promote into the Infrastructure Firewall as PreToolUse gates on a simple count path: after one negative occurrence the pattern becomes a <em>warn</em> gate; after three it upgrades to <em>block</em>. That is intentional and deterministic — not a Thompson-sampling precision/recall gate. Live gates also do not guarantee lesson provenance (<code>sourceLessonId</code> / equivalent IDs are not required on the persisted gate), so operators should treat the rule text and occurrence count as the source of truth, not a guaranteed back-link to the originating lesson.</p>
101
+ <p>The firewall improves from operating, not from retraining. To be explicit, because it is the most common misunderstanding: <strong>ThumbGate does not update model weights.</strong> It intercepts tool calls at runtime. The learning happens in the rule corpus, not the model.</p>
102
+
103
+ <h2>What we got wrong: the false-positive tax</h2>
104
+ <div class="callout warn">
105
+ <p style="margin-top:0"><strong>Honesty section.</strong> Deterministic lexical matching has a failure mode, and pretending otherwise would make this a worse post than the ones we admire — so here it is.</p>
106
+ </div>
107
+ <p>A matcher that scans command text for <code>rm -rf</code> or a secret pattern is fast and predictable. It is also <em>lexical</em>, which means it fires on text that merely <em>mentions</em> the dangerous thing. In production we hit exactly this, and we filed the bugs against ourselves:</p>
108
+ <ul>
109
+ <li>A guard scoped to financial actions fired on ordinary prose, because an everyday English word carries both a git meaning and a commercial one and appeared here in its git sense.</li>
110
+ <li>A permission guard blocked a documentation write that <em>quoted</em> a shell command as an example.</li>
111
+ <li>A blast-radius evaluator counted a shared working tree's dirty files instead of the single staged file, and false-blocked a clean commit.</li>
112
+ </ul>
113
+ <p>The lesson is not "lexical matching is wrong." It is that a gate must scan the <em>action</em>, not the <em>narration of the action</em> — the tool plus its resolved arguments, never surrounding prose or an evidence field. Scoping matchers to real side effects is ongoing work, tracked in the open, and it is the honest cost of choosing determinism over an LLM judge. We would make the same trade again: a gate that occasionally over-blocks and tells you exactly why beats a gate that silently, unpredictably lets the destructive case through.</p>
114
+
115
+ <h2>What this buys you</h2>
116
+ <ul>
117
+ <li><strong>The catastrophic classes are stopped before execution</strong>, not flagged after.</li>
118
+ <li><strong>Every decision is reproducible and logged</strong> — a record you could hand an auditor, not a vibe.</li>
119
+ <li><strong>The rule set is yours</strong> — grown from your agents' actual mistakes, portable across every MCP-capable harness you run.</li>
120
+ <li><strong>No cloud on the enforcement path.</strong> The gate runs locally; the block does not depend on a network round-trip.</li>
121
+ </ul>
122
+
123
+ <hr />
124
+ <p>The pattern generalizes beyond coding agents, but coding agents are where the blast radius is highest and the tool-call boundary is cleanest, so that is where we started. If you run agents against anything you would be unhappy to lose, the gate belongs before the tool call.</p>
125
+
126
+ <div class="footer-cta">
127
+ <p style="margin-top:0"><strong>Try the local gate.</strong> MIT-licensed, no telemetry without opt-in.</p>
128
+ <pre><code>npx thumbgate init</code></pre>
129
+ <p style="margin-bottom:0;font-size:14px;color:var(--muted)">Read next: <a href="/blog/process-over-outcome-gates">Process over outcome</a> · <a href="/blog/inside-your-boundary">Inside your boundary</a></p>
130
+ </div>
131
+ </article>
132
+ </body>
133
+ </html>
package/public/blog.html CHANGED
@@ -28,6 +28,36 @@
28
28
  "description": "Engineering notes on pre-action checks, process-over-outcome gates, and local-first agent governance.",
29
29
  "publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
30
30
  "blogPost": [
31
+ {
32
+ "@type": "BlogPosting",
33
+ "headline": "Git at Agent Scale: Why Pre-Action Firewalls Matter for Distributed Coding Agents",
34
+ "url": "https://thumbgate.ai/blog/git-at-agent-scale",
35
+ "datePublished": "2026-08-19",
36
+ "keywords": "Git at scale, Cursor Continuity, ThumbGate, AI agent firewall, Write-Ahead Log, Rendezvous hashing"
37
+ },
38
+ {
39
+ "@type": "BlogPosting",
40
+ "headline": "No LLM in the gate: blocking AI-agent mistakes before they execute",
41
+ "url": "https://thumbgate.ai/blog/no-llm-in-the-gate",
42
+ "datePublished": "2026-08-19",
43
+ "keywords": "PreToolUse hook, deterministic enforcement, pre-action gate, AI coding agent safety, ThumbGate"
44
+ },
45
+ {
46
+ "@type": "BlogPosting",
47
+ "headline": "A $10 VPS is not a Computer",
48
+ "url": "https://thumbgate.ai/blog/a-10-dollar-vps-is-not-a-computer",
49
+ "datePublished": "2026-08-19",
50
+ "author": { "@type": "Person", "name": "Igor Ganapolsky" },
51
+ "keywords": "hosted Hermes, pre-action gate, Cursor blog format, chat completions, ThumbGate"
52
+ },
53
+ {
54
+ "@type": "BlogPosting",
55
+ "headline": "A receipt is not world-state",
56
+ "url": "https://thumbgate.ai/blog/a-receipt-is-not-world-state",
57
+ "datePublished": "2026-08-19",
58
+ "author": { "@type": "Person", "name": "Igor Ganapolsky" },
59
+ "keywords": "Infrastructure Firewall, Reliability Gateway, PreToolUse, completion claim, ThumbGate"
60
+ },
31
61
  {
32
62
  "@type": "BlogPosting",
33
63
  "headline": "Process over outcome: gates for self-improving coding loops",
@@ -228,6 +258,56 @@
228
258
  </p>
229
259
  </section>
230
260
 
261
+ <section class="series" aria-labelledby="series-architecture">
262
+ <h2 class="series-title" id="series-architecture">Systems Architecture & Scale</h2>
263
+ <div class="cards">
264
+ <a class="card" href="/blog/git-at-agent-scale.html">
265
+ <div class="card-meta"><span>2026-08-19</span><span>Systems Architecture</span></div>
266
+ <h2>Git at Agent Scale: Why Pre-Action Firewalls Matter for Distributed Coding Agents</h2>
267
+ <p>
268
+ Cursor scaled Git storage for agentic workloads with Continuity. Here is how ThumbGate provides the sub-millisecond pre-action firewall, cryptographic edit anchoring, and deterministic rendezvous routing in front of it.
269
+ </p>
270
+ <span class="arrow">Read the post →</span>
271
+ </a>
272
+ </div>
273
+ </section>
274
+
275
+ <section class="series" aria-labelledby="series-gate">
276
+ <h2 class="series-title" id="series-gate">No LLM in the gate</h2>
277
+ <div class="cards">
278
+ <a class="card" href="/blog/no-llm-in-the-gate">
279
+ <div class="card-meta"><span>2026-08-19</span><span>Architecture</span></div>
280
+ <h2>No LLM in the gate: blocking AI-agent mistakes before they execute</h2>
281
+ <p>
282
+ Why the gate sits at the PreToolUse boundary, why there is no language model on the enforcement path, and how a thumbs-down becomes a blocking rule—including the false positives we had to fix in the open.
283
+ </p>
284
+ <span class="arrow">Read the post →</span>
285
+ </a>
286
+ </div>
287
+ </section>
288
+
289
+ <section class="series" aria-labelledby="series-research">
290
+ <h2 class="series-title" id="series-research">Research</h2>
291
+ <div class="cards">
292
+ <a class="card" href="/blog/a-10-dollar-vps-is-not-a-computer">
293
+ <div class="card-meta"><span>2026-08-19</span><span>research</span></div>
294
+ <h2>A $10 VPS is not a Computer</h2>
295
+ <p>
296
+ Cursor publishes dated, authored engineering notes on its own domain. We stole that format. Hosted Hermes POSTs chat completions. thumbgate.ai is the pre-action gate. Neither is OpenClaw.
297
+ </p>
298
+ <span class="arrow">Igor Ganapolsky · 7 min read →</span>
299
+ </a>
300
+ <a class="card" href="/blog/a-receipt-is-not-world-state">
301
+ <div class="card-meta"><span>2026-08-19</span><span>research</span><span>Igor Ganapolsky · 11 min read</span></div>
302
+ <h2>A receipt is not world-state</h2>
303
+ <p>
304
+ thumbgate.ai evaluates the tool call, blocks the unsafe ones, and leaves a receipt. A receipt is not production, CI, or a completed task. First-party research with a table of contents — the Cursor blog format, applied to the Infrastructure Firewall.
305
+ </p>
306
+ <span class="arrow">Read the post →</span>
307
+ </a>
308
+ </div>
309
+ </section>
310
+
231
311
  <section class="series" aria-labelledby="series-reward">
232
312
  <h2 class="series-title" id="series-reward">Process over outcome</h2>
233
313
  <div class="cards">
@@ -129,6 +129,21 @@ thumbgate@1.29.2 → 0 holes</pre>
129
129
  <p><strong>Result.</strong> “Is it fixed?” became a command with a number, including against the npm tarball users actually install.</p>
130
130
  </article>
131
131
 
132
+ <article id="memory-compaction">
133
+ <h2>6. Agent memory crowded by near-duplicate lessons</h2>
134
+ <p class="meta">Retrieval quality · memory dedupe/compaction</p>
135
+ <span class="metric">3 dupe records → 1 survivor</span>
136
+ <span class="metric">slot budget back to full</span>
137
+ <span class="metric">opposite signals never merge</span>
138
+ <p><strong>Problem.</strong> Promoted lessons accumulated paraphrases of the same failure. One real lesson could occupy every retrieval slot and starve distinct ones; a July 2026 audit found ~86% of promoted lessons were near-duplicates.</p>
139
+ <p><strong>Action.</strong> Dedupe the candidate pool before ranking, and add a compaction CLI that merges near-duplicates with summed occurrence counts — while never merging opposite-signal lessons on the same topic.</p>
140
+ <pre>dupe-1 "Railway deploy verification timed out…" ← 1 slot
141
+ dupe-2 same lesson, rephrased ← slot 2, useless
142
+ dupe-3 same lesson, rephrased ← slot 3, useless
143
+ → after fix: one survivor + 2 distinct lessons ← full slot budget</pre>
144
+ <p><strong>Artifact.</strong> <code>tests/lesson-retrieval-dedupe-backfill.test.js</code> + <code>tests/memory-near-dupe.test.js</code> in CI; <code>npm run memory:compact</code> applies with a timestamped backup.</p>
145
+ </article>
146
+
132
147
  <p>
133
148
  <a class="cta" href="/whitepaper">Evaluation white paper</a>
134
149
  <a class="cta" href="/eval-scorecard">Bench scorecard</a>
@@ -136,7 +151,7 @@ thumbgate@1.29.2 → 0 holes</pre>
136
151
  </p>
137
152
 
138
153
  <p class="footer-note">
139
- Want a customer case study here? Ship with ThumbGate and write <a href="mailto:igor.ganapolsky@gmail.com">igor.ganapolsky@gmail.com</a>.
154
+ Want a customer case study here? Ship with ThumbGate and write <a href="mailto:igor@thumbgate.ai">igor@thumbgate.ai</a>.
140
155
  We only publish reproducible claims.
141
156
  </p>
142
157
  <p class="footer-note">