thumbgate 1.27.12 → 1.27.13

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 (132) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.well-known/llms.txt +2 -1
  3. package/.well-known/mcp/server-card.json +1 -1
  4. package/README.md +2 -4
  5. package/adapters/claude/.mcp.json +2 -2
  6. package/adapters/mcp/server-stdio.js +1 -1
  7. package/adapters/opencode/opencode.json +1 -1
  8. package/adapters/policy-engine/ethicore-guardian-client.js +68 -0
  9. package/adapters/policy-engine/thumbgate-policy-engine-adapter.js +260 -0
  10. package/bin/cli.js +78 -259
  11. package/config/gate-templates.json +0 -228
  12. package/config/gates/claim-verification.json +0 -18
  13. package/package.json +35 -25
  14. package/public/assets/brand/thumbgate-logo-transparent.svg +22 -0
  15. package/public/assets/brand/thumbgate-mark-inline-v3.svg +19 -0
  16. package/public/assets/brand/thumbgate-mark.svg +11 -5
  17. package/public/blog.html +0 -30
  18. package/public/brand/thumbgate-mark.svg +9 -5
  19. package/public/chatgpt-app.html +2 -2
  20. package/public/compare.html +2 -1
  21. package/public/dashboard.html +1 -1
  22. package/public/federal.html +1 -1
  23. package/public/index.html +95 -216
  24. package/public/learn.html +59 -35
  25. package/public/lessons.html +1 -1
  26. package/public/numbers.html +2 -2
  27. package/public/pro.html +7 -7
  28. package/scripts/aws-blocks-guardrails.js +228 -0
  29. package/scripts/cli-schema.js +22 -10
  30. package/scripts/dashboard-chat.js +2 -1
  31. package/scripts/document-intake.js +1 -49
  32. package/scripts/durability/step.js +3 -3
  33. package/scripts/gate-stats.js +5 -11
  34. package/scripts/gates-engine.js +0 -49
  35. package/scripts/gemini-embedding-policy.js +2 -1
  36. package/scripts/hook-stop-anti-claim.js +116 -184
  37. package/scripts/hosted-config.js +0 -12
  38. package/scripts/lesson-search.js +1 -15
  39. package/scripts/llm-client.js +187 -5
  40. package/scripts/plausible-domain-config.js +3 -1
  41. package/scripts/seo-gsd.js +240 -1
  42. package/scripts/tool-registry.js +2 -2
  43. package/scripts/vector-store.js +44 -0
  44. package/scripts/workspace-evolver.js +62 -2
  45. package/src/api/server.js +340 -131
  46. package/public/assets/brand/thumbgate-mark-inline.svg +0 -15
  47. package/public/compare/adopt-ai.html +0 -219
  48. package/public/compare/agentix-labs.html +0 -197
  49. package/public/compare/ai-experience-orchestration.html +0 -216
  50. package/public/compare/anthropic-claude-for-legal.html +0 -260
  51. package/public/compare/anthropic-containment.html +0 -280
  52. package/public/compare/arcade.html +0 -175
  53. package/public/compare/arcjet.html +0 -239
  54. package/public/compare/bumblebee.html +0 -307
  55. package/public/compare/claude-code-hooks.html +0 -294
  56. package/public/compare/databricks-unity-ai-gateway.html +0 -215
  57. package/public/compare/fallow.html +0 -351
  58. package/public/compare/heidi.html +0 -233
  59. package/public/compare/mem0.html +0 -342
  60. package/public/compare/oak-and-sparrow-gatekeeper.html +0 -289
  61. package/public/compare/rein.html +0 -236
  62. package/public/compare/sigmashake.html +0 -256
  63. package/public/compare/speclock.html +0 -342
  64. package/public/guides/agent-harness-optimization.html +0 -342
  65. package/public/guides/agentic-web-governance.html +0 -406
  66. package/public/guides/ai-agent-governance-sprint.html +0 -415
  67. package/public/guides/ai-agent-pre-action-approval-gates.html +0 -401
  68. package/public/guides/ai-agent-workflow-migration-checklist.html +0 -392
  69. package/public/guides/ai-deployment-readiness.html +0 -415
  70. package/public/guides/ai-mode-ads-agent-governance.html +0 -401
  71. package/public/guides/ai-search-topical-presence.html +0 -342
  72. package/public/guides/autoresearch-agent-safety.html +0 -342
  73. package/public/guides/background-agent-governance.html +0 -358
  74. package/public/guides/best-tools-stop-ai-agents-breaking-production.html +0 -363
  75. package/public/guides/browser-automation-safety.html +0 -342
  76. package/public/guides/chatgpt-ads-trust.html +0 -353
  77. package/public/guides/claude-code-feedback.html +0 -339
  78. package/public/guides/claude-code-prevent-repeated-mistakes.html +0 -161
  79. package/public/guides/claude-code-skills-guardrails.html +0 -343
  80. package/public/guides/claude-desktop.html +0 -356
  81. package/public/guides/code-knowledge-graph-guardrails.html +0 -365
  82. package/public/guides/codex-cli-guardrails.html +0 -339
  83. package/public/guides/cursor-agent-guardrails.html +0 -339
  84. package/public/guides/cursor-prevent-repeated-mistakes.html +0 -161
  85. package/public/guides/database-agent-safety.html +0 -406
  86. package/public/guides/deepseek-v4-runtime-guardrails.html +0 -346
  87. package/public/guides/developer-machine-supply-chain-guardrails.html +0 -358
  88. package/public/guides/gcp-mcp-guardrails.html +0 -147
  89. package/public/guides/gemini-cli-feedback-memory.html +0 -339
  90. package/public/guides/gpt-5-5-model-evaluation.html +0 -358
  91. package/public/guides/internal-ai-engineering-stack-guardrails.html +0 -348
  92. package/public/guides/long-running-agent-context-management.html +0 -346
  93. package/public/guides/mcp-tool-governance.html +0 -401
  94. package/public/guides/multica-thumbgate-setup.html +0 -134
  95. package/public/guides/native-messaging-host-security.html +0 -342
  96. package/public/guides/policy-engine-pre-action-gates.html +0 -346
  97. package/public/guides/pre-action-checks.html +0 -342
  98. package/public/guides/pretooluse-hooks-vs-advisory-prompt-rules.html +0 -342
  99. package/public/guides/prompt-tricks-to-workflow-rules.html +0 -365
  100. package/public/guides/proxy-pointer-rag-guardrails.html +0 -352
  101. package/public/guides/rag-precision-tuning-guardrails.html +0 -352
  102. package/public/guides/reasoning-compression-guardrails.html +0 -346
  103. package/public/guides/relational-knowledge-ai-recommendations.html +0 -342
  104. package/public/guides/roo-code-alternative-cline.html +0 -339
  105. package/public/guides/semantic-programmatic-seo-guardrails.html +0 -352
  106. package/public/guides/seo-agent-skills-guardrails.html +0 -344
  107. package/public/guides/stop-repeated-ai-agent-mistakes.html +0 -342
  108. package/public/learn/ac-dc-runtime-enforcement.html +0 -277
  109. package/public/learn/agent-harness-pattern.html +0 -181
  110. package/public/learn/agent-identity-connector-governance.html +0 -146
  111. package/public/learn/agent-swarms-shared-gates.html +0 -173
  112. package/public/learn/agentic-enterprise-context-brain.html +0 -117
  113. package/public/learn/agentic-os-team-governance.html +0 -146
  114. package/public/learn/ai-agent-governance.html +0 -158
  115. package/public/learn/ai-agent-persistent-memory.html +0 -211
  116. package/public/learn/anthropomorphic-claim-gates.html +0 -180
  117. package/public/learn/background-agent-control-layer.html +0 -184
  118. package/public/learn/claude-code-goal-with-rubrics.html +0 -205
  119. package/public/learn/codex-role-plugins-need-governance.html +0 -125
  120. package/public/learn/cost-aware-agent-gate-routing.html +0 -173
  121. package/public/learn/databricks-unity-ai-gateway-runtime-governance.html +0 -157
  122. package/public/learn/deterministic-agent-workflows.html +0 -185
  123. package/public/learn/feedback-loop-vs-decision-layer.html +0 -283
  124. package/public/learn/from-prototype-to-production.html +0 -223
  125. package/public/learn/learn.css +0 -51
  126. package/public/learn/mcp-pre-action-checks-explained.html +0 -172
  127. package/public/learn/pretix-stripe-connect-marketplaces.html +0 -161
  128. package/public/learn/regulated-agent-execution-boundary.html +0 -196
  129. package/public/learn/spec-driven-development.html +0 -168
  130. package/public/learn/stop-ai-agent-force-push.html +0 -134
  131. package/public/learn/vibe-coding-safety-net.html +0 -142
  132. package/scripts/reddit-browser-notification-watch.js +0 -230
