thumbgate 1.16.8 → 1.16.9
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/README.md +5 -5
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/package.json +7 -4
- package/public/dashboard.html +18 -18
- package/public/index.html +144 -24
- package/public/numbers.html +33 -33
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate-marketplace",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.9",
|
|
4
4
|
"owner": {
|
|
5
5
|
"name": "Igor Ganapolsky",
|
|
6
6
|
"email": "ig5973700@gmail.com"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"source": "npm",
|
|
14
14
|
"package": "thumbgate"
|
|
15
15
|
},
|
|
16
|
-
"version": "1.16.
|
|
16
|
+
"version": "1.16.9",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "Igor Ganapolsky"
|
|
19
19
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
3
|
"description": "Type 👍 or 👎 on any agent action. ThumbGate captures it, distills a lesson, and blocks the pattern from repeating. One thumbs-down = the agent physically cannot make that mistake again. 33 pre-action checks, budget enforcement, self-protection, and NIST/SOC2 compliance tags.",
|
|
4
|
-
"version": "1.16.
|
|
4
|
+
"version": "1.16.9",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Igor Ganapolsky"
|
|
7
7
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.9",
|
|
4
4
|
"description": "ThumbGate — 👍👎 feedback that teaches your AI agent. Thumbs down a mistake, it never happens again.",
|
|
5
5
|
"homepage": "https://thumbgate-production.up.railway.app",
|
|
6
6
|
"transport": "stdio",
|
package/README.md
CHANGED
|
@@ -261,13 +261,13 @@ The free tier gives you 3 lifetime feedback captures and 1 auto-promoted prevent
|
|
|
261
261
|
|
|
262
262
|
Pro ($19/mo or $149/yr) lifts those caps and adds history-aware lesson recall, lesson search, DPO export, and a personal dashboard. Team ($49/seat/mo) adds a shared hosted lesson DB, org dashboard, and shared enforcement across the org. Pro and Team include `open_feedback_session`, `append_feedback_context`, and `finalize_feedback_session` for structured multi-turn feedback capture.
|
|
263
263
|
|
|
264
|
-
**Best first paid motion for teams:** the **Workflow Hardening Sprint** — qualify one repeated failure before committing to a full rollout. **[Start intake →](https://
|
|
264
|
+
**Best first paid motion for teams:** the **Workflow Hardening Sprint** — qualify one repeated failure before committing to a full rollout. **[Start intake →](https://thumbgate-production.up.railway.app/?utm_source=github&utm_medium=readme&utm_campaign=team_rollout#workflow-sprint-intake)**
|
|
265
265
|
|
|
266
266
|
**Best first technical motion:** install the CLI-first and let `init` wire hooks for the agent you already use.
|
|
267
267
|
|
|
268
|
-
**Paid path for individual operators:** [ThumbGate Pro](https://
|
|
268
|
+
**Paid path for individual operators:** [ThumbGate Pro](https://thumbgate-production.up.railway.app/checkout/pro?utm_source=github&utm_medium=readme&utm_campaign=pro_page) is the self-serve side lane for a personal dashboard and export-ready evidence.
|
|
269
269
|
|
|
270
|
-
**[Start free](https://
|
|
270
|
+
**[Start free](https://thumbgate-production.up.railway.app/?utm_source=github&utm_medium=readme)** · **[See Pro](https://thumbgate-production.up.railway.app/checkout/pro?utm_source=github&utm_medium=readme)** · **[Team Sprint intake](https://thumbgate-production.up.railway.app/?utm_source=github&utm_medium=readme#workflow-sprint-intake)**
|
|
271
271
|
|
|
272
272
|
---
|
|
273
273
|
|
|
@@ -360,9 +360,9 @@ Every Changeset is tied to the exact `main` merge commit and generates Verificat
|
|
|
360
360
|
|
|
361
361
|
---
|
|
362
362
|
|
|
363
|
-
**Popular buyer questions:** **[AI search topical presence](https://
|
|
363
|
+
**Popular buyer questions:** **[AI search topical presence](https://thumbgate-production.up.railway.app/guides/ai-search-topical-presence?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Relational knowledge and AI recommendations](https://thumbgate-production.up.railway.app/guides/relational-knowledge-ai-recommendations?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Stop repeated AI agent mistakes](https://thumbgate-production.up.railway.app/guides/stop-repeated-ai-agent-mistakes?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Browser automation safety](https://thumbgate-production.up.railway.app/guides/browser-automation-safety?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Native messaging host security](https://thumbgate-production.up.railway.app/guides/native-messaging-host-security?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Autoresearch agent safety](https://thumbgate-production.up.railway.app/guides/autoresearch-agent-safety?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Cursor guardrails](https://thumbgate-production.up.railway.app/guides/cursor-agent-guardrails?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Codex CLI guardrails](https://thumbgate-production.up.railway.app/guides/codex-cli-guardrails?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)** · **[Gemini CLI memory + enforcement](https://thumbgate-production.up.railway.app/guides/gemini-cli-feedback-memory?utm_source=github&utm_medium=readme&utm_campaign=buyer_questions)**
|
|
364
364
|
|
|
365
|
-
**[Workflow Hardening Sprint](https://
|
|
365
|
+
**[Workflow Hardening Sprint](https://thumbgate-production.up.railway.app/?utm_source=github&utm_medium=readme&utm_campaign=top_cta#workflow-sprint-intake)** · **[Live Dashboard](https://thumbgate-production.up.railway.app/dashboard?utm_source=github&utm_medium=readme&utm_campaign=top_cta)**
|
|
366
366
|
|
|
367
367
|
---
|
|
368
368
|
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"thumbgate": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--yes", "--package", "thumbgate@1.16.
|
|
5
|
+
"args": ["--yes", "--package", "thumbgate@1.16.9", "thumbgate", "serve"]
|
|
6
6
|
}
|
|
7
7
|
},
|
|
8
8
|
"hooks": {
|
|
9
9
|
"preToolUse": {
|
|
10
10
|
"command": "npx",
|
|
11
|
-
"args": ["--yes", "--package", "thumbgate@1.16.
|
|
11
|
+
"args": ["--yes", "--package", "thumbgate@1.16.9", "thumbgate", "gate-check"]
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -201,7 +201,7 @@ const {
|
|
|
201
201
|
finalizeSession: finalizeFeedbackSession,
|
|
202
202
|
} = require('../../scripts/feedback-session');
|
|
203
203
|
|
|
204
|
-
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.16.
|
|
204
|
+
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.16.9' };
|
|
205
205
|
const COMMERCE_CATEGORIES = [
|
|
206
206
|
'product_recommendation',
|
|
207
207
|
'brand_compliance',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.9",
|
|
4
4
|
"description": "Self-improving agent governance: type thumbs-up or thumbs-down on any AI agent action. ThumbGate turns every mistake into a prevention rule and blocks the pattern from repeating. One thumbs-down, never again. 33 pre-action checks, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
|
|
5
5
|
"homepage": "https://thumbgate-production.up.railway.app",
|
|
6
6
|
"repository": {
|
|
@@ -217,6 +217,7 @@
|
|
|
217
217
|
"scripts": {
|
|
218
218
|
"postinstall": "node bin/postinstall.js || true",
|
|
219
219
|
"start": "node src/api/server.js",
|
|
220
|
+
"numbers:generate": "node scripts/generate-numbers-page.js",
|
|
220
221
|
"changeset": "changeset",
|
|
221
222
|
"changeset:version": "changeset version && node scripts/sync-version.js",
|
|
222
223
|
"changeset:status": "changeset status",
|
|
@@ -237,6 +238,8 @@
|
|
|
237
238
|
"gtm:aiventyx": "node scripts/aiventyx-marketplace-plan.js",
|
|
238
239
|
"gtm:chatgpt": "node scripts/chatgpt-gpt-revenue-pack.js",
|
|
239
240
|
"gtm:codex": "node scripts/codex-marketplace-revenue-pack.js",
|
|
241
|
+
"gtm:linkedin": "node scripts/linkedin-workflow-hardening-pack.js",
|
|
242
|
+
"gtm:reddit": "node scripts/reddit-dm-workflow-hardening-pack.js",
|
|
240
243
|
"sales:pipeline": "node scripts/sales-pipeline.js",
|
|
241
244
|
"social:prepare": "node scripts/social-pipeline.js prepare",
|
|
242
245
|
"social:post": "node scripts/social-pipeline.js post",
|
|
@@ -305,7 +308,7 @@
|
|
|
305
308
|
"test:hosted-config": "node --test tests/hosted-config.test.js",
|
|
306
309
|
"test:operational-summary": "node --test tests/operational-summary.test.js",
|
|
307
310
|
"test:operational-dashboard": "node --test tests/operational-dashboard.test.js",
|
|
308
|
-
"test:operator-artifacts": "node --test tests/operator-artifacts.test.js tests/claude-workflow-hardening-pack.test.js tests/gemini-cli-demand-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js",
|
|
311
|
+
"test:operator-artifacts": "node --test tests/operator-artifacts.test.js tests/revenue-pack-utils.test.js tests/claude-workflow-hardening-pack.test.js tests/gemini-cli-demand-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js",
|
|
309
312
|
"test:operator-key-auth": "node --test tests/api-operator-key-auth.test.js",
|
|
310
313
|
"test:cloudflare-sandbox": "node --test tests/cloudflare-dynamic-sandbox.test.js tests/cloudflare-sandbox-api.test.js",
|
|
311
314
|
"test:mcp-config": "node --test tests/mcp-config.test.js",
|
|
@@ -347,7 +350,7 @@
|
|
|
347
350
|
"test:training-export": "node --test tests/training-export.test.js tests/databricks-export.test.js",
|
|
348
351
|
"test:deployment": "node --test tests/deployment.test.js tests/deploy-policy.test.js tests/publish-decision.test.js tests/changeset-check.test.js tests/release-notes.test.js tests/sonarcloud-workflow.test.js tests/package-boundary.test.js tests/public-package-boundary.test.js tests/revenue-observability-workflow.test.js",
|
|
349
352
|
"test:operational-integrity": "node --test tests/operational-integrity.test.js tests/sync-branch-protection.test.js",
|
|
350
|
-
"test:workflow": "node --test tests/workflow-contract.test.js tests/social-marketing-assets.test.js tests/social-pipeline.test.js tests/positioning-contract.test.js tests/docs-claim-hygiene.test.js tests/thumbgate-scope.test.js tests/workflow-runs.test.js tests/workflow-sprint-intake.test.js tests/gtm-revenue-loop.test.js tests/aiventyx-marketplace-plan.test.js tests/cursor-marketplace-revenue-pack.test.js tests/codex-marketplace-revenue-pack.test.js tests/codex-plugin-revenue-pack.test.js tests/gemini-cli-demand-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js tests/autonomous-sales-agent.test.js tests/sales-pipeline.test.js tests/reddit-dm-outreach.test.js tests/enterprise-story.test.js tests/ralph-loop.test.js tests/ralph-mode-ci.test.js tests/guide-conversion-path.test.js",
|
|
353
|
+
"test:workflow": "node --test tests/workflow-contract.test.js tests/social-marketing-assets.test.js tests/social-pipeline.test.js tests/positioning-contract.test.js tests/docs-claim-hygiene.test.js tests/thumbgate-scope.test.js tests/workflow-runs.test.js tests/workflow-sprint-intake.test.js tests/gtm-revenue-loop.test.js tests/customer-discovery-sprint.test.js tests/revenue-pack-utils.test.js tests/aiventyx-marketplace-plan.test.js tests/cursor-marketplace-revenue-pack.test.js tests/codex-marketplace-revenue-pack.test.js tests/codex-plugin-revenue-pack.test.js tests/gemini-cli-demand-pack.test.js tests/linkedin-workflow-hardening-pack.test.js tests/chatgpt-gpt-revenue-pack.test.js tests/mcp-directory-revenue-pack.test.js tests/autonomous-sales-agent.test.js tests/reddit-dm-workflow-hardening-pack.test.js tests/sales-pipeline.test.js tests/reddit-dm-outreach.test.js tests/github-outreach.test.js tests/enterprise-story.test.js tests/ralph-loop.test.js tests/ralph-mode-ci.test.js tests/guide-conversion-path.test.js",
|
|
351
354
|
"test:sales-pipeline": "node --test tests/sales-pipeline.test.js",
|
|
352
355
|
"test:billing": "node --test tests/billing.test.js tests/stripe-sync-product-images.test.js",
|
|
353
356
|
"test:cli": "node --test tests/analytics-report.test.js tests/codex-self-heal.test.js tests/creator-campaigns.test.js tests/cli.test.js tests/codex-bridge-script.test.js tests/dependabot-changeset.test.js tests/dispatch-brief.test.js tests/feedback-normalize.test.js tests/install-mcp.test.js tests/pr-manager.test.js tests/pro-local-dashboard.test.js tests/published-cli.test.js tests/revenue-status.test.js tests/stripe-live-status.test.js",
|
|
@@ -601,7 +604,7 @@
|
|
|
601
604
|
"node": ">=18.18.0"
|
|
602
605
|
},
|
|
603
606
|
"dependencies": {
|
|
604
|
-
"@anthropic-ai/sdk": "
|
|
607
|
+
"@anthropic-ai/sdk": "0.92.0",
|
|
605
608
|
"@google/genai": "1.49.0",
|
|
606
609
|
"@huggingface/transformers": "^4.1.0",
|
|
607
610
|
"@lancedb/lancedb": "^0.27.2",
|
package/public/dashboard.html
CHANGED
|
@@ -1065,20 +1065,20 @@ function buildDemoGeneratedViewSpec(viewName) {
|
|
|
1065
1065
|
}
|
|
1066
1066
|
if (viewName === 'workflow-rollout') {
|
|
1067
1067
|
base.components = [
|
|
1068
|
-
{ type: 'hero', title: 'Generated Workflow Rollout View', description: 'Turn funnel, attribution, and predictive data into a constrained operator dashboard for team rollout.' },
|
|
1068
|
+
{ type: 'hero', title: 'Generated Workflow Rollout View', description: 'Turn funnel, attribution, and predictive data into a constrained operator dashboard for team rollout. Demo mode shows sample structure only and waits for hosted evidence before showing paid signals.' },
|
|
1069
1069
|
{ type: 'stat_grid', title: 'Rollout pipeline', items: [
|
|
1070
|
-
{ label: 'Workflow sprint leads', value: '
|
|
1071
|
-
{ label: 'Qualified leads', value: '
|
|
1072
|
-
{ label: 'Booked revenue', value: '
|
|
1073
|
-
{ label: 'Team propensity', value: '
|
|
1070
|
+
{ label: 'Workflow sprint leads', value: 'Sample', note: 'connect hosted funnel for live intake counts' },
|
|
1071
|
+
{ label: 'Qualified leads', value: 'Sample', note: 'proof-backed rollout data appears after intake review' },
|
|
1072
|
+
{ label: 'Booked revenue', value: 'Awaiting evidence', note: 'demo mode omits paid numbers until hosted analytics load' },
|
|
1073
|
+
{ label: 'Team propensity', value: 'Sample', note: 'score loads from hosted predictive analytics' }
|
|
1074
1074
|
] },
|
|
1075
1075
|
{ type: 'list', title: 'Top acquisition sources', emptyMessage: 'No sources.', items: [
|
|
1076
|
-
{ title: 'producthunt', subtitle: '
|
|
1077
|
-
{ title: 'website', subtitle: '
|
|
1076
|
+
{ title: 'producthunt', subtitle: 'example acquisition source', badge: 'sample only' },
|
|
1077
|
+
{ title: 'website', subtitle: 'example acquisition source', badge: 'sample only' }
|
|
1078
1078
|
] },
|
|
1079
1079
|
{ type: 'list', title: 'Next rollout moves', emptyMessage: 'No rollout moves.', items: [
|
|
1080
|
-
{ title: '
|
|
1081
|
-
{ title: 'Qualify pending sprint leads', subtitle: '
|
|
1080
|
+
{ title: 'Load hosted conversion signals', subtitle: 'Use authenticated funnel and revenue data before prioritizing paid rollout moves.', badge: 'evidence gate' },
|
|
1081
|
+
{ title: 'Qualify pending sprint leads', subtitle: 'Promote real workflow owners only after intake and proof review exist.', badge: 'proof-first' }
|
|
1082
1082
|
] }
|
|
1083
1083
|
];
|
|
1084
1084
|
return base;
|
|
@@ -1086,20 +1086,20 @@ function buildDemoGeneratedViewSpec(viewName) {
|
|
|
1086
1086
|
base.components = [
|
|
1087
1087
|
{ type: 'hero', title: 'Generated Team Reliability Review', description: 'A constrained hosted view assembled from approved dashboard components.' },
|
|
1088
1088
|
{ type: 'stat_grid', title: 'Team snapshot', items: [
|
|
1089
|
-
{ label: 'Active agents', value: '
|
|
1090
|
-
{ label: 'Org adherence', value: '
|
|
1091
|
-
{ label: 'Team propensity', value: '
|
|
1092
|
-
{ label: 'Forecast revenue', value: '
|
|
1089
|
+
{ label: 'Active agents', value: 'Sample', note: 'connect your workspace for live counts' },
|
|
1090
|
+
{ label: 'Org adherence', value: 'Sample', note: 'rolling view loads from your own telemetry' },
|
|
1091
|
+
{ label: 'Team propensity', value: 'Sample', note: 'score loads from hosted predictive analytics' },
|
|
1092
|
+
{ label: 'Forecast revenue', value: 'Awaiting evidence', note: 'demo mode never invents forecast dollars' }
|
|
1093
1093
|
] },
|
|
1094
1094
|
{ type: 'list', title: 'Highest-risk agents', emptyMessage: 'No risky agents.', items: [
|
|
1095
|
-
{ title: 'claude-reviewer', subtitle: '
|
|
1096
|
-
{ title: 'codex-second-pass', subtitle: '
|
|
1095
|
+
{ title: 'claude-reviewer', subtitle: 'example workflow · sample branch', badge: 'sample only' },
|
|
1096
|
+
{ title: 'codex-second-pass', subtitle: 'example workflow · sample branch', badge: 'sample only' }
|
|
1097
1097
|
] },
|
|
1098
1098
|
{ type: 'list', title: 'Predictive watchlist', emptyMessage: 'No anomalies.', items: [
|
|
1099
1099
|
{ title: 'pricing_resistance', subtitle: 'Price sensitivity dominates current loss reasons.', badge: 'warning' },
|
|
1100
1100
|
{ title: 'creator_underperformance', subtitle: 'Creator reach_vb is generating intent without revenue conversion.', badge: 'warning' }
|
|
1101
1101
|
] },
|
|
1102
|
-
{ type: 'callout', title: 'Commercial signal', body: '
|
|
1102
|
+
{ type: 'callout', title: 'Commercial signal', body: 'Demo mode keeps commercial numbers gated until hosted analytics and proof-backed workflow data are available.', tone: 'warning' }
|
|
1103
1103
|
];
|
|
1104
1104
|
return base;
|
|
1105
1105
|
}
|
|
@@ -1499,8 +1499,8 @@ function loadDemo() {
|
|
|
1499
1499
|
var teaserHtml = demoData.map(renderResult).join('');
|
|
1500
1500
|
var upgradeBanner = '<div style="margin-bottom:12px;padding:12px 16px;background:linear-gradient(90deg,rgba(184,92,45,0.14),rgba(184,92,45,0.06));border:1px solid rgba(184,92,45,0.35);border-radius:10px;display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;">' +
|
|
1501
1501
|
'<div style="color:#ddd;font-size:14px;">' +
|
|
1502
|
-
'<span style="color:#ffb98a;font-weight:700;">
|
|
1503
|
-
'Point ThumbGate at your own feedback to see <em>your</em> gates, lessons, and team signals
|
|
1502
|
+
'<span style="color:#ffb98a;font-weight:700;">Sample demo data below.</span> ' +
|
|
1503
|
+
'Point ThumbGate at your own feedback to see <em>your</em> gates, lessons, and team signals. Paid and revenue fields stay hidden until hosted evidence loads.' +
|
|
1504
1504
|
'</div>' +
|
|
1505
1505
|
'<a href="/go/pro?utm_source=dashboard_live" rel="noopener" ' +
|
|
1506
1506
|
'style="flex:none;background:#b85c2d;color:#fff;padding:8px 18px;border-radius:8px;text-decoration:none;font-weight:700;font-size:13px;white-space:nowrap;">Go Pro — $19/mo</a>' +
|
package/public/index.html
CHANGED
|
@@ -123,10 +123,84 @@ __GA_BOOTSTRAP__
|
|
|
123
123
|
"description": "Annual Pro for individual operators who want personal enforcement proof, the local dashboard, and proof-ready exports",
|
|
124
124
|
"url": "https://thumbgate-production.up.railway.app/checkout/pro?plan_id=pro&billing_cycle=annual&landing_path=%2F"
|
|
125
125
|
}
|
|
126
|
+
],
|
|
127
|
+
"potentialAction": [
|
|
128
|
+
{
|
|
129
|
+
"@type": "InstallAction",
|
|
130
|
+
"name": "Install ThumbGate Free",
|
|
131
|
+
"target": {
|
|
132
|
+
"@type": "EntryPoint",
|
|
133
|
+
"urlTemplate": "https://thumbgate-production.up.railway.app/guide",
|
|
134
|
+
"actionPlatform": [
|
|
135
|
+
"https://schema.org/DesktopWebPlatform"
|
|
136
|
+
]
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"@type": "BuyAction",
|
|
141
|
+
"name": "Start ThumbGate Pro",
|
|
142
|
+
"target": {
|
|
143
|
+
"@type": "EntryPoint",
|
|
144
|
+
"urlTemplate": "https://thumbgate-production.up.railway.app/checkout/pro?plan_id=pro&landing_path=%2F",
|
|
145
|
+
"actionPlatform": [
|
|
146
|
+
"https://schema.org/DesktopWebPlatform"
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
"expectsAcceptanceOf": {
|
|
150
|
+
"@type": "Offer",
|
|
151
|
+
"name": "Pro Monthly",
|
|
152
|
+
"price": "19",
|
|
153
|
+
"priceCurrency": "USD",
|
|
154
|
+
"url": "https://thumbgate-production.up.railway.app/checkout/pro?plan_id=pro&landing_path=%2F"
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"@type": "CommunicateAction",
|
|
159
|
+
"name": "Start Workflow Hardening Sprint intake",
|
|
160
|
+
"target": {
|
|
161
|
+
"@type": "EntryPoint",
|
|
162
|
+
"urlTemplate": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake",
|
|
163
|
+
"actionPlatform": [
|
|
164
|
+
"https://schema.org/DesktopWebPlatform"
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
}
|
|
126
168
|
]
|
|
127
169
|
}
|
|
128
170
|
</script>
|
|
129
171
|
|
|
172
|
+
<script type="application/ld+json">
|
|
173
|
+
{
|
|
174
|
+
"@context": "https://schema.org",
|
|
175
|
+
"@type": "Service",
|
|
176
|
+
"name": "ThumbGate Workflow Hardening Sprint",
|
|
177
|
+
"serviceType": "AI-agent workflow hardening sprint",
|
|
178
|
+
"provider": {
|
|
179
|
+
"@type": "Organization",
|
|
180
|
+
"name": "ThumbGate",
|
|
181
|
+
"url": "https://thumbgate-production.up.railway.app"
|
|
182
|
+
},
|
|
183
|
+
"url": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake",
|
|
184
|
+
"description": "Founder-led workflow hardening for one AI-agent workflow that needs approval boundaries, rollback safety, and rollout proof before wider team rollout.",
|
|
185
|
+
"offers": {
|
|
186
|
+
"@type": "Offer",
|
|
187
|
+
"name": "Workflow Hardening Sprint intake",
|
|
188
|
+
"url": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake"
|
|
189
|
+
},
|
|
190
|
+
"potentialAction": {
|
|
191
|
+
"@type": "CommunicateAction",
|
|
192
|
+
"name": "Book a workflow hardening intake",
|
|
193
|
+
"target": {
|
|
194
|
+
"@type": "EntryPoint",
|
|
195
|
+
"urlTemplate": "https://thumbgate-production.up.railway.app/#workflow-sprint-intake",
|
|
196
|
+
"actionPlatform": [
|
|
197
|
+
"https://schema.org/DesktopWebPlatform"
|
|
198
|
+
]
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
</script>
|
|
203
|
+
|
|
130
204
|
<script type="application/ld+json">
|
|
131
205
|
{
|
|
132
206
|
"@context": "https://schema.org",
|
|
@@ -211,10 +285,10 @@ __GA_BOOTSTRAP__
|
|
|
211
285
|
},
|
|
212
286
|
{
|
|
213
287
|
"@type": "Question",
|
|
214
|
-
"name": "
|
|
288
|
+
"name": "When should I use Pro versus the Workflow Hardening Sprint?",
|
|
215
289
|
"acceptedAnswer": {
|
|
216
290
|
"@type": "Answer",
|
|
217
|
-
"text": "
|
|
291
|
+
"text": "Start with the setup guide if you only need the local path. Choose Pro after one real blocked repeat when you want your own dashboard, DPO export, and proof-ready exports. Choose the Workflow Hardening Sprint when one workflow owner needs approval boundaries, rollback safety, and rollout proof before wider rollout."
|
|
218
292
|
}
|
|
219
293
|
},
|
|
220
294
|
{
|
|
@@ -461,7 +535,13 @@ __GA_BOOTSTRAP__
|
|
|
461
535
|
.btn-pro:hover { opacity: 0.85; }
|
|
462
536
|
.btn-team { display: block; text-align: center; padding: 10px; background: rgba(74,222,128,0.14); color: var(--green); border: 1px solid rgba(74,222,128,0.4); border-radius: 8px; text-decoration: none; font-size: 14px; font-weight: 600; transition: border-color 0.15s, transform 0.15s; }
|
|
463
537
|
.btn-team:hover { border-color: var(--green); transform: translateY(-1px); }
|
|
538
|
+
.team-intake-panel { max-width: 900px; margin: 24px auto 0; padding: 22px; border: 1px solid rgba(74,222,128,0.28); border-radius: 12px; background: rgba(74,222,128,0.055); box-shadow: inset 0 1px 0 rgba(74,222,128,0.08); }
|
|
539
|
+
.team-intake-panel-head { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; margin-bottom: 16px; }
|
|
540
|
+
.team-intake-panel h3 { margin: 0 0 6px; font-size: 18px; color: var(--text); }
|
|
541
|
+
.team-intake-panel p { margin: 0; color: var(--text-dim); font-size: 13px; line-height: 1.55; }
|
|
542
|
+
.team-intake-badge { flex-shrink: 0; padding: 6px 10px; border: 1px solid rgba(74,222,128,0.35); border-radius: 999px; color: var(--green); font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; }
|
|
464
543
|
.team-form { max-width: 860px; margin: 24px auto 0; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
|
|
544
|
+
.team-intake-panel .team-form { max-width: none; margin: 0; }
|
|
465
545
|
.team-form .full { grid-column: 1 / -1; }
|
|
466
546
|
.team-form input, .team-form textarea { width: 100%; background: var(--bg-card); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; color: var(--text); font-size: 14px; font-family: inherit; }
|
|
467
547
|
.team-form textarea { min-height: 120px; resize: vertical; }
|
|
@@ -523,6 +603,8 @@ __GA_BOOTSTRAP__
|
|
|
523
603
|
.seo-grid { grid-template-columns: 1fr; }
|
|
524
604
|
.autoresearch-grid { grid-template-columns: 1fr; }
|
|
525
605
|
.pricing-grid { grid-template-columns: 1fr; }
|
|
606
|
+
.team-intake-panel-head { display: block; }
|
|
607
|
+
.team-intake-badge { display: inline-block; margin-bottom: 10px; }
|
|
526
608
|
.team-form { grid-template-columns: 1fr; }
|
|
527
609
|
.hero { padding: 72px 0 56px; }
|
|
528
610
|
.hero-actions { flex-direction: column; }
|
|
@@ -1082,7 +1164,7 @@ __GA_BOOTSTRAP__
|
|
|
1082
1164
|
<!-- HOW IT WORKS -->
|
|
1083
1165
|
<section class="how-it-works" id="how-it-works">
|
|
1084
1166
|
<div class="container">
|
|
1085
|
-
<div class="section-label">New in v1.16.
|
|
1167
|
+
<div class="section-label">New in v1.16.9</div>
|
|
1086
1168
|
<h2 class="section-title">Three steps to stop repeated AI failures</h2>
|
|
1087
1169
|
<div class="steps">
|
|
1088
1170
|
<div class="step">
|
|
@@ -1317,24 +1399,34 @@ __GA_BOOTSTRAP__
|
|
|
1317
1399
|
<div class="section-label">Team Pilot</div>
|
|
1318
1400
|
<h2 class="section-title">Start with one repo, one workflow, one repeat failure</h2>
|
|
1319
1401
|
<p style="color:var(--text-dim);max-width:720px;margin:0 auto 16px;">This is the fastest path to first paid value for teams. Start with one workflow, one owner, and one blocker. The intake is designed to prove that ThumbGate reduces review churn, rollout risk, or repeated agent mistakes before a wider rollout.</p>
|
|
1320
|
-
<
|
|
1321
|
-
<
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
<input type="text" name="company" placeholder="Company">
|
|
1328
|
-
<input type="text" name="workflow" placeholder="Workflow to harden (e.g. deploy approvals, migrations, PR review)" required>
|
|
1329
|
-
<input type="text" name="owner" placeholder="Workflow owner" required>
|
|
1330
|
-
<input type="text" name="runtime" placeholder="Current agent/runtime (Claude Code, Codex, Cursor, Gemini...)" required>
|
|
1331
|
-
<textarea class="full" name="blocker" placeholder="What repeat mistake, rollout blocker, or team handoff failure keeps happening?" required></textarea>
|
|
1332
|
-
<textarea class="full" name="note" placeholder="Optional context: team size, repos involved, target rollout date, or what you need to prove internally."></textarea>
|
|
1333
|
-
<div class="full">
|
|
1334
|
-
<button type="submit" class="btn-team">Start Team Pilot Intake</button>
|
|
1402
|
+
<div class="team-intake-panel">
|
|
1403
|
+
<div class="team-intake-panel-head">
|
|
1404
|
+
<div>
|
|
1405
|
+
<h3>Tell us the workflow. Get a proof plan.</h3>
|
|
1406
|
+
<p>The highest-fit Team buyer is already feeling one repeated failure. Capture it here instead of making them click through a hidden form.</p>
|
|
1407
|
+
</div>
|
|
1408
|
+
<span class="team-intake-badge">30-minute intake</span>
|
|
1335
1409
|
</div>
|
|
1336
|
-
|
|
1337
|
-
|
|
1410
|
+
<form id="team-pilot-intake-form" class="team-form" action="/v1/intake/workflow-sprint" method="POST" data-team-intake-form>
|
|
1411
|
+
<input type="hidden" name="ctaId" value="workflow_sprint_intake">
|
|
1412
|
+
<input type="hidden" name="ctaPlacement" value="team_visible_intake">
|
|
1413
|
+
<input type="hidden" name="planId" value="team">
|
|
1414
|
+
<input type="hidden" name="utmSource" value="website">
|
|
1415
|
+
<input type="hidden" name="utmMedium" value="visible_team_intake">
|
|
1416
|
+
<input type="hidden" name="utmCampaign" value="workflow_hardening_sprint">
|
|
1417
|
+
<input type="hidden" name="page" value="/#workflow-sprint-intake">
|
|
1418
|
+
<input type="email" name="email" placeholder="you@company.com" autocomplete="email" required>
|
|
1419
|
+
<input type="text" name="company" placeholder="Company">
|
|
1420
|
+
<input type="text" name="workflow" placeholder="Workflow to harden (e.g. deploy approvals, migrations, PR review)" required>
|
|
1421
|
+
<input type="text" name="owner" placeholder="Workflow owner" required>
|
|
1422
|
+
<input type="text" name="runtime" placeholder="Current agent/runtime (Claude Code, Codex, Cursor, Gemini...)" required>
|
|
1423
|
+
<textarea class="full" name="blocker" placeholder="What repeat mistake, rollout blocker, or team handoff failure keeps happening?" required></textarea>
|
|
1424
|
+
<textarea class="full" name="note" placeholder="Optional context: team size, repos involved, target rollout date, or what you need to prove internally."></textarea>
|
|
1425
|
+
<div class="full">
|
|
1426
|
+
<button type="submit" class="btn-team">Start Team Pilot Intake</button>
|
|
1427
|
+
</div>
|
|
1428
|
+
</form>
|
|
1429
|
+
</div>
|
|
1338
1430
|
</div>
|
|
1339
1431
|
</section>
|
|
1340
1432
|
|
|
@@ -1365,8 +1457,8 @@ __GA_BOOTSTRAP__
|
|
|
1365
1457
|
<div class="faq-a">No. The ThumbGate GPT is the ChatGPT entrypoint for checking proposed actions, capturing thumbs-up/down lessons, and getting setup help. Use it for advice and checkpointing; hard enforcement still runs locally where the agent executes after <code>npx thumbgate init</code>.</div>
|
|
1366
1458
|
</div>
|
|
1367
1459
|
<div class="faq-item">
|
|
1368
|
-
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">
|
|
1369
|
-
<div class="faq-a">
|
|
1460
|
+
<div class="faq-q" role="button" tabindex="0" aria-expanded="false" onclick="toggleFaq(this)" onkeydown="handleFaqKeydown(event)">When should I use Pro versus the Workflow Hardening Sprint?</div>
|
|
1461
|
+
<div class="faq-a">Start with the <a href="/guide" style="color:var(--cyan);text-decoration:underline;">setup guide</a> if you only need the local path. Choose Pro after one real blocked repeat when you want your own dashboard, DPO export, and proof-ready exports. Choose the <a href="#workflow-sprint-intake" style="color:var(--cyan);text-decoration:underline;">Workflow Hardening Sprint</a> when one workflow owner needs approval boundaries, rollback safety, and rollout proof before wider rollout.</div>
|
|
1370
1462
|
</div>
|
|
1371
1463
|
<div class="faq-item">
|
|
1372
1464
|
<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>
|
|
@@ -1442,7 +1534,7 @@ __GA_BOOTSTRAP__
|
|
|
1442
1534
|
<a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
|
|
1443
1535
|
<a href="/blog">Blog</a>
|
|
1444
1536
|
</div>
|
|
1445
|
-
<span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.16.
|
|
1537
|
+
<span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.16.9</span>
|
|
1446
1538
|
</div>
|
|
1447
1539
|
</footer>
|
|
1448
1540
|
|
|
@@ -1527,6 +1619,32 @@ function sendFirstPartyTelemetry(eventType, props) {
|
|
|
1527
1619
|
}).catch(function() {});
|
|
1528
1620
|
}
|
|
1529
1621
|
|
|
1622
|
+
function initializeTeamIntakeTelemetry() {
|
|
1623
|
+
document.querySelectorAll('[data-team-intake-form]').forEach(function(form) {
|
|
1624
|
+
var started = false;
|
|
1625
|
+
function readHidden(name) {
|
|
1626
|
+
var input = form.querySelector('input[name="' + name + '"]');
|
|
1627
|
+
return input ? input.value : null;
|
|
1628
|
+
}
|
|
1629
|
+
form.addEventListener('input', function() {
|
|
1630
|
+
if (started) return;
|
|
1631
|
+
started = true;
|
|
1632
|
+
sendFirstPartyTelemetry('workflow_sprint_intake_started', {
|
|
1633
|
+
ctaId: readHidden('ctaId'),
|
|
1634
|
+
ctaPlacement: readHidden('ctaPlacement'),
|
|
1635
|
+
planId: readHidden('planId') || 'team',
|
|
1636
|
+
});
|
|
1637
|
+
});
|
|
1638
|
+
form.addEventListener('submit', function() {
|
|
1639
|
+
sendFirstPartyTelemetry('workflow_sprint_intake_submit_attempted', {
|
|
1640
|
+
ctaId: readHidden('ctaId'),
|
|
1641
|
+
ctaPlacement: readHidden('ctaPlacement'),
|
|
1642
|
+
planId: readHidden('planId') || 'team',
|
|
1643
|
+
});
|
|
1644
|
+
});
|
|
1645
|
+
});
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1530
1648
|
function resolvePricingClickTier(el) {
|
|
1531
1649
|
if (el.classList.contains('btn-install-hero')) return 'install';
|
|
1532
1650
|
if (el.classList.contains('btn-install-link')) return 'install';
|
|
@@ -1661,13 +1779,15 @@ function copyInstall(el) {
|
|
|
1661
1779
|
{ selector: '.price-card.pro .btn-pro', ctaId: 'pricing_pro_monthly', ctaPlacement: 'pricing', planId: 'pro' },
|
|
1662
1780
|
{ selector: '.hero-actions .btn-pro-page', ctaId: 'hero_go_pro', ctaPlacement: 'hero', planId: 'pro' },
|
|
1663
1781
|
{ selector: '.sticky-cta .btn-pro', ctaId: 'sticky_go_pro', ctaPlacement: 'sticky_cta', planId: 'pro' },
|
|
1664
|
-
{ selector: '.price-card.team .btn-team', ctaId: 'team_workflow_sprint', ctaPlacement: 'pricing', planId: 'team' }
|
|
1782
|
+
{ selector: '.price-card.team .btn-team', ctaId: 'team_workflow_sprint', ctaPlacement: 'pricing', planId: 'team' },
|
|
1783
|
+
{ selector: '#team-pilot-intake-form', ctaId: 'workflow_sprint_intake', ctaPlacement: 'team_visible_intake', planId: 'team' }
|
|
1665
1784
|
]
|
|
1666
1785
|
});
|
|
1667
1786
|
})();
|
|
1668
1787
|
</script>
|
|
1669
1788
|
<script>
|
|
1670
1789
|
initializeBuyerIntentForms();
|
|
1790
|
+
initializeTeamIntakeTelemetry();
|
|
1671
1791
|
|
|
1672
1792
|
async function handleProTrial() {
|
|
1673
1793
|
var buyerIntent = globalThis.ThumbGateBuyerIntent;
|
package/public/numbers.html
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<meta name="generator" content="ThumbGate">
|
|
7
7
|
<meta name="author" content="Igor Ganapolsky">
|
|
8
|
-
<title>ThumbGate — The Numbers |
|
|
9
|
-
<meta name="description" content="ThumbGate's
|
|
8
|
+
<title>ThumbGate — The Numbers | First-Party Data Snapshot</title>
|
|
9
|
+
<meta name="description" content="ThumbGate's generated first-party operational snapshot: active pre-action checks, AI agent actions blocked, estimated LLM tokens and dollars saved, and the Bayes error rate of the intervention scorer.">
|
|
10
10
|
<meta property="og:title" content="ThumbGate — The Numbers">
|
|
11
|
-
<meta property="og:description" content="
|
|
11
|
+
<meta property="og:description" content="Generated first-party operational metrics: gates, blocks, token savings, and scorer calibration.">
|
|
12
12
|
<meta property="og:type" content="website">
|
|
13
13
|
<meta property="og:url" content="https://thumbgate-production.up.railway.app/numbers">
|
|
14
14
|
<meta name="twitter:card" content="summary_large_image">
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"alternateName": "thumbgate",
|
|
26
26
|
"applicationCategory": "DeveloperApplication",
|
|
27
27
|
"operatingSystem": "Cross-platform, Node.js >=18.18.0",
|
|
28
|
-
"softwareVersion": "1.
|
|
28
|
+
"softwareVersion": "1.16.9",
|
|
29
29
|
"url": "https://thumbgate-production.up.railway.app/numbers",
|
|
30
|
-
"dateModified": "2026-
|
|
30
|
+
"dateModified": "2026-05-03",
|
|
31
31
|
"creator": {
|
|
32
32
|
"@type": "Person",
|
|
33
33
|
"name": "Igor Ganapolsky",
|
|
@@ -57,10 +57,10 @@
|
|
|
57
57
|
"https://www.linkedin.com/in/igorganapolsky"
|
|
58
58
|
]
|
|
59
59
|
},
|
|
60
|
-
"dateModified": "2026-
|
|
61
|
-
"datePublished": "2026-
|
|
60
|
+
"dateModified": "2026-05-03",
|
|
61
|
+
"datePublished": "2026-05-03",
|
|
62
62
|
"keywords": [
|
|
63
|
-
"AI agent
|
|
63
|
+
"AI agent gates",
|
|
64
64
|
"LLM token savings",
|
|
65
65
|
"prevention rules",
|
|
66
66
|
"Bayes error rate",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
{
|
|
71
71
|
"@type": "PropertyValue",
|
|
72
72
|
"name": "active_gates",
|
|
73
|
-
"value":
|
|
73
|
+
"value": 37
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
76
|
"@type": "PropertyValue",
|
|
@@ -80,12 +80,12 @@
|
|
|
80
80
|
{
|
|
81
81
|
"@type": "PropertyValue",
|
|
82
82
|
"name": "actions_warned",
|
|
83
|
-
"value":
|
|
83
|
+
"value": 0
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
"@type": "PropertyValue",
|
|
87
87
|
"name": "estimated_hours_saved",
|
|
88
|
-
"value": "
|
|
88
|
+
"value": "0.0"
|
|
89
89
|
},
|
|
90
90
|
{
|
|
91
91
|
"@type": "PropertyValue",
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
{
|
|
102
102
|
"@type": "PropertyValue",
|
|
103
103
|
"name": "bayes_error_rate",
|
|
104
|
-
"value": 0
|
|
104
|
+
"value": 0
|
|
105
105
|
}
|
|
106
106
|
]
|
|
107
107
|
}
|
|
@@ -189,34 +189,34 @@
|
|
|
189
189
|
|
|
190
190
|
<main class="container">
|
|
191
191
|
<h1>The Numbers</h1>
|
|
192
|
-
<p class="subtitle">
|
|
193
|
-
<div class="freshness">Updated: 2026-
|
|
192
|
+
<p class="subtitle">Generated first-party operational data from the ThumbGate runtime. No surveys or projections — this page is a release-time snapshot produced by the same local scripts that power the CLI and dashboard.</p>
|
|
193
|
+
<div class="freshness">Updated: 2026-05-03 · Version 1.16.9</div>
|
|
194
194
|
|
|
195
|
-
<h2>
|
|
195
|
+
<h2>Gate enforcement</h2>
|
|
196
196
|
<div class="stats-grid">
|
|
197
197
|
<div class="stat-card">
|
|
198
|
-
<div class="stat-label">Active
|
|
199
|
-
<div class="stat-value">
|
|
200
|
-
<div class="stat-sub">
|
|
201
|
-
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/
|
|
198
|
+
<div class="stat-label">Active gates</div>
|
|
199
|
+
<div class="stat-value">37</div>
|
|
200
|
+
<div class="stat-sub">36 manual · 1 auto-promoted</div>
|
|
201
|
+
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/gate-stats.js">source: gate-stats.js</a>
|
|
202
202
|
</div>
|
|
203
203
|
<div class="stat-card">
|
|
204
204
|
<div class="stat-label">Actions blocked</div>
|
|
205
205
|
<div class="stat-value">0</div>
|
|
206
|
-
<div class="stat-sub">repeat AI mistakes prevented at the
|
|
207
|
-
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/
|
|
206
|
+
<div class="stat-sub">repeat AI mistakes prevented at the gate</div>
|
|
207
|
+
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/gate-stats.js">source: gate-stats.js</a>
|
|
208
208
|
</div>
|
|
209
209
|
<div class="stat-card">
|
|
210
210
|
<div class="stat-label">Actions warned</div>
|
|
211
|
-
<div class="stat-value">
|
|
211
|
+
<div class="stat-value">0</div>
|
|
212
212
|
<div class="stat-sub">soft interventions; not blocks</div>
|
|
213
|
-
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/
|
|
213
|
+
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/gate-stats.js">source: gate-stats.js</a>
|
|
214
214
|
</div>
|
|
215
215
|
<div class="stat-card">
|
|
216
|
-
<div class="stat-label">Top blocked
|
|
216
|
+
<div class="stat-label">Top blocked gate</div>
|
|
217
217
|
<div class="stat-value" style="font-size:1.1rem;">local-only-git-writes (0 blocks)</div>
|
|
218
218
|
<div class="stat-sub">highest-occurrence prevention rule</div>
|
|
219
|
-
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/
|
|
219
|
+
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/gate-stats.js">source: gate-stats.js</a>
|
|
220
220
|
</div>
|
|
221
221
|
</div>
|
|
222
222
|
|
|
@@ -224,9 +224,9 @@
|
|
|
224
224
|
<div class="stats-grid">
|
|
225
225
|
<div class="stat-card">
|
|
226
226
|
<div class="stat-label">Estimated hours saved</div>
|
|
227
|
-
<div class="stat-value">
|
|
227
|
+
<div class="stat-value">0.0</div>
|
|
228
228
|
<div class="stat-sub">~15 min per blocked mistake × blocks+warns</div>
|
|
229
|
-
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/
|
|
229
|
+
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/gate-stats.js">source: gate-stats.js</a>
|
|
230
230
|
</div>
|
|
231
231
|
<div class="stat-card">
|
|
232
232
|
<div class="stat-label">Estimated LLM dollars saved</div>
|
|
@@ -242,9 +242,9 @@
|
|
|
242
242
|
</div>
|
|
243
243
|
<div class="stat-card">
|
|
244
244
|
<div class="stat-label">Scorer Bayes error</div>
|
|
245
|
-
<div class="stat-value">
|
|
245
|
+
<div class="stat-value">0.0%</div>
|
|
246
246
|
<div class="stat-sub">irreducible error given current feature set</div>
|
|
247
|
-
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/bayes-optimal-
|
|
247
|
+
<a class="stat-source" href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/scripts/bayes-optimal-gate.js">source: bayes-optimal-gate.js</a>
|
|
248
248
|
</div>
|
|
249
249
|
</div>
|
|
250
250
|
|
|
@@ -253,18 +253,18 @@
|
|
|
253
253
|
<p><strong>Where the numbers come from.</strong> This page is regenerated from local scripts — no survey data, no hand-edited figures, no third-party attribution. Every number on this page is produced by code in the public <a href="https://github.com/IgorGanapolsky/ThumbGate">ThumbGate repo</a>.</p>
|
|
254
254
|
<ul>
|
|
255
255
|
<li><strong>Active checks</strong> — union of shipped default rules and the auto-promotion ledger (auto).</li>
|
|
256
|
-
<li><strong>Actions blocked/warned</strong> — sum of <code>occurrences</code> across
|
|
256
|
+
<li><strong>Actions blocked/warned</strong> — sum of <code>occurrences</code> across gates with the corresponding action.</li>
|
|
257
257
|
<li><strong>Hours saved</strong> — conservative 15-minute/incident estimate for debugging a repeated AI mistake × (blocks + warns).</li>
|
|
258
258
|
<li><strong>Dollars saved</strong> — blended per-call token estimate (2k input + 600 output) × blocks × 2026-04-15 Anthropic + OpenAI list prices. See <code>scripts/token-savings.js</code> for the full price snapshot.</li>
|
|
259
259
|
<li><strong>Bayes error rate</strong> — irreducible classifier error of the current risk scorer given its feature set. High values mean "add features, don't tune thresholds."</li>
|
|
260
260
|
</ul>
|
|
261
|
-
<p style="margin-top:12px;">Last auto-promotion:
|
|
261
|
+
<p style="margin-top:12px;">Last auto-promotion: none. Regenerated on every release via <code>npm run numbers:generate</code> and on a weekly cadence.</p>
|
|
262
262
|
</div>
|
|
263
263
|
|
|
264
264
|
<div class="cta">
|
|
265
265
|
<a href="https://www.npmjs.com/package/thumbgate">Install ThumbGate — npx thumbgate init</a>
|
|
266
|
-
<div class="footer-note">Prefer the raw feed? See <a href="https://github.com/IgorGanapolsky/ThumbGate">GitHub</a> or run <code>npm run
|
|
267
|
-
<div class="footer-note">Generated at 2026-
|
|
266
|
+
<div class="footer-note">Prefer the raw feed? See <a href="https://github.com/IgorGanapolsky/ThumbGate">GitHub</a> or run <code>npm run gate:stats</code> locally.</div>
|
|
267
|
+
<div class="footer-note">Generated at 2026-05-03T13:08:12.498Z UTC.</div>
|
|
268
268
|
</div>
|
|
269
269
|
</main>
|
|
270
270
|
</body>
|