thumbgate 1.16.2 โ†’ 1.16.4

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate-marketplace",
3
- "version": "1.16.2",
3
+ "version": "1.16.4",
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.2",
16
+ "version": "1.16.4",
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.2",
4
+ "version": "1.16.4",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.16.2",
3
+ "version": "1.16.4",
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",
@@ -2,13 +2,13 @@
2
2
  "mcpServers": {
3
3
  "thumbgate": {
4
4
  "command": "npx",
5
- "args": ["--yes", "--package", "thumbgate@1.16.2", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.16.4", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.16.2", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.16.4", "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.2' };
204
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.16.4' };
205
205
  const COMMERCE_CATEGORIES = [
206
206
  'product_recommendation',
207
207
  'brand_compliance',
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.16.2",
10
+ "thumbgate@1.16.4",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
@@ -2,8 +2,8 @@
2
2
  "repo": "IgorGanapolsky/ThumbGate",
3
3
  "repositoryUrl": "https://github.com/IgorGanapolsky/ThumbGate",
4
4
  "homepageUrl": "https://thumbgate-production.up.railway.app",
5
- "githubDescription": "Self-improving agent governance: ๐Ÿ‘/๐Ÿ‘Ž โ†’ Pre-Action Checks that block repeat AI mistakes. Stop paying for the same mistake twice.",
6
- "metaDescription": "Stop paying for the same AI mistake twice. ThumbGate is the enforcement layer for AI agent orchestration: ๐Ÿ‘ thumbs up and ๐Ÿ‘Ž thumbs down become history-aware lessons, shared lessons and org visibility, plus Pre-Action Checks that block repeat mistakes before the next tool call across Claude Code, Cursor, Codex, Gemini, Amp, Cline, and OpenCode.",
5
+ "githubDescription": "Agent governance for ThumbGate: ๐Ÿ‘/๐Ÿ‘Ž become Pre-Action Checks that block repeat mistakes before code, money, or customer systems change.",
6
+ "metaDescription": "Stop paying for the same AI mistake twice. ThumbGate is machine-speed pre-action defense for AI coding agents: ๐Ÿ‘ thumbs up and ๐Ÿ‘Ž thumbs down become history-aware lessons, shared lessons and org visibility, actionable remediations, agent surface inventory, and Pre-Action Checks that block repeat mistakes before the next tool call across Claude Code, Cursor, Codex, Gemini, Amp, Cline, and OpenCode.",
7
7
  "topics": [
8
8
  "thumbgate",
9
9
  "pre-action-checks",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.16.2",
3
+ "version": "1.16.4",
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": {
@@ -59,6 +59,7 @@
59
59
  "scripts/audit-trail.js",
60
60
  "scripts/auto-promote-gates.js",
61
61
  "scripts/auto-wire-hooks.js",
62
+ "scripts/background-agent-governance.js",
62
63
  "scripts/bayes-optimal-gate.js",
63
64
  "scripts/belief-update.js",
64
65
  "scripts/billing.js",
@@ -344,7 +345,7 @@
344
345
  "test:training-export": "node --test tests/training-export.test.js tests/databricks-export.test.js",
345
346
  "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",
346
347
  "test:operational-integrity": "node --test tests/operational-integrity.test.js tests/sync-branch-protection.test.js",
347
- "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/sales-pipeline.test.js tests/enterprise-story.test.js tests/ralph-loop.test.js tests/ralph-mode-ci.test.js",
348
+ "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/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",
348
349
  "test:sales-pipeline": "node --test tests/sales-pipeline.test.js",
349
350
  "test:billing": "node --test tests/billing.test.js tests/stripe-sync-product-images.test.js",
350
351
  "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",
@@ -3,8 +3,8 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>ThumbGate Dashboard โ€” Gate Stats, Approval Rate, Prevention Impact</title>
7
- <meta name="description" content="Live dashboard showing gate enforcement stats, approval rate trends, prevention impact, and system health for ThumbGate pre-action checks.">
6
+ <title>ThumbGate Dashboard โ€” Gate Stats, Agent Inventory, Remediations</title>
7
+ <meta name="description" content="Live ThumbGate dashboard showing gate enforcement stats, agent surface inventory, actionable remediations, prevention impact, and system health for pre-action checks.">
8
8
  <link rel="canonical" href="https://thumbgate-production.up.railway.app/dashboard">
9
9
  <link rel="icon" type="image/png" href="/thumbgate-icon.png">
10
10
  <link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
@@ -123,6 +123,16 @@
123
123
  .team-note { font-size: 13px; color: var(--text-muted); margin-top: 6px; }
124
124
  .team-columns { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
125
125
  .risk-row, .blocked-row, .template-meta { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; }
126
+ .inventory-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; margin-top: 16px; }
127
+ .inventory-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: 12px; padding: 18px; }
128
+ .inventory-value { font-size: 22px; font-weight: 700; color: var(--cyan); letter-spacing: -0.03em; }
129
+ .inventory-note { font-size: 12px; color: var(--text-muted); margin-top: 6px; line-height: 1.5; }
130
+ .inventory-tools, .inventory-sources, .remediation-list { display: flex; flex-direction: column; gap: 10px; }
131
+ .inventory-row, .remediation-row { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; padding: 10px 0; border-bottom: 1px solid var(--border); }
132
+ .inventory-row:last-child, .remediation-row:last-child { border-bottom: none; }
133
+ .inventory-name, .remediation-name { font-size: 14px; font-weight: 600; }
134
+ .inventory-subtitle, .remediation-subtitle { font-size: 12px; color: var(--text-muted); line-height: 1.55; margin-top: 4px; }
135
+ .remediation-action { display: inline-flex; align-items: center; gap: 4px; font-size: 11px; border-radius: 999px; padding: 4px 10px; background: var(--bg-raised); color: var(--text-muted); border: 1px solid var(--border); white-space: nowrap; }
126
136
  .risk-row, .blocked-row { padding: 10px 0; border-bottom: 1px solid var(--border); }
127
137
  .risk-row:last-child, .blocked-row:last-child { border-bottom: none; }
128
138
  .risk-name, .blocked-name { font-size: 14px; font-weight: 600; }
@@ -183,7 +193,7 @@
183
193
  @media (max-width: 700px) {
184
194
  .stats-grid { grid-template-columns: repeat(2, 1fr); }
185
195
  .search-filters { flex-wrap: wrap; }
186
- .team-grid, .template-grid, .team-columns, .settings-grid, .generated-grid { grid-template-columns: 1fr; }
196
+ .team-grid, .template-grid, .team-columns, .settings-grid, .generated-grid, .inventory-grid { grid-template-columns: 1fr; }
187
197
  }
188
198
  </style>
189
199
  </head>
@@ -329,6 +339,51 @@
329
339
  <h3>Predictive Watchlist</h3>
330
340
  <div id="predictiveAnomalies"><div class="loading">Loading predictive watchlist...</div></div>
331
341
  </div>
342
+ <div class="panel" style="margin-top:16px;">
343
+ <h3>Agent Surface Inventory</h3>
344
+ <p class="template-summary">See which tools, policy sources, and MCP surfaces are actually active before you widen rollout.</p>
345
+ <div class="inventory-grid" id="inventorySummaryCards"><div class="loading">Loading inventory...</div></div>
346
+ <div class="team-columns" style="margin-top:16px;">
347
+ <div class="panel">
348
+ <h3>Observed Tools</h3>
349
+ <div class="inventory-tools" id="inventoryObservedTools"><div class="loading">Loading observed tools...</div></div>
350
+ </div>
351
+ <div class="panel">
352
+ <h3>Policy Sources</h3>
353
+ <div class="inventory-sources" id="inventoryPolicySources"><div class="loading">Loading policy sources...</div></div>
354
+ </div>
355
+ </div>
356
+ </div>
357
+ <div class="panel" style="margin-top:16px;">
358
+ <h3>Background Agent Mode</h3>
359
+ <p class="template-summary">Queued and scheduled agents need explicit checkpoints before they touch code, money, or customer systems.</p>
360
+ <div class="inventory-grid" id="backgroundAgentSummaryCards"><div class="loading">Loading background-agent mode...</div></div>
361
+ <div class="team-columns" style="margin-top:16px;">
362
+ <div class="panel">
363
+ <h3>Governance Pressure</h3>
364
+ <div class="inventory-tools" id="backgroundAgentHighlights"><div class="loading">Loading background-agent governance...</div></div>
365
+ </div>
366
+ <div class="panel">
367
+ <h3>Run Types</h3>
368
+ <div class="inventory-sources" id="backgroundAgentRunTypes"><div class="loading">Loading background-agent run types...</div></div>
369
+ </div>
370
+ </div>
371
+ </div>
372
+ <div class="panel" style="margin-top:16px;">
373
+ <h3>Regulated Buyer Proof</h3>
374
+ <p class="template-summary">Show where policy came from, how many runs were reviewed, and which proof artifacts are ready when buyers ask for auditability.</p>
375
+ <div class="inventory-grid" id="regulatedProofSummaryCards"><div class="loading">Loading proof posture...</div></div>
376
+ <div class="team-columns" style="margin-top:16px;">
377
+ <div class="panel">
378
+ <h3>Policy Origin Proof</h3>
379
+ <div class="inventory-tools" id="regulatedProofDetails"><div class="loading">Loading policy origin proof...</div></div>
380
+ </div>
381
+ <div class="panel">
382
+ <h3>Latest Replay Artifacts</h3>
383
+ <div class="inventory-sources" id="regulatedProofArtifacts"><div class="loading">Loading replay artifacts...</div></div>
384
+ </div>
385
+ </div>
386
+ </div>
332
387
  </div>
333
388
  </div>
334
389
 
@@ -428,6 +483,12 @@
428
483
  </div>
429
484
  </div>
430
485
 
486
+ <div class="panel" style="margin-bottom:24px;">
487
+ <h3>Highest-ROI Next Actions</h3>
488
+ <p class="template-summary">These recommendations come from real feedback, risk patterns, and delegation pressure in your current runtime.</p>
489
+ <div class="remediation-list" id="actionableRemediations"><div class="loading">Loading next actions...</div></div>
490
+ </div>
491
+
431
492
  <!-- How It Works -->
432
493
  <div class="panel">
433
494
  <h3 style="margin-bottom:12px;">How ThumbGate Learns</h3>
@@ -907,9 +968,12 @@ function renderDashboardData(data) {
907
968
  }
908
969
 
909
970
  renderTeam(data.team || {}, data.analytics || {});
971
+ renderAgentInventory(data.agentSurfaceInventory || {});
972
+ renderBackgroundAgents(data.backgroundAgents || {});
910
973
  renderReviewDelta(data.reviewDelta || {});
911
974
  renderPredictive(data.predictive || {});
912
975
  renderSettingsStatus(data.settingsStatus || {});
976
+ renderRegulatedProof(data.regulatedProof || {});
913
977
  renderTemplates(data.templateLibrary || {});
914
978
  renderInsights(data);
915
979
  }
@@ -1202,6 +1266,135 @@ function renderPredictive(predictive) {
1202
1266
  : '<div class="empty" style="padding:20px 0;">No predictive anomalies right now.</div>';
1203
1267
  }
1204
1268
 
1269
+ function renderAgentInventory(inventory) {
1270
+ var cards = [
1271
+ {
1272
+ label: 'MCP profile',
1273
+ value: inventory.profile || 'unknown',
1274
+ note: (inventory.tier || 'custom') + ' tier',
1275
+ },
1276
+ {
1277
+ label: 'Observed tools',
1278
+ value: String(inventory.observedToolCount || 0),
1279
+ note: 'from decision + audit logs',
1280
+ },
1281
+ {
1282
+ label: 'Policy sources',
1283
+ value: String((inventory.policySources || []).length),
1284
+ note: 'gates, scanners, or routers firing now',
1285
+ },
1286
+ {
1287
+ label: 'Configured MCP servers',
1288
+ value: String(inventory.configuredServerCount || 0),
1289
+ note: 'from local .mcp.json',
1290
+ }
1291
+ ];
1292
+
1293
+ document.getElementById('inventorySummaryCards').innerHTML = cards.map(function(card) {
1294
+ return '<div class="inventory-card"><div class="team-kicker">' + escHtml(card.label) + '</div><div class="inventory-value">' + escHtml(card.value) + '</div><div class="inventory-note">' + escHtml(card.note) + '</div></div>';
1295
+ }).join('');
1296
+
1297
+ var tools = Array.isArray(inventory.observedTools) ? inventory.observedTools : [];
1298
+ document.getElementById('inventoryObservedTools').innerHTML = tools.length
1299
+ ? tools.map(function(tool) {
1300
+ return '<div class="inventory-row"><div><div class="inventory-name">' + escHtml(tool.toolName || 'unknown') + '</div><div class="inventory-subtitle">' + escHtml((tool.evaluations || 0) + ' evals ยท ' + (tool.intercepted || 0) + ' intercepted ยท ' + (tool.allow || 0) + ' allowed') + '</div></div><span class="generated-badge">' + escHtml(String((tool.deny || 0) + ' deny / ' + (tool.warn || 0) + ' warn')) + '</span></div>';
1301
+ }).join('')
1302
+ : '<div class="empty" style="padding:20px 0;">No observed tools yet.</div>';
1303
+
1304
+ var sources = Array.isArray(inventory.policySources) ? inventory.policySources : [];
1305
+ document.getElementById('inventoryPolicySources').innerHTML = sources.length
1306
+ ? sources.map(function(source) {
1307
+ return '<div class="inventory-row"><div><div class="inventory-name">' + escHtml(source.source || 'unknown') + '</div><div class="inventory-subtitle">Runtime policy source</div></div><span class="generated-badge">' + escHtml(String(source.count || 0) + ' events') + '</span></div>';
1308
+ }).join('')
1309
+ : '<div class="empty" style="padding:20px 0;">No policy sources recorded yet.</div>';
1310
+ }
1311
+
1312
+ function renderBackgroundAgents(backgroundAgents) {
1313
+ var cards = [
1314
+ {
1315
+ label: 'Background runs',
1316
+ value: String(backgroundAgents.total || 0),
1317
+ note: 'last ' + String(backgroundAgents.periodHours || 24) + ' hours',
1318
+ },
1319
+ {
1320
+ label: 'Pass rate',
1321
+ value: String(backgroundAgents.passRate || 0) + '%',
1322
+ note: String(backgroundAgents.completed || 0) + ' completed / ' + String(backgroundAgents.failed || 0) + ' failed',
1323
+ },
1324
+ {
1325
+ label: 'Gate pressure',
1326
+ value: String(backgroundAgents.gatesBlocked || 0),
1327
+ note: String(backgroundAgents.gatesChecked || 0) + ' checkpoints evaluated',
1328
+ },
1329
+ {
1330
+ label: 'Checkpoint coverage',
1331
+ value: String(Math.round((backgroundAgents.checkpointCoverage || 0) * 100)) + '%',
1332
+ note: String(backgroundAgents.reviewedRuns || 0) + ' reviewed proof-backed runs',
1333
+ }
1334
+ ];
1335
+
1336
+ document.getElementById('backgroundAgentSummaryCards').innerHTML = cards.map(function(card) {
1337
+ return '<div class="inventory-card"><div class="team-kicker">' + escHtml(card.label) + '</div><div class="inventory-value">' + escHtml(card.value) + '</div><div class="inventory-note">' + escHtml(card.note) + '</div></div>';
1338
+ }).join('');
1339
+
1340
+ var highlights = [];
1341
+ if (backgroundAgents.topFailingAgent) {
1342
+ highlights.push('<div class="inventory-row"><div><div class="inventory-name">Top failing agent</div><div class="inventory-subtitle">' + escHtml(backgroundAgents.topFailingAgent.agentId || 'unknown') + '</div></div><span class="generated-badge">' + escHtml(String(backgroundAgents.topFailingAgent.passRate || 0) + '% pass') + '</span></div>');
1343
+ }
1344
+ highlights.push('<div class="inventory-row"><div><div class="inventory-name">Recommended operating mode</div><div class="inventory-subtitle">Use ' + escHtml(backgroundAgents.recommendedMode || 'bootstrapping') + ' when background agents queue code, money, or customer actions.</div></div><span class="generated-badge">' + escHtml(String(backgroundAgents.blocked || 0) + ' blocked') + '</span></div>');
1345
+ document.getElementById('backgroundAgentHighlights').innerHTML = highlights.join('');
1346
+
1347
+ var runTypes = Object.keys(backgroundAgents.byType || {});
1348
+ document.getElementById('backgroundAgentRunTypes').innerHTML = runTypes.length
1349
+ ? runTypes.map(function(runType) {
1350
+ return '<div class="inventory-row"><div><div class="inventory-name">' + escHtml(runType) + '</div><div class="inventory-subtitle">Observed background workflow type</div></div><span class="generated-badge">' + escHtml(String(backgroundAgents.byType[runType] || 0) + ' runs') + '</span></div>';
1351
+ }).join('')
1352
+ : '<div class="empty" style="padding:20px 0;">No background-agent runs recorded yet.</div>';
1353
+ }
1354
+
1355
+ function renderRegulatedProof(regulatedProof) {
1356
+ var cards = [
1357
+ {
1358
+ label: 'Policy origins',
1359
+ value: String(regulatedProof.policyOriginCount || 0),
1360
+ note: String(regulatedProof.activeLayerCount || 0) + ' active settings layers',
1361
+ },
1362
+ {
1363
+ label: 'Reviewed runs',
1364
+ value: String(regulatedProof.reviewedRuns || 0),
1365
+ note: String(regulatedProof.proofBackedRuns || 0) + ' proof-backed runs tracked',
1366
+ },
1367
+ {
1368
+ label: 'Decision records',
1369
+ value: String(regulatedProof.decisionEvaluations || 0),
1370
+ note: regulatedProof.appendOnlyAuditReady ? 'append-only audit trail live' : 'no decision audit yet',
1371
+ },
1372
+ {
1373
+ label: 'Runtime isolation',
1374
+ value: regulatedProof.runtimeIsolation ? 'on' : 'off',
1375
+ note: 'containerized execution posture',
1376
+ }
1377
+ ];
1378
+
1379
+ document.getElementById('regulatedProofSummaryCards').innerHTML = cards.map(function(card) {
1380
+ return '<div class="inventory-card"><div class="team-kicker">' + escHtml(card.label) + '</div><div class="inventory-value">' + escHtml(card.value) + '</div><div class="inventory-note">' + escHtml(card.note) + '</div></div>';
1381
+ }).join('');
1382
+
1383
+ var details = [];
1384
+ if (regulatedProof.latestPolicyOrigin) {
1385
+ details.push('<div class="inventory-row"><div><div class="inventory-name">' + escHtml(regulatedProof.latestPolicyOrigin.path || 'latest setting') + '</div><div class="inventory-subtitle">' + escHtml(regulatedProof.latestPolicyOrigin.sourcePath || 'built-in defaults') + '</div></div><span class="generated-badge">' + escHtml(String(regulatedProof.latestPolicyOrigin.scope || 'default')) + '</span></div>');
1386
+ }
1387
+ details.push('<div class="inventory-row"><div><div class="inventory-name">Checkpoint coverage</div><div class="inventory-subtitle">Reviewed proof-backed runs divided by total proof-backed workflow runs.</div></div><span class="generated-badge">' + escHtml(String(Math.round((regulatedProof.checkpointCoverage || 0) * 100)) + '%') + '</span></div>');
1388
+ document.getElementById('regulatedProofDetails').innerHTML = details.join('');
1389
+
1390
+ var artifacts = Array.isArray(regulatedProof.latestProofArtifacts) ? regulatedProof.latestProofArtifacts : [];
1391
+ document.getElementById('regulatedProofArtifacts').innerHTML = artifacts.length
1392
+ ? artifacts.map(function(artifact) {
1393
+ return '<div class="inventory-row"><div><div class="inventory-name">' + escHtml(artifact) + '</div><div class="inventory-subtitle">Proof artifact from ' + escHtml(regulatedProof.latestWorkflowName || 'latest workflow run') + '</div></div><span class="generated-badge">replay-ready</span></div>';
1394
+ }).join('')
1395
+ : '<div class="empty" style="padding:20px 0;">No workflow replay artifacts recorded yet.</div>';
1396
+ }
1397
+
1205
1398
  function renderTemplates(templateLibrary) {
1206
1399
  const templates = Array.isArray(templateLibrary.templates) ? templateLibrary.templates : [];
1207
1400
  const categories = templateLibrary.categories || {};
@@ -1370,6 +1563,39 @@ function loadDemo() {
1370
1563
  { type: 'creator_underperformance', message: 'Creator reach_vb is generating intent without revenue conversion.', severity: 'warning' }
1371
1564
  ]
1372
1565
  });
1566
+ renderAgentInventory({
1567
+ profile: 'default',
1568
+ tier: 'builder',
1569
+ configuredServerCount: 3,
1570
+ observedToolCount: 4,
1571
+ observedTools: [
1572
+ { toolName: 'Bash', evaluations: 120, intercepted: 19, allow: 101, deny: 12, warn: 7 },
1573
+ { toolName: 'Edit', evaluations: 64, intercepted: 6, allow: 58, deny: 2, warn: 4 },
1574
+ { toolName: 'Read', evaluations: 42, intercepted: 0, allow: 42, deny: 0, warn: 0 }
1575
+ ],
1576
+ policySources: [
1577
+ { source: 'gates-engine', count: 23 },
1578
+ { source: 'secret-guard', count: 6 },
1579
+ { source: 'workflow-sentinel', count: 4 }
1580
+ ]
1581
+ });
1582
+ renderActionableRemediations([
1583
+ {
1584
+ title: 'tighten verification before response ยท recent-signals',
1585
+ rationale: 'Recent approval rate has dropped below the lifetime baseline, so fast completion claims need tighter proof.',
1586
+ action: 'tighten-verification-before-response',
1587
+ },
1588
+ {
1589
+ title: 'audit domain failures ยท git-workflow',
1590
+ rationale: 'Git workflow events are overrepresented in high-risk outcomes and deserve a stronger pre-action gate.',
1591
+ action: 'audit-domain-failures',
1592
+ },
1593
+ {
1594
+ title: 'review and update skill ยท github',
1595
+ rationale: 'GitHub-related failures have crossed the negative-rate threshold, so the skill needs a correction pass.',
1596
+ action: 'review-and-update-skill',
1597
+ }
1598
+ ]);
1373
1599
  renderSettingsStatus({
1374
1600
  activeLayers: [
1375
1601
  { scope: 'defaults', exists: true, leafCount: 7, sourcePath: null },
@@ -1412,6 +1638,58 @@ function loadDemo() {
1412
1638
  ]
1413
1639
  });
1414
1640
  renderGeneratedView(buildDemoGeneratedViewSpec(currentGeneratedView));
1641
+ renderInsights({
1642
+ gateStats: { blocked: 180 },
1643
+ tokenSavings: {
1644
+ dollarsSaved: 0,
1645
+ dollarsSavedDisplay: '$0.00',
1646
+ tokensSavedDisplay: '0',
1647
+ blockedCalls: 0,
1648
+ modelMix: { 'sonnet-4.5': 0.8, 'opus-4.6': 0.15, 'haiku-4.5': 0.05 },
1649
+ blendedPricePer1M: { input: 6.2, output: 24.1 }
1650
+ },
1651
+ lessonPipeline: {
1652
+ stages: [
1653
+ { id: 'feedback', label: 'Feedback Signals', count: 297, detail: '37 up / 260 down' },
1654
+ { id: 'lessons', label: 'Lessons Distilled', count: 94, detail: '72 mistakes / 22 good patterns' },
1655
+ { id: 'gates', label: 'Gates Promoted', count: 21, detail: '22% of lessons become gates' },
1656
+ { id: 'blocked', label: 'Actions Blocked', count: 180, detail: 'Repeat mistakes prevented' }
1657
+ ],
1658
+ rates: { feedbackToLesson: 32, lessonToGate: 22 }
1659
+ },
1660
+ feedbackTimeSeries: {
1661
+ days: Array.from({ length: 30 }, function(_, index) {
1662
+ return {
1663
+ dayKey: '2026-04-' + String(index + 1).padStart(2, '0'),
1664
+ up: index % 6 === 0 ? 2 : (index % 4 === 0 ? 1 : 0),
1665
+ down: 3 + (index % 5),
1666
+ lessons: index % 3 === 0 ? 2 : 1
1667
+ };
1668
+ })
1669
+ },
1670
+ gateAudit: {
1671
+ days: Array.from({ length: 14 }, function(_, index) {
1672
+ return {
1673
+ dayKey: '2026-04-' + String(index + 10).padStart(2, '0'),
1674
+ allow: 8 + (index % 3),
1675
+ deny: 2 + (index % 2),
1676
+ warn: index % 3
1677
+ };
1678
+ })
1679
+ },
1680
+ actionableRemediations: [
1681
+ {
1682
+ title: 'tighten verification before response ยท recent-signals',
1683
+ rationale: 'Recent approval rate has dropped below the lifetime baseline, so fast completion claims need tighter proof.',
1684
+ action: 'tighten-verification-before-response'
1685
+ },
1686
+ {
1687
+ title: 'audit domain failures ยท git-workflow',
1688
+ rationale: 'Git workflow events are overrepresented in high-risk outcomes and deserve a stronger pre-action gate.',
1689
+ action: 'audit-domain-failures'
1690
+ }
1691
+ ]
1692
+ });
1415
1693
  }
1416
1694
 
1417
1695
  // Auto-load demo on first visit so visitors see the product immediately
@@ -1461,6 +1739,23 @@ function renderInsights(data) {
1461
1739
  renderFeedbackTrendChart(data.feedbackTimeSeries || {});
1462
1740
  renderLessonTrendChart(data.feedbackTimeSeries || {});
1463
1741
  renderGateAuditChartFromData(data.gateAudit || {});
1742
+ renderActionableRemediations(data.actionableRemediations || []);
1743
+ }
1744
+
1745
+ function renderActionableRemediations(remediations) {
1746
+ var list = document.getElementById('actionableRemediations');
1747
+ if (!list) return;
1748
+ if (!Array.isArray(remediations) || !remediations.length) {
1749
+ list.innerHTML = '<div class="empty" style="padding:20px 0;">No remediation pressure yet. As feedback accumulates, ThumbGate will rank the next highest-ROI fixes here.</div>';
1750
+ return;
1751
+ }
1752
+
1753
+ list.innerHTML = remediations.map(function(item) {
1754
+ var title = item.title || ((item.action || 'review') + ' ยท ' + (item.target || 'system'));
1755
+ var subtitle = item.rationale || '';
1756
+ var action = item.action || 'review';
1757
+ return '<div class="remediation-row"><div><div class="remediation-name">' + escHtml(title) + '</div><div class="remediation-subtitle">' + escHtml(subtitle) + '</div></div><span class="remediation-action">' + escHtml(String(action).replace(/-/g, ' ')) + '</span></div>';
1758
+ }).join('');
1464
1759
  }
1465
1760
 
1466
1761
  /**
package/public/index.html CHANGED
@@ -24,7 +24,7 @@ __GOOGLE_SITE_VERIFICATION_META__
24
24
  <link rel="apple-touch-icon" href="/assets/brand/thumbgate-mark.svg">
25
25
  <meta property="og:image" content="/og.png">
26
26
  <title>ThumbGate โ€” Stop paying for the same AI mistake twice</title>
27
- <meta name="description" content="Stop paying for the same AI mistake twice. ThumbGate is the enforcement layer for AI agent orchestration: ๐Ÿ‘ thumbs up and ๐Ÿ‘Ž thumbs down become history-aware lessons, shared lessons and org visibility, plus Pre-Action Checks that block repeat mistakes before the next tool call across Claude Code, Cursor, Codex, Gemini, Amp, Cline, and OpenCode.">
27
+ <meta name="description" content="Stop paying for the same AI mistake twice. ThumbGate is machine-speed pre-action defense for AI coding agents: ๐Ÿ‘ thumbs up and ๐Ÿ‘Ž thumbs down become history-aware lessons, shared lessons and org visibility, actionable remediations, agent surface inventory, and Pre-Action Checks that block repeat mistakes before the next tool call across Claude Code, Cursor, Codex, Gemini, Amp, Cline, and OpenCode.">
28
28
  <meta property="og:title" content="ThumbGate โ€” Stop paying for the same AI mistake twice">
29
29
  <meta property="og:description" content="Frontier LLMs are expensive, opaque, and unreliable in production. ThumbGate gates risky agent actions before they run: workflow shape, inspection evidence, token budget, and repeated-failure memory in one pre-action check.">
30
30
  <meta property="og:type" content="website">
@@ -53,7 +53,7 @@ __GA_BOOTSTRAP__
53
53
  "@type": "SoftwareApplication",
54
54
  "name": "ThumbGate",
55
55
  "alternateName": "thumbgate",
56
- "description": "ThumbGate stops you from paying for the same AI mistake twice. Frontier LLMs are expensive, opaque, and unreliable in production โ€” every repeated hallucination, retry loop, or known-bad tool call burns more tokens. ThumbGate's Pre-Action Checks inspect workflow shape, environment evidence, budget, and repeated-failure memory before the action runs. Works with Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode, and any MCP-compatible agent.",
56
+ "description": "ThumbGate stops you from paying for the same AI mistake twice. It is machine-speed pre-action defense for coding agents: thumbs-up/down feedback becomes history-aware lessons, shared lessons and org visibility, actionable remediations, agent surface inventory, and Pre-Action Checks that inspect workflow shape, environment evidence, budget, and repeated-failure memory before the next tool call across Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode, and any MCP-compatible agent.",
57
57
  "applicationCategory": "DeveloperApplication",
58
58
  "operatingSystem": "Cross-platform, Node.js >=18.18.0",
59
59
  "license": "https://opensource.org/licenses/MIT",
@@ -70,7 +70,9 @@ __GA_BOOTSTRAP__
70
70
  "Prevent expensive AI mistakes โ€” catch bad commands, destructive database actions, unsafe publishes, and risky API calls before execution",
71
71
  "Make AI stop repeating mistakes โ€” thumbs-down feedback becomes history-aware lessons and Pre-Action Checks",
72
72
  "Turn AI into a reliable operator โ€” checkpoint risky actions, enforce safe patterns, and keep proof of what changed",
73
- "ThumbGate GPT for ChatGPT โ€” check proposed agent actions, capture thumbs-up/down lessons, and route users into local enforcement",
73
+ "Agent surface inventory โ€” see which tools, MCP surfaces, and policy sources are actually active before rollout",
74
+ "Actionable remediations โ€” rank the next highest-ROI fixes from real feedback and risk pressure",
75
+ "ThumbGate GPT for ChatGPT โ€” preflight risky commands, refunds, deploys, and PR actions, capture typed thumbs-up/down lessons, and route users into local enforcement",
74
76
  "Workflow Sentinel โ€” score blast radius before PR, merge, release, and publish actions fire",
75
77
  "Workflow architecture checks โ€” distinguish predefined workflows, parallel fan-out, and open-ended agents before execution",
76
78
  "Environment inspection evidence โ€” require read-before-write, screenshots, API response checks, tests, or output validation for open-ended agent loops",
@@ -572,9 +574,9 @@ __GA_BOOTSTRAP__
572
574
  <section class="hero">
573
575
  <div class="container">
574
576
  <div class="hero-thumbs">๐Ÿ‘๐Ÿ‘Ž</div>
575
- <div class="hero-badge">โ— Your AI coding bill has a leak</div>
577
+ <div class="hero-badge">โ— Machine-speed pre-action defense for coding agents</div>
576
578
  <h1>Stop paying $ for the same AI mistake.</h1>
577
- <p style="font-size:18px;color:var(--text-muted);max-width:720px;margin:0 auto 20px;line-height:1.6;">Every retry loop, every hallucinated import, every "let me try a different approach" โ€” those are billable tokens on every LLM vendor's bill. Thumbs-down once; ThumbGate blocks that exact mistake on every future call. Across Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode โ€” any MCP-compatible agent, forever, including fast-moving vibe coding workflows.</p>
579
+ <p style="font-size:18px;color:var(--text-muted);max-width:720px;margin:0 auto 20px;line-height:1.6;">Every retry loop, every hallucinated import, every "let me try a different approach" โ€” those are billable tokens on every LLM vendor's bill. ThumbGate is machine-speed pre-action defense: thumbs-down once, block that exact mistake on every future call, surface the next highest-ROI remediation, and show which agent surfaces are actually active before rollout. Across Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode โ€” any MCP-compatible agent, forever, including fast-moving vibe coding workflows.</p>
578
580
  <p style="font-size:15px;color:var(--text-dim);max-width:760px;margin:0 auto 24px;line-height:1.6;">As desktop agents move into parallel sessions, terminals, and production workflows, ThumbGate checks the thing benchmarks miss: is this next action a known workflow, an open-ended agent, a costly fan-out, or a blind tool call with no way to verify it worked?</p>
579
581
 
580
582
  <!-- HERO PRICING CARD โ€” visible in first viewport so $19/mo and $149/yr never get buried -->
@@ -611,12 +613,12 @@ __GA_BOOTSTRAP__
611
613
  <span style="display:inline-flex;align-items:center;gap:6px;color:#4ade80;"><span style="width:6px;height:6px;border-radius:50%;background:#4ade80;box-shadow:0 0 8px #4ade80;animation:pulse 1.6s ease-in-out infinite;"></span>enforcing</span>
612
614
  </div>
613
615
  <div style="font-size:13px;color:var(--text-muted);margin-bottom:4px;">๐Ÿ’ธ Tokens saved โ€” since install (Sonnet-blended, conservative)</div>
614
- <div id="hero-savings-counter" data-target="1247.82" style="font-size:44px;font-weight:700;color:#4ade80;letter-spacing:-0.02em;line-height:1;margin-bottom:18px;">$0.00</div>
616
+ <div id="hero-savings-counter" data-target="0" style="font-size:44px;font-weight:700;color:#4ade80;letter-spacing:-0.02em;line-height:1;margin-bottom:18px;">$0.00</div>
615
617
  <div style="font-size:12px;line-height:1.8;border-top:1px solid rgba(255,255,255,0.06);padding-top:12px;">
616
618
  <div style="color:#4ade80;">โœ… check:no-force-push โ€” blocked 12ร—</div>
617
619
  <div style="color:#4ade80;">โœ… check:no-hallucinated-import โ€” blocked 8ร—</div>
618
620
  <div style="color:#f87171;">โŒ check:no-drop-prod โ€” FIRED ยท saved ~$3.40</div>
619
- <div style="color:var(--text-muted);font-size:11px;margin-top:8px;">Sample shown. Your own dashboard tracks live feedback log + blocked calls from day one. <span style="color:var(--cyan);">Open dashboard โ†’</span></div>
621
+ <div style="color:var(--text-muted);font-size:11px;margin-top:8px;">Sample shown. Your own dashboard tracks live feedback log, actionable remediations, and agent surface inventory from day one. <span style="color:var(--cyan);">Open dashboard โ†’</span></div>
620
622
  </div>
621
623
  </a>
622
624
  <style>@keyframes pulse{0%,100%{opacity:1}50%{opacity:0.4}}</style>
@@ -632,7 +634,8 @@ __GA_BOOTSTRAP__
632
634
  </script>
633
635
  <div class="hero-signals">
634
636
  <a class="signal-pill signal-down" href="#how-it-works" title="See how check interception works">Block repeat hallucinations before the model sees them</a>
635
- <a class="signal-pill signal-up" href="#how-it-works" title="See the one-thumbs-down enforcement loop">Thumbs-down once, blocked forever, across every agent</a>
637
+ <a class="signal-pill signal-up" href="/dashboard" title="See the remediation and inventory dashboard">Thumbs-down once, blocked forever</a>
638
+ <a class="signal-pill" href="/dashboard" title="See the remediation and inventory dashboard">Actionable remediations + agent surface inventory</a>
636
639
  <a class="signal-pill" href="#install" title="Install the CLI">CLI-first workflow governance with a live tokens-saved counter</a>
637
640
  </div>
638
641
  <p class="hero-persona" style="display:none">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>
@@ -784,15 +787,15 @@ __GA_BOOTSTRAP__
784
787
  <div class="container">
785
788
  <div class="gpt-panel">
786
789
  <div class="section-label" style="text-align:left;">ChatGPT Entry Point ยท Live ThumbGate GPT for ChatGPT</div>
787
- <h2>Open the GPT. Give typed thumbs feedback. Turn the lesson into a check.</h2>
788
- <p>ThumbGate should meet users where they already ask AI for help. The live GPT is the lowest-friction way to capture a useful thumbs-up/down lesson, check a risky action, and prove the enforcement loop before installing anything. As ChatGPT ads roll out, this matters more: ChatGPT can stay the discovery and checkpointing layer, while ThumbGate remains the hard execution boundary after <code>npx thumbgate init</code>.</p>
790
+ <h2>Use the GPT as a preflight desk for risky commands, refunds, deploys, and PR actions.</h2>
791
+ <p>ThumbGate should meet users where they already ask AI for help. The live GPT is the fastest way to preflight a risky action, capture a typed thumbs-up/down lesson, and prove the enforcement loop before installing anything. As ChatGPT ads roll out, this matters more: ChatGPT can stay the discovery and checkpointing layer, while ThumbGate remains the hard execution boundary after <code>npx thumbgate init</code>.</p>
789
792
  <div class="gpt-steps">
790
793
  <div class="gpt-step">
791
- <strong>1. Try the live GPT</strong>
792
- <p>Paste a proposed command, file edit, merge, deploy, or API call and ask whether to allow, block, or checkpoint it.</p>
794
+ <strong>1. Open the live GPT</strong>
795
+ <p>Paste a proposed command, file edit, merge, deploy, refund, invoice, or API call and ask whether to allow, block, or checkpoint it.</p>
793
796
  </div>
794
797
  <div class="gpt-step">
795
- <strong>2. Save the signal</strong>
798
+ <strong>2. Save the typed signal</strong>
796
799
  <p>Reply in chat with <code>thumbs up:</code> or <code>thumbs down:</code> plus one concrete sentence. Do not rely on ChatGPT's native rating buttons for ThumbGate memory.</p>
797
800
  </div>
798
801
  <div class="gpt-step">
@@ -805,7 +808,7 @@ __GA_BOOTSTRAP__
805
808
  <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/adapters/chatgpt/INSTALL.md" class="btn-free" target="_blank" rel="noopener" style="display:inline-flex;align-items:center;padding:12px 20px;border-radius:8px;">ChatGPT Actions setup</a>
806
809
  <a href="/guides/chatgpt-ads-trust" class="btn-free" style="display:inline-flex;align-items:center;padding:12px 20px;border-radius:8px;">Why ChatGPT ads need checks</a>
807
810
  </div>
808
- <p class="gpt-note"><strong>Plain English rule:</strong> ChatGPT is the discovery and memory surface for advice, checkpointing, and typed feedback capture. One typed signal becomes one remembered rule. The hard Reliability Gateway still runs in the local agent or CI lane.</p>
811
+ <p class="gpt-note"><strong>Find it fast:</strong> if the direct link does not open, go to <strong>Explore GPTs</strong>, search <code>ThumbGate</code>, and choose the GPT by Igor Ganapolsky in <strong>Programming</strong>. <strong>Plain English rule:</strong> ChatGPT is the discovery and memory surface for advice, checkpointing, and typed feedback capture. One typed signal becomes one remembered rule. The hard Reliability Gateway still runs in the local agent or CI lane.</p>
809
812
  </div>
810
813
  </div>
811
814
  </section>
@@ -857,7 +860,7 @@ __GA_BOOTSTRAP__
857
860
  </a>
858
861
  <a class="compat-card" href="/go/gpt?utm_source=website&utm_medium=compatibility&utm_campaign=chatgpt_gpt&cta_id=compat_open_gpt&cta_placement=compatibility" target="_blank" rel="noopener">
859
862
  <h3>๐Ÿ’ฌ ChatGPT GPT Actions</h3>
860
- <p>Open the ThumbGate GPT to check proposed AI actions, capture thumbs-up/down lessons, and get setup guidance. Real blocking for coding agents still runs locally after <code>npx thumbgate init</code>.</p>
863
+ <p>Open the ThumbGate GPT to preflight risky commands, deploys, refunds, PR actions, and setup steps, capture thumbs-up/down lessons, and save typed signals. Real blocking for coding agents still runs locally after <code>npx thumbgate init</code>.</p>
861
864
  <div class="card-arrow">Open ThumbGate GPT โ†’</div>
862
865
  </a>
863
866
  </div>
@@ -1079,7 +1082,7 @@ __GA_BOOTSTRAP__
1079
1082
  <!-- HOW IT WORKS -->
1080
1083
  <section class="how-it-works" id="how-it-works">
1081
1084
  <div class="container">
1082
- <div class="section-label">New in v1.16.2</div>
1085
+ <div class="section-label">New in v1.16.4</div>
1083
1086
  <h2 class="section-title">Three steps to stop repeated AI failures</h2>
1084
1087
  <div class="steps">
1085
1088
  <div class="step">
@@ -1439,7 +1442,7 @@ __GA_BOOTSTRAP__
1439
1442
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
1440
1443
  <a href="/blog">Blog</a>
1441
1444
  </div>
1442
- <span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.16.2</span>
1445
+ <span class="footer-copy">ยฉ 2026 Max Smith KDP LLC ยท MIT License ยท v1.16.4</span>
1443
1446
  </div>
1444
1447
  </footer>
1445
1448