@@ -1,277 +0,0 @@
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>AC/DC governs the code agents write. Runtime enforcement governs what agents do. - ThumbGate</title>
7
- <script defer data-domain="thumbgate.ai" src="https://plausible.io/js/script.js"></script>
8
- <meta name="description" content="Sonar's Agent Centric Development Cycle (AC/DC) defines Guide → Generate → Verify → Solve for code-quality. It has no Pre-Execution Gate. Here is where runtime enforcement plugs into AC/DC, with a worked map for each stage.">
9
- <meta name="keywords" content="AC/DC framework, Agent Centric Development Cycle, AI coding agent governance, PreToolUse runtime enforcement, agentic SDLC, Sonar AC/DC, ThumbGate">
10
- <meta property="og:title" content="AC/DC + Runtime Enforcement: Closing the Pre-Execution Gap">
11
- <meta property="og:description" content="Sonar's AC/DC governs what agents WRITE. Runtime enforcement at PreToolUse governs what agents DO. The two compose — but only one of them stops rm -rf / DROP TABLE / unauthorized MCP calls before they happen.">
12
- <meta property="og:type" content="article">
13
- <meta property="og:url" content="https://thumbgate.ai/learn/ac-dc-runtime-enforcement">
14
- <link rel="canonical" href="https://thumbgate.ai/learn/ac-dc-runtime-enforcement">
15
- <link rel="stylesheet" href="/learn/learn.css">
16
- <script type="application/ld+json">
17
- {
18
- "@context": "https://schema.org",
19
- "@type": "TechArticle",
20
- "headline": "AC/DC governs the code agents write. Runtime enforcement governs what agents do.",
21
- "description": "Sonar's Agent Centric Development Cycle (AC/DC) framework — Guide, Generate, Verify, Solve — is a code-quality lifecycle. Its Verify stage operates on generated code. Many of the highest-blast-radius agent failures (destructive shell commands, unauthorized MCP calls, secret exfiltration) never become code that Verify can inspect. They happen between Generate and the next Guide as runtime actions. This article maps each AC/DC stage to the runtime-enforcement layer that closes the pre-execution gap.",
22
- "author": {
23
- "@type": "Person",
24
- "name": "Igor Ganapolsky",
25
- "url": "https://github.com/IgorGanapolsky"
26
- },
27
- "publisher": {
28
- "@type": "Organization",
29
- "name": "ThumbGate",
30
- "url": "https://thumbgate.ai"
31
- },
32
- "datePublished": "2026-05-27",
33
- "dateModified": "2026-05-27",
34
- "mainEntityOfPage": "https://thumbgate.ai/learn/ac-dc-runtime-enforcement",
35
- "citation": [
36
- "https://www.sonarsource.com/blog/the-future-is-ac-dc-the-agent-centric-development-cycle",
37
- "https://thenewstack.io/agentic-development-cycle-framework/"
38
- ],
39
- "about": [
40
- { "@type": "Thing", "name": "AC/DC framework" },
41
- { "@type": "Thing", "name": "Agent Centric Development Cycle" },
42
- { "@type": "Thing", "name": "agentic SDLC governance" },
43
- { "@type": "Thing", "name": "PreToolUse runtime enforcement" }
44
- ]
45
- }
46
- </script>
47
- <script type="application/ld+json">
48
- {
49
- "@context": "https://schema.org",
50
- "@type": "FAQPage",
51
- "mainEntity": [
52
- {
53
- "@type": "Question",
54
- "name": "What is the AC/DC framework?",
55
- "acceptedAnswer": {
56
- "@type": "Answer",
57
- "text": "AC/DC stands for Agent Centric Development Cycle. It is a four-stage governance framework published by Sonar (the company behind SonarCloud and SonarQube) for teams running AI coding agents. The stages are Guide (hand the agent your standards, architecture, and constraints before it writes code), Generate (the LLM writes code), Verify (mandatory verification of the generated code, primarily through static analysis), and Solve (fix the issues Verify surfaces). Each stage feeds the next, and outputs from Verify and Solve loop back into Guide so future iterations improve. AC/DC is a code-quality lifecycle for agentic development."
58
- }
59
- },
60
- {
61
- "@type": "Question",
62
- "name": "Does AC/DC cover runtime safety?",
63
- "acceptedAnswer": {
64
- "@type": "Answer",
65
- "text": "Not directly. AC/DC's Verify stage inspects generated code — typically after the agent has produced a diff or pull request. Many of the highest-blast-radius agent failures never become code that Verify can inspect. A destructive shell command like rm -rf, a DROP TABLE against the wrong database, a git push --force to main, a leaked environment variable through an MCP tool call, or an outbound LLM call to an unauthorized endpoint all happen between Generate and the next Guide loop as runtime actions. They produce no committed source code. Runtime enforcement at the PreToolUse hook is the layer that catches them before execution."
66
- }
67
- },
68
- {
69
- "@type": "Question",
70
- "name": "Does runtime enforcement replace AC/DC's Verify stage?",
71
- "acceptedAnswer": {
72
- "@type": "Answer",
73
- "text": "No. They cover different surfaces and compose cleanly. AC/DC's Verify stage catches problems in committed code. Runtime enforcement catches problems in proposed tool calls before the tool fires. A correct deployment of both means: PreToolUse hooks block destructive or unauthorized actions before execution, Verify catches quality and security issues in the code the agent did write, and Solve fixes what Verify surfaces. The two layers add up to coverage of both the action surface and the code surface."
74
- }
75
- },
76
- {
77
- "@type": "Question",
78
- "name": "Where does ThumbGate fit into AC/DC?",
79
- "acceptedAnswer": {
80
- "@type": "Answer",
81
- "text": "ThumbGate fits at two AC/DC stages. At Guide, ThumbGate's prevention-rules.md and context packs hand the agent local, learned constraints before it writes code — generated from prior failures captured by feedback hooks. At Verify, ThumbGate adds a runtime-action verification layer that operates on the tool call the agent is about to make, not on the code it already wrote. This closes the pre-execution gap between Generate and the next Guide iteration that pure-static Verify cannot reach."
82
- }
83
- },
84
- {
85
- "@type": "Question",
86
- "name": "Is Sonar a ThumbGate competitor?",
87
- "acceptedAnswer": {
88
- "@type": "Answer",
89
- "text": "No. Sonar runs at the code-quality layer (static analysis of committed code, security hotspots, coverage, duplications). ThumbGate runs at the runtime-action layer (PreToolUse hooks in Claude Code, Cursor, Codex CLI, Gemini CLI, Amp, Cline, OpenCode, Claude Desktop). The two layers are complementary. Regulated teams already running Sonar can keep Sonar at Verify-of-code and add ThumbGate at Verify-of-action to close the runtime gap AC/DC does not explicitly name."
90
- }
91
- }
92
- ]
93
- }
94
- </script>
95
- <style>
96
- table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
97
- th, td { text-align: left; padding: 0.7rem 0.8rem; border-bottom: 1px solid var(--border); vertical-align: top; font-size: 0.92rem; }
98
- th { color: var(--cyan); font-weight: 700; }
99
- .layer strong { color: var(--green); }
100
- .mini-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; margin: 1.25rem 0; }
101
- .mini-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 1rem; }
102
- .mini-card h3 { margin-top: 0; color: var(--text); }
103
- .mini-card p { color: var(--muted); }
104
- blockquote { border-left: 3px solid var(--cyan); margin: 1rem 0; padding: 0.5rem 1rem; color: var(--text); font-style: italic; background: rgba(34, 211, 238, 0.05); }
105
- @media (max-width: 700px) { .mini-grid { grid-template-columns: 1fr; } }
106
- </style>
107
- </head>
108
- <body>
109
- <nav>
110
- <a href="/" class="brand"><img src="/assets/brand/thumbgate-mark-inline.svg" alt="ThumbGate" class="logo-mark" width="28" height="28"><span class="logo-text">ThumbGate</span></a>
111
- <a href="/guide">Setup Guide</a>
112
- <a href="/learn">Learn</a>
113
- <a href="/dashboard">Dashboard</a>
114
- <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
115
- </nav>
116
-
117
- <div class="container">
118
- <div class="breadcrumb"><a href="/learn">Learn</a> / AC/DC Runtime Enforcement</div>
119
- <h1>AC/DC governs the code agents write. Runtime enforcement governs what agents do.</h1>
120
- <p style="color:var(--muted);">6 min read &middot; For engineering leaders adopting Sonar's Agent Centric Development Cycle</p>
121
-
122
- <div class="tldr"><strong>TL;DR:</strong> Sonar's AC/DC framework (Guide → Generate → Verify → Solve) is a code-quality lifecycle for agentic development. It has no Pre-Execution Gate stage. The highest-blast-radius agent failures — destructive shell, unauthorized MCP calls, force-push to main, secret exfiltration — never become committed code. They are runtime actions that happen between Generate and the next Guide loop. PreToolUse runtime enforcement is the layer that closes that gap. The two compose: AC/DC verifies the code, runtime enforcement verifies the action.</div>
123
-
124
- <h2>What AC/DC is</h2>
125
- <p>Sonar published <a href="https://www.sonarsource.com/blog/the-future-is-ac-dc-the-agent-centric-development-cycle" target="_blank" rel="noopener">the Agent Centric Development Cycle</a> (AC/DC) in early 2026 as a framework for teams shipping AI coding agents at scale. <a href="https://thenewstack.io/agentic-development-cycle-framework/" target="_blank" rel="noopener">The New Stack covered it as the governance framework</a> teams should reach for. Four stages, each feeding the next, with outputs from Verify and Solve looping back into Guide:</p>
126
-
127
- <table>
128
- <thead>
129
- <tr>
130
- <th>Stage</th>
131
- <th>What happens</th>
132
- <th>What it inspects</th>
133
- </tr>
134
- </thead>
135
- <tbody>
136
- <tr class="layer">
137
- <td><strong>Guide</strong></td>
138
- <td>Hand the agent your standards, architecture, and constraints before it writes a line of code.</td>
139
- <td>Prompts, context packs, conventions.</td>
140
- </tr>
141
- <tr class="layer">
142
- <td><strong>Generate</strong></td>
143
- <td>The LLM produces the code it believes will achieve the desired outcome.</td>
144
- <td>Nothing yet &mdash; pure generation.</td>
145
- </tr>
146
- <tr class="layer">
147
- <td><strong>Verify</strong></td>
148
- <td>Mandatory verification of the generated code &mdash; static analysis, security hotspots, coverage, duplication.</td>
149
- <td>Committed source code.</td>
150
- </tr>
151
- <tr class="layer">
152
- <td><strong>Solve</strong></td>
153
- <td>Fix the issues Verify surfaces, so the next iteration is cleaner.</td>
154
- <td>Issues, lessons.</td>
155
- </tr>
156
- </tbody>
157
- </table>
158
-
159
- <blockquote>"In an agentic development model, the primary challenge is no longer writing code; it is creating a system that makes generated code trustworthy." — Sonar, on AC/DC</blockquote>
160
-
161
- <p>That's a correct framing for the code-quality slice of agentic governance. It is also the slice Sonar happens to own. The framework is honest about that — it is explicitly a code-trust framework, not an action-trust framework.</p>
162
-
163
- <h2>The structural gap: no Pre-Execution Gate</h2>
164
- <p>Look at the four stages again. Verify inspects code the agent already wrote. Solve fixes that code. Guide informs the next generation. Nowhere in the loop is there a stage that intercepts an action the agent is about to take.</p>
165
-
166
- <p>That matters because the failures that wake operators at 2 a.m. are rarely "the committed code had a bug Verify missed." They are:</p>
167
-
168
- <ul>
169
- <li>An agent ran <code>rm -rf node_modules ../</code> with a path that traversed out of the workspace.</li>
170
- <li>An agent ran <code>DROP TABLE users</code> against the staging connection because the staging connection happened to point at prod.</li>
171
- <li>An agent ran <code>git push --force</code> to <code>main</code> to "clean up history" and erased two days of work.</li>
172
- <li>An MCP tool was given an outbound URL the agent improvised &mdash; and the URL was a credential-stealing endpoint hidden in a doc the agent ingested.</li>
173
- <li>An agent committed <code>.env</code> with live keys, pushed, and the leak detector caught it ninety seconds later.</li>
174
- </ul>
175
-
176
- <p>None of those produce committed source code that Verify can read. They are runtime actions that happen <em>between</em> Generate and the next Guide loop. By the time AC/DC's Verify stage runs, the damage is done.</p>
177
-
178
- <div class="callout">
179
- <strong>The gap in plain terms:</strong> AC/DC governs what the agent <strong>writes</strong>. The unsolved layer is what the agent <strong>does</strong> &mdash; tool calls, shell commands, file writes, MCP invocations, outbound network calls &mdash; before any of those actions become text that a static analyzer can see.
180
- </div>
181
-
182
- <h2>Where runtime enforcement plugs into AC/DC</h2>
183
- <p>ThumbGate operates at the PreToolUse boundary inside the agent runtime &mdash; Claude Code, Cursor, OpenAI Codex CLI, Google Gemini CLI, Sourcegraph Amp, Cline, OpenCode, Claude Desktop. When the agent is about to execute a tool call, ThumbGate inspects the proposed call and returns allow, warn, block, or route-to-human. The boundary is the runtime, not the file system.</p>
184
-
185
- <p>Mapped onto AC/DC, that lands in two stages:</p>
186
-
187
- <table>
188
- <thead>
189
- <tr>
190
- <th>AC/DC stage</th>
191
- <th>What runtime enforcement adds</th>
192
- </tr>
193
- </thead>
194
- <tbody>
195
- <tr class="layer">
196
- <td><strong>Guide</strong></td>
197
- <td>Local prevention rules promoted from prior failures (auto-generated from feedback hooks) become part of the context handed to the agent. The agent doesn't just see "your team's standards" &mdash; it sees "your team's standards plus a list of specific tool-call patterns that have caused incidents here."</td>
198
- </tr>
199
- <tr class="layer">
200
- <td><strong>Verify (runtime)</strong></td>
201
- <td>A second Verify pass runs at PreToolUse: before the agent's proposed tool call executes, ThumbGate checks it against the local lesson DB, allowlists, and policy bundles. Allow, warn, block, or route. Evidence is logged structurally so reviewers can audit decisions later.</td>
202
- </tr>
203
- </tbody>
204
- </table>
205
-
206
- <div class="mini-grid">
207
- <div class="mini-card">
208
- <h3>Verify of code</h3>
209
- <p>Static analysis on committed source code. Catches quality, security, and duplication issues after the diff exists. This is what Sonar does well, and what AC/DC's Verify stage maps to.</p>
210
- </div>
211
- <div class="mini-card">
212
- <h3>Verify of action</h3>
213
- <p>Runtime inspection of the proposed tool call before it fires. Catches destructive shell, unauthorized MCP, secret exfiltration, force-push, and out-of-scope file writes &mdash; before they become incidents.</p>
214
- </div>
215
- </div>
216
-
217
- <h2>The two-layer deployment for an AC/DC team</h2>
218
- <p>If your team already runs Sonar (or any static-analysis Verify stage), the integration story is short and additive:</p>
219
-
220
- <ol>
221
- <li><strong>Keep AC/DC's Verify on code.</strong> Sonar, SonarQube, or your existing static-analysis pipeline continues to inspect the source the agent produces. Nothing changes there.</li>
222
- <li><strong>Add a Verify-of-action layer at the PreToolUse boundary.</strong> Install ThumbGate in the agent runtimes your developers actually use. The runtime now inspects every proposed tool call against your local rules and the prevention-rules.md generated from prior failures.</li>
223
- <li><strong>Wire the feedback loop back into Guide.</strong> Every blocked action becomes a lesson. Lessons promote to prevention rules. Prevention rules become part of the context the next Guide iteration hands to the agent. AC/DC's loop closes one stage earlier.</li>
224
- </ol>
225
-
226
- <div class="callout callout-green">
227
- <strong>Sales line:</strong> If your team adopted AC/DC and stopped at Verify-of-code, you are governing what the agent wrote and not what the agent did. Add the Pre-Execution Gate before the next blast-radius incident teaches you which half of the loop was missing.
228
- </div>
229
-
230
- <h2>What this looks like in a buyer demo</h2>
231
- <ol>
232
- <li>One AC/DC iteration where Sonar's Verify catches a real code-quality issue in generated code. Good. That's what AC/DC promises.</li>
233
- <li>One proposed tool call (<code>git push --force origin main</code>) blocked at PreToolUse before execution. Evidence logged.</li>
234
- <li>The blocked call promoted to a prevention rule. The next agent run sees that rule in its Guide context.</li>
235
- <li>An export a reviewer or risk officer can inspect: allowed calls, blocked calls, overrides, rule-promotion history.</li>
236
- </ol>
237
-
238
- <h2>FAQ</h2>
239
- <details class="faq-item" open>
240
- <summary>Why doesn't AC/DC name a Pre-Execution Gate stage?</summary>
241
- <p>AC/DC is framed by Sonar, whose product surface ends at static analysis of code. Naming a runtime-action stage that Sonar doesn't ship would be marketing against itself. The framework is internally consistent for the slice it owns; it just doesn't claim coverage of runtime actions. That's the gap a runtime-enforcement layer fills.</p>
242
- </details>
243
- <details class="faq-item">
244
- <summary>Can I run ThumbGate without Sonar, or vice versa?</summary>
245
- <p>Yes to both. ThumbGate adds runtime-action Verify regardless of what static-analysis tool runs alongside it. AC/DC's Verify stage can be filled by any static-analysis pipeline. They are independent layers.</p>
246
- </details>
247
- <details class="faq-item">
248
- <summary>Where do prevention rules come from?</summary>
249
- <p>From your team's own incidents and feedback. ThumbGate captures thumbs-down events via feedback hooks, promotes recurring failures to the local lesson DB, and synthesizes prevention rules that survive model upgrades and prompt resets. The rules are local to your team &mdash; they encode your specific failure patterns, not generic SOC2 boilerplate.</p>
250
- </details>
251
- <details class="faq-item">
252
- <summary>Does ThumbGate work with Claude Code only?</summary>
253
- <p>No. The PreToolUse boundary exists in Claude Code, Cursor, OpenAI Codex CLI, Google Gemini CLI, Sourcegraph Amp, Cline, OpenCode, and Claude Desktop. ThumbGate's adapter matrix covers all of them. One rule set, every agent runtime.</p>
254
- </details>
255
-
256
- <div class="cta-box">
257
- <h2 style="color:var(--text);font-size:1.3rem;margin:0 0 8px;">Close the pre-execution gap in AC/DC</h2>
258
- <p>Install runtime enforcement at the PreToolUse boundary across every agent your team uses. Local rules, hosted evidence, no static-analyzer in the path.</p>
259
- <div class="cta-install">$ npx thumbgate init</div>
260
- </div>
261
-
262
- <div class="related">
263
- <h3>Related articles</h3>
264
- <a href="/learn/background-agent-control-layer">Background Agent Control Layer &rarr;</a>
265
- <a href="/learn/mcp-pre-action-checks-explained">MCP Pre-Action Checks Explained &rarr;</a>
266
- <a href="/learn/regulated-agent-execution-boundary">Regulated Agent Execution Boundary &rarr;</a>
267
- <a href="/compare/anthropic-containment">ThumbGate vs Anthropic Containment &rarr;</a>
268
- </div>
269
- </div>
270
-
271
- <div class="sticky-cta">
272
- <span style="color:var(--muted)">Try it now:</span>
273
- <code>npx thumbgate init</code>
274
- <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub &rarr;</a>
275
- </div>
276
- </body>
277
- </html>
@@ -1,181 +0,0 @@
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>The Agent Harness Pattern: Why Your AI Needs a Seatbelt — ThumbGate</title>
7
- <script defer data-domain="thumbgate.ai" src="https://plausible.io/js/script.js"></script>
8
- <meta name="description" content="Tsinghua researchers formalized agent harnesses as first-class objects with contracts, verification checks, and durable state. ThumbGate implements this pattern today.">
9
- <meta name="keywords" content="agent harness pattern, natural language agent harness, NLAH, AI agent safety, pre-action checks, verification checks, agent contracts, ThumbGate, MCP hooks">
10
- <meta property="og:title" content="The Agent Harness Pattern: Why Your AI Needs a Seatbelt">
11
- <meta property="og:description" content="Academic research meets production code. How the natural-language agent harness pattern maps to real pre-action checks.">
12
- <meta property="og:type" content="article">
13
- <meta property="og:url" content="https://thumbgate.ai/learn/agent-harness-pattern">
14
- <link rel="canonical" href="https://thumbgate.ai/learn/agent-harness-pattern">
15
-
16
- <script type="application/ld+json">
17
- {
18
- "@context": "https://schema.org",
19
- "@type": "TechArticle",
20
- "headline": "The Agent Harness Pattern: Why Your AI Needs a Seatbelt",
21
- "description": "How the natural-language agent harness pattern from academic research maps to real pre-action checks you can ship today.",
22
- "author": {
23
- "@type": "Person",
24
- "name": "Igor Ganapolsky",
25
- "url": "https://github.com/IgorGanapolsky"
26
- },
27
- "publisher": {
28
- "@type": "Organization",
29
- "name": "ThumbGate",
30
- "url": "https://thumbgate.ai"
31
- },
32
- "datePublished": "2026-04-02",
33
- "dateModified": "2026-04-02",
34
- "mainEntityOfPage": "https://thumbgate.ai/learn/agent-harness-pattern",
35
- "about": [
36
- {"@type": "Thing", "name": "agent harness pattern"},
37
- {"@type": "Thing", "name": "natural language agent harness"},
38
- {"@type": "Thing", "name": "AI agent verification"}
39
- ]
40
- }
41
- </script>
42
-
43
- <link rel="stylesheet" href="/learn/learn.css">
44
- <style>
45
- table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
46
- th, td { text-align: left; padding: 0.6rem 0.8rem; border-bottom: 1px solid var(--border); font-size: 0.9rem; }
47
- th { color: var(--cyan); font-weight: 600; }
48
- .mapping-row td:first-child { color: var(--green); font-weight: 500; }
49
- </style>
50
- </head>
51
- <body>
52
-
53
- <nav>
54
- <a href="/" class="brand"><img src="/assets/brand/thumbgate-mark-inline.svg" alt="ThumbGate" class="logo-mark" width="28" height="28"><span class="logo-text">ThumbGate</span></a>
55
- <a href="/guide">Setup Guide</a>
56
- <a href="/learn">Learn</a>
57
- <a href="/dashboard">Dashboard</a>
58
- <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
59
- </nav>
60
-
61
- <div class="container">
62
- <div class="breadcrumb"><a href="/learn">Learn</a> / Agent Harness Pattern</div>
63
- <h1>The Agent Harness Pattern: Why Your AI Needs a Seatbelt</h1>
64
- <p style="color:var(--muted);">5 min read &middot; Research deep-dive for developers shipping AI agents in production</p>
65
-
66
- <div class="tldr"><strong>TL;DR:</strong> Tsinghua researchers proved that AI agents need harnesses — contracts, verification checks, and durable state. ThumbGate is a production implementation you can ship today.</div>
67
-
68
- <h2>The problem: agents act faster than you can review</h2>
69
- <p>AI coding agents can write, commit, and deploy code in seconds. The gap between "agent decides to act" and "irreversible damage" is measured in milliseconds. Prompt instructions alone cannot close that gap because they live inside the same context the agent can override.</p>
70
- <p>Researchers at Tsinghua University formalized this problem in their work on Natural-Language Agent Harnesses (NLAH). Their key insight: the safety layer must be <strong>external to the agent</strong>, treated as a first-class object with its own contracts, verification logic, and persistent state.</p>
71
-
72
- <div class="callout">
73
- <strong>The core idea:</strong> An agent harness is not a prompt. It is a runtime layer that sits between the agent's intent and the outside world, enforcing contracts that the agent cannot bypass.
74
- </div>
75
-
76
- <h2>Four components of an agent harness</h2>
77
- <p>The NLAH framework defines four components that any production-grade harness needs. Here is how each maps to a concrete implementation in ThumbGate:</p>
78
-
79
- <table>
80
- <thead>
81
- <tr>
82
- <th>NLAH Component</th>
83
- <th>What It Does</th>
84
- <th>ThumbGate Implementation</th>
85
- </tr>
86
- </thead>
87
- <tbody>
88
- <tr class="mapping-row">
89
- <td>Contracts</td>
90
- <td>Formal rules that define what the agent must not do</td>
91
- <td>Prevention rules in <code>prevention-rules.md</code> — auto-generated from thumbs-down feedback</td>
92
- </tr>
93
- <tr class="mapping-row">
94
- <td>Verification Checks</td>
95
- <td>Checkpoints that intercept actions before execution</td>
96
- <td>PreToolUse hooks — intercept every tool call, match against checks, block or allow</td>
97
- </tr>
98
- <tr class="mapping-row">
99
- <td>Durable State</td>
100
- <td>Persistent memory that survives across sessions</td>
101
- <td>SQLite+FTS5 lesson database — feedback, memories, and rules persist and are searchable</td>
102
- </tr>
103
- <tr class="mapping-row">
104
- <td>Adapters</td>
105
- <td>Platform-specific connectors for different agent runtimes</td>
106
- <td>MCP server + adapters for Claude Code, Cursor, Codex, Gemini, Amp, OpenCode</td>
107
- </tr>
108
- </tbody>
109
- </table>
110
-
111
- <h2>Why contracts beat prompt rules</h2>
112
- <p>A prompt rule says: "Do not force-push to main." An agent can reason around that, reinterpret it, or simply lose it in a long context window.</p>
113
- <p>A contract says: if the tool call is <code>Bash</code> and the command matches <code>git push.*--force</code> targeting <code>main</code>, return <code>{"decision": "block"}</code>. The agent never executes the command. There is nothing to reason around.</p>
114
-
115
- <div class="callout callout-red">
116
- <strong>Prompt rules fail silently.</strong> When a prompt rule is violated, you only find out after the damage is done. A verification check fails loudly — the agent receives a block response and must adapt.
117
- </div>
118
-
119
- <h2>Verification checks in practice</h2>
120
- <p>Every time your AI agent calls a tool — running a shell command, writing a file, making an API call — a PreToolUse hook fires. ThumbGate checks the call against your checks:</p>
121
-
122
- <ol>
123
- <li><strong>Pattern match:</strong> Does the tool name and arguments match any prevention rule?</li>
124
- <li><strong>Thompson Sampling:</strong> For rules with uncertain severity, use multi-armed bandit sampling to decide block vs. warn</li>
125
- <li><strong>Decision:</strong> Block (hard stop), warn (let agent reconsider), or allow (no match)</li>
126
- <li><strong>Feedback loop:</strong> The decision is logged. Thumbs-up/down on outcomes refines future checks.</li>
127
- </ol>
128
-
129
- <p>This is the verification check pattern from the NLAH framework, running in production today.</p>
130
-
131
- <h2>Durable state: memory that survives sessions</h2>
132
- <p>One of the NLAH paper's strongest arguments is that agent harnesses need persistent state. An agent that forgets its mistakes between sessions will repeat them.</p>
133
- <p>ThumbGate stores every feedback event in a SQLite database with full-text search (FTS5). When a new session starts, the agent's context is assembled from relevant past lessons — not the entire history, but the lessons most similar to the current task.</p>
134
-
135
- <div class="callout callout-green">
136
- <strong>The feedback loop closes itself:</strong> You thumbs-down a mistake → a prevention rule is generated → the check blocks the mistake next time → the agent adapts → you thumbs-up the adaptation → the rule is reinforced.
137
- </div>
138
-
139
- <h2>Adapters: one harness, many agents</h2>
140
- <p>The NLAH framework emphasizes platform independence. A harness should work across different agent runtimes without rewriting the safety logic.</p>
141
- <p>ThumbGate achieves this through the Model Context Protocol (MCP). Any agent that speaks MCP — Claude Code, Cursor, Codex, Gemini, Amp, OpenCode — connects to the same ThumbGate server and gets the same checks. Write your rules once, enforce everywhere.</p>
142
-
143
- <h2>From research to production in two minutes</h2>
144
- <p>The NLAH framework describes what an agent harness <em>should</em> be. ThumbGate is what it looks like when you ship one:</p>
145
-
146
- <pre><code>npx thumbgate init</code></pre>
147
-
148
- <p>That single command sets up:</p>
149
- <ul>
150
- <li>A PreToolUse hook that intercepts every tool call</li>
151
- <li>A SQLite+FTS5 lesson database for durable state</li>
152
- <li>Prevention rules generated from your feedback</li>
153
- <li>Thompson Sampling for probabilistic check decisions</li>
154
- <li>MCP server adapters for your agent runtime</li>
155
- </ul>
156
-
157
- <p>You are not writing safety rules from scratch. You are thumbs-downing mistakes and letting the harness learn.</p>
158
-
159
- <div class="cta-box">
160
- <h2 style="color:var(--text);font-size:1.3rem;margin:0 0 8px;">Ship the harness pattern today</h2>
161
- <p>One command. Works with Claude Code, Cursor, Codex, Gemini, Amp, and any MCP agent.</p>
162
- <div class="cta-install">$ npx thumbgate init</div>
163
- </div>
164
-
165
- <div class="related">
166
- <h3>Related articles</h3>
167
- <a href="/learn/mcp-pre-action-checks-explained">MCP Pre-Action Checks Explained →</a>
168
- <a href="/learn/stop-ai-agent-force-push">How to Stop AI Agents From Force-Pushing to Main →</a>
169
- <a href="/learn/vibe-coding-safety-net">The Vibe Coding Safety Net You Are Missing →</a>
170
- </div>
171
- </div>
172
-
173
-
174
- <div class="sticky-cta">
175
- <span style="color:var(--muted)">Try it now:</span>
176
- <code>npx thumbgate init</code>
177
- <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub &rarr;</a>
178
- </div>
179
- <script src="/js/buyer-intent.js"></script>
180
- </body>
181
- </html>
@@ -1,146 +0,0 @@
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>Agent Identity and Connector Governance — ThumbGate</title>
7
- <meta name="description" content="How ThumbGate gates AI agent identities, MCP connectors, Tool Packs, service accounts, DLP, audit logs, and purpose-permission scope before agents act.">
8
- <link rel="canonical" href="https://thumbgate.ai/learn/agent-identity-connector-governance">
9
- <link rel="llm-context" href="/llm-context.md" type="text/markdown">
10
- <link rel="icon" type="image/png" href="/thumbgate-icon.png">
11
- <script defer data-domain="thumbgate.ai" src="https://plausible.io/js/script.js"></script>
12
- <meta property="og:title" content="Agent Identity and Connector Governance">
13
- <meta property="og:description" content="Agents with connectors are identities. Gate owner, invoker, credentials, permissions, DLP, audit, and purpose before the next tool call.">
14
- <meta property="og:type" content="article">
15
- <meta property="og:url" content="https://thumbgate.ai/learn/agent-identity-connector-governance">
16
- <script type="application/ld+json">
17
- {
18
- "@context": "https://schema.org",
19
- "@type": "TechArticle",
20
- "headline": "Agent Identity and Connector Governance",
21
- "description": "A ThumbGate implementation pattern for treating AI agents and MCP connector tool packs as governed identities with owner, purpose, credentials, permissions, DLP, and audit evidence.",
22
- "datePublished": "2026-06-20",
23
- "dateModified": "2026-06-20",
24
- "author": {
25
- "@type": "Person",
26
- "name": "Igor Ganapolsky",
27
- "url": "https://github.com/IgorGanapolsky"
28
- },
29
- "publisher": {
30
- "@type": "Organization",
31
- "name": "ThumbGate",
32
- "url": "https://thumbgate.ai"
33
- },
34
- "url": "https://thumbgate.ai/learn/agent-identity-connector-governance",
35
- "about": [
36
- "AI agent identity",
37
- "MCP connector governance",
38
- "least privilege",
39
- "agent audit trails"
40
- ]
41
- }
42
- </script>
43
- <script type="application/ld+json">
44
- {
45
- "@context": "https://schema.org",
46
- "@type": "FAQPage",
47
- "mainEntity": [
48
- {
49
- "@type": "Question",
50
- "name": "Is Glean a ThumbGate competitor?",
51
- "acceptedAnswer": {
52
- "@type": "Answer",
53
- "text": "Glean is adjacent, not a direct replacement. Glean is a Work AI platform with enterprise search, agents, connectors, governance, orchestration, and an MCP gateway. ThumbGate is a local-first pre-action enforcement layer for agent tool calls, repeated-failure memory, and proof gates across developer and MCP workflows."
54
- }
55
- },
56
- {
57
- "@type": "Question",
58
- "name": "How does Merge Agent Handler relate to ThumbGate?",
59
- "acceptedAnswer": {
60
- "@type": "Answer",
61
- "text": "Merge Agent Handler provides production-ready MCP connectors, authentication, scoped access, DLP, observability, and audit logs. ThumbGate complements it by gating whether the next tool call or connector addition matches the agent's owner, purpose, identity, and scope."
62
- }
63
- }
64
- ]
65
- }
66
- </script>
67
- <style>
68
- *, *::before, *::after { box-sizing: border-box; }
69
- body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0a0a0b; color: #ececf0; line-height: 1.65; }
70
- nav { display: flex; gap: 22px; align-items: center; padding: 16px 28px; border-bottom: 1px solid #242428; }
71
- nav a { color: #a7a7b1; text-decoration: none; font-size: 0.95rem; }
72
- nav a:hover { color: #22d3ee; }
73
- .brand { color: #fff; font-weight: 700; display: inline-flex; gap: 8px; align-items: center; }
74
- .brand img { width: 28px; height: 28px; }
75
- main { max-width: 900px; margin: 0 auto; padding: 48px 22px 72px; }
76
- h1 { font-size: clamp(2rem, 5vw, 3.55rem); line-height: 1.06; margin: 0 0 18px; max-width: 800px; }
77
- h2 { color: #22d3ee; font-size: 1.45rem; margin: 42px 0 14px; }
78
- p { margin: 0 0 16px; color: #d6d6de; }
79
- a { color: #67e8f9; }
80
- .lede { color: #a7a7b1; font-size: 1.15rem; max-width: 760px; }
81
- .callout, .card { border: 1px solid #303039; background: #151518; border-radius: 8px; padding: 22px; }
82
- .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px; margin: 24px 0; }
83
- .card { background: #111114; padding: 18px; }
84
- .card strong { display: block; color: #fff; margin-bottom: 8px; }
85
- code, pre { font-family: "SF Mono", "Cascadia Code", "JetBrains Mono", Consolas, monospace; }
86
- pre { overflow-x: auto; background: #050506; border: 1px solid #25252a; border-radius: 8px; padding: 18px; color: #d7f9ff; }
87
- .source-note { color: #8f8f99; font-size: 0.92rem; }
88
- .cta { display: inline-block; margin-top: 16px; padding: 11px 18px; border-radius: 8px; background: #22d3ee; color: #031114; text-decoration: none; font-weight: 700; }
89
- @media (max-width: 720px) { nav { padding: 14px 18px; gap: 14px; flex-wrap: wrap; } main { padding-top: 32px; } .grid { grid-template-columns: 1fr; } }
90
- </style>
91
- </head>
92
- <body>
93
- <nav>
94
- <a href="/" class="brand"><img src="/assets/brand/thumbgate-mark-inline.svg" alt="ThumbGate" width="28" height="28">ThumbGate</a>
95
- <a href="/guide">Setup Guide</a>
96
- <a href="/learn">Learn</a>
97
- <a href="/compare/databricks-unity-ai-gateway">Runtime governance</a>
98
- </nav>
99
- <main>
100
- <h1>Agents with connectors are identities</h1>
101
- <p class="lede">Once an AI agent can authenticate to GitHub, Jira, Slack, Salesforce, Snowflake, cloud, databases, or remote MCP tool packs, it is no longer just a chatbot. It is an actor with credentials, permissions, owners, purpose, and drift.</p>
102
-
103
- <div class="callout">
104
- <p><strong>The high-ROI lesson:</strong> treat every agent as an identity and every connector bundle as a scoped permission set. ThumbGate gates the moment before the next action: is this tool call inside the agent's declared purpose, identity, and connector scope?</p>
105
- <p class="source-note">Source signals: BleepingComputer/Token Security argued on June 19, 2026 that AI agents are becoming first-class identities; Merge Agent Handler positions production MCP connectors with authentication, scoped access, DLP, observability, and audit logs; Glean positions Work AI with agents, governance, orchestration, connectors, and MCP Gateway; Okta's AI identity checklist frames secure-by-design agent patterns around token vaulting, fine-grained authorization, human-in-the-loop oversight, shadow AI discovery, registration, and lifecycle management.</p>
106
- </div>
107
-
108
- <h2>What ThumbGate now gates</h2>
109
- <div class="grid">
110
- <div class="card"><strong>Identity inventory</strong> Owner, invoker, credential or service account, connected systems, and allowed verbs.</div>
111
- <div class="card"><strong>Purpose-permission match</strong> A sales prep agent should not delete database tables or create privileged users.</div>
112
- <div class="card"><strong>Connector Tool Pack scope</strong> Remote MCP and connector bundles need allowed tools, auth identity, DLP, audit, and downstream-system evidence.</div>
113
- <div class="card"><strong>Review freshness</strong> Agent access changes over time; stale point-in-time reviews are treated as drift signals.</div>
114
- <div class="card"><strong>Shadow agent registration</strong> Unregistered agents and imported MCP servers are blocked before privileged tool calls.</div>
115
- <div class="card"><strong>Vaulted tokens</strong> Raw connector credentials, plaintext API keys, and unvaulted service tokens require explicit exception evidence.</div>
116
- </div>
117
-
118
- <h2>The proof actions</h2>
119
- <p>Before a high-trust claim is accepted, ThumbGate can require tracked evidence:</p>
120
- <pre><code>track_action("agent_identity_inventory_verified", {
121
- owner: "workflow owner",
122
- invoker: "who can run the agent",
123
- credential: "service account or connector identity",
124
- systems: ["GitHub", "Jira", "Slack"],
125
- verbs: ["read", "write"],
126
- purpose: "triage engineering tickets"
127
- })
128
-
129
- track_action("connector_scope_verified", {
130
- platform: "Merge Agent Handler or Glean MCP Gateway",
131
- allowedTools: ["create_ticket", "read_issue"],
132
- dlp: "enabled",
133
- audit: "tool-call logs verified",
134
- downstreamSystems: ["Jira"]
135
- })</code></pre>
136
-
137
- <h2>Is Glean a competitor?</h2>
138
- <p>Glean is adjacent and upstream. It is a Work AI platform: enterprise search, assistant, agents, orchestration, connectors, security, and MCP Gateway. It competes for enterprise AI budget, but it does not replace ThumbGate's local-first feedback-to-enforcement loop for Claude Code, Cursor, Codex, Gemini CLI, MCP tools, and developer-machine actions.</p>
139
- <p>The wedge is complementary: Glean and Merge help agents reach more enterprise systems. ThumbGate makes each new action boundary safer by checking purpose, identity, connector scope, and prior failures before execution.</p>
140
-
141
- <h2>Buyer message</h2>
142
- <p>If your agent can authenticate, it has an identity. If it can call tools, it has a blast radius. ThumbGate gives the operator a pre-action gate for that blast radius.</p>
143
- <p><a class="cta" href="/guide">Install ThumbGate locally</a></p>
144
- </main>
145
- </body>
146
- </html>