thumbgate 1.27.12 โ†’ 1.27.14

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 (133) 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/agent-readiness.js +142 -0
  29. package/scripts/aws-blocks-guardrails.js +228 -0
  30. package/scripts/cli-schema.js +22 -10
  31. package/scripts/dashboard-chat.js +2 -1
  32. package/scripts/document-intake.js +1 -49
  33. package/scripts/durability/step.js +3 -3
  34. package/scripts/gate-stats.js +5 -11
  35. package/scripts/gates-engine.js +0 -49
  36. package/scripts/gemini-embedding-policy.js +2 -1
  37. package/scripts/hook-stop-anti-claim.js +116 -184
  38. package/scripts/hosted-config.js +0 -12
  39. package/scripts/lesson-search.js +1 -15
  40. package/scripts/llm-client.js +187 -5
  41. package/scripts/plausible-domain-config.js +3 -1
  42. package/scripts/seo-gsd.js +240 -1
  43. package/scripts/tool-registry.js +2 -2
  44. package/scripts/vector-store.js +44 -0
  45. package/scripts/workspace-evolver.js +62 -2
  46. package/src/api/server.js +340 -131
  47. package/public/assets/brand/thumbgate-mark-inline.svg +0 -15
  48. package/public/compare/adopt-ai.html +0 -219
  49. package/public/compare/agentix-labs.html +0 -197
  50. package/public/compare/ai-experience-orchestration.html +0 -216
  51. package/public/compare/anthropic-claude-for-legal.html +0 -260
  52. package/public/compare/anthropic-containment.html +0 -280
  53. package/public/compare/arcade.html +0 -175
  54. package/public/compare/arcjet.html +0 -239
  55. package/public/compare/bumblebee.html +0 -307
  56. package/public/compare/claude-code-hooks.html +0 -294
  57. package/public/compare/databricks-unity-ai-gateway.html +0 -215
  58. package/public/compare/fallow.html +0 -351
  59. package/public/compare/heidi.html +0 -233
  60. package/public/compare/mem0.html +0 -342
  61. package/public/compare/oak-and-sparrow-gatekeeper.html +0 -289
  62. package/public/compare/rein.html +0 -236
  63. package/public/compare/sigmashake.html +0 -256
  64. package/public/compare/speclock.html +0 -342
  65. package/public/guides/agent-harness-optimization.html +0 -342
  66. package/public/guides/agentic-web-governance.html +0 -406
  67. package/public/guides/ai-agent-governance-sprint.html +0 -415
  68. package/public/guides/ai-agent-pre-action-approval-gates.html +0 -401
  69. package/public/guides/ai-agent-workflow-migration-checklist.html +0 -392
  70. package/public/guides/ai-deployment-readiness.html +0 -415
  71. package/public/guides/ai-mode-ads-agent-governance.html +0 -401
  72. package/public/guides/ai-search-topical-presence.html +0 -342
  73. package/public/guides/autoresearch-agent-safety.html +0 -342
  74. package/public/guides/background-agent-governance.html +0 -358
  75. package/public/guides/best-tools-stop-ai-agents-breaking-production.html +0 -363
  76. package/public/guides/browser-automation-safety.html +0 -342
  77. package/public/guides/chatgpt-ads-trust.html +0 -353
  78. package/public/guides/claude-code-feedback.html +0 -339
  79. package/public/guides/claude-code-prevent-repeated-mistakes.html +0 -161
  80. package/public/guides/claude-code-skills-guardrails.html +0 -343
  81. package/public/guides/claude-desktop.html +0 -356
  82. package/public/guides/code-knowledge-graph-guardrails.html +0 -365
  83. package/public/guides/codex-cli-guardrails.html +0 -339
  84. package/public/guides/cursor-agent-guardrails.html +0 -339
  85. package/public/guides/cursor-prevent-repeated-mistakes.html +0 -161
  86. package/public/guides/database-agent-safety.html +0 -406
  87. package/public/guides/deepseek-v4-runtime-guardrails.html +0 -346
  88. package/public/guides/developer-machine-supply-chain-guardrails.html +0 -358
  89. package/public/guides/gcp-mcp-guardrails.html +0 -147
  90. package/public/guides/gemini-cli-feedback-memory.html +0 -339
  91. package/public/guides/gpt-5-5-model-evaluation.html +0 -358
  92. package/public/guides/internal-ai-engineering-stack-guardrails.html +0 -348
  93. package/public/guides/long-running-agent-context-management.html +0 -346
  94. package/public/guides/mcp-tool-governance.html +0 -401
  95. package/public/guides/multica-thumbgate-setup.html +0 -134
  96. package/public/guides/native-messaging-host-security.html +0 -342
  97. package/public/guides/policy-engine-pre-action-gates.html +0 -346
  98. package/public/guides/pre-action-checks.html +0 -342
  99. package/public/guides/pretooluse-hooks-vs-advisory-prompt-rules.html +0 -342
  100. package/public/guides/prompt-tricks-to-workflow-rules.html +0 -365
  101. package/public/guides/proxy-pointer-rag-guardrails.html +0 -352
  102. package/public/guides/rag-precision-tuning-guardrails.html +0 -352
  103. package/public/guides/reasoning-compression-guardrails.html +0 -346
  104. package/public/guides/relational-knowledge-ai-recommendations.html +0 -342
  105. package/public/guides/roo-code-alternative-cline.html +0 -339
  106. package/public/guides/semantic-programmatic-seo-guardrails.html +0 -352
  107. package/public/guides/seo-agent-skills-guardrails.html +0 -344
  108. package/public/guides/stop-repeated-ai-agent-mistakes.html +0 -342
  109. package/public/learn/ac-dc-runtime-enforcement.html +0 -277
  110. package/public/learn/agent-harness-pattern.html +0 -181
  111. package/public/learn/agent-identity-connector-governance.html +0 -146
  112. package/public/learn/agent-swarms-shared-gates.html +0 -173
  113. package/public/learn/agentic-enterprise-context-brain.html +0 -117
  114. package/public/learn/agentic-os-team-governance.html +0 -146
  115. package/public/learn/ai-agent-governance.html +0 -158
  116. package/public/learn/ai-agent-persistent-memory.html +0 -211
  117. package/public/learn/anthropomorphic-claim-gates.html +0 -180
  118. package/public/learn/background-agent-control-layer.html +0 -184
  119. package/public/learn/claude-code-goal-with-rubrics.html +0 -205
  120. package/public/learn/codex-role-plugins-need-governance.html +0 -125
  121. package/public/learn/cost-aware-agent-gate-routing.html +0 -173
  122. package/public/learn/databricks-unity-ai-gateway-runtime-governance.html +0 -157
  123. package/public/learn/deterministic-agent-workflows.html +0 -185
  124. package/public/learn/feedback-loop-vs-decision-layer.html +0 -283
  125. package/public/learn/from-prototype-to-production.html +0 -223
  126. package/public/learn/learn.css +0 -51
  127. package/public/learn/mcp-pre-action-checks-explained.html +0 -172
  128. package/public/learn/pretix-stripe-connect-marketplaces.html +0 -161
  129. package/public/learn/regulated-agent-execution-boundary.html +0 -196
  130. package/public/learn/spec-driven-development.html +0 -168
  131. package/public/learn/stop-ai-agent-force-push.html +0 -134
  132. package/public/learn/vibe-coding-safety-net.html +0 -142
  133. package/scripts/reddit-browser-notification-watch.js +0 -230
