thumbgate 1.3.0 → 1.4.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.
Files changed (146) hide show
  1. package/.claude-plugin/marketplace.json +32 -13
  2. package/.claude-plugin/plugin.json +15 -2
  3. package/.well-known/llms.txt +60 -0
  4. package/.well-known/mcp/server-card.json +1 -1
  5. package/README.md +109 -20
  6. package/adapters/README.md +1 -1
  7. package/adapters/chatgpt/openapi.yaml +168 -0
  8. package/adapters/claude/.mcp.json +2 -2
  9. package/adapters/codex/config.toml +2 -2
  10. package/adapters/mcp/server-stdio.js +84 -1
  11. package/adapters/opencode/opencode.json +1 -1
  12. package/bin/cli.js +200 -13
  13. package/bin/postinstall.js +8 -2
  14. package/config/budget.json +18 -0
  15. package/config/gates/code-edit.json +61 -0
  16. package/config/gates/db-write.json +61 -0
  17. package/config/gates/default.json +154 -3
  18. package/config/gates/deploy.json +61 -0
  19. package/config/github-about.json +2 -1
  20. package/config/merge-quality-checks.json +23 -0
  21. package/openapi/openapi.yaml +168 -0
  22. package/package.json +42 -10
  23. package/plugins/claude-codex-bridge/.claude-plugin/plugin.json +1 -1
  24. package/plugins/claude-codex-bridge/.mcp.json +1 -1
  25. package/plugins/claude-codex-bridge/scripts/codex-bridge.js +1 -3
  26. package/plugins/codex-profile/.codex-plugin/plugin.json +1 -1
  27. package/plugins/codex-profile/.mcp.json +1 -1
  28. package/plugins/codex-profile/INSTALL.md +27 -4
  29. package/plugins/codex-profile/README.md +33 -9
  30. package/plugins/cursor-marketplace/.cursor-plugin/plugin.json +1 -1
  31. package/plugins/opencode-profile/INSTALL.md +1 -1
  32. package/public/blog.html +73 -0
  33. package/public/compare/mem0.html +189 -0
  34. package/public/compare/speclock.html +180 -0
  35. package/public/compare.html +10 -2
  36. package/public/guide.html +2 -2
  37. package/public/guides/claude-code-prevent-repeated-mistakes.html +161 -0
  38. package/public/guides/codex-cli-guardrails.html +158 -0
  39. package/public/guides/cursor-prevent-repeated-mistakes.html +161 -0
  40. package/public/guides/pre-action-gates.html +162 -0
  41. package/public/guides/stop-repeated-ai-agent-mistakes.html +159 -0
  42. package/public/index.html +136 -50
  43. package/public/lessons.html +33 -24
  44. package/public/llm-context.md +140 -0
  45. package/public/pro.html +24 -22
  46. package/scripts/__pycache__/train_from_feedback.cpython-312.pyc +0 -0
  47. package/scripts/access-anomaly-detector.js +1 -1
  48. package/scripts/adk-consolidator.js +1 -5
  49. package/scripts/agent-security-hardening.js +4 -6
  50. package/scripts/agentic-data-pipeline.js +1 -3
  51. package/scripts/async-job-runner.js +1 -5
  52. package/scripts/audit-trail.js +1 -5
  53. package/scripts/background-agent-governance.js +2 -10
  54. package/scripts/billing.js +2 -16
  55. package/scripts/budget-enforcer.js +173 -0
  56. package/scripts/build-codex-plugin.js +152 -0
  57. package/scripts/check-congruence.js +132 -14
  58. package/scripts/commercial-offer.js +5 -7
  59. package/scripts/content-engine/linkedin-content-generator.js +154 -0
  60. package/scripts/content-engine/output/linkedin-memento-validation.md +17 -0
  61. package/scripts/content-engine/output/linkedin-posts-2026-04-09.md +175 -0
  62. package/scripts/content-engine/reddit-thread-finder.js +154 -0
  63. package/scripts/context-engine.js +21 -6
  64. package/scripts/contextfs.js +1 -21
  65. package/scripts/dashboard.js +20 -0
  66. package/scripts/decision-journal.js +341 -0
  67. package/scripts/delegation-runtime.js +1 -5
  68. package/scripts/distribution-surfaces.js +26 -0
  69. package/scripts/document-intake.js +927 -0
  70. package/scripts/ephemeral-agent-store.js +1 -8
  71. package/scripts/evolution-state.js +1 -5
  72. package/scripts/experiment-tracker.js +1 -5
  73. package/scripts/export-databricks-bundle.js +1 -5
  74. package/scripts/export-hf-dataset.js +1 -5
  75. package/scripts/export-training.js +1 -5
  76. package/scripts/feedback-attribution.js +1 -16
  77. package/scripts/feedback-history-distiller.js +1 -16
  78. package/scripts/feedback-loop.js +1 -5
  79. package/scripts/feedback-root-consolidator.js +2 -21
  80. package/scripts/feedback-session.js +49 -0
  81. package/scripts/feedback-to-rules.js +188 -28
  82. package/scripts/filesystem-search.js +1 -9
  83. package/scripts/fs-utils.js +104 -0
  84. package/scripts/gates-engine.js +149 -4
  85. package/scripts/github-about.js +32 -8
  86. package/scripts/gtm-revenue-loop.js +1 -5
  87. package/scripts/harness-selector.js +148 -0
  88. package/scripts/hosted-job-launcher.js +1 -5
  89. package/scripts/hybrid-feedback-context.js +7 -33
  90. package/scripts/intervention-policy.js +58 -1
  91. package/scripts/lesson-db.js +3 -18
  92. package/scripts/lesson-inference.js +194 -16
  93. package/scripts/lesson-retrieval.js +60 -24
  94. package/scripts/llm-client.js +59 -0
  95. package/scripts/managed-lesson-agent.js +183 -0
  96. package/scripts/marketing-experiment.js +8 -22
  97. package/scripts/meta-agent-loop.js +624 -0
  98. package/scripts/metered-billing.js +1 -1
  99. package/scripts/money-watcher.js +1 -4
  100. package/scripts/obsidian-export.js +1 -5
  101. package/scripts/operational-integrity.js +15 -3
  102. package/scripts/org-dashboard.js +6 -1
  103. package/scripts/per-step-scoring.js +2 -4
  104. package/scripts/pr-manager.js +201 -19
  105. package/scripts/pro-features.js +3 -2
  106. package/scripts/prompt-dlp.js +3 -3
  107. package/scripts/prove-adapters.js +1 -5
  108. package/scripts/prove-attribution.js +1 -5
  109. package/scripts/prove-automation.js +1 -3
  110. package/scripts/prove-cloudflare-sandbox.js +1 -3
  111. package/scripts/prove-data-pipeline.js +1 -3
  112. package/scripts/prove-intelligence.js +1 -3
  113. package/scripts/prove-lancedb.js +1 -5
  114. package/scripts/prove-local-intelligence.js +1 -3
  115. package/scripts/prove-packaged-runtime.js +75 -9
  116. package/scripts/prove-predictive-insights.js +1 -3
  117. package/scripts/prove-training-export.js +1 -3
  118. package/scripts/prove-workflow-contract.js +1 -5
  119. package/scripts/rate-limiter.js +3 -1
  120. package/scripts/reddit-dm-outreach.js +14 -4
  121. package/scripts/schedule-manager.js +3 -5
  122. package/scripts/security-scanner.js +448 -0
  123. package/scripts/self-distill-agent.js +579 -0
  124. package/scripts/semantic-dedup.js +115 -0
  125. package/scripts/skill-exporter.js +1 -3
  126. package/scripts/skill-generator.js +1 -5
  127. package/scripts/social-analytics/engagement-audit.js +1 -18
  128. package/scripts/social-analytics/pollers/linkedin.js +26 -16
  129. package/scripts/social-analytics/publishers/linkedin.js +1 -1
  130. package/scripts/social-analytics/publishers/zernio.js +51 -0
  131. package/scripts/social-pipeline.js +1 -3
  132. package/scripts/social-post-hourly.js +47 -4
  133. package/scripts/statusline-links.js +6 -5
  134. package/scripts/statusline.sh +29 -153
  135. package/scripts/sync-branch-protection.js +340 -0
  136. package/scripts/tessl-export.js +1 -3
  137. package/scripts/thumbgate-search.js +32 -1
  138. package/scripts/tool-kpi-tracker.js +1 -1
  139. package/scripts/tool-registry.js +106 -2
  140. package/scripts/vector-store.js +1 -5
  141. package/scripts/weekly-auto-post.js +1 -1
  142. package/scripts/workflow-sentinel.js +91 -0
  143. package/skills/thumbgate/SKILL.md +1 -1
  144. package/src/api/server.js +273 -4
  145. package/scripts/social-analytics/db/social-analytics.db-shm +0 -0
  146. /package/scripts/social-analytics/db/{social-analytics.db-wal → analytics.sqlite} +0 -0
