thumbgate 1.5.8 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/CHANGELOG.md +198 -0
- package/README.md +7 -6
- package/adapters/README.md +1 -1
- package/adapters/chatgpt/openapi.yaml +25 -0
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/codex/config.toml +4 -4
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/bin/cli.js +61 -5
- package/openapi/openapi.yaml +25 -0
- package/package.json +12 -3
- package/public/codex-plugin.html +277 -0
- package/public/dashboard.html +141 -13
- package/public/index.html +92 -34
- package/public/learn.html +13 -2
- package/public/lessons.html +5 -2
- package/public/pro.html +8 -1
- package/scripts/auto-wire-hooks.js +10 -5
- package/scripts/billing.js +503 -8
- package/scripts/contextfs.js +1 -1
- package/scripts/dashboard.js +236 -0
- package/scripts/gates-engine.js +153 -2
- package/scripts/hook-runtime.js +42 -0
- package/scripts/llm-client.js +25 -10
- package/scripts/mailer/index.js +13 -0
- package/scripts/mailer/resend-mailer.js +350 -0
- package/scripts/mcp-config.js +13 -0
- package/scripts/published-cli.js +8 -0
- package/scripts/seo-gsd.js +118 -4
- package/scripts/statusline.sh +8 -0
- package/scripts/vector-store.js +21 -7
- package/src/api/server.js +112 -7
package/public/index.html
CHANGED
|
@@ -19,12 +19,21 @@
|
|
|
19
19
|
<meta charset="UTF-8">
|
|
20
20
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
21
21
|
__GOOGLE_SITE_VERIFICATION_META__
|
|
22
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png">
|
|
23
|
+
<link rel="alternate icon" type="image/svg+xml" href="/assets/brand/thumbgate-mark.svg">
|
|
24
|
+
<link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
|
|
25
|
+
<meta property="og:image" content="/og.png">
|
|
22
26
|
<title>ThumbGate — Stop paying for the same AI mistake twice</title>
|
|
23
27
|
<meta name="description" content="Stop paying for the same AI mistake twice. ThumbGate turns 👍 thumbs up and 👎 thumbs down feedback into history-aware lessons and Pre-Action Gates that block repeat AI agent mistakes before they reach the model — self-improving agent governance with shared lessons and org visibility for Claude Code, Cursor, Codex, Gemini, Amp, and OpenCode.">
|
|
24
28
|
<meta property="og:title" content="ThumbGate — Stop paying for the same AI mistake twice">
|
|
25
29
|
<meta property="og:description" content="Frontier LLMs are expensive and repeat mistakes cost real money. ThumbGate blocks known-bad AI agent actions before they hit the model — zero tokens spent on retries, hallucinations, or repeat commands. Fix it once, your bill never sees it again.">
|
|
26
30
|
<meta property="og:type" content="website">
|
|
31
|
+
<meta property="og:image" content="https://thumbgate-production.up.railway.app/og.png">
|
|
32
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
33
|
+
<meta name="twitter:image" content="https://thumbgate-production.up.railway.app/og.png">
|
|
27
34
|
<meta name="keywords" content="ThumbGate, thumbgate, 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 gates, agent governance, Claude Code, Cursor, Codex, Gemini, Amp, OpenCode, workflow hardening, context engineering, AI authenticity, brand authenticity AI">
|
|
35
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png">
|
|
36
|
+
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
|
|
28
37
|
|
|
29
38
|
<!-- Privacy-friendly analytics by Plausible -->
|
|
30
39
|
<script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
|
|
@@ -266,7 +275,9 @@ __GA_BOOTSTRAP__
|
|
|
266
275
|
/* NAV */
|
|
267
276
|
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; }
|
|
268
277
|
nav .container { display: flex; justify-content: space-between; align-items: center; }
|
|
269
|
-
.nav-logo { font-weight: 700; font-size: 15px; letter-spacing: -0.02em; color: var(--text); text-decoration: none; }
|
|
278
|
+
.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; }
|
|
279
|
+
.nav-logo .logo-mark { width: 28px; height: 28px; display: block; }
|
|
280
|
+
.nav-logo .logo-text { color: var(--text); }
|
|
270
281
|
.nav-logo span { color: var(--cyan); }
|
|
271
282
|
.nav-links { display: flex; gap: 24px; align-items: center; }
|
|
272
283
|
.nav-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; transition: color 0.15s; }
|
|
@@ -310,13 +321,17 @@ __GA_BOOTSTRAP__
|
|
|
310
321
|
.first-gate-step { border: 1px solid var(--border); border-radius: 10px; background: rgba(10,10,11,0.62); padding: 14px; }
|
|
311
322
|
.first-gate-step strong { display: block; color: var(--cyan); margin-bottom: 6px; }
|
|
312
323
|
.first-gate-step p { font-size: 13px; line-height: 1.5; margin: 0; }
|
|
313
|
-
.first-gate-
|
|
324
|
+
.first-gate-examples { display: grid; gap: 8px; margin-top: 12px; }
|
|
325
|
+
.first-gate-example { font-family: var(--mono); border-radius: 8px; padding: 10px 12px; font-size: 12px; overflow-x: auto; line-height: 1.55; }
|
|
326
|
+
.first-gate-example.signal-good { color: var(--green); background: rgba(74,222,128,0.08); border: 1px solid rgba(74,222,128,0.24); }
|
|
327
|
+
.first-gate-example.signal-fix { color: #fda4af; background: rgba(251,113,133,0.08); border: 1px solid rgba(251,113,133,0.24); }
|
|
314
328
|
|
|
315
329
|
/* SOCIAL PROOF BAR */
|
|
316
|
-
.proof-bar { display: flex; justify-content: center; flex-wrap: wrap; gap:
|
|
317
|
-
.proof-bar a { display: inline-flex; align-items: center;
|
|
318
|
-
.proof-bar a:hover { color: var(--cyan); }
|
|
319
|
-
.proof-bar
|
|
330
|
+
.proof-bar { display: flex; justify-content: center; flex-wrap: wrap; gap: 10px; font-size: 13px; color: var(--text-muted); padding: 4px 0 12px; max-width: 1040px; margin: 0 auto; }
|
|
331
|
+
.proof-bar a { display: inline-flex; align-items: center; justify-content: center; min-height: 36px; padding: 8px 12px; border: 1px solid rgba(34,211,238,0.14); border-radius: 8px; background: rgba(17,17,19,0.72); color: var(--text-muted); text-decoration: none; line-height: 1.25; white-space: nowrap; transition: color 0.15s, border-color 0.15s, background-color 0.15s; }
|
|
332
|
+
.proof-bar a:hover, .proof-bar a:focus-visible { color: var(--cyan); border-color: rgba(34,211,238,0.42); background: rgba(34,211,238,0.08); outline: none; }
|
|
333
|
+
.proof-bar a:focus-visible { box-shadow: 0 0 0 3px rgba(34,211,238,0.18); }
|
|
334
|
+
.proof-bar .dot { display: none; }
|
|
320
335
|
|
|
321
336
|
/* COMPATIBILITY */
|
|
322
337
|
.compatibility { padding: 0 0 80px; }
|
|
@@ -368,6 +383,20 @@ __GA_BOOTSTRAP__
|
|
|
368
383
|
}
|
|
369
384
|
.seo-card .card-arrow { font-size: 13px; color: var(--cyan); margin-top: 12px; font-weight: 500; }
|
|
370
385
|
|
|
386
|
+
/* AUTORESEARCH PACK */
|
|
387
|
+
.autoresearch-pack { padding: 0 0 80px; }
|
|
388
|
+
.autoresearch-panel { border: 1px solid rgba(34,211,238,0.28); border-radius: 8px; background: linear-gradient(180deg, rgba(17,17,19,0.98) 0%, rgba(10,18,20,0.98) 100%); padding: 28px; }
|
|
389
|
+
.autoresearch-panel h2 { font-size: 30px; line-height: 1.18; margin-bottom: 12px; }
|
|
390
|
+
.autoresearch-panel > p { color: var(--text-muted); line-height: 1.65; max-width: 860px; margin-bottom: 22px; }
|
|
391
|
+
.autoresearch-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin: 22px 0; }
|
|
392
|
+
.autoresearch-card { border: 1px solid var(--border); border-radius: 8px; background: rgba(10,10,11,0.62); padding: 18px; }
|
|
393
|
+
.autoresearch-card h3 { font-size: 16px; margin-bottom: 8px; }
|
|
394
|
+
.autoresearch-card p { color: var(--text-muted); font-size: 14px; line-height: 1.55; }
|
|
395
|
+
.autoresearch-cta { display: flex; gap: 12px; flex-wrap: wrap; align-items: center; margin-top: 18px; }
|
|
396
|
+
.autoresearch-cta a { display: inline-flex; align-items: center; min-height: 40px; padding: 10px 16px; border-radius: 8px; text-decoration: none; font-size: 14px; font-weight: 700; }
|
|
397
|
+
.autoresearch-cta .primary { background: var(--cyan); color: #041016; }
|
|
398
|
+
.autoresearch-cta .secondary { border: 1px solid var(--border); color: var(--text); }
|
|
399
|
+
|
|
371
400
|
/* HOW IT WORKS */
|
|
372
401
|
.how-it-works { padding: 80px 0; }
|
|
373
402
|
.section-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--cyan); font-weight: 600; margin-bottom: 12px; text-align: center; }
|
|
@@ -470,7 +499,7 @@ __GA_BOOTSTRAP__
|
|
|
470
499
|
#claude-code-section:hover, #thumbgate-gpt:hover { opacity: 1; }
|
|
471
500
|
|
|
472
501
|
/* Simplify proof bar — make it less overwhelming */
|
|
473
|
-
.proof-bar { font-size:
|
|
502
|
+
.proof-bar { font-size: 13px; gap: 10px; opacity: 1; }
|
|
474
503
|
|
|
475
504
|
/* RESPONSIVE */
|
|
476
505
|
@media (max-width: 700px) {
|
|
@@ -479,13 +508,15 @@ __GA_BOOTSTRAP__
|
|
|
479
508
|
.first-gate-steps { grid-template-columns: 1fr; }
|
|
480
509
|
.gpt-steps { grid-template-columns: 1fr; }
|
|
481
510
|
.seo-grid { grid-template-columns: 1fr; }
|
|
511
|
+
.autoresearch-grid { grid-template-columns: 1fr; }
|
|
482
512
|
.pricing-grid { grid-template-columns: 1fr; }
|
|
483
513
|
.team-form { grid-template-columns: 1fr; }
|
|
484
514
|
.hero { padding: 72px 0 56px; }
|
|
485
515
|
.hero-actions { flex-direction: column; }
|
|
486
516
|
.hero-actions a { width: 100%; }
|
|
487
517
|
.nav-links a:not(.nav-cta) { display: none; }
|
|
488
|
-
.proof-bar { gap:
|
|
518
|
+
.proof-bar { gap: 8px; justify-content: flex-start; }
|
|
519
|
+
.proof-bar a { width: 100%; min-height: 42px; white-space: normal; }
|
|
489
520
|
.proof-bar .dot { display: none; }
|
|
490
521
|
}
|
|
491
522
|
</style>
|
|
@@ -505,10 +536,11 @@ __GA_BOOTSTRAP__
|
|
|
505
536
|
<!-- NAV -->
|
|
506
537
|
<nav>
|
|
507
538
|
<div class="container">
|
|
508
|
-
<a href="#" class="nav-logo"><span
|
|
539
|
+
<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>
|
|
509
540
|
<div class="nav-links">
|
|
510
541
|
<a href="#how-it-works">How It Works</a>
|
|
511
542
|
<a href="#pricing">Pricing</a>
|
|
543
|
+
<a href="/guides/autoresearch-agent-safety">Autoresearch</a>
|
|
512
544
|
<a href="#faq">FAQ</a>
|
|
513
545
|
<a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
|
|
514
546
|
<a href="#compatibility" style="display:none;">Compatibility</a>
|
|
@@ -603,7 +635,7 @@ __GA_BOOTSTRAP__
|
|
|
603
635
|
<div class="hero-secondary-ctas" style="display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-top:8px;opacity:0.7;">
|
|
604
636
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-claude-desktop.mcpb" class="btn-gpt-page" target="_blank" rel="noopener" onclick="posthog.capture('hero_claude_extension_click',{cta:'install_claude_extension'})" style="font-size:12px;padding:8px 16px;background:#d97706;color:#fff;box-shadow:none;">Install Claude Extension</a>
|
|
605
637
|
<a href="/go/github?utm_source=website&utm_medium=hero_cta&utm_campaign=github_repo&cta_id=hero_star_github&cta_placement=hero" target="_blank" rel="noopener" class="btn-free" style="display:inline-flex;align-items:center;gap:6px;padding:8px 14px;border-radius:999px;font-size:12px;">⭐ Star on GitHub</a>
|
|
606
|
-
<a href="
|
|
638
|
+
<a href="/codex-plugin?utm_source=website&utm_medium=hero_cta&utm_campaign=codex_plugin&cta_id=hero_codex_plugin&cta_placement=hero" class="btn-install-link" onclick="posthog.capture('hero_codex_plugin_click',{cta:'install_codex_plugin'})" style="font-size:11px;color:var(--text-muted);text-decoration:none;padding:6px 10px;">Install Codex plugin →</a>
|
|
607
639
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/tree/main/plugins/cursor-marketplace" class="btn-install-link" target="_blank" rel="noopener" onclick="posthog.capture('hero_cursor_plugin_click',{cta:'install_cursor_plugin'})" style="font-size:11px;color:var(--text-muted);text-decoration:none;padding:6px 10px;">Install Cursor plugin →</a>
|
|
608
640
|
<a href="/go/gpt?utm_source=website&utm_medium=hero_cta&utm_campaign=chatgpt_gpt&cta_id=hero_open_gpt&cta_placement=hero" class="btn-gpt-page" target="_blank" rel="noopener" onclick="posthog.capture('hero_cta_click',{cta:'open_gpt'})" style="font-size:11px;padding:6px 12px;background:transparent;border:1px solid rgba(74,222,128,0.3);color:var(--green);">Open ThumbGate GPT</a>
|
|
609
641
|
</div>
|
|
@@ -628,44 +660,36 @@ __GA_BOOTSTRAP__
|
|
|
628
660
|
<div class="first-gate-steps">
|
|
629
661
|
<div class="first-gate-step">
|
|
630
662
|
<strong>1. Install ThumbGate</strong>
|
|
631
|
-
<p>Run <code>npx thumbgate init</code> in your repo. Or install the <a href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-claude-desktop.mcpb" style="color:var(--cyan);">Claude Extension</a>, <a href="
|
|
663
|
+
<p>Run <code>npx thumbgate init</code> in your repo. Or install the <a href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-claude-desktop.mcpb" style="color:var(--cyan);">Claude Extension</a>, <a href="/codex-plugin" style="color:var(--cyan);">Codex plugin</a>, <a href="https://github.com/IgorGanapolsky/ThumbGate/tree/main/plugins/cursor-marketplace" style="color:var(--cyan);">Cursor plugin</a>, or <a href="/go/gpt" style="color:var(--cyan);">open the GPT</a>. Native ChatGPT rating buttons are not the ThumbGate capture path.</p>
|
|
632
664
|
</div>
|
|
633
665
|
<div class="first-gate-step">
|
|
634
666
|
<strong>2. Give feedback</strong>
|
|
635
|
-
<p>
|
|
667
|
+
<p>Give <code>thumbs up</code> when the agent follows your standards, or <code>thumbs down</code> when it misses. ThumbGate captures the context and distills a lesson from up to 8 prior entries.</p>
|
|
636
668
|
</div>
|
|
637
669
|
<div class="first-gate-step">
|
|
638
670
|
<strong>3. The gate blocks the repeat</strong>
|
|
639
671
|
<p>Next time the agent tries the same mistake, the PreToolUse hook fires and physically blocks it. Upgrade after one real blocked repeat when you need the dashboard and exports.</p>
|
|
640
672
|
</div>
|
|
641
673
|
</div>
|
|
642
|
-
<div class="first-gate-
|
|
674
|
+
<div class="first-gate-examples" aria-label="ThumbGate feedback examples">
|
|
675
|
+
<div class="first-gate-example signal-good">thumbs up: this review named exact files, commands, and tests; repeat this evidence-first format.</div>
|
|
676
|
+
<div class="first-gate-example signal-fix">thumbs down: the answer ignored my request for exact files and tests; next time include file paths, commands, and verification evidence.</div>
|
|
677
|
+
</div>
|
|
643
678
|
</div>
|
|
644
|
-
<
|
|
679
|
+
<nav class="proof-bar" aria-label="ThumbGate install and proof links">
|
|
645
680
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-claude-desktop.mcpb" target="_blank" rel="noopener" style="color:var(--cyan);font-weight:600;">Claude Extension →</a>
|
|
646
|
-
<span class="dot"></span>
|
|
647
681
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/.claude-plugin/README.md" target="_blank" rel="noopener">Claude marketplace install →</a>
|
|
648
|
-
<span class="dot"></span>
|
|
649
682
|
<a href="/guide" rel="noopener">CLI setup guide →</a>
|
|
650
|
-
<
|
|
651
|
-
<a href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-codex-plugin.zip" target="_blank" rel="noopener">Codex plugin download →</a>
|
|
652
|
-
<span class="dot"></span>
|
|
683
|
+
<a href="/codex-plugin?utm_source=website&utm_medium=proof_bar&utm_campaign=codex_plugin&cta_id=proof_bar_codex_plugin&cta_placement=proof_bar">Codex plugin setup →</a>
|
|
653
684
|
<a href="/go/gpt?utm_source=website&utm_medium=proof_bar&utm_campaign=chatgpt_gpt&cta_id=proof_bar_open_gpt&cta_placement=proof_bar" target="_blank" rel="noopener">ThumbGate GPT →</a>
|
|
654
|
-
<span class="dot"></span>
|
|
655
685
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md" target="_blank" rel="noopener">Verification evidence →</a>
|
|
656
|
-
<span class="dot"></span>
|
|
657
686
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/THUMBGATE_BENCH.md" target="_blank" rel="noopener">ThumbGate Bench →</a>
|
|
658
|
-
<span class="dot"></span>
|
|
659
687
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/actions" target="_blank" rel="noopener">Proof-backed CI →</a>
|
|
660
|
-
<span class="dot"></span>
|
|
661
688
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/actions" target="_blank" rel="noopener">CI and proof lanes →</a>
|
|
662
|
-
<span class="dot"></span>
|
|
663
689
|
<a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/RELEASE_CONFIDENCE.md" target="_blank" rel="noopener">Release confidence →</a>
|
|
664
|
-
<span class="dot"></span>
|
|
665
690
|
<a href="https://www.producthunt.com/products/thumbgate" target="_blank" rel="noopener">Product Hunt →</a>
|
|
666
|
-
<span class="dot"></span>
|
|
667
691
|
<a href="#compatibility">Claude Code · Cursor · Codex · Gemini · Amp · OpenCode</a>
|
|
668
|
-
</
|
|
692
|
+
</nav>
|
|
669
693
|
</div>
|
|
670
694
|
</section>
|
|
671
695
|
|
|
@@ -793,10 +817,10 @@ __GA_BOOTSTRAP__
|
|
|
793
817
|
<p>Claude Code, Codex, Gemini CLI, Amp, and OpenCode all use the same gateway and memory model. Any MCP-compatible agent gets pre-action gates, feedback memory, and enforcement out of the box.</p>
|
|
794
818
|
<div class="card-arrow">Open the setup guide →</div>
|
|
795
819
|
</a>
|
|
796
|
-
<a class="compat-card" href="
|
|
820
|
+
<a class="compat-card" href="/codex-plugin?utm_source=website&utm_medium=compatibility&utm_campaign=codex_plugin&cta_id=compat_codex_plugin&cta_placement=compatibility" rel="noopener" onclick="if(typeof posthog!=='undefined')posthog.capture('compat_codex_plugin_click',{cta:'open_codex_plugin_page'})">
|
|
797
821
|
<h3>🧩 Codex plugin</h3>
|
|
798
|
-
<p>Codex
|
|
799
|
-
<div class="card-arrow">
|
|
822
|
+
<p>Codex gets a standalone ThumbGate plugin bundle, a repo-local plugin profile, and the same auto-updating MCP launcher. The runtime resolves <code>thumbgate@latest</code> when Codex starts, so npm fixes reach active installs. The install page includes the zip, MCP config, and verification path in one place.</p>
|
|
823
|
+
<div class="card-arrow">Open the Codex install page →</div>
|
|
800
824
|
</a>
|
|
801
825
|
<a class="compat-card" href="/guides/cursor-prevent-repeated-mistakes.html" rel="noopener">
|
|
802
826
|
<h3>🎯 Cursor plugin</h3>
|
|
@@ -810,7 +834,7 @@ __GA_BOOTSTRAP__
|
|
|
810
834
|
</a>
|
|
811
835
|
<a class="compat-card" href="https://mcp.so/server/thumbgate" target="_blank" rel="noopener" onclick="if(typeof posthog!=='undefined')posthog.capture('compat_mcp_so_click',{cta:'view_mcp_directory'})">
|
|
812
836
|
<h3>🗂️ MCP Server Directory</h3>
|
|
813
|
-
<p>ThumbGate is listed on <code>mcp.so</code>
|
|
837
|
+
<p>ThumbGate is listed on <code>mcp.so</code> so MCP-compatible clients can verify the package, copy the npx config, and confirm they are installing the real Pre-Action Gates server.</p>
|
|
814
838
|
<div class="card-arrow">View on mcp.so →</div>
|
|
815
839
|
</a>
|
|
816
840
|
<a class="compat-card" href="/go/gpt?utm_source=website&utm_medium=compatibility&utm_campaign=chatgpt_gpt&cta_id=compat_open_gpt&cta_placement=compatibility" target="_blank" rel="noopener">
|
|
@@ -829,7 +853,7 @@ __GA_BOOTSTRAP__
|
|
|
829
853
|
<div class="agent-grid">
|
|
830
854
|
<div class="agent-card">
|
|
831
855
|
<h3>🔍 Live Dashboard Demo</h3>
|
|
832
|
-
<p>Search lessons, inspect gates, and see
|
|
856
|
+
<p>Search lessons, inspect gates, mark a review checkpoint, and see only what changed since the last pass. No signup or install required.</p>
|
|
833
857
|
<a href="/dashboard" style="display:inline-block;margin-top:12px;color:var(--cyan);font-weight:600;text-decoration:underline;">Open Dashboard Demo →</a>
|
|
834
858
|
</div>
|
|
835
859
|
<div class="agent-card">
|
|
@@ -909,6 +933,40 @@ __GA_BOOTSTRAP__
|
|
|
909
933
|
<p>Why Gemini CLI buyers start with memory and convert when they see how memory becomes real pre-action gates.</p>
|
|
910
934
|
<div class="card-arrow">Read the Gemini guide →</div>
|
|
911
935
|
</a>
|
|
936
|
+
<a class="seo-card" href="/guides/autoresearch-agent-safety">
|
|
937
|
+
<div class="seo-kicker">Autoresearch</div>
|
|
938
|
+
<h3>Autoresearch Safety for Self-Improving Agents</h3>
|
|
939
|
+
<p>Why benchmark-search loops need gates for holdout tests, proof trails, reward hacking, and unsafe promotions.</p>
|
|
940
|
+
<div class="card-arrow">Read the Autoresearch guide →</div>
|
|
941
|
+
</a>
|
|
942
|
+
</div>
|
|
943
|
+
</div>
|
|
944
|
+
</section>
|
|
945
|
+
|
|
946
|
+
<section class="autoresearch-pack" id="autoresearch-pack">
|
|
947
|
+
<div class="container">
|
|
948
|
+
<div class="autoresearch-panel">
|
|
949
|
+
<div class="section-label" style="text-align:left;">Autoresearch Safety Pack</div>
|
|
950
|
+
<h2>Stop self-improving coding loops from hacking the benchmark.</h2>
|
|
951
|
+
<p>Autoresearch loops run experiments, inspect metrics, and accept better variants. ThumbGate gives those loops a Reliability Gateway: Pre-Action Gates for skipped holdout tests, fake proof, reward hacking, unsafe edits, and promotion without verification evidence.</p>
|
|
952
|
+
<div class="autoresearch-grid">
|
|
953
|
+
<div class="autoresearch-card">
|
|
954
|
+
<h3>Guard the metric</h3>
|
|
955
|
+
<p>Require primary and holdout checks before an agent can call a variant better. Block cherry-picked runs and missing baselines.</p>
|
|
956
|
+
</div>
|
|
957
|
+
<div class="autoresearch-card">
|
|
958
|
+
<h3>Preserve proof trails</h3>
|
|
959
|
+
<p>Promotion needs commands, logs, changed files, and verification evidence so the win survives review instead of becoming a vague claim.</p>
|
|
960
|
+
</div>
|
|
961
|
+
<div class="autoresearch-card">
|
|
962
|
+
<h3>Ship into CI</h3>
|
|
963
|
+
<p>Start with templates for <code>npm test</code>, Playwright duration, bundle size, lint, and CI failures, then add Team gates for shared workflows.</p>
|
|
964
|
+
</div>
|
|
965
|
+
</div>
|
|
966
|
+
<div class="autoresearch-cta">
|
|
967
|
+
<a class="primary" href="/guides/autoresearch-agent-safety?utm_source=website&utm_medium=autoresearch_pack&utm_campaign=autoresearch_safety&cta_id=autoresearch_guide&cta_placement=autoresearch_pack">Read the Autoresearch guide</a>
|
|
968
|
+
<a class="secondary" href="/checkout/pro?utm_source=website&utm_medium=autoresearch_pack&utm_campaign=autoresearch_safety&cta_id=autoresearch_pro_trial&cta_placement=autoresearch_pack&plan_id=pro&landing_path=%2F">Start Pro trial</a>
|
|
969
|
+
</div>
|
|
912
970
|
</div>
|
|
913
971
|
</div>
|
|
914
972
|
</section>
|
|
@@ -916,7 +974,7 @@ __GA_BOOTSTRAP__
|
|
|
916
974
|
<!-- HOW IT WORKS -->
|
|
917
975
|
<section class="how-it-works" id="how-it-works">
|
|
918
976
|
<div class="container">
|
|
919
|
-
<div class="section-label">New in v1.
|
|
977
|
+
<div class="section-label">New in v1.6.0</div>
|
|
920
978
|
<h2 class="section-title">Three steps to stop repeated AI failures</h2>
|
|
921
979
|
<div class="steps">
|
|
922
980
|
<div class="step">
|
|
@@ -1272,7 +1330,7 @@ __GA_BOOTSTRAP__
|
|
|
1272
1330
|
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
1273
1331
|
<a href="/blog">Blog</a>
|
|
1274
1332
|
</div>
|
|
1275
|
-
<span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.
|
|
1333
|
+
<span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.6.0</span>
|
|
1276
1334
|
</div>
|
|
1277
1335
|
</footer>
|
|
1278
1336
|
|
package/public/learn.html
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
<meta property="og:type" content="website">
|
|
13
13
|
<meta property="og:url" content="https://thumbgate-production.up.railway.app/learn">
|
|
14
14
|
<link rel="canonical" href="https://thumbgate-production.up.railway.app/learn">
|
|
15
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png">
|
|
16
|
+
<link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
|
|
15
17
|
|
|
16
18
|
<script type="application/ld+json">
|
|
17
19
|
{
|
|
@@ -105,7 +107,8 @@
|
|
|
105
107
|
nav { padding: 1rem 2rem; border-bottom: 1px solid var(--border); display: flex; gap: 1.5rem; align-items: center; }
|
|
106
108
|
nav a { color: var(--muted); text-decoration: none; font-size: 0.9rem; }
|
|
107
109
|
nav a:hover { color: var(--cyan); }
|
|
108
|
-
nav .brand { color: var(--text); font-weight: 700; font-size: 1.1rem; }
|
|
110
|
+
nav .brand { color: var(--text); font-weight: 700; font-size: 1.1rem; display: inline-flex; align-items: center; gap: 8px; text-decoration: none; }
|
|
111
|
+
nav .brand .logo-mark { width: 28px; height: 28px; display: block; }
|
|
109
112
|
h1 { font-size: 2.2rem; line-height: 1.2; margin: 2rem 0 1rem; }
|
|
110
113
|
h2 { font-size: 1.5rem; margin: 2.5rem 0 1rem; color: var(--cyan); }
|
|
111
114
|
p { color: var(--text); margin-bottom: 0.75rem; }
|
|
@@ -175,7 +178,7 @@
|
|
|
175
178
|
<body>
|
|
176
179
|
|
|
177
180
|
<nav>
|
|
178
|
-
<a href="/" class="brand"
|
|
181
|
+
<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>
|
|
179
182
|
<a href="/guide">Setup Guide</a>
|
|
180
183
|
<a href="/learn">Learn</a>
|
|
181
184
|
<a href="/dashboard">Dashboard</a>
|
|
@@ -261,6 +264,14 @@
|
|
|
261
264
|
<span class="article-tag">Memory</span>
|
|
262
265
|
<span class="article-tag">Enforcement</span>
|
|
263
266
|
</a>
|
|
267
|
+
|
|
268
|
+
<a href="/guides/autoresearch-agent-safety" class="article-card">
|
|
269
|
+
<h3>Autoresearch Agent Safety for Self-Improving Coding Agents</h3>
|
|
270
|
+
<p>The control-plane story for benchmark-search loops that need holdout tests, proof trails, and reward-hacking gates.</p>
|
|
271
|
+
<span class="article-tag">Autoresearch</span>
|
|
272
|
+
<span class="article-tag">Holdout Proof</span>
|
|
273
|
+
<span class="article-tag">Gates</span>
|
|
274
|
+
</a>
|
|
264
275
|
</div>
|
|
265
276
|
|
|
266
277
|
<div class="cta-section">
|
package/public/lessons.html
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>ThumbGate — Lessons Learned</title>
|
|
7
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png">
|
|
8
|
+
<link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
|
|
7
9
|
<script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
|
|
8
10
|
<style>
|
|
9
11
|
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
@@ -22,7 +24,8 @@
|
|
|
22
24
|
/* NAV */
|
|
23
25
|
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; }
|
|
24
26
|
nav .container { display: flex; justify-content: space-between; align-items: center; }
|
|
25
|
-
.nav-logo { font-weight: 700; font-size: 15px; color: var(--text); text-decoration: none; }
|
|
27
|
+
.nav-logo { font-weight: 700; font-size: 15px; color: var(--text); text-decoration: none; display: inline-flex; align-items: center; gap: 8px; }
|
|
28
|
+
.nav-logo .logo-mark { width: 28px; height: 28px; display: block; }
|
|
26
29
|
.nav-links { display: flex; gap: 16px; align-items: center; }
|
|
27
30
|
.nav-links a { color: var(--text-muted); text-decoration: none; font-size: 13px; }
|
|
28
31
|
.nav-links a:hover { color: var(--text); }
|
|
@@ -185,7 +188,7 @@
|
|
|
185
188
|
|
|
186
189
|
<nav>
|
|
187
190
|
<div class="container">
|
|
188
|
-
<a href="/dashboard" class="nav-logo"
|
|
191
|
+
<a href="/dashboard" 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>
|
|
189
192
|
<div class="nav-links">
|
|
190
193
|
<a href="/dashboard">Dashboard</a>
|
|
191
194
|
<a href="/lessons" class="active">Lessons</a>
|
package/public/pro.html
CHANGED
|
@@ -11,6 +11,9 @@ __GOOGLE_SITE_VERIFICATION_META__
|
|
|
11
11
|
<meta property="og:type" content="website">
|
|
12
12
|
<meta property="og:url" content="__APP_ORIGIN__/pro">
|
|
13
13
|
<link rel="canonical" href="__APP_ORIGIN__/pro">
|
|
14
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png">
|
|
15
|
+
<link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
|
|
16
|
+
<meta property="og:image" content="/og.png">
|
|
14
17
|
<meta name="keywords" content="ThumbGate Pro, AI agent reliability, pre-action gates, DPO export, local dashboard, review-ready evidence, Claude Code reliability, Codex reliability, Cursor reliability">
|
|
15
18
|
|
|
16
19
|
<script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
|
|
@@ -169,8 +172,12 @@ __GA_BOOTSTRAP__
|
|
|
169
172
|
font-weight: 700;
|
|
170
173
|
letter-spacing: -0.02em;
|
|
171
174
|
text-decoration: none;
|
|
175
|
+
display: inline-flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
gap: 8px;
|
|
172
178
|
}
|
|
173
179
|
|
|
180
|
+
.nav-logo .logo-mark { width: 28px; height: 28px; display: block; }
|
|
174
181
|
.nav-logo span { color: var(--cyan); }
|
|
175
182
|
|
|
176
183
|
.nav-links {
|
|
@@ -777,7 +784,7 @@ __GA_BOOTSTRAP__
|
|
|
777
784
|
<body>
|
|
778
785
|
<nav>
|
|
779
786
|
<div class="container">
|
|
780
|
-
<a href="/" class="nav-logo"><span
|
|
787
|
+
<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 Pro</span></a>
|
|
781
788
|
<div class="nav-links">
|
|
782
789
|
<a href="#why-pay">Why Pro</a>
|
|
783
790
|
<a href="#proof">Proof</a>
|
|
@@ -17,6 +17,11 @@ const fs = require('fs');
|
|
|
17
17
|
const path = require('path');
|
|
18
18
|
const {
|
|
19
19
|
cacheUpdateHookCommand,
|
|
20
|
+
codexCacheUpdateHookCommand,
|
|
21
|
+
codexPreToolHookCommand,
|
|
22
|
+
codexSessionStartHookCommand,
|
|
23
|
+
codexStatuslineCommand,
|
|
24
|
+
codexUserPromptHookCommand,
|
|
20
25
|
preToolHookCommand,
|
|
21
26
|
sessionStartHookCommand,
|
|
22
27
|
statuslineCommand,
|
|
@@ -48,17 +53,17 @@ const CLAUDE_HOOKS = {
|
|
|
48
53
|
const CODEX_HOOKS = {
|
|
49
54
|
PreToolUse: {
|
|
50
55
|
matcher: 'Bash',
|
|
51
|
-
hooks: [{ type: 'command', command:
|
|
56
|
+
hooks: [{ type: 'command', command: codexPreToolHookCommand() }],
|
|
52
57
|
},
|
|
53
58
|
UserPromptSubmit: {
|
|
54
|
-
hooks: [{ type: 'command', command:
|
|
59
|
+
hooks: [{ type: 'command', command: codexUserPromptHookCommand() }],
|
|
55
60
|
},
|
|
56
61
|
PostToolUse: {
|
|
57
62
|
matcher: 'mcp__thumbgate__feedback_stats|mcp__thumbgate__dashboard',
|
|
58
|
-
hooks: [{ type: 'command', command:
|
|
63
|
+
hooks: [{ type: 'command', command: codexCacheUpdateHookCommand() }],
|
|
59
64
|
},
|
|
60
65
|
SessionStart: {
|
|
61
|
-
hooks: [{ type: 'command', command:
|
|
66
|
+
hooks: [{ type: 'command', command: codexSessionStartHookCommand() }],
|
|
62
67
|
},
|
|
63
68
|
};
|
|
64
69
|
|
|
@@ -459,7 +464,7 @@ function syncCodexStatusLine(config, desiredStatusLine) {
|
|
|
459
464
|
function wireCodexHooks(options) {
|
|
460
465
|
const configPath = options.settingsPath || codexConfigPath();
|
|
461
466
|
const dryRun = options.dryRun || false;
|
|
462
|
-
const desiredStatusLine =
|
|
467
|
+
const desiredStatusLine = codexStatuslineCommand();
|
|
463
468
|
|
|
464
469
|
let config = loadJsonFile(configPath) || {};
|
|
465
470
|
config.hooks = config.hooks || {};
|