package/public/index.html CHANGED
@@ -20,7 +20,7 @@ __GOOGLE_SITE_VERIFICATION_META__
20
20
  <meta property="og:image" content="https://thumbgate.ai/og.png">
21
21
  <meta name="twitter:card" content="summary_large_image">
22
22
  <meta name="twitter:image" content="https://thumbgate.ai/og.png">
23
- <meta name="thumbgate-version" content="1.27.7">
23
+ <meta name="thumbgate-version" content="1.27.8">
24
24
  <meta name="keywords" content="ThumbGate, thumbgate, AI agent orchestration, AI experience orchestration, agentic development cycle, AC/DC framework, Guide Generate Verify Solve, agent enforcement layer, save LLM tokens, reduce Claude API cost, reduce OpenAI cost, AI agent token savings, prevent LLM retries, prevent hallucination retries, stop AI token waste, pre-action checks, agent governance, Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode, workflow hardening, context engineering, AI authenticity, brand authenticity AI">
25
25
  <link rel="canonical" href="__APP_ORIGIN__/">
26
26
  <link rel="alternate" type="text/markdown" title="ThumbGate LLM context" href="__APP_ORIGIN__/llm-context.md">
@@ -337,7 +337,7 @@ __GA_BOOTSTRAP__
337
337
  "name": "How does ThumbGate reduce host blast radius for high-risk local runs?",
338
338
  "acceptedAnswer": {
339
339
  "@type": "Answer",
340
- "text": "ThumbGate combines pre-action checks with execution guidance. Workflow Sentinel predicts risky local actions before they execute, and high-risk runs can be routed into Docker Sandboxes instead of running directly on the host. Team workflows also have a signed hosted sandbox lane for isolated automation dispatch."
340
+ "text": "ThumbGate combines pre-action checks with execution guidance. Workflow Sentinel predicts risky local actions before they execute, and high-risk runs can be routed into Docker Sandboxes instead of running directly on the host. Enterprise workflows also have a signed hosted sandbox lane for isolated automation dispatch."
341
341
  }
342
342
  },
343
343
  {
@@ -411,10 +411,9 @@ __GA_BOOTSTRAP__
411
411
  /* NAV */
412
412
  nav { position: sticky; top: 0; z-index: 50; background: rgba(10,10,11,0.85); backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); padding: 14px 0; }
413
413
  nav .container { display: flex; justify-content: space-between; align-items: center; }
414
- .nav-logo { font-weight: 700; font-size: 15px; letter-spacing: -0.02em; color: var(--text); text-decoration: none; display: inline-flex; align-items: center; gap: 8px; }
415
- .nav-logo .logo-mark { width: 28px; height: 28px; display: block; }
416
- .nav-logo .logo-text { color: var(--text); }
417
- .nav-logo span { color: var(--cyan); }
414
+ .nav-logo { color: var(--text); text-decoration: none; display: inline-flex; align-items: center; flex: 0 0 auto; }
415
+ .nav-logo .logo-mark { width: 220px; height: 66px; display: block; flex: 0 0 auto; object-fit: contain; }
416
+ .nav-logo .logo-text { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
418
417
  .nav-links { display: flex; gap: 24px; align-items: center; }
419
418
  .nav-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; transition: color 0.15s; }
420
419
  .nav-links a:hover { color: var(--text); }
@@ -430,32 +429,6 @@ __GA_BOOTSTRAP__
430
429
  .hero p { font-size: 17px; color: var(--text-muted); max-width: 620px; margin: 0 auto 28px; line-height: 1.6; }
431
430
  .hero-lede { font-size: clamp(18px, 2vw, 21px) !important; max-width: 760px !important; color: var(--text-muted); }