package/public/index.html CHANGED
@@ -19,12 +19,12 @@
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
- <title>ThumbGate — Self-improving AI coding agents that learn from every mistake</title>
23
- <meta name="description" content="Pre-action gates, a learned intervention policy, and workflow governance for self-improving AI coding agents. 👎 Thumbs down distills history-aware lessons from up to 8 prior entries and stays linked to a 60-second feedback session. 👍 Thumbs up reinforces safe patterns. Team adds shared lessons and org visibility.">
24
- <meta property="og:title" content="ThumbGate — Self-improving AI coding agents that learn from every mistake">
25
- <meta property="og:description" content="Pre-action gates, a learned intervention policy, and workflow governance for self-improving AI coding agents. 👎 Thumbs down distills history-aware lessons from up to 8 prior entries and stays linked to a 60-second feedback session. 👍 Thumbs up reinforces safe patterns. Team adds shared lessons and org visibility.">
22
+ <title>ThumbGate — Agent governance for AI coding workflows</title>
23
+ <meta name="description" content="CLI-first agent governance for teams shipping AI-generated changes. 👎 Thumbs down distills history-aware lessons from up to 8 prior entries and stays linked to a 60-second feedback session. 👍 Thumbs up reinforces safe patterns. Pre-action gates, workflow governance, shared lessons and org visibility, release confidence, and isolated execution guidance turn vibe coding mistakes into shared enforcement and proof-ready rollout.">
24
+ <meta property="og:title" content="ThumbGate — Agent governance for AI coding workflows">
25
+ <meta property="og:description" content="CLI-first agent governance for teams shipping AI-generated changes. 👎 Thumbs down distills history-aware lessons from up to 8 prior entries and stays linked to a 60-second feedback session. 👍 Thumbs up reinforces safe patterns. Pre-action gates, workflow governance, shared lessons and org visibility, release confidence, and isolated execution guidance turn vibe coding mistakes into shared enforcement and proof-ready rollout.">
26
26
  <meta property="og:type" content="website">
27
- <meta name="keywords" content="ThumbGate, thumbgate, self-improving AI agents, AI agent self-improvement, AI agent learning, AI agent memory, pre-action gates, human-in-the-loop, MCP server, Claude Code, Cursor, Codex, Gemini, Amp, OpenCode, vibe coding safety, SpecLock alternative, Mem0 alternative, AI coding agent feedback loop, PreToolUse hooks, prevention rules, feedback enforcement, context engineering">
27
+ <meta name="keywords" content="ThumbGate, thumbgate, agent governance, AI coding workflow governance, workflow hardening sprint, pre-action gates, CLI-first agent safety, Claude Code, Cursor, Codex, Gemini, Amp, OpenCode, approval policies, audit trail, release confidence, Docker Sandboxes, feedback enforcement, context engineering, AI authenticity, prevent AI slop, human-led AI, AI agent standards enforcement, brand authenticity AI">
28
28
 
29
29
  <!-- Privacy-friendly analytics by Plausible -->
30
30
  <script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
@@ -44,14 +44,14 @@ __GA_BOOTSTRAP__
44
44
  "@type": "SoftwareApplication",
45
45
  "name": "ThumbGate",
46
46
  "alternateName": "thumbgate",
47
- "description": "Make your AI coding agent self-improving. Every mistake becomes a prevention rule and trains a local intervention policy. Every correction strengthens future recall, verification, and enforcement. ThumbGate adds workflow governance and isolated execution guidance so high-risk runs do not have to happen directly on the host.",
47
+ "description": "ThumbGate is a CLI-first agent governance control plane for AI coding workflows. Every repeated failure can become shared enforcement, every risky rollout can carry approval and audit boundaries, and high-risk local autonomy can be routed toward isolated execution instead of running directly on the host.",
48
48
  "applicationCategory": "DeveloperApplication",
49
49
  "operatingSystem": "Cross-platform, Node.js >=18.18.0",
50
50
  "license": "https://opensource.org/licenses/MIT",
51
51
  "url": "https://github.com/IgorGanapolsky/ThumbGate",
52
52
  "downloadUrl": "https://www.npmjs.com/package/thumbgate",
53
53
  "installUrl": "https://www.npmjs.com/package/thumbgate",
54
- "dateModified": "2026-04-03",
54
+ "dateModified": "2026-04-09",
55
55
  "creator": {
56
56
  "@type": "Person",
57
57
  "name": "Igor Ganapolsky",
@@ -71,7 +71,8 @@ __GA_BOOTSTRAP__
71
71
  "Prompt-Level DLP — scans tool call inputs before execution",
72
72
  "Per-Step Scoring — every gate decision becomes a DPO/KTO training signal",
73
73
  "HuggingFace Export — share PII-redacted agent traces as open training datasets",
74
- "Unified Context — one-call context assembly with session, lessons, guards, and code-graph"
74
+ "Unified Context — one-call context assembly with session, lessons, guards, and code-graph",
75
+ "AI Authenticity Enforcement — every gate reflects your team's actual standards, not generic AI patterns"
75
76
  ],