432
431
  .hero-proof-card { max-width: 720px; margin: 0 auto 28px; padding: 20px 22px; border: 1px solid rgba(34,211,238,0.24); border-radius: 8px; background: #090d12; box-shadow: 0 20px 80px rgba(0,0,0,0.35); font-family: var(--mono); text-align: left; }
433
- .interactive-gate-demo { max-width: 980px; margin: 0 auto 28px; text-align: left; border: 1px solid rgba(34,211,238,0.24); border-radius: 14px; background: linear-gradient(180deg, rgba(17,17,19,0.98) 0%, rgba(10,16,18,0.98) 100%); box-shadow: 0 20px 80px rgba(0,0,0,0.28); overflow: hidden; }
434
- .interactive-gate-head { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 18px 20px; border-bottom: 1px solid var(--border); }
435
- .interactive-gate-head h2 { margin: 0; font-size: clamp(20px, 3vw, 28px); line-height: 1.15; letter-spacing: -0.025em; }
436
- .interactive-gate-head p { max-width: 480px; margin: 0; font-size: 13px; line-height: 1.5; color: var(--text-muted); text-align: right; }
437
- .interactive-gate-body { display: grid; grid-template-columns: minmax(210px, 0.9fr) minmax(0, 1.35fr); gap: 0; }
438
- .action-picker { border-right: 1px solid var(--border); padding: 16px; display: grid; gap: 10px; align-content: start; }
439
- .action-picker button { width: 100%; text-align: left; border: 1px solid var(--border); border-radius: 8px; background: rgba(10,10,11,0.82); color: var(--text); padding: 12px 14px; font: inherit; cursor: pointer; transition: border-color 0.15s, background 0.15s, transform 0.15s; }
440
- .action-picker button:hover, .action-picker button:focus-visible { border-color: rgba(34,211,238,0.55); outline: none; transform: translateY(-1px); }
441
- .action-picker button[aria-pressed="true"] { border-color: rgba(34,211,238,0.72); background: rgba(34,211,238,0.1); }
442
- .action-picker strong { display: block; font-size: 13px; line-height: 1.25; margin-bottom: 4px; }
443
- .action-picker span { display: block; color: var(--text-muted); font-size: 12px; line-height: 1.35; }
444
- .gate-visual { padding: 18px; }
445
- .gate-flow { display: grid; grid-template-columns: 1fr auto 1fr auto 1fr; align-items: stretch; gap: 10px; margin-bottom: 16px; }
446
- .gate-node { border: 1px solid var(--border); border-radius: 10px; background: rgba(10,10,11,0.72); padding: 14px; min-height: 112px; }
447
- .gate-node-label { color: var(--text-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; margin-bottom: 8px; font-weight: 800; }
448
- .gate-node-value { font-family: var(--mono); font-size: 13px; line-height: 1.5; color: var(--text); overflow-wrap: anywhere; }
449
- .gate-node.blocked { border-color: rgba(248,113,113,0.42); background: rgba(248,113,113,0.08); }
450
- .gate-node.allowed { border-color: rgba(74,222,128,0.42); background: rgba(74,222,128,0.08); }
451
- .gate-arrow { align-self: center; color: var(--cyan); font-weight: 900; font-size: 20px; }
452
- .gate-result { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
453
- .gate-metric { border: 1px solid var(--border); border-radius: 8px; padding: 12px; background: rgba(10,10,11,0.58); }
454
- .gate-metric span { display: block; color: var(--text-muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 4px; }
455
- .gate-metric strong { display: block; color: var(--text); font-size: 16px; }
456
- .gate-metric.block strong { color: var(--red); }
457
- .gate-metric.allow strong { color: var(--green); }
458
- .gate-caption { margin: 12px 0 0; color: var(--text-muted); font-size: 12px; line-height: 1.5; }
459
432
  .terminal-row { padding: 8px 0; font-size: 14px; line-height: 1.45; border-bottom: 1px solid rgba(255,255,255,0.06); }
460
433
  .terminal-row:last-child { border-bottom: 0; }
461
434
  .terminal-row.muted { color: var(--text-muted); }
@@ -473,13 +446,20 @@ __GA_BOOTSTRAP__
473
446
  .hero-actions { display: flex; justify-content: center; align-items: center; flex-wrap: wrap; gap: 12px; margin: 0 auto 16px; max-width: 900px; }
474
447
  .hero-actions a, .hero-actions .hero-install { min-height: 48px; border-radius: 8px; }
475
448
  .hero-actions .hero-install { margin-bottom: 0; font-size: 18px; padding: 14px 22px; border: 1px solid rgba(34,211,238,0.55); background: rgba(34,211,238,0.07); box-shadow: none; }
476
- .hero-actions .btn-install-hero { font-size: 16px; padding: 14px 22px; }
449
+ .hero-actions .btn-install-hero { font-size: 17px; padding: 14px 24px; font-weight: 800; background: var(--cyan); color: var(--bg); border: 1px solid rgba(34,211,238,0.65); box-shadow: 0 0 0 1px rgba(34,211,238,0.28), 0 12px 32px rgba(34,211,238,0.18); }
477
450
  .hero-actions .hero-diagnostic { font-size: 16px; padding: 14px 22px; background: var(--green); color: #06120a; font-weight: 800; box-shadow: none; }
478
451
  .offer-router{max-width:940px;margin:18px auto 22px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;text-align:left}
479
452
  .offer-route{border:1px solid rgba(34,211,238,.18);background:rgba(17,17,19,.72);border-radius:8px;padding:14px}
480
453
  .offer-route strong{display:block;color:var(--text);font-size:14px;margin-bottom:6px}.offer-route p{margin:0 0 10px;color:var(--text-muted);font-size:13px}
481
454
  .offer-route a,.offer-route button{color:var(--cyan);font-weight:800;font-size:13px;text-decoration:none;background:transparent;border:0;padding:0;cursor:pointer}.offer-route.primary{background:rgba(34,211,238,.07)}
455
+ .repeat-proof-strip { max-width: 760px; margin: 0 auto 24px; display: grid; grid-template-columns: 1fr auto 1fr; gap: 10px; align-items: stretch; text-align: left; }
456
+ .repeat-proof-step { border: 1px solid rgba(34,211,238,0.18); background: rgba(17,17,19,0.76); border-radius: 8px; padding: 12px 14px; min-height: 74px; }
457
+ .repeat-proof-step strong { display: block; color: var(--text); font-size: 13px; margin-bottom: 4px; }
458
+ .repeat-proof-step code { display: block; color: var(--text-muted); font-family: var(--mono); font-size: 12px; line-height: 1.45; white-space: normal; }
459
+ .repeat-proof-step.blocked { border-color: rgba(248,113,113,0.34); background: rgba(248,113,113,0.08); }
460
+ .repeat-proof-arrow { display: flex; align-items: center; justify-content: center; color: var(--cyan); font-weight: 800; }
482
461
  .btn-pro-page { display: inline-flex; align-items: center; justify-content: center; padding: 11px 18px; background: var(--cyan); color: var(--bg); border-radius: 999px; text-decoration: none; font-size: 14px; font-weight: 700; box-shadow: 0 0 0 1px rgba(34,211,238,0.28), 0 12px 32px rgba(34,211,238,0.18); transition: opacity 0.15s, transform 0.15s; }
462
+ .btn-pro-page.hero-secondary { background: rgba(17,17,19,0.72); color: var(--cyan); border: 1px solid rgba(34,211,238,0.32); box-shadow: none; }
483
463
  .btn-pro-page:hover { opacity: 0.9; transform: translateY(-1px); }
484
464
  .btn-gpt-page { display: inline-flex; align-items: center; justify-content: center; padding: 14px 32px; background: var(--green); color: #06120a; border-radius: 8px; text-decoration: none; font-size: 16px; font-weight: 800; box-shadow: 0 0 0 1px rgba(74,222,128,0.32), 0 12px 32px rgba(74,222,128,0.18); transition: opacity 0.15s, transform 0.15s; }
485
465
  .btn-gpt-page:hover { opacity: 0.92; transform: translateY(-1px); }
@@ -729,16 +709,11 @@ __GA_BOOTSTRAP__
729
709
  .team-intake-recovery a { width: 100%; }
730
710
  .team-form { grid-template-columns: 1fr; }
731
711
  .hero { padding: 72px 0 56px; }
732
- .interactive-gate-head { display: block; }
733
- .interactive-gate-head p { text-align: left; margin-top: 8px; }
734
- .interactive-gate-body { grid-template-columns: 1fr; }
735
- .action-picker { border-right: 0; border-bottom: 1px solid var(--border); }
736
- .gate-flow { grid-template-columns: 1fr; }
737
- .gate-arrow { transform: rotate(90deg); justify-self: center; }
738
- .gate-result { grid-template-columns: 1fr; }
739
712
  .hero-actions { flex-direction: column; }
740
713
  .hero-actions a { width: 100%; }
741
714
  .offer-router { grid-template-columns: 1fr; }
715
+ .repeat-proof-strip { grid-template-columns: 1fr; }
716
+ .repeat-proof-arrow { min-height: 20px; }
742
717
  .hero-paid-actions { justify-content: center; }
743
718
  .hero-paid-actions a { width: 100%; }
744
719
  .nav-links a:not(.nav-cta) { display: none; }
@@ -763,7 +738,7 @@ __GA_BOOTSTRAP__
763
738
  <!-- NAV -->
764
739
  <nav>
765
740
  <div class="container">
766
- <a href="/" class="nav-logo"><img src="/assets/brand/thumbgate-mark-inline.svg" alt="ThumbGate" class="logo-mark" width="28" height="28"><span class="logo-text">ThumbGate</span></a>
741
+ <a href="/" class="nav-logo" aria-label="ThumbGate home"><img src="/assets/brand/thumbgate-logo-transparent.svg?v=20260623-transparent-wordmark-nav" alt="" class="logo-mark" width="220" height="66"><span class="logo-text">ThumbGate</span></a>
767
742
  <div class="nav-links">
768
743
  <a href="#how-it-works">How It Works</a>
769
744
  <a href="/pricing">Pricing</a>
@@ -788,102 +763,54 @@ __GA_BOOTSTRAP__
788
763
  <!-- HERO -->
789
764
  <section class="hero">
790
765
  <div class="container">
791
- <div class="hero-badge">๐Ÿ‘ ๐Ÿ‘Ž Local-first ยท open-source ยท Pro proof when it matters</div>
792
- <h1>Stop AI agents before they spend money, leak secrets, or break production.</h1>
793
- <p class="hero-lede">Claude Code, Cursor, Codex, Gemini CLI, and MCP tools now touch terminals, repos, databases, SaaS APIs, and cloud systems. ThumbGate checks the next tool call before it runs, blocks repeated failures from your thumbs-down feedback, and gives paid operators proof, sync, recall, and exports when local rules become business-critical.</p>
794
-
795
- <div class="hero-signals" aria-label="June 2026 buyer signals">
796
- <a class="signal-pill signal-down" href="#june-2026-proof">MCP tool risk</a>
797
- <a class="signal-pill" href="#june-2026-proof">Managed-agent rollout</a>
798
- <a class="signal-pill" href="#june-2026-proof">Token spend pressure</a>
799
- <a class="signal-pill signal-up" href="#pricing">Free wedge, paid proof</a>
766
+ <div class="hero-badge">For AI coders who already corrected the same agent twice</div>
767
+ <h1>Stop repeated AI agent mistakes before they run again.</h1>
768
+ <p class="hero-lede">ThumbGate turns one thumbs-down into a local pre-action check. If Claude Code, Cursor, Codex, Gemini CLI, or another MCP-capable agent tries the same unsafe command, edit, deploy, retry loop, or API call again, ThumbGate blocks it before execution and records why.</p>
769
+
770
+ <div class="hero-signals" aria-label="Repeated agent mistakes ThumbGate stops">
771
+ <a class="signal-pill signal-down" href="#first-check">Repeated command</a>
772
+ <a class="signal-pill" href="#first-check">Runaway retry loop</a>
773
+ <a class="signal-pill" href="#first-check">Rejected edit returns</a>
774
+ <a class="signal-pill signal-up" href="#pricing">Upgrade after proof</a>
800
775
  </div>
801
776
 
802
- <div class="hero-proof-card" aria-label="ThumbGate blocking dangerous AI agent commands in real time">
803
- <img src="/media/thumbgate-demo.gif" alt="ThumbGate blocking an AI agent's rm -rf, git push --force, and chmod 777 in real time, while letting safe commands through" style="width:100%;display:block;border-radius:8px;" loading="lazy" />
777
+ <div class="repeat-proof-strip" aria-label="ThumbGate thumbs-down to blocked repeat example">
778
+ <div class="repeat-proof-step">
779
+ <strong>1. You reject it once</strong>
780
+ <code>thumbs down: never force-push main without explicit approval</code>
781
+ </div>
782
+ <div class="repeat-proof-arrow">โ†’</div>
783
+ <div class="repeat-proof-step blocked">
784
+ <strong>2. The repeat is stopped</strong>
785
+ <code>agent: git push --force origin main<br>BLOCKED before execution</code>
786
+ </div>
804
787
  </div>
805
788
 
806
- <div class="interactive-gate-demo" data-gate-demo aria-label="Interactive ThumbGate pre-action gate simulator">
807
- <div class="interactive-gate-head">
808
- <h2>Click an agent action. See the gate fire before execution.</h2>
809
- <p>This is the part dashboards miss: ThumbGate checks the proposed tool call while it is still only intent, then records the receipt.</p>
810
- </div>
811
- <div class="interactive-gate-body">
812
- <div class="action-picker" role="group" aria-label="Choose an AI agent action to simulate">
813
- <button type="button" data-demo-action="forcePush" aria-pressed="true">
814
- <strong>Force-push main</strong>
815
- <span>Known repeated failure from a thumbs-down</span>
816
- </button>
817
- <button type="button" data-demo-action="secretPaste" aria-pressed="false">
818
- <strong>Paste an API key</strong>
819
- <span>Public LLM prompt with secret-shaped data</span>
820
- </button>
821
- <button type="button" data-demo-action="safeTest" aria-pressed="false">
822
- <strong>Run tests</strong>
823
- <span>Safe local verification command</span>
824
- </button>
825
- <button type="button" data-demo-action="deployNoProof" aria-pressed="false">
826
- <strong>Deploy without proof</strong>
827
- <span>Risky production action missing receipts</span>
828
- </button>
829
- </div>
830
- <div class="gate-visual">
831
- <div class="gate-flow" aria-live="polite">
832
- <div class="gate-node">
833
- <div class="gate-node-label">Agent Intent</div>
834
- <div class="gate-node-value" data-demo-command>git push --force origin main</div>
835
- </div>
836
- <div class="gate-arrow" aria-hidden="true">โ†’</div>
837
- <div class="gate-node">
838
- <div class="gate-node-label">PreToolUse Gate</div>
839
- <div class="gate-node-value" data-demo-rule>Rule: never force-push protected branches</div>
840
- </div>
841
- <div class="gate-arrow" aria-hidden="true">โ†’</div>
842
- <div class="gate-node blocked" data-demo-decision-node>
843
- <div class="gate-node-label">Decision</div>
844
- <div class="gate-node-value" data-demo-decision>BLOCK before execution</div>
845
- </div>
846
- </div>
847
- <div class="gate-result">
848
- <div class="gate-metric block" data-demo-status-card>
849
- <span>Status</span>
850
- <strong data-demo-status>Blocked</strong>
851
- </div>
852
- <div class="gate-metric">
853
- <span>Repeat Tokens</span>
854
- <strong data-demo-tokens>0 spent</strong>
855
- </div>
856
- <div class="gate-metric">
857
- <span>Receipt</span>
858
- <strong data-demo-receipt>tg_427_force_push</strong>
859
- </div>
860
- </div>
861
- <p class="gate-caption" data-demo-caption>The agent receives a concrete refusal and chooses a safer plan. The audit trail keeps the rule, source feedback, timestamp, and proposed command.</p>
862
- </div>
863
- </div>
789
+ <div class="hero-proof-card" aria-label="ThumbGate blocking dangerous AI agent commands in real time">
790
+ <img src="/media/thumbgate-demo.gif" alt="ThumbGate blocking an AI agent's rm -rf, git push --force, and chmod 777 in real time, while letting safe commands through" style="width:100%;display:block;border-radius:8px;" loading="lazy" />
864
791
  </div>
865
792
 
866
793
  <div class="hero-actions">
867
- <a href="/checkout/pro?utm_source=website&utm_medium=hero_cta&utm_campaign=pro_upgrade&cta_id=hero_start_pro&cta_placement=hero&plan_id=pro&landing_path=%2F" data-revenue-cta data-cta-id="hero_start_pro" data-cta-placement="hero" data-tier="pro" data-plan-id="pro" data-price="19" onclick="trackRevenueCta(this);try{posthog.capture('hero_pro_checkout_click',{cta:'hero_start_pro',tier:'pro',price:19})}catch(_){}" class="btn-pro-page hero-pro hero-pro-primary">Start Pro โ€” $19/mo</a>
868
- <a href="#workflow-sprint-intake" onclick="try{posthog.capture('hero_sprint_click',{cta:'sprint_intake'})}catch(_){};sendFirstPartyTelemetry('hero_sprint_intake_started',{ctaId:'hero_workflow_sprint',ctaPlacement:'hero',offer:'workflow_sprint'});" class="btn-pro-page hero-pro">Send workflow first</a>
869
- <a href="/go/install?utm_source=website&utm_medium=hero_cta&utm_campaign=install_free&cta_id=hero_install_cli&cta_placement=hero" onclick="event.preventDefault(); navigator.clipboard.writeText('npx thumbgate init'); this.textContent='Copied โœ“ โ€” paste in your repo'; setTimeout(()=>{this.textContent='Copy Free CLI'},2000); try{posthog.capture('hero_install_click',{cta:'install_cli'})}catch(_){}" class="btn-free btn-install-hero" title="Click to copy: npx thumbgate init">Copy Free CLI</a>
794
+ <a href="/go/install?utm_source=website&utm_medium=hero_cta&utm_campaign=install_free&cta_id=hero_install_cli&cta_placement=hero" onclick="event.preventDefault(); navigator.clipboard.writeText('npx thumbgate init'); this.textContent='Copied โœ“ โ€” paste in your repo'; setTimeout(()=>{this.textContent='Install Free CLI'},2000); try{posthog.capture('hero_install_click',{cta:'install_cli'})}catch(_){}" class="btn-free btn-install-hero" title="Click to copy: npx thumbgate init">Install Free CLI</a>
795
+ <a href="/checkout/pro?utm_source=website&utm_medium=hero_cta&utm_campaign=pro_upgrade&cta_id=hero_start_pro&cta_placement=hero&plan_id=pro&landing_path=%2F" data-revenue-cta data-cta-id="hero_start_pro" data-cta-placement="hero" data-tier="pro" data-plan-id="pro" data-price="19" onclick="trackRevenueCta(this);try{posthog.capture('hero_pro_checkout_click',{cta:'hero_start_pro',tier:'pro',price:19})}catch(_){}" class="btn-pro-page hero-pro hero-pro-primary hero-secondary">Upgrade after one blocked repeat</a>
796
+ <a href="#workflow-sprint-intake" onclick="try{posthog.capture('hero_sprint_click',{cta:'sprint_intake'})}catch(_){};sendFirstPartyTelemetry('hero_sprint_intake_started',{ctaId:'hero_workflow_sprint',ctaPlacement:'hero',offer:'workflow_sprint'});" class="btn-pro-page hero-pro hero-secondary">Team workflow intake โ†’</a>
870
797
  </div>
871
798
 
872
799
  <div class="offer-router" aria-label="Choose the right ThumbGate path">
873
800
  <div class="offer-route primary">
874
- <strong>Solo operator: Start Pro</strong>
875
- <p>Unlimited rules, recall, sync, proof, exports.</p>
876
- <a href="/checkout/pro?utm_source=website&utm_medium=offer_router&cta_id=router_start_pro&cta_placement=offer_router&plan_id=pro" data-revenue-cta data-cta-id="router_start_pro" data-cta-placement="offer_router" data-tier="pro" data-plan-id="pro" data-price="19" onclick="trackRevenueCta(this);">Pay $19/mo with Stripe โ†’</a>
801
+ <strong>Start here: Free CLI</strong>
802
+ <p>2 captures/day, 3 active rules. Enough to prove one blocked repeat in your repo.</p>
803
+ <button data-router-install onclick="copyInstall(this)"><span class="copy-hint">Copy npx thumbgate init</span></button>
877
804
  </div>
878
805
  <div class="offer-route">
879
- <strong>Team workflow: Start with intake</strong>
880
- <p>One repeated failure, one owner, one proof plan.</p>
881
- <a href="#workflow-sprint-intake" onclick="sendFirstPartyTelemetry('workflow_sprint_intake_started',{ctaId:'router_workflow_sprint',ctaPlacement:'offer_router',offer:'workflow_sprint'});">Talk to us โ†’</a>
806
+ <strong>After it blocks a repeat: Pro</strong>
807
+ <p>Unlimited rules, recall, sync, dashboard proof, and exports for one operator.</p>
808
+ <a href="/checkout/pro?utm_source=website&utm_medium=offer_router&cta_id=router_start_pro&cta_placement=offer_router&plan_id=pro" data-revenue-cta data-cta-id="router_start_pro" data-cta-placement="offer_router" data-tier="pro" data-plan-id="pro" data-price="19" onclick="trackRevenueCta(this);">Upgrade to Pro โ†’</a>
882
809
  </div>
883
810
  <div class="offer-route">
884
- <strong>Still evaluating: Free CLI</strong>
885
- <p>2 captures/day, 3 active rules. Enough to prove one blocked repeat.</p>
886
- <button data-router-install onclick="copyInstall(this)"><span class="copy-hint">Copy npx thumbgate init</span></button>
811
+ <strong>Team has the same failure: intake</strong>
812
+ <p>One repeated workflow, one owner, one proof plan before a wider rollout.</p>
813
+ <a href="#workflow-sprint-intake" onclick="sendFirstPartyTelemetry('workflow_sprint_intake_started',{ctaId:'router_workflow_sprint',ctaPlacement:'offer_router',offer:'workflow_sprint'});">Send workflow first โ†’</a>
887
814
  </div>
888
815
  </div>
889
816
 
@@ -1187,6 +1114,21 @@ __GA_BOOTSTRAP__
1187
1114
  <p>Claude Code, Codex, Gemini CLI, Amp, and OpenCode all use the same gateway and memory model. Any MCP-compatible agent gets pre-action checks, feedback memory, and enforcement out of the box.</p>
1188
1115
  <div class="card-arrow">Open the setup guide โ†’</div>
1189
1116
  </a>
1117
+ <a class="compat-card seo-card" href="/guides/hermes-agent-guardrails" rel="noopener">
1118
+ <h3>โ˜ค Hermes Agent guardrails</h3>
1119
+ <p>Hermes-style agents bring persistent memory, generated skills, messaging gateways, scheduled automations, and sandboxed execution. ThumbGate adds the safer self-evolution loop: propose rule and skill changes from failures, then gate them with evidence before anything overwrites stable instructions or repeats an expensive action.</p>
1120
+ <div class="card-arrow">Read the Hermes guardrails guide โ†’</div>
1121
+ </a>
1122
+ <a class="compat-card seo-card" href="/guides/vllm-serving-guardrails" rel="noopener">
1123
+ <h3>vLLM serving guardrails</h3>
1124
+ <p>vLLM makes self-hosted inference cheaper and faster with PagedAttention, continuous batching, chunked prefill, prefix caching, and optimized kernels. ThumbGate gates the routing change with latency, cache-isolation, benchmark, and rollback proof before agent traffic moves.</p>
1125
+ <div class="card-arrow">Read the vLLM guardrails guide โ†’</div>
1126
+ </a>
1127
+ <a class="compat-card seo-card" href="/guides/agent-context-governance" rel="noopener">
1128
+ <h3>Context and tool governance</h3>
1129
+ <p>Long-running agents need cleaner working context, approved model routes, isolated execution, tool lockdown, direct pushback, and evidence before high-risk actions. ThumbGate turns those controls into local pre-action gates.</p>
1130
+ <div class="card-arrow">Read the context governance guide โ†’</div>
1131
+ </a>
1190
1132
  <a class="compat-card seo-card" href="/guides/gcp-mcp-guardrails" rel="noopener">
1191
1133
  <h3>โ˜๏ธ Google Data Agent Kit</h3>
1192
1134
  <p>Cloud Next 2026 shipped BigQuery, Spanner, AlloyDB, and Cloud SQL as MCP tool calls into Claude Code, Codex, and Gemini CLI. ThumbGate checks the destructive ones โ€” DROP on prod datasets, unscoped DELETEs, IAM escalation โ€” before they fire.</p>
@@ -1237,7 +1179,7 @@ __GA_BOOTSTRAP__
1237
1179
  <p>Every block explains why: which pattern matched, what evidence triggered it, and whether the rule came from your own corrections.</p>
1238
1180
  </div>
1239
1181
  <div class="agent-card">
1240
- <h3>๐Ÿ“Š Org Dashboard (Team)</h3>
1182
+ <h3>๐Ÿ“Š Org Dashboard</h3>
1241
1183
  <p>See which agents are creating review churn, which checks are saving time, and where rollout risk is still concentrated across the shared workflow.</p>
1242
1184
  </div>
1243
1185
  <div class="agent-card">
@@ -1260,6 +1202,28 @@ __GA_BOOTSTRAP__
1260
1202
  </div>
1261
1203
  </section>
1262
1204
 
1205
+ <section class="compatibility" id="governance-not-logging">
1206
+ <div class="container">
1207
+ <div class="section-label">Governance, Not Logging</div>
1208
+ <h2 class="section-title">Logs describe the damage. ThumbGate blocks the risky action before it runs.</h2>
1209
+ <p style="color:var(--text-dim);max-width:820px;margin:0 auto 22px;">Self-governance is an operator writing local rules and keeping local logs. ThumbGate starts there, then turns each correction into a pre-action decision: allow, block, require evidence, or route for approval before the tool call touches code, data, money, or customers.</p>
1210
+ <div class="agent-grid">
1211
+ <div class="agent-card">
1212
+ <h3>Pre-action enforcement</h3>
1213
+ <p>The rule is evaluated at the execution boundary, not after the fact. Repeated failures are stopped before shell commands, PR actions, deploys, refunds, or production writes run.</p>
1214
+ </div>
1215
+ <div class="agent-card">
1216
+ <h3>Reviewable decision trail</h3>
1217
+ <p>Each event records the rule, source lesson, policy version, actor, action, evidence requirement, and reason so reviewers can inspect the decision instead of trusting an agent summary.</p>
1218
+ </div>
1219
+ <div class="agent-card">
1220
+ <h3>Enterprise governance mode</h3>
1221
+ <p>Org-owned policies, reviewer approvals, signed evidence bundles, and export paths turn local corrections into shared controls without giving the agent unilateral authority over the rules.</p>
1222
+ </div>
1223
+ </div>
1224
+ </div>
1225
+ </section>
1226
+
1263
1227
  <section class="compatibility" id="orchestration-layer">
1264
1228
  <div class="container">
1265
1229
  <div class="section-label">Positioning</div>
@@ -1323,6 +1287,7 @@ __GA_BOOTSTRAP__
1323
1287
  <a href="/guides/relational-knowledge-ai-recommendations">Relational knowledge</a>
1324
1288
  <a href="/guides/claude-code-feedback">Claude Code feedback</a>
1325
1289
  <a href="/guides/autoresearch-agent-safety">Autoresearch safety</a>
1290
+ <a href="/guides/aws-blocks-agent-guardrails">AWS Blocks guardrails</a>
1326
1291
  </div>
1327
1292
  </div>
1328
1293
  </div>
@@ -1345,7 +1310,7 @@ __GA_BOOTSTRAP__
1345
1310
  </div>
1346
1311
  <div class="autoresearch-card">
1347
1312
  <h3>Ship into CI</h3>
1348
- <p>Start with templates for <code>npm test</code>, Playwright duration, bundle size, lint, and CI failures, then add Team checks for shared workflows.</p>
1313
+ <p>Start with templates for <code>npm test</code>, Playwright duration, bundle size, lint, and CI failures, then add shared workflow checks for team-owned releases.</p>
1349
1314
  </div>
1350
1315
  </div>
1351
1316
  <div class="autoresearch-cta">
@@ -1381,8 +1346,9 @@ __GA_BOOTSTRAP__
1381
1346
  <!-- HOW IT WORKS -->
1382
1347
  <section class="how-it-works" id="how-it-works">
1383
1348
  <div class="container">
1384
- <div class="section-label">Current release</div>
1349
+ <div class="section-label">Self-improving enforcement</div>
1385
1350
  <h2 class="section-title">Three steps to stop repeated AI failures</h2>
1351
+ <p class="section-sub" style="max-width:720px;margin:6px auto 22px;text-align:center;color:var(--text-muted);font-size:clamp(16px,1.6vw,18px);">Self-improving โ€” but for safety, not capability: every <code>๐Ÿ‘Ž</code> compiles into a hard rule, and each rule regression-tests itself against your history, so it blocks the repeat and never the safe action.</p>
1386
1352
  <div class="steps">
1387
1353
  <div class="step">
1388
1354
  <div class="step-num">1</div>
@@ -1587,7 +1553,7 @@ __GA_BOOTSTRAP__
1587
1553
  <li><strong>Audit-ready enforcement proof</strong> โ€” Personal local dashboard for the individual operator with auditable block history</li>
1588
1554
  <li><strong>Ship hardened agents to production</strong> โ€” Model Hardening Advisor plus HuggingFace dataset export</li>
1589
1555
  <li><strong>Hand a PR with proof</strong> โ€” Review-ready workflow support and proof-ready lesson bundles a reviewer can verify in 30 seconds</li>
1590
- <li><strong>Hand off without re-onboarding</strong> โ€” Team lesson export/import for handoff or migration</li>
1556
+ <li><strong>Hand off without re-onboarding</strong> โ€” Lesson export/import for handoff or migration</li>
1591
1557
  </ul>
1592
1558
  <div style="margin:12px 0 16px;padding:12px;border:1px solid rgba(34,211,238,0.25);border-radius:8px;background:rgba(34,211,238,0.06);">
1593
1559
  <div style="font-size:12px;color:var(--text-muted);margin-bottom:4px;">What your Pro dashboard looks like</div>
@@ -1765,7 +1731,7 @@ __GA_BOOTSTRAP__
1765
1731
  </div>
1766
1732
  <div class="faq-item">
1767
1733
  <button class="faq-q" type="button" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How do we keep high-risk autonomous runs off the host?</button>
1768
- <div class="faq-a">ThumbGate is the control plane, not just a prompt layer. Workflow Sentinel predicts blast radius before execution, and risky local autonomy can be routed into Docker Sandboxes instead of running directly on the host. Team workflows also have a signed hosted sandbox lane for isolated dispatch when local repo access is not required.</div>
1734
+ <div class="faq-a">ThumbGate is the control plane, not just a prompt layer. Workflow Sentinel predicts blast radius before execution, and risky local autonomy can be routed into Docker Sandboxes instead of running directly on the host. Enterprise workflows also have a signed hosted sandbox lane for isolated dispatch when local repo access is not required.</div>
1769
1735
  </div>
1770
1736
  <div class="faq-item">
1771
1737
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">How do we trust a new package release?</div>
@@ -1849,7 +1815,7 @@ __GA_BOOTSTRAP__
1849
1815
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
1850
1816
  <a href="/blog">Blog</a>
1851
1817
  </div>
1852
- <span class="footer-copy">ยฉ 2026 ThumbGate ยท MIT License ยท npm v1.27.7</span>
1818
+ <span class="footer-copy">ยฉ 2026 ThumbGate ยท MIT License ยท npm v1.27.8</span>
1853
1819
  </div>
1854
1820
  </footer>
1855
1821
 
@@ -2045,93 +2011,6 @@ function copyInstall(el) {
2045
2011
  });
2046
2012
  }
2047
2013
 
2048
- function initializeGateDemo() {
2049
- var root = document.querySelector('[data-gate-demo]');
2050
- if (!root) return;
2051
- var scenarios = {
2052
- forcePush: {
2053
- command: 'git push --force origin main',
2054
- rule: 'Rule: never force-push protected branches',
2055
- decision: 'BLOCK before execution',
2056
- status: 'Blocked',
2057
- statusClass: 'block',
2058
- nodeClass: 'blocked',
2059
- tokens: '0 spent',
2060
- receipt: 'tg_427_force_push',
2061
- caption: 'The agent receives a concrete refusal and chooses a safer plan. The audit trail keeps the rule, source feedback, timestamp, and proposed command.'
2062
- },
2063
- secretPaste: {
2064
- command: 'paste STRIPE_SECRET_KEY into a public LLM prompt',
2065
- rule: 'Rule: sanitize secrets before external AI tools',
2066
- decision: 'BLOCK before data leaves the machine',
2067
- status: 'Blocked',
2068
- statusClass: 'block',
2069
- nodeClass: 'blocked',
2070
- tokens: '0 spent',
2071
- receipt: 'tg_618_secret_prompt',
2072
- caption: 'ThumbGate treats public prompt submission as an external action. Redact, tokenize, or route through a private endpoint before retrying.'
2073
- },
2074
- safeTest: {
2075
- command: 'npm test -- --runInBand',
2076
- rule: 'Rule: local verification is allowed',
2077
- decision: 'ALLOW and log receipt',
2078
- status: 'Allowed',
2079
- statusClass: 'allow',
2080
- nodeClass: 'allowed',
2081
- tokens: 'normal',
2082
- receipt: 'tg_102_test_ok',
2083
- caption: 'Safe verification commands keep moving. ThumbGate records the action so later claims can cite what actually ran.'
2084
- },
2085
- deployNoProof: {
2086
- command: 'railway deploy --production',
2087
- rule: 'Rule: production deploy requires test, rollback, owner',
2088
- decision: 'PAUSE for proof before execution',
2089
- status: 'Needs proof',
2090
- statusClass: 'block',
2091
- nodeClass: 'blocked',
2092
- tokens: 'retry avoided',
2093
- receipt: 'tg_511_deploy_gate',
2094
- caption: 'The deploy is not rejected forever; it is held until the agent shows the proof packet: tests, rollback path, owner, and target environment.'
2095
- }
2096
- };
2097
- var fields = {
2098
- command: root.querySelector('[data-demo-command]'),
2099
- rule: root.querySelector('[data-demo-rule]'),
2100
- decision: root.querySelector('[data-demo-decision]'),
2101
- decisionNode: root.querySelector('[data-demo-decision-node]'),
2102
- statusCard: root.querySelector('[data-demo-status-card]'),
2103
- status: root.querySelector('[data-demo-status]'),
2104
- tokens: root.querySelector('[data-demo-tokens]'),
2105
- receipt: root.querySelector('[data-demo-receipt]'),
2106
- caption: root.querySelector('[data-demo-caption]')
2107
- };
2108
- function render(key) {
2109
- var next = scenarios[key] || scenarios.forcePush;
2110
- fields.command.textContent = next.command;
2111
- fields.rule.textContent = next.rule;
2112
- fields.decision.textContent = next.decision;
2113
- fields.status.textContent = next.status;
2114
- fields.tokens.textContent = next.tokens;
2115
- fields.receipt.textContent = next.receipt;
2116
- fields.caption.textContent = next.caption;
2117
- fields.decisionNode.classList.remove('blocked', 'allowed');
2118
- fields.decisionNode.classList.add(next.nodeClass);
2119
- fields.statusCard.classList.remove('block', 'allow');
2120
- fields.statusCard.classList.add(next.statusClass);
2121
- root.querySelectorAll('[data-demo-action]').forEach(function(button) {
2122
- button.setAttribute('aria-pressed', button.getAttribute('data-demo-action') === key ? 'true' : 'false');
2123
- });
2124
- if (typeof plausible === 'function') plausible('interactive_gate_demo', { props: { scenario: key, status: next.status } });
2125
- }
2126
- root.querySelectorAll('[data-demo-action]').forEach(function(button) {
2127
- button.addEventListener('click', function() {
2128
- render(button.getAttribute('data-demo-action'));
2129
- });
2130
- });
2131
- }
2132
-
2133
- initializeGateDemo();
2134
-
2135
2014
  /* โ”€โ”€ Plausible custom event tracking โ”€โ”€ */
2136
2015
  (function() {
2137
2016
 
@@ -2181,7 +2060,7 @@ initializeGateDemo();
2181
2060
  trackClick('.btn-demo-link', 'demo_click', { source: 'homepage' });
2182
2061
  trackClick('.nav-cta:not([data-revenue-cta])', 'chatgpt_gpt_click', { tier: 'free', source: 'nav' });
2183
2062
 
2184
- /* Pricing CTA conversion tracking โ€” fires on every Get Started / Pro / Team button click
2063
+ /* Pricing CTA conversion tracking โ€” fires on every Get Started / Pro / Enterprise button click
2185
2064
  with section context so we can distinguish pricing section vs final CTA section clicks */
2186
2065
  document.querySelectorAll('.btn-pro, .btn-gpt-page, .btn-pro-page, .btn-install-hero, .btn-install-link, .btn-team, .btn-free, .btn-demo-link, .nav-cta').forEach(function(el) {
2187
2066
  el.addEventListener('click', function() {