76
77
  "offers": [
77
78
  {
@@ -81,12 +82,20 @@ __GA_BOOTSTRAP__
81
82
  "priceCurrency": "USD",
82
83
  "description": "Local enforcement — captures, recalls, gates, and PreToolUse hook blocking for solo devs"
83
84
  },
85
+ {
86
+ "@type": "Offer",
87
+ "name": "Team",
88
+ "price": "99",
89
+ "priceCurrency": "USD",
90
+ "description": "Intake-led team rollout with a workflow hardening sprint, shared enforcement memory, org dashboard visibility, approval boundaries, release confidence, Docker Sandboxes guidance for risky local autonomy, and pilot support for teams shipping AI-generated changes",
91
+ "url": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake"
92
+ },
84
93
  {
85
94
  "@type": "Offer",
86
95
  "name": "Pro Monthly",
87
96
  "price": "19",
88
97
  "priceCurrency": "USD",
89
- "description": "Personal local dashboard, DPO export, advanced data exports, and founder-license support for individual operators",
98
+ "description": "Self-serve side lane for solo operators who want a personal local dashboard, DPO export, and proof-ready exports",
90
99
  "url": "https://thumbgate-production.up.railway.app/checkout/pro?plan_id=pro&landing_path=%2F"
91
100
  },
92
101
  {
@@ -96,14 +105,6 @@ __GA_BOOTSTRAP__
96
105
  "priceCurrency": "USD",
97
106
  "description": "Annual Pro for individual operators who want the personal local dashboard and proof-ready exports",
98
107
  "url": "https://thumbgate-production.up.railway.app/checkout/pro?plan_id=pro&billing_cycle=annual&landing_path=%2F"
99
- },
100
- {
101
- "@type": "Offer",
102
- "name": "Team",
103
- "price": "12",
104
- "priceCurrency": "USD",
105
- "description": "Intake-led team rollout with a workflow hardening sprint, shared enforcement memory, org dashboard visibility, Docker Sandboxes guidance for risky local autonomy, and pilot support for teams shipping AI-generated changes",
106
- "url": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake"
107
108
  }
108
109
  ]
109
110
  }
@@ -120,7 +121,7 @@ __GA_BOOTSTRAP__
120
121
  "@type": "HowToStep",
121
122
  "position": 1,
122
123
  "name": "Install ThumbGate",
123
- "text": "Run: npx thumbgate init --agent claude-code. This adds the MCP server to your agent. No API key needed everything runs locally."
124
+ "text": "Run: npx thumbgate init --agent claude-code. This installs the local CLI gateway and wires the agent's MCP transport automatically. No API key needed and the core path stays local."
124
125
  },
125
126
  {
126
127
  "@type": "HowToStep",
@@ -199,6 +200,14 @@ __GA_BOOTSTRAP__
199
200
  "text": "Prompt rules are suggestions agents can ignore. Pre-Action Gates are enforcement — they block the action before execution via PreToolUse hooks. Gates are auto-generated from feedback and use Thompson Sampling to adapt."
200
201
  }
201
202
  },
203
+ {
204
+ "@type": "Question",
205
+ "name": "How does ThumbGate prevent AI slop and protect brand authenticity?",
206
+ "acceptedAnswer": {
207
+ "@type": "Answer",
208
+ "text": "AI slop happens when agents act without human judgment as a hard gate — generating repetitive, generic outputs that erode trust and dilute your brand. ThumbGate inserts human thumbs-up/down between AI intent and execution. Every thumbs-down becomes a prevention rule that blocks the bad pattern permanently. Every thumbs-up reinforces what 'good' looks like for your specific context. Your agent's outputs reflect your actual standards, not generic AI patterns. This is authenticity enforcement at the tool-call level."
209
+ }
210
+ },
202
211
  {
203
212
  "@type": "Question",
204
213
  "name": "How is ThumbGate different from SpecLock?",
@@ -448,28 +457,43 @@ __GA_BOOTSTRAP__
448
457
  <div class="hero-signals">
449
458
  <div class="signal-pill signal-down">👎 Repeated failure becomes enforcement before the next run</div>
450
459
  <div class="signal-pill signal-up">👍 Safe pattern reinforced across the shared workflow</div>
460
+ <div class="signal-pill">🛡️ Human judgment gates every AI action — your standards, not AI slop</div>
451
461
  </div>
452
462
  <p class="hero-persona">For consultancies, platform teams, and AI product teams with one workflow owner, one repeated failure, and one buyer who needs proof before a wider rollout.</p>
453
463
  <p><strong>Best first paid motion:</strong> start with one repo, one workflow, and one repeat failure. ThumbGate turns the blocker into enforcement, routes risky runs toward isolated execution, and gives the buyer a proof-ready story around shared memory, approval boundaries, release confidence, and auditability.</p>
454
464
  <div class="hero-actions">
455
465
  <a href="#workflow-sprint-intake" class="btn-team">Start Workflow Hardening Sprint</a>
456
- <a href="/pro?utm_source=website&utm_medium=homepage_hero&utm_campaign=pro_page" class="btn-pro-page">See Pro for solo operators</a>
466
+ <a href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-codex-plugin.zip" class="btn-install-link" target="_blank" rel="noopener">Install Codex plugin</a>
467
+ <a href="/guide?utm_source=website&utm_medium=homepage_hero&utm_campaign=install_free" class="btn-pro-page btn-install-link">Install Free CLI</a>
457
468
  <a href="/dashboard?utm_source=website&utm_medium=homepage_hero&utm_campaign=demo" class="btn-demo-link">Open dashboard demo</a>
458
469
  </div>
459
- <p class="hero-paid-note"><strong>Start free as an individual.</strong> Pro stays the self-serve lane for personal dashboard and DPO export. Team pricing anchors at <strong>$12/seat/mo with a 3-seat minimum</strong>, but the team path starts intake-first with the Workflow Hardening Sprint so buyers see proof before a wider rollout.</p>
470
+ <p class="hero-paid-note"><strong>Running Codex?</strong> Download the published plugin bundle or open the <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/plugins/codex-profile/INSTALL.md" target="_blank" rel="noopener">Codex install guide</a> for the repo-local profile and MCP path.</p>
471
+ <p class="hero-paid-note"><strong>Start free as an individual.</strong> Pro stays the self-serve lane for personal dashboard and DPO export. Team pricing anchors at <strong>$99/seat/mo with a 3-seat minimum</strong>, but the team path starts intake-first with the Workflow Hardening Sprint so buyers see proof before a wider rollout.</p>
460
472
  <div class="hero-install" onclick="copyInstall(this)" title="Click to copy">
461
473
  <span class="prompt">$</span>
462
474
  <span class="cmd">npx thumbgate init</span>
463
475
  <span class="copy-hint">click to copy</span>
464
476
  </div>
465
477
  <div class="proof-bar">
466
- <a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener">1,000+ npm downloads →</a>
478
+ <a href="/guide" rel="noopener">CLI-first setup guide →</a>
479
+ <span class="dot"></span>
480
+ <a href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-codex-plugin.zip" target="_blank" rel="noopener">Codex plugin download →</a>
481
+ <span class="dot"></span>
482
+ <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/VERIFICATION_EVIDENCE.md" target="_blank" rel="noopener">Verification evidence →</a>
483
+ <span class="dot"></span>
484
+ <a href="https://arxiv.org/abs/2603.18743" target="_blank" rel="noopener">Research-backed (Memento-Skills, arXiv 2603.18743) →</a>
485
+ <span class="dot"></span>
486
+ <a href="https://blog.langchain.dev/continual-learning-for-ai-agents/" target="_blank" rel="noopener">Three-layer continual learning (LangChain) →</a>
467
487
  <span class="dot"></span>
468
- <a href="https://github.com/IgorGanapolsky/ThumbGate/actions" target="_blank" rel="noopener">1,500+ tests passing →</a>
488
+ <a href="https://cloud.google.com/blog/topics/healthcare-life-sciences/ensuring-safety-and-quality-in-healthcare-qa-agents" target="_blank" rel="noopener">Google Cloud safety framework architecture →</a>
469
489
  <span class="dot"></span>
470
490
  <a href="https://www.producthunt.com/products/thumbgate" target="_blank" rel="noopener">Product Hunt →</a>
471
491
  <span class="dot"></span>
472
- <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/LICENSE" target="_blank" rel="noopener">MIT licensed</a>
492
+ <a href="https://github.com/IgorGanapolsky/ThumbGate/actions" target="_blank" rel="noopener">Proof-backed CI →</a>
493
+ <span class="dot"></span>
494
+ <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/docs/RELEASE_CONFIDENCE.md" target="_blank" rel="noopener">Release confidence →</a>
495
+ <span class="dot"></span>
496
+ <a href="https://github.com/IgorGanapolsky/ThumbGate/actions" target="_blank" rel="noopener">CI and proof lanes →</a>
473
497
  <span class="dot"></span>
474
498
  <a href="#compatibility">Claude Code · Cursor · Codex · Gemini · Amp · OpenCode</a>
475
499
  </div>
@@ -486,6 +510,11 @@ __GA_BOOTSTRAP__
486
510
  <p>Claude Code, Claw-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>
487
511
  <div class="card-arrow">View setup guide →</div>
488
512
  </a>
513
+ <a class="compat-card" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/plugins/codex-profile/INSTALL.md" target="_blank" rel="noopener">
514
+ <h3>🧩 Codex plugin</h3>
515
+ <p>Codex ships with a published standalone ThumbGate plugin bundle plus a repo-local plugin profile. Download the zip, extract it, and install without wiring MCP by hand.</p>
516
+ <div class="card-arrow">Get the Codex plugin →</div>
517
+ </a>
489
518
  <a class="compat-card" href="/guides/claude-desktop">
490
519
  <h3>🧩 Claude Desktop plugin</h3>
491
520
  <p>One command install. No build step, no cloud account. Grab the <code>.mcpb</code> bundle or run <code>npx thumbgate init --claude-desktop</code>.</p>
@@ -498,7 +527,7 @@ __GA_BOOTSTRAP__
498
527
  </a>
499
528
  <a class="compat-card seo-card" href="https://github.com/IgorGanapolsky/ThumbGate/tree/main/.claude/skills/thumbgate" target="_blank" rel="noopener">
500
529
  <h3>⚡ Claude Code Skill</h3>
501
- <p>Type <code>/thumbgate</code> in any Claude Code session. Auto-triggers on "gate", "feedback", "block mistake". Free skill with Pro upgrade path built in.</p>
530
+ <p>Type <code>/thumbgate</code> in any Claude Code session. Auto-triggers on "gate", "feedback", "block mistake". Free skill on top of the same local gateway teams later harden into a shared workflow.</p>
502
531
  <div class="card-arrow">View skill on GitHub →</div>
503
532
  </a>
504
533
  </div>
@@ -520,8 +549,8 @@ __GA_BOOTSTRAP__
520
549
  <p>Every block explains why: which pattern matched, what evidence triggered it, and whether the rule came from your own corrections.</p>
521
550
  </div>
522
551
  <div class="agent-card">
523
- <h3>📊 Org Dashboard (Pro)</h3>
524
- <p>See which agents are creating review churn, which gates are saving time, and where rollout risk is still concentrated.</p>
552
+ <h3>📊 Org Dashboard (Team)</h3>
553
+ <p>See which agents are creating review churn, which gates are saving time, and where rollout risk is still concentrated across the shared workflow.</p>
525
554
  </div>
526
555
  <div class="agent-card">
527
556
  <h3>🧱 Isolated Execution Lanes</h3>
@@ -599,7 +628,7 @@ __GA_BOOTSTRAP__
599
628
  <!-- HOW IT WORKS -->
600
629
  <section class="how-it-works" id="how-it-works">
601
630
  <div class="container">
602
- <div class="section-label">New in v1.3.0</div>
631
+ <div class="section-label">New in v1.4.0</div>
603
632
  <h2 class="section-title">Three steps to stop repeated AI failures</h2>
604
633
  <div class="steps">
605
634
  <div class="step">
@@ -682,17 +711,72 @@ __GA_BOOTSTRAP__
682
711
  </div>
683
712
  </section>
684
713
 
714
+ <section id="install" style="padding: 60px 40px; max-width: 900px; margin: 0 auto;">
715
+ <h2 style="font-size: 2em; text-align: center; margin-bottom: 40px;">Install for Your Agent</h2>
716
+
717
+ <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 24px;">
718
+ <div style="background: #161b22; border-radius: 12px; padding: 24px; border: 1px solid #30363d;">
719
+ <h3>Claude Code</h3>
720
+ <code style="display: block; background: #0d1117; padding: 12px; border-radius: 8px; color: #58a6ff; margin: 12px 0;">npx thumbgate init --agent claude-code</code>
721
+ <p style="color: #8b949e; font-size: 14px;">Wires PreToolUse hooks automatically</p>
722
+ </div>
723
+
724
+ <div style="background: #161b22; border-radius: 12px; padding: 24px; border: 1px solid #30363d;">
725
+ <h3>Cursor</h3>
726
+ <code style="display: block; background: #0d1117; padding: 12px; border-radius: 8px; color: #58a6ff; margin: 12px 0;">npx thumbgate init --agent cursor</code>
727
+ <p style="color: #8b949e; font-size: 14px;">4 skills: feedback, rules, search, recall</p>
728
+ </div>
729
+
730
+ <div style="background: #161b22; border-radius: 12px; padding: 24px; border: 1px solid #30363d;">
731
+ <h3>Codex</h3>
732
+ <code style="display: block; background: #0d1117; padding: 12px; border-radius: 8px; color: #58a6ff; margin: 12px 0;">npx thumbgate init --agent codex</code>
733
+ <p style="color: #8b949e; font-size: 14px;">6 skills including adversarial review</p>
734
+ </div>
735
+
736
+ <div style="background: #161b22; border-radius: 12px; padding: 24px; border: 1px solid #30363d;">
737
+ <h3>Gemini CLI</h3>
738
+ <code style="display: block; background: #0d1117; padding: 12px; border-radius: 8px; color: #58a6ff; margin: 12px 0;">npx thumbgate init --agent gemini</code>
739
+ <p style="color: #8b949e; font-size: 14px;">Gemini CLI integration</p>
740
+ </div>
741
+
742
+ <div style="background: #161b22; border-radius: 12px; padding: 24px; border: 1px solid #30363d;">
743
+ <h3>Amp</h3>
744
+ <code style="display: block; background: #0d1117; padding: 12px; border-radius: 8px; color: #58a6ff; margin: 12px 0;">npx thumbgate init --agent amp</code>
745
+ <p style="color: #8b949e; font-size: 14px;">Amp agent integration</p>
746
+ </div>
747
+
748
+ <div style="background: #161b22; border-radius: 12px; padding: 24px; border: 1px solid #30363d;">
749
+ <h3>Any MCP Client</h3>
750
+ <code style="display: block; background: #0d1117; padding: 12px; border-radius: 8px; color: #58a6ff; margin: 12px 0;">npx thumbgate serve</code>
751
+ <p style="color: #8b949e; font-size: 14px;">MCP stdio server for any compatible client</p>
752
+ </div>
753
+ </div>
754
+
755
+ <div style="text-align: center; margin-top: 40px;">
756
+ <h3>Claude Desktop</h3>
757
+ <p style="color: #8b949e;">Add to your <code>claude_desktop_config.json</code>:</p>
758
+ <pre style="background: #0d1117; padding: 16px; border-radius: 8px; color: #58a6ff; text-align: left; display: inline-block; margin: 12px auto;">{
759
+ "mcpServers": {
760
+ "thumbgate": {
761
+ "command": "npx",
762
+ "args": ["--yes", "thumbgate", "serve"]
763
+ }
764
+ }
765
+ }</pre>
766
+ </div>
767
+ </section>
768
+
685
769
  <!-- PRICING -->
686
770
  <section class="pricing" id="pricing">
687
771
  <div class="container">
688
772
  <div class="section-label">Pricing</div>
689
- <h2 class="section-title">Start free. Use the workflow hardening sprint to prove team value. Keep Pro as the self-serve lane for individual operators.</h2>
773
+ <h2 class="section-title">Install free. Buy with the workflow hardening sprint. Keep Pro as the solo side lane.</h2>
690
774
  <div class="pricing-grid">
691
775
  <div class="price-card">
692
776
  <div class="tier">Free</div>
693
777
  <div class="price">$0</div>
694
- <div class="price-sub">Forever free · Local enforcement for one developer</div>
695
- <p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo developers who want to stop the same agent mistake from showing up twice.</p>
778
+ <div class="price-sub">Forever free · CLI-first local enforcement for one developer</div>
779
+ <p style="font-size:13px;color:#aaa;margin-bottom:16px;">For solo developers who want to stop the same agent mistake from showing up twice and prove value before a team rollout conversation exists.</p>
696
780
  <ul>
697
781
  <li>3 feedback captures/day · 5 lesson searches/day · unlimited recall</li>
698
782
  <li>5 auto-promoted gates plus the core safety policy</li>
@@ -705,12 +789,12 @@ __GA_BOOTSTRAP__
705
789
  <a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener" class="btn-free">Install Free</a>
706
790
  </div>
707
791
  <div class="price-card pro" data-price-dollars="__PRO_PRICE_DOLLARS__">
708
- <div class="tier">Pro</div>
792
+ <div class="tier">Solo Pro</div>
709
793
  <div class="price">$19<span style="font-size:16px;color:var(--text-dim)">/mo</span></div>
710
794
  <div class="price-sub">or $149/yr (save 35%) · Personal dashboard + exports</div>
711
- <p style="font-size:13px;color:var(--cyan);margin-bottom:16px;font-weight:500;">For individual operators who need review-ready evidence, faster debugging, and a dashboard of exactly what got blocked.</p>
795
+ <p style="font-size:13px;color:var(--cyan);margin-bottom:16px;font-weight:500;">For an individual operator who wants a personal dashboard and proof-ready exports without starting the team rollout motion.</p>
712
796
  <div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
713
- <strong style="color:#fff;">Go Pro when:</strong> you want review-ready evidence, need your own dashboard, or keep correcting the same failure modes.
797
+ <strong style="color:#fff;">Choose Pro when:</strong> you want review-ready evidence, need your own dashboard, or are still operating solo.
714
798
  </div>
715
799
  <div class="dashboard-preview" style="margin-bottom:16px;border:1px solid #333;border-radius:8px;overflow:hidden;">
716
800
  <div style="background:linear-gradient(135deg,#1a1a2e 0%,#16213e 100%);padding:16px;text-align:center;">
@@ -731,7 +815,7 @@ __GA_BOOTSTRAP__
731
815
  <li><strong>HuggingFace dataset export</strong> — share PII-redacted agent traces as open training datasets (<code>npm run export:hf</code>)</li>
732
816
  <li><strong>Model Hardening Advisor</strong> — get recommendations on when and how to fine-tune your model to natively avoid recurring failures</li>
733
817
  <li>Personal local dashboard — every Pro user gets a localhost dashboard without extra cloud setup</li>
734
- <li>Founder-license support — we help you wire the riskiest flows first: migrations, force-pushes, deploys, and CI</li>
818
+ <li>Review-ready workflow support — we help you wire the riskiest flows first: migrations, force-pushes, deploys, and CI</li>
735
819
  </ul>
736
820
  <a href="/checkout/pro?utm_source=website&utm_medium=homepage_pricing&utm_campaign=pro_pack&cta_id=homepage_pricing_trial&cta_placement=pricing&plan_id=pro&landing_path=%2F" class="btn-pro" style="display:none" id="pro-checkout-link">Start Free Trial — then $19/mo</a>
737
821
  <div class="trial-badge" style="background:var(--cyan);color:#000;display:inline-block;padding:4px 12px;border-radius:12px;font-size:12px;font-weight:700;margin-bottom:12px;">7-DAY FREE TRIAL</div>
@@ -739,14 +823,13 @@ __GA_BOOTSTRAP__
739
823
  <input type="email" id="pro-email" data-buyer-email placeholder="Your email to start trial" style="width:100%;padding:10px 14px;border:1px solid #333;border-radius:6px;background:#1a1a2e;color:#fff;font-size:14px;">
740
824
  </div>
741
825
  <button class="btn-pro" id="pro-trial-btn" onclick="handleProTrial()" style="width:100%;cursor:pointer;border:none;">Start 7-Day Free Trial</button>
742
- <p style="font-size:11px;color:#666;margin-top:8px;">Founder pricing <a href="https://buy.stripe.com/aFa4gz1M84r419v7mb3sI05" style="color:var(--cyan);text-decoration:underline;">preserved $49 one-time founder link</a> for early buyers who still want that path.</p>
743
- <p style="font-size:12px;color:var(--cyan);margin-top:6px;">Mem0 Pro: $249/mo. ThumbGate Pro: $19/mo.</p>
826
+ <p style="font-size:11px;color:#666;margin-top:8px;">Solo Pro stays available for operators who want a personal dashboard and export-ready evidence without the team rollout motion.</p>
744
827
  </div>
745
828
  <div class="price-card team">
746
829
  <div class="tier">Team</div>
747
- <div class="price">$12<span style="font-size:16px;color:var(--text-dim)">/seat/mo</span></div>
830
+ <div class="price">$99<span style="font-size:16px;color:var(--text-dim)">/seat/mo</span></div>
748
831
  <div class="price-sub">3-seat minimum · intake-led rollout for the first workflow</div>
749
- <p style="font-size:13px;color:var(--green);margin-bottom:16px;font-weight:500;">For teams shipping AI-generated changes across shared repos who need one correction to protect every reviewer and runtime. The first team step is a workflow hardening sprint, not a blind org-wide rollout.</p>
832
+ <p style="font-size:13px;color:var(--green);margin-bottom:16px;font-weight:500;">For teams shipping AI-generated changes across shared repos who need one correction to protect every reviewer and runtime. This is the primary buying motion.</p>
750
833
  <div class="pro-upgrade-triggers" style="font-size:12px;color:#aaa;margin-bottom:12px;">
751
834
  <strong style="color:#fff;">Best first paid motion:</strong> one workflow, one owner, one proof review. Qualify the blocker first, then expand into seats.
752
835
  </div>
@@ -762,7 +845,7 @@ __GA_BOOTSTRAP__
762
845
  <li>Proof pack — attach verification evidence and rollout diagnostics so the buyer does not have to trust a demo</li>
763
846
  </ul>
764
847
  <a href="#workflow-sprint-intake" class="btn-team">Start Workflow Hardening Sprint</a>
765
- <p style="font-size:11px;color:#666;margin-top:8px;">Team pricing anchors at $12/seat/mo with a 3-seat minimum after qualification. The first step is a 30-minute intake around one real blocker.</p>
848
+ <p style="font-size:11px;color:#666;margin-top:8px;">Team pricing anchors at $99/seat/mo with a 3-seat minimum after qualification. The first step is a 30-minute intake around one real blocker.</p>
766
849
  </div>
767
850
  </div>
768
851
  </div>
@@ -811,7 +894,7 @@ __GA_BOOTSTRAP__
811
894
  </div>
812
895
  <div class="faq-item">
813
896
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What AI agents and editors does this work with?</div>
814
- <div class="faq-a">ThumbGate works with Claude Code, Cursor, Codex, Gemini CLI, Amp, OpenCode, and any other MCP-compatible agent. Cursor ships with a plugin bundle in this repo. Codex ships with a repo-local app plugin profile. VS Code works when you run an MCP-compatible agent inside it, but this repo does not ship a standalone VS Code extension today.</div>
897
+ <div class="faq-a">ThumbGate works with Claude Code, Cursor, Codex, Gemini CLI, Amp, OpenCode, and any other MCP-compatible agent. Cursor ships with a plugin bundle in this repo. Codex now ships both a standalone plugin bundle and a repo-local app plugin profile, and the published download is linked directly from this page. VS Code works when you run an MCP-compatible agent inside it, but this repo does not ship a standalone VS Code extension today.</div>
815
898
  </div>
816
899
  <div class="faq-item">
817
900
  <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>
@@ -823,7 +906,7 @@ __GA_BOOTSTRAP__
823
906
  </div>
824
907
  <div class="faq-item">
825
908
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">Do I need a cloud account?</div>
826
- <div class="faq-a">No. Free keeps local enforcement on your machine with 3 daily feedback captures, 5 lesson searches, unlimited recall, gates, and hook blocking. No cloud account is required. Pro adds a personal local dashboard plus DPO export. Team is the hosted rollout lane when your group wants a shared lesson database, hosted review views, org dashboard visibility, and team-wide proof.</div>
909
+ <div class="faq-a">No. Free keeps local enforcement on your machine with 3 daily feedback captures, 5 lesson searches, unlimited recall, gates, and hook blocking. No cloud account is required. The business starts when a team wants shared rules, approval boundaries, hosted review views, org dashboard visibility, and proof that survives handoffs. Pro is the optional solo side lane for a personal dashboard and DPO export.</div>
827
910
  </div>
828
911
  <div class="faq-item">
829
912
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What if my thumbs-down is vague?</div>
@@ -835,7 +918,7 @@ __GA_BOOTSTRAP__
835
918
  </div>
836
919
  <div class="faq-item">
837
920
  <div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">What does Pro cost?</div>
838
- <div class="faq-a">Pro is $19/mo or $149/yr (save 35%) for individual operators. Team pricing anchors at $12/seat/mo with a 3-seat minimum, and team buyers start with the workflow sprint intake instead of a blind org-wide rollout.</div>
921
+ <div class="faq-a">Pro is $19/mo or $149/yr (save 35%) for individual operators. Team pricing anchors at $99/seat/mo with a 3-seat minimum, and team buyers start with the workflow sprint intake instead of a blind org-wide rollout.</div>
839
922
  </div>
840
923
  </div>
841
924
  </div>
@@ -845,11 +928,11 @@ __GA_BOOTSTRAP__
845
928
  <section class="compatibility" id="newsletter" style="padding: 48px 0;">
846
929
  <div class="container" style="text-align: center;">
847
930
  <div class="section-label">Buyer Follow-Up</div>
848
- <h2 class="section-title" style="margin-bottom: 16px;">Not ready to buy today? Keep the sprint brief, demo, and checkout path one click away.</h2>
849
- <p style="color: var(--text-dim); margin-bottom: 24px; max-width: 560px; margin-left: auto; margin-right: auto;">Save your work email for launch updates, new gate patterns, the workflow sprint brief, and the paid demo path. We also keep it on this device so the Pro checkout can open prefilled instead of making you type it again.</p>
931
+ <h2 class="section-title" style="margin-bottom: 16px;">Not ready to buy today? Keep the sprint brief, demo, and discovery notes one click away.</h2>
932
+ <p style="color: var(--text-dim); margin-bottom: 24px; max-width: 560px; margin-left: auto; margin-right: auto;">Save your work email for the workflow sprint brief, new gate patterns, and buyer-facing proof updates. If you later choose the solo Pro checkout, we keep that path prefilled on this device too.</p>
850
933
  <form action="/api/newsletter" method="POST" data-newsletter-form data-page="homepage" data-intent="buyer_follow_up" style="display: flex; gap: 8px; max-width: 480px; margin: 0 auto; flex-wrap: wrap; justify-content: center;">
851
934
  <input type="email" name="email" data-buyer-email placeholder="you@company.com" required style="flex: 1; min-width: 220px; padding: 12px 16px; border: 1px solid var(--border); border-radius: 8px; background: var(--bg-raised); color: var(--text); font-size: 15px;">
852
- <button type="submit" style="padding: 12px 24px; background: var(--cyan); color: #000; border: none; border-radius: 8px; font-weight: 600; font-size: 15px; cursor: pointer;">Get updates + keep checkout ready</button>
935
+ <button type="submit" style="padding: 12px 24px; background: var(--cyan); color: #000; border: none; border-radius: 8px; font-weight: 600; font-size: 15px; cursor: pointer;">Get sprint brief + updates</button>
853
936
  </form>
854
937
  <p data-newsletter-status style="min-height:20px;font-size:12px;color:var(--text-dim);margin-top:10px;" aria-live="polite"></p>
855
938
  </div>
@@ -859,10 +942,10 @@ __GA_BOOTSTRAP__
859
942
  <section class="final-cta">
860
943
  <div class="container">
861
944
  <h2>Start with one workflow you actually need to defend.</h2>
862
- <p>Use the workflow hardening sprint for team rollout, or choose Pro if you are the solo operator who needs a personal dashboard and review-ready exports.</p>
945
+ <p>Use the workflow hardening sprint for team rollout. Install the free CLI if you are still evaluating alone. Pro remains the solo side lane for a personal dashboard and review-ready exports.</p>
863
946
  <div style="display:flex;gap:12px;justify-content:center;flex-wrap:wrap;">
864
947
  <a href="#workflow-sprint-intake" class="btn-team" style="background:var(--green);">Start Workflow Hardening Sprint</a>
865
- <a href="/checkout/pro?utm_source=website&utm_medium=homepage_final&utm_campaign=pro_pack&cta_id=homepage_final_trial&cta_placement=final&plan_id=pro&landing_path=%2F" class="btn-pro">Try Pro free for 7 days → $19/mo</a>
948
+ <a href="/guide?utm_source=website&utm_medium=homepage_final&utm_campaign=install_free" class="btn-pro btn-install-link">Install Free CLI</a>
866
949
  </div>
867
950
  </div>
868
951
  </section>
@@ -873,11 +956,12 @@ __GA_BOOTSTRAP__
873
956
  <div class="footer-links">
874
957
  <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
875
958
  <a href="https://www.npmjs.com/package/thumbgate" target="_blank" rel="noopener">npm</a>
959
+ <a href="https://www.producthunt.com/products/thumbgate" target="_blank" rel="noopener">Product Hunt</a>
876
960
  <a href="https://x.com/IgorGanapolsky" target="_blank" rel="noopener">X / Twitter</a>
877
961
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
878
962
  <a href="/blog">Blog</a>
879
963
  </div>
880
- <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.3.0</span>
964
+ <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.4.0</span>
881
965
  </div>
882
966
  </footer>
883
967
 
@@ -892,6 +976,7 @@ function initializeBuyerIntentForms() {
892
976
  }
893
977
 
894
978
  function resolvePricingClickTier(el) {
979
+ if (el.classList.contains('btn-install-link')) return 'install';
895
980
  if (el.classList.contains('btn-pro')) return 'pro';
896
981
  if (el.classList.contains('btn-pro-page')) return 'pro_page';
897
982
  if (el.classList.contains('btn-team')) return 'team';
@@ -935,7 +1020,8 @@ function copyInstall(el) {
935
1020
 
936
1021
  /* CTA clicks */
937
1022
  trackClick('.btn-pro', 'checkout_start', { tier: 'pro', price: 19, billing: 'monthly' });
938
- trackClick('.btn-pro-page', 'pro_page_click', { tier: 'pro', source: 'hero' });
1023
+ trackClick('.btn-pro-page:not(.btn-install-link)', 'pro_page_click', { tier: 'pro', source: 'hero' });
1024
+ trackClick('.btn-install-link', 'install_guide_click', { tier: 'free', source: 'homepage_cta' });
939
1025
  trackClick('.btn-team', 'workflow_sprint_intake_click', { tier: 'team', offer: 'workflow_hardening_sprint' });
940
1026
  trackClick('.btn-free', 'install_click', { tier: 'free' });
941
1027
  trackClick('.btn-demo-link', 'demo_click', { source: 'homepage' });
@@ -943,7 +1029,7 @@ function copyInstall(el) {
943
1029
 
944
1030
  /* Pricing CTA conversion tracking — fires on every Get Started / Pro / Team button click
945
1031
  with section context so we can distinguish pricing section vs final CTA section clicks */
946
- document.querySelectorAll('.btn-pro, .btn-pro-page, .btn-team, .btn-free, .btn-demo-link, .nav-cta').forEach(function(el) {
1032
+ document.querySelectorAll('.btn-pro, .btn-pro-page, .btn-install-link, .btn-team, .btn-free, .btn-demo-link, .nav-cta').forEach(function(el) {
947
1033
  el.addEventListener('click', function() {
948
1034
  var section = el.closest('section');
949
1035
  var sectionId = section ? (section.id || section.className.split(' ')[0] || 'unknown') : 'unknown';
@@ -242,24 +242,24 @@
242
242
  </div>
243
243
  <div class="metrics-summary-grid" id="metricsSummaryGrid">
244
244
  <div class="metric-tile">
245
- <div class="metric-kicker">7d approval</div>
245
+ <div class="metric-kicker">Fast path rate</div>
246
246
  <div class="metric-number purple">--</div>
247
- <div class="metric-note">Waiting for live feedback</div>
247
+ <div class="metric-note">Waiting for live decisions</div>
248
248
  </div>
249
249
  <div class="metric-tile">
250
- <div class="metric-kicker">This week negatives</div>
250
+ <div class="metric-kicker">Override rate</div>
251
251
  <div class="metric-number red">--</div>
252
- <div class="metric-note">Waiting for live feedback</div>
252
+ <div class="metric-note">Waiting for live decisions</div>
253
253
  </div>
254
254
  <div class="metric-tile">
255
- <div class="metric-kicker">Actions blocked</div>
256
- <div class="metric-number green">--</div>
257
- <div class="metric-note">Recorded gate denies</div>
255
+ <div class="metric-kicker">Rollback rate</div>
256
+ <div class="metric-number cyan">--</div>
257
+ <div class="metric-note">Waiting for live decisions</div>
258
258
  </div>
259
259
  <div class="metric-tile">
260
- <div class="metric-kicker">Repeat pressure</div>
261
- <div class="metric-number cyan">--</div>
262
- <div class="metric-note">Share of negatives that repeat</div>
260
+ <div class="metric-kicker">Median latency</div>
261
+ <div class="metric-number green">--</div>
262
+ <div class="metric-note">Time from recommendation to recorded outcome</div>
263
263
  </div>
264
264
  </div>
265
265
  <div class="metrics-chart-wrap">
@@ -492,7 +492,7 @@ function updateMetricsSelection() {
492
492
  note.textContent = 'Showing timeline events for ' + formatShortDay(activeTimelineDay) + '. Clear the day filter to return to the full timeline.';
493
493
  }
494
494
  } else {
495
- note.textContent = 'The chart combines recorded feedback events with daily gate-audit activity.';
495
+ note.textContent = 'The chart combines recorded feedback events with daily gate-audit activity. Decision-loop metrics above come from recorded evaluations and outcomes.';
496
496
  }
497
497
  }
498
498
 
@@ -627,12 +627,12 @@ function renderImprovementMetrics(stats, data) {
627
627
  if (!summary || !grid || !chart) return;
628
628
 
629
629
  if (isDemo) {
630
- summary.textContent = 'Live improvement trends appear here once local Pro is connected. The chart is based on recorded feedback, gate denials, and repeat-failure pressure.';
630
+ summary.textContent = 'Live improvement trends appear here once local Pro is connected. The decision tiles are based on recorded evaluations plus override and rollback outcomes, while the chart below stays anchored to feedback and gate audits.';
631
631
  grid.innerHTML = [
632
- { label: '7d approval', value: '12.5%', tone: 'purple', note: 'Demo preview only' },
633
- { label: 'This week negatives', value: '4', tone: 'red', note: 'Sample trend only' },
634
- { label: 'Actions blocked', value: '42', tone: 'green', note: 'Sample gate denies' },
635
- { label: 'Repeat pressure', value: '38%', tone: 'cyan', note: 'Sample repeated failures' }
632
+ { label: 'Fast path rate', value: '62%', tone: 'purple', note: 'Sample auto-execute share' },
633
+ { label: 'Override rate', value: '14%', tone: 'red', note: 'Sample operator overrides' },
634
+ { label: 'Rollback rate', value: '4%', tone: 'cyan', note: 'Sample reversed decisions' },
635
+ { label: 'Median latency', value: '6m', tone: 'green', note: 'Sample decision completion speed' }
636
636
  ].map(function(tile) {
637
637
  return '<div class="metric-tile"><div class="metric-kicker">' + escHtml(tile.label) + '</div><div class="metric-number ' + escHtml(tile.tone) + '">' + escHtml(tile.value) + '</div><div class="metric-note">' + escHtml(tile.note) + '</div></div>';
638
638
  }).join('');
@@ -645,23 +645,32 @@ function renderImprovementMetrics(stats, data) {
645
645
  var gateStats = (data && data.gateStats) || {};
646
646
  var gateAudit = (data && data.gateAudit) || {};
647
647
  var liveMetrics = (data && data.liveMetrics) || {};
648
+ var decisionLoop = (data && data.decisions) || {};
648
649
  var harness = (data && data.harness) || {};
649
650
  var approvalRate = Math.round(((stats && (stats.recentRate || stats.approvalRate)) || 0) * 100);
650
651
  var errorTrend = liveMetrics.errorTrend || {};
651
- var repeatPressure = Math.round(((harness.repeatFailureRate || 0) * 100));
652
- var repeatedCount = harness.repeatedFailureCount || 0;
652
+ var fastPathRate = Math.round(((decisionLoop.fastPathRate || 0) * 100));
653
+ var overrideRate = Math.round(((decisionLoop.overrideRate || 0) * 100));
654
+ var rollbackRate = Math.round(((decisionLoop.rollbackRate || 0) * 100));
655
+ var medianLatencyMs = Number(decisionLoop.medianLatencyMs || 0);
656
+ var medianLatencyText = medianLatencyMs >= 3600000
657
+ ? (medianLatencyMs / 3600000).toFixed(1) + 'h'
658
+ : medianLatencyMs >= 60000
659
+ ? Math.round(medianLatencyMs / 60000) + 'm'
660
+ : Math.round(medianLatencyMs / 1000) + 's';
653
661
  var thisWeekNeg = errorTrend.thisWeek || 0;
654
662
  var lastWeekNeg = errorTrend.lastWeek || 0;
655
663
  var blocked = gateStats.blocked || 0;
664
+ var resolvedCount = decisionLoop.resolvedCount || 0;
656
665
 
657
- summary.textContent = '7-day approval is ' + approvalRate + '%. This week logged ' + thisWeekNeg + ' negative signal' + (thisWeekNeg === 1 ? '' : 's')
658
- + ' versus ' + lastWeekNeg + ' last week, while gates recorded ' + blocked + ' deny decision' + (blocked === 1 ? '' : 's') + '.';
666
+ summary.textContent = 'ThumbGate is auto-routing ' + fastPathRate + '% of tracked decisions while holding override rate at ' + overrideRate + '% and rollback rate at ' + rollbackRate + '% across '
667
+ + resolvedCount + ' resolved decision' + (resolvedCount === 1 ? '' : 's') + '. Feedback approval is ' + approvalRate + '%, and gates still recorded ' + blocked + ' deny decision' + (blocked === 1 ? '' : 's') + '.';
659
668
 
660
669
  grid.innerHTML = [
661
- { label: '7d approval', value: approvalRate + '%', tone: 'purple', note: 'Recent approval rate from feedback signals' },
662
- { label: 'This week negatives', value: String(thisWeekNeg), tone: 'red', note: 'Vs ' + lastWeekNeg + ' last week' },
663
- { label: 'Actions blocked', value: String(blocked), tone: 'green', note: 'Recorded gate denies from the audit trail' },
664
- { label: 'Repeat pressure', value: repeatPressure + '%', tone: 'cyan', note: repeatedCount + ' repeated failure pattern' + (repeatedCount === 1 ? '' : 's') }
670
+ { label: 'Fast path rate', value: fastPathRate + '%', tone: 'purple', note: 'Recorded evaluations that stayed auto-executable' },
671
+ { label: 'Override rate', value: overrideRate + '%', tone: 'red', note: 'Resolved decisions later changed by a human' },
672
+ { label: 'Rollback rate', value: rollbackRate + '%', tone: 'cyan', note: 'Resolved decisions later reversed' },
673
+ { label: 'Median latency', value: medianLatencyText, tone: 'green', note: 'Time from recommendation to recorded outcome' }
665
674
  ].map(function(tile) {
666
675
  return '<div class="metric-tile"><div class="metric-kicker">' + escHtml(tile.label) + '</div><div class="metric-number ' + escHtml(tile.tone) + '">' + escHtml(tile.value) + '</div><div class="metric-note">' + escHtml(tile.note) + '</div></div>';
667
676
  }).join('');