thumbgate 1.14.1 → 1.15.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 (43) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.well-known/mcp/server-card.json +1 -1
  4. package/README.md +2 -1
  5. package/adapters/claude/.mcp.json +2 -2
  6. package/adapters/mcp/server-stdio.js +8 -1
  7. package/adapters/opencode/opencode.json +1 -1
  8. package/bin/cli.js +54 -0
  9. package/config/enforcement.json +59 -7
  10. package/config/gates/default.json +33 -0
  11. package/config/mcp-allowlists.json +4 -0
  12. package/config/merge-quality-checks.json +2 -1
  13. package/package.json +17 -5
  14. package/public/codex-plugin.html +7 -1
  15. package/public/dashboard.html +23 -2
  16. package/public/index.html +20 -2
  17. package/public/learn.html +39 -0
  18. package/public/lessons.html +25 -1
  19. package/public/numbers.html +271 -0
  20. package/public/pro.html +7 -1
  21. package/scripts/cli-feedback.js +2 -1
  22. package/scripts/cli-schema.js +43 -4
  23. package/scripts/commercial-offer.js +1 -1
  24. package/scripts/contextfs.js +214 -32
  25. package/scripts/feedback-loop.js +49 -5
  26. package/scripts/harness-selector.js +132 -0
  27. package/scripts/lesson-canonical.js +181 -0
  28. package/scripts/lesson-db.js +71 -10
  29. package/scripts/lesson-synthesis.js +23 -2
  30. package/scripts/native-messaging-audit.js +514 -0
  31. package/scripts/pr-manager.js +47 -7
  32. package/scripts/profile-router.js +16 -1
  33. package/scripts/rule-validator.js +285 -0
  34. package/scripts/seo-gsd.js +182 -2
  35. package/scripts/tool-registry.js +12 -0
  36. package/skills/thumbgate/SKILL.md +1 -1
  37. package/src/api/server.js +53 -0
  38. package/.claude-plugin/README.md +0 -170
  39. package/adapters/README.md +0 -12
  40. package/skills/agent-memory/SKILL.md +0 -97
  41. package/skills/solve-architecture-autonomy/SKILL.md +0 -17
  42. package/skills/solve-architecture-autonomy/tool.js +0 -33
  43. package/skills/thumbgate-feedback/SKILL.md +0 -49
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate-marketplace",
3
- "version": "1.14.1",
3
+ "version": "1.15.0",
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.14.1",
16
+ "version": "1.15.0",
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 gates, budget enforcement, self-protection, and NIST/SOC2 compliance tags.",
4
- "version": "1.14.1",
4
+ "version": "1.15.0",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.14.1",
3
+ "version": "1.15.0",
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
@@ -210,6 +210,7 @@ npx thumbgate doctor # health check
210
210
  npx thumbgate capture # create a gate from text
211
211
  npx thumbgate lessons # see what's been learned
212
212
  npx thumbgate explore # terminal explorer for lessons, gates, stats
213
+ npx thumbgate native-messaging-audit # inspect local browser bridges and extension hosts
213
214
  npx thumbgate dashboard # open local dashboard
214
215
  npx thumbgate serve # start MCP server on stdio
215
216
  npx thumbgate bench # run reliability benchmark
@@ -335,7 +336,7 @@ Every Changeset is tied to the exact `main` merge commit and generates Verificat
335
336
 
336
337
  ---
337
338
 
338
- **Popular 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)** · **[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)**
339
+ **Popular 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)**
339
340
 
340
341
  **[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)**
341
342
 
@@ -2,13 +2,13 @@
2
2
  "mcpServers": {
3
3
  "thumbgate": {
4
4
  "command": "npx",
5
- "args": ["--yes", "--package", "thumbgate@1.14.1", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.15.0", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.14.1", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.15.0", "thumbgate", "gate-check"]
12
12
  }
13
13
  }
14
14
  }
@@ -93,6 +93,7 @@ const { exportDatabricksBundle } = require('../../scripts/export-databricks-bund
93
93
  const { generateDashboard } = require('../../scripts/dashboard');
94
94
  const { getSettingsStatus } = require('../../scripts/settings-hierarchy');
95
95
  const { generateSkills } = require('../../scripts/skill-generator');
96
+ const { buildNativeMessagingAudit } = require('../../scripts/native-messaging-audit');
96
97
  const {
97
98
  loadModel,
98
99
  getReliability,
@@ -157,7 +158,7 @@ const {
157
158
  finalizeSession: finalizeFeedbackSession,
158
159
  } = require('../../scripts/feedback-session');
159
160
 
160
- const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.14.1' };
161
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.15.0' };
161
162
  const COMMERCE_CATEGORIES = [
162
163
  'product_recommendation',
163
164
  'brand_compliance',
@@ -850,6 +851,12 @@ async function callToolInner(name, args) {
850
851
  return toTextResult(generateOrgDashboard({ windowHours: Number(args.windowHours || 24) }));
851
852
  case 'settings_status':
852
853
  return toTextResult(getSettingsStatus());
854
+ case 'native_messaging_audit':
855
+ return toTextResult(buildNativeMessagingAudit({
856
+ platform: args.platform,
857
+ homeDir: args.homeDir,
858
+ aiOnly: args.aiOnly === true,
859
+ }));
853
860
  case 'commerce_recall':
854
861
  enforceLimit('commerce_recall');
855
862
  return buildCommerceRecallResponse(args);
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.14.1",
10
+ "thumbgate@1.15.0",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
package/bin/cli.js CHANGED
@@ -1475,6 +1475,52 @@ function gateStats() {
1475
1475
  console.log('\n' + formatStats(stats) + '\n');
1476
1476
  }
1477
1477
 
1478
+ function harnessAudit() {
1479
+ const args = parseArgs(process.argv.slice(3));
1480
+ const { buildHarnessOptimizationAudit } = require(path.join(PKG_ROOT, 'scripts', 'harness-selector'));
1481
+ const audit = buildHarnessOptimizationAudit({
1482
+ rootDir: CWD,
1483
+ docTokenBudget: args['doc-token-budget'],
1484
+ });
1485
+
1486
+ if (args.json) {
1487
+ console.log(JSON.stringify(audit, null, 2));
1488
+ return;
1489
+ }
1490
+
1491
+ console.log('\nThumbGate Harness Optimization Audit');
1492
+ console.log(`Status : ${audit.status}`);
1493
+ console.log(`Score : ${audit.score}/100`);
1494
+ console.log(`Docs : ~${audit.totals.globalDocEstimatedTokens} tokens across global agent docs`);
1495
+ console.log(`MCP : ${audit.totals.mcpToolCount} indexed tools; progressive discovery ${audit.signals.progressiveToolIndexPresent ? 'on' : 'missing'}`);
1496
+ console.log(`Gates : ${audit.totals.specializedHarnessCount} specialized harnesses`);
1497
+ console.log('\nRecommendations:');
1498
+ for (const recommendation of audit.recommendations) {
1499
+ console.log(` - ${recommendation}`);
1500
+ }
1501
+ console.log('');
1502
+ }
1503
+
1504
+ function nativeMessagingAudit() {
1505
+ const args = parseArgs(process.argv.slice(3));
1506
+ const {
1507
+ buildNativeMessagingAudit,
1508
+ formatNativeMessagingAudit,
1509
+ } = require(path.join(PKG_ROOT, 'scripts', 'native-messaging-audit'));
1510
+ const report = buildNativeMessagingAudit({
1511
+ homeDir: args['home-dir'],
1512
+ platform: args.platform,
1513
+ aiOnly: args['ai-only'] === true,
1514
+ });
1515
+
1516
+ if (args.json) {
1517
+ console.log(JSON.stringify(report, null, 2));
1518
+ return;
1519
+ }
1520
+
1521
+ process.stdout.write(formatNativeMessagingAudit(report));
1522
+ }
1523
+
1478
1524
  function optimize() {
1479
1525
  const { optimize: doOptimize } = require(path.join(PKG_ROOT, 'scripts', 'optimize-context'));
1480
1526
  doOptimize();
@@ -1969,6 +2015,14 @@ switch (COMMAND) {
1969
2015
  case 'rules':
1970
2016
  rules();
1971
2017
  break;
2018
+ case 'harness-audit':
2019
+ case 'harness':
2020
+ harnessAudit();
2021
+ break;
2022
+ case 'native-messaging-audit':
2023
+ case 'bridge-audit':
2024
+ nativeMessagingAudit();
2025
+ break;
1972
2026
  case 'optimize':
1973
2027
  optimize();
1974
2028
  break;
@@ -1,20 +1,72 @@
1
1
  {
2
2
  "$schema": "./enforcement.schema.json",
3
- "description": "Loss matrix and enforcement knobs for the Bayes-optimal pre-tool-use gate. See scripts/bayes-optimal-gate.js for the decision math. Tags listed here mirror the canonical tags emitted by risk-scorer.buildPatternSummary. To disable tag-specific costs and fall back to a symmetric 1:1 decision, reduce any override to 1.0.",
3
+ "description": "Loss matrix and enforcement knobs for the Bayes-optimal pre-tool-use gate. See scripts/bayes-optimal-gate.js for the decision math. Tags listed here mirror the canonical tags emitted by risk-scorer.buildPatternSummary. Costs are relative: falseAllow[tag] is the regret of letting a harmful tool call through, falseBlock[tag] is the regret of blocking a safe one. resolveCost takes the max across matched tags, so a single high-cost tag dominates. To disable tag-specific costs and fall back to a symmetric 1:1 decision, reduce any override to 1.0.",
4
4
  "lossMatrix": {
5
5
  "falseAllow": {
6
6
  "default": 1.0,
7
- "deploy-prod": 100.0,
8
- "destructive": 50.0,
7
+
9
8
  "secrets": 1000.0,
10
- "force-push-main": 200.0,
11
- "data-loss": 500.0,
12
9
  "credentials": 800.0,
10
+ "env-file-edit": 700.0,
11
+ "env-override": 700.0,
12
+ "deploy-env-secret-exposure": 900.0,
13
+
14
+ "self-protect": 1500.0,
15
+ "kill-gate": 1500.0,
16
+ "hooks-disable": 1200.0,
17
+ "config-tamper": 1200.0,
18
+
19
+ "data-loss": 500.0,
20
+ "db-drop-production": 600.0,
21
+ "db-truncate-production": 600.0,
22
+ "db-delete-nowhere": 500.0,
23
+ "db-unmigrated-sql": 400.0,
24
+ "db-runtime-sqlite": 350.0,
25
+ "db-lancedb-wipe": 400.0,
26
+ "mcp-sql-delete": 400.0,
27
+ "mcp-sql-bulk-update": 250.0,
28
+
29
+ "destructive": 50.0,
13
30
  "rm-rf": 300.0,
14
- "git-reset-hard": 100.0
31
+ "git-reset-hard": 100.0,
32
+ "force-push-main": 200.0,
33
+ "force-push": 150.0,
34
+ "protected-branch-push": 150.0,
35
+ "protected-file": 120.0,
36
+ "package-lock-reset": 75.0,
37
+
38
+ "deploy-prod": 100.0,
39
+ "deploy-unverified": 120.0,
40
+ "deploy-skip-ci": 150.0,
41
+ "deploy-publish-without-test": 180.0,
42
+ "deploy-version-drift": 90.0,
43
+ "production-change": 130.0,
44
+ "schema-migration": 150.0,
45
+ "permission-change": 140.0,
46
+
47
+ "supply-chain": 200.0,
48
+ "supply-chain-add": 200.0,
49
+ "unverified-skill": 160.0,
50
+ "blocked-npx": 180.0,
51
+ "network-egress": 250.0,
52
+ "unauthorized-egress": 250.0,
53
+
54
+ "pr-scope-violation": 80.0,
55
+ "admin-merge-bypass": 80.0,
56
+ "loop-abuse": 40.0,
57
+ "thread-unchecked-push": 40.0,
58
+ "generated-file-edit": 30.0,
59
+ "test-skip": 40.0,
60
+ "version-drift": 50.0,
61
+ "lockfile-manual": 60.0
15
62
  },
16
63
  "falseBlock": {
17
- "default": 1.0
64
+ "default": 1.0,
65
+
66
+ "style-violation": 5.0,
67
+ "console-log-commit": 4.0,
68
+ "non-critical-warning": 5.0,
69
+ "large-file": 3.0
18
70
  }
19
71
  },
20
72
  "bayesOptimalEnabled": true,
@@ -146,6 +146,28 @@
146
146
  "severity": "critical",
147
147
  "compliance": ["NIST-CM-5", "SOC2-CC8.1", "CWE-863"]
148
148
  },
149
+ {
150
+ "id": "git-reset-hard",
151
+ "layer": "Execution",
152
+ "trigger": "Bash:git_reset_hard",
153
+ "toolNames": ["Bash"],
154
+ "pattern": "(?:^|[;&|]\\s*)git\\s+reset\\s+--hard\\b",
155
+ "action": "block",
156
+ "message": "git reset --hard is blocked because it can destroy uncommitted work. Stash or use a non-destructive restore path with explicit user approval.",
157
+ "severity": "critical",
158
+ "compliance": ["NIST-CM-5", "SOC2-CC8.1", "CWE-863"]
159
+ },
160
+ {
161
+ "id": "git-clean-force",
162
+ "layer": "Execution",
163
+ "trigger": "Bash:git_clean_force",
164
+ "toolNames": ["Bash"],
165
+ "pattern": "(?:^|[;&|]\\s*)git\\s+clean\\s+(?:-[^\\s]*f[^\\s]*|--force)\\b",
166
+ "action": "block",
167
+ "message": "git clean --force is blocked because it can delete untracked user work. Inventory files and get explicit approval before destructive cleanup.",
168
+ "severity": "critical",
169
+ "compliance": ["NIST-CM-5", "SOC2-CC8.1", "CWE-863"]
170
+ },
149
171
  {
150
172
  "id": "protected-branch-push",
151
173
  "layer": "Execution",
@@ -155,6 +177,17 @@
155
177
  "message": "Direct push to protected branch. Use feature branches and PRs.",
156
178
  "severity": "critical"
157
179
  },
180
+ {
181
+ "id": "rm-rf-home-or-root",
182
+ "layer": "Execution",
183
+ "trigger": "Bash:rm_rf_home_or_root",
184
+ "toolNames": ["Bash"],
185
+ "pattern": "(?:^|[;&|]\\s*)rm\\s+-(?=[^\\s]*r)(?=[^\\s]*f)[^\\s]+\\s+(?:/|/\\*|~(?:/[^\\s]*)?|\\$HOME(?:/[^\\s]*)?)(?:\\s|$)",
186
+ "action": "block",
187
+ "message": "Broad rm -rf against root or home is blocked. Use a narrow, reviewed path and explicit approval for destructive deletes.",
188
+ "severity": "critical",
189
+ "compliance": ["NIST-CM-5", "SOC2-CC8.1", "CWE-732"]
190
+ },
158
191
  {
159
192
  "id": "env-file-edit",
160
193
  "layer": "Cloud",
@@ -45,6 +45,7 @@
45
45
  "gate_stats",
46
46
  "dashboard",
47
47
  "settings_status",
48
+ "native_messaging_audit",
48
49
  "list_harnesses",
49
50
  "run_harness",
50
51
  "run_autoresearch",
@@ -139,6 +140,7 @@
139
140
  "gate_stats",
140
141
  "dashboard",
141
142
  "settings_status",
143
+ "native_messaging_audit",
142
144
  "get_business_metrics",
143
145
  "describe_semantic_entity",
144
146
  "get_reliability_rules",
@@ -173,6 +175,7 @@
173
175
  "gate_stats",
174
176
  "dashboard",
175
177
  "settings_status",
178
+ "native_messaging_audit",
176
179
  "get_business_metrics",
177
180
  "describe_semantic_entity",
178
181
  "get_reliability_rules",
@@ -199,6 +202,7 @@
199
202
  "check_operational_integrity",
200
203
  "workflow_sentinel",
201
204
  "settings_status",
205
+ "native_messaging_audit",
202
206
  "generate_operator_artifact"
203
207
  ]
204
208
  }
@@ -6,7 +6,8 @@
6
6
  "Verify changeset",
7
7
  "SonarCloud Code Analysis",
8
8
  "GitGuardian Security Checks",
9
- "Socket Security: Project Report"
9
+ "Socket Security: Project Report",
10
+ "Socket Security: Pull Request Alerts"
10
11
  ],
11
12
  "passingBuckets": [
12
13
  "pass",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.14.1",
3
+ "version": "1.15.0",
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 gates, 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": {
@@ -15,7 +15,6 @@
15
15
  "thumbgate": "bin/cli.js"
16
16
  },
17
17
  "files": [
18
- ".claude-plugin/README.md",
19
18
  ".claude-plugin/marketplace.json",
20
19
  ".claude-plugin/plugin.json",
21
20
  ".well-known/",
@@ -42,6 +41,7 @@
42
41
  "public/index.html",
43
42
  "public/learn.html",
44
43
  "public/lessons.html",
44
+ "public/numbers.html",
45
45
  "public/pro.html",
46
46
  "scripts/access-anomaly-detector.js",
47
47
  "scripts/agent-readiness.js",
@@ -125,6 +125,7 @@
125
125
  "scripts/internal-agent-bootstrap.js",
126
126
  "scripts/intervention-policy.js",
127
127
  "scripts/jsonl-watcher.js",
128
+ "scripts/lesson-canonical.js",
128
129
  "scripts/lesson-db.js",
129
130
  "scripts/lesson-inference.js",
130
131
  "scripts/lesson-reranker.js",
@@ -132,6 +133,7 @@
132
133
  "scripts/lesson-rotation.js",
133
134
  "scripts/lesson-search.js",
134
135
  "scripts/lesson-synthesis.js",
136
+ "scripts/rule-validator.js",
135
137
  "scripts/license.js",
136
138
  "scripts/llm-client.js",
137
139
  "scripts/mailer/index.js",
@@ -143,6 +145,7 @@
143
145
  "scripts/memory-firewall.js",
144
146
  "scripts/meta-agent-loop.js",
145
147
  "scripts/multimodal-retrieval-plan.js",
148
+ "scripts/native-messaging-audit.js",
146
149
  "scripts/natural-language-harness.js",
147
150
  "scripts/obsidian-export.js",
148
151
  "scripts/operational-dashboard.js",
@@ -208,7 +211,7 @@
208
211
  "scripts/workflow-sprint-intake.js",
209
212
  "scripts/workspace-evolver.js",
210
213
  "scripts/xmemory-lite.js",
211
- "skills/",
214
+ "skills/thumbgate/SKILL.md",
212
215
  "src/"
213
216
  ],
214
217
  "scripts": {
@@ -265,10 +268,11 @@
265
268
  "trace:eval": "node scripts/decision-trace.js eval",
266
269
  "social:reply-monitor": "node scripts/social-reply-monitor.js",
267
270
  "social:reply-monitor:dry": "node scripts/social-reply-monitor.js --dry-run",
268
- "test": "npm run test:schema && npm run test:loop && npm run test:dpo && npm run test:kto && npm run test:api && npm run test:proof && npm run test:e2e && npm run test:rlaif && npm run test:attribution && npm run test:quality && npm run test:intelligence && npm run test:training-export && npm run test:deployment && npm run test:operational-integrity && npm run test:workflow && npm run test:billing && npm run test:cli && npm run test:watcher && npm run test:autoresearch && npm run test:ops && npm run test:session-analyzer && npm run test:tessl && npm run test:gates && npm run test:evoskill && npm run test:gates-hardening && npm run test:workers && npm run test:social-analytics && npm run test:memalign && npm run test:xmemory-lite && npm run test:filesystem-search && npm run test:zernio && npm run test:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:post-everywhere-channels && npm run test:zernio-canonical-pollers && npm run test:zernio-status && npm run test:obsidian-export && npm run test:lesson-db && npm run test:lesson-rotation && npm run test:memory-dedup && npm run test:feedback-quality && npm run test:sync-version && npm run test:check-congruence && npm run test:tool-registry && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operator-artifacts && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:plan-gate && npm run test:pulse && npm run test:semantic-layer && npm run test:data-pipeline && npm run test:optimize-context && npm run test:principle-extractor && npm run test:analytics-window && npm run test:funnel-analytics && npm run test:experiment-tracker && npm run test:build-metadata && npm run test:context-engine && npm run test:hf-papers && npm run test:marketing-experiment && npm run test:seo-gsd && npm run test:verify-run && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:bot-detector && npm run test:postinstall && npm run test:funnel-invariants && npm run test:cli-telemetry && npm run test:pro-parity && npm run test:model-tier-router && npm run test:computer-use-firewall && npm run test:skill-exporter && npm run test:statusline && npm run test:evolution && npm run test:org-dashboard && npm run test:multi-hop-recall && npm run test:synthetic-dpo && npm run test:thumbgate-skill && npm run test:learn-hub && npm run test:feedback-fallback && npm run test:metaclaw && npm run test:server-lock && npm run test:control-tower && npm run test:pii-scanner && npm run test:data-governance && npm run test:lesson-inference && npm run test:semantic-dedup && npm run test:fs-utils && npm run test:cli-schema && npm run test:explore && npm run test:lesson-reranker && npm run test:lesson-retrieval && npm run test:cross-encoder && npm run test:reflector-agent && npm run test:feedback-session && npm run test:feedback-history-distiller && npm run test:hallucination-detector && npm run test:history-distiller && npm run test:predictive-insights && npm run test:prove-predictive-insights && npm run test:statusbar-cli && npm run test:generate-instagram-card && npm run test:instagram-thumbgate-post && npm run test:publish-instagram-thumbgate && npm run test:lesson-synthesis && npm run test:background-governance && npm run test:memory-migration && npm run test:prompt-dlp && npm run test:ephemeral-store && npm run test:agent-security && npm run test:skill-progressive && npm run test:per-step-scoring && npm run test:weekly-auto-post && npm run test:social-post-hourly && npm run test:social-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && npm run test:budget && npm run test:quick-start && npm run test:utm && npm run test:product-feedback && npm run test:feedback-root-consolidator && npm run test:engagement-audit && npm run test:install-growth-automation && npm run test:publish-thumbgate-launch && npm run test:reconcile-thumbgate-campaign && npm run test:reddit-publisher && npm run test:schedule-thumbgate-campaign && npm run test:social-reply-monitor && npm run test:sync-launch-assets && npm run test:ai-search-visibility && npm run test:perplexity && npm run test:security-scanner && npm run test:llm-client && npm run test:managed-lesson-agent && npm run test:self-distill && npm run test:meta-agent && npm run test:harness-selector && npm run test:thumbgate-bench && npm run test:seo-guides && npm run test:enforcement-loop && npm run test:cli-agent-experience && npm run test:bot-detection && npm run test:checkout-bot-guard && npm run test:session-health && npm run test:session-episodes && npm run test:spec-gate && npm run test:decision-trace && npm run test:dashboard-insights && npm run test:prompt-eval && npm run test:demo-voiceover && npm run test:gate-coherence && npm run test:gate-eval && npm run test:high-roi && npm run test:public-static-assets && npm run test:token-savings && npm run test:workflow-gate-checkpoint && npm run test:lesson-export-import && npm run test:landing-page-claims && npm run test:dashboard-deeplink-e2e && npm run test:public-package-parity && npm run test:token-savings-dashboard && npm run test:cursor-wiring && npm run test:pretooluse-injection && npm run test:recent-corrective-context && npm run test:durability-step && npm run test:mailer && npm run test:brand-assets && npm run test:enforcement-teeth && npm run test:bayes-optimal-gate && npm run test:swarm-coordinator && npm run test:session-report && npm run test:require-evidence-gate",
271
+ "test": "npm run test:schema && npm run test:loop && npm run test:dpo && npm run test:kto && npm run test:api && npm run test:proof && npm run test:e2e && npm run test:rlaif && npm run test:attribution && npm run test:quality && npm run test:intelligence && npm run test:training-export && npm run test:deployment && npm run test:operational-integrity && npm run test:workflow && npm run test:billing && npm run test:cli && npm run test:watcher && npm run test:autoresearch && npm run test:ops && npm run test:session-analyzer && npm run test:tessl && npm run test:gates && npm run test:evoskill && npm run test:gates-hardening && npm run test:workers && npm run test:social-analytics && npm run test:memalign && npm run test:xmemory-lite && npm run test:filesystem-search && npm run test:zernio && npm run test:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:post-everywhere-channels && npm run test:zernio-canonical-pollers && npm run test:zernio-status && npm run test:obsidian-export && npm run test:lesson-db && npm run test:lesson-rotation && npm run test:memory-dedup && npm run test:feedback-quality && npm run test:sync-version && npm run test:check-congruence && npm run test:tool-registry && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operator-artifacts && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:plan-gate && npm run test:pulse && npm run test:semantic-layer && npm run test:data-pipeline && npm run test:optimize-context && npm run test:principle-extractor && npm run test:analytics-window && npm run test:funnel-analytics && npm run test:experiment-tracker && npm run test:build-metadata && npm run test:context-engine && npm run test:hf-papers && npm run test:marketing-experiment && npm run test:seo-gsd && npm run test:verify-run && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:bot-detector && npm run test:postinstall && npm run test:funnel-invariants && npm run test:cli-telemetry && npm run test:pro-parity && npm run test:model-tier-router && npm run test:computer-use-firewall && npm run test:skill-exporter && npm run test:statusline && npm run test:evolution && npm run test:org-dashboard && npm run test:multi-hop-recall && npm run test:synthetic-dpo && npm run test:thumbgate-skill && npm run test:learn-hub && npm run test:feedback-fallback && npm run test:metaclaw && npm run test:server-lock && npm run test:control-tower && npm run test:pii-scanner && npm run test:data-governance && npm run test:lesson-inference && npm run test:semantic-dedup && npm run test:fs-utils && npm run test:cli-schema && npm run test:explore && npm run test:lesson-reranker && npm run test:lesson-retrieval && npm run test:cross-encoder && npm run test:reflector-agent && npm run test:feedback-session && npm run test:feedback-history-distiller && npm run test:hallucination-detector && npm run test:history-distiller && npm run test:predictive-insights && npm run test:prove-predictive-insights && npm run test:statusbar-cli && npm run test:generate-instagram-card && npm run test:instagram-thumbgate-post && npm run test:publish-instagram-thumbgate && npm run test:lesson-synthesis && npm run test:lesson-canonical && npm run test:background-governance && npm run test:memory-migration && npm run test:prompt-dlp && npm run test:ephemeral-store && npm run test:agent-security && npm run test:skill-progressive && npm run test:per-step-scoring && npm run test:weekly-auto-post && npm run test:social-post-hourly && npm run test:social-quality-gate && npm run test:a2ui-engine && npm run test:gate-satisfy && npm run test:money-watcher && npm run test:budget && npm run test:quick-start && npm run test:utm && npm run test:product-feedback && npm run test:feedback-root-consolidator && npm run test:engagement-audit && npm run test:install-growth-automation && npm run test:publish-thumbgate-launch && npm run test:reconcile-thumbgate-campaign && npm run test:reddit-publisher && npm run test:schedule-thumbgate-campaign && npm run test:social-reply-monitor && npm run test:sync-launch-assets && npm run test:ai-search-visibility && npm run test:perplexity && npm run test:security-scanner && npm run test:llm-client && npm run test:managed-lesson-agent && npm run test:self-distill && npm run test:meta-agent && npm run test:harness-selector && npm run test:thumbgate-bench && npm run test:seo-guides && npm run test:enforcement-loop && npm run test:cli-agent-experience && npm run test:bot-detection && npm run test:checkout-bot-guard && npm run test:session-health && npm run test:session-episodes && npm run test:spec-gate && npm run test:decision-trace && npm run test:dashboard-insights && npm run test:prompt-eval && npm run test:demo-voiceover && npm run test:gate-coherence && npm run test:gate-eval && npm run test:high-roi && npm run test:public-static-assets && npm run test:token-savings && npm run test:numbers-page && npm run test:workflow-gate-checkpoint && npm run test:lesson-export-import && npm run test:landing-page-claims && npm run test:dashboard-deeplink-e2e && npm run test:public-package-parity && npm run test:token-savings-dashboard && npm run test:cursor-wiring && npm run test:pretooluse-injection && npm run test:recent-corrective-context && npm run test:durability-step && npm run test:mailer && npm run test:brand-assets && npm run test:enforcement-teeth && npm run test:bayes-optimal-gate && npm run test:swarm-coordinator && npm run test:session-report && npm run test:require-evidence-gate && npm run test:rule-validator && npm run test:bluesky-atproto && npm run test:social-reply-monitor-bluesky && npm run test:bluesky-delete-replies && npm run test:architect-kit-memory-bridge && npm run test:sonar-review-hotspots",
269
272
  "test:swarm-coordinator": "node --test tests/swarm-coordinator.test.js",
270
273
  "test:session-report": "node --test tests/session-report.test.js",
271
274
  "test:require-evidence-gate": "node --test tests/require-evidence-gate.test.js",
275
+ "test:rule-validator": "node --test tests/rule-validator.test.js",
272
276
  "test:session-health": "node --test tests/session-health-sensor.test.js",
273
277
  "test:session-episodes": "node --test tests/session-episode-store.test.js",
274
278
  "test:spec-gate": "node --test tests/spec-gate.test.js",
@@ -345,7 +349,7 @@
345
349
  "test:evolution": "node --test tests/workspace-evolver.test.js",
346
350
  "test:watcher": "node --test tests/jsonl-watcher.test.js",
347
351
  "test:autoresearch": "node --test tests/autoresearch.test.js",
348
- "test:ops": "node --test tests/adk-consolidator.test.js tests/anthropic-partner-strategy.test.js tests/auto-promote-gates.test.js tests/auto-wire-hooks.test.js tests/claude-skill.test.js tests/codegraph-context.test.js tests/commercial-signals.test.js tests/decision-journal.test.js tests/delegation-runtime.test.js tests/disagreement-mining.test.js tests/failure-diagnostics.test.js tests/gate-stats.test.js tests/github-billing.test.js tests/intervention-policy.test.js tests/markdown-escape.test.js tests/mcp-tools-gates.test.js tests/project-bayes-e2e.test.js tests/project-bayes.test.js tests/rate-limiter.test.js tests/schedule-manager.test.js tests/session-handoff.test.js tests/skill-generator.test.js tests/smart-learning.test.js tests/spike-and-sink.test.js tests/stripe-revenue.test.js tests/stripe-webhook-route.test.js tests/stripe-webhook-rotation.test.js tests/train-from-feedback.test.js tests/workflow-hardening-sprint.test.js tests/workflow-sentinel.test.js tests/test-suite-parity.test.js tests/a2ui-engine.test.js tests/webhook-delivery.test.js",
352
+ "test:ops": "node --test tests/adk-consolidator.test.js tests/anthropic-partner-strategy.test.js tests/auto-promote-gates.test.js tests/auto-wire-hooks.test.js tests/claude-skill.test.js tests/codegraph-context.test.js tests/commercial-signals.test.js tests/decision-journal.test.js tests/delegation-runtime.test.js tests/disagreement-mining.test.js tests/failure-diagnostics.test.js tests/gate-stats.test.js tests/git-hook-installer.test.js tests/github-billing.test.js tests/intervention-policy.test.js tests/markdown-escape.test.js tests/mcp-tools-gates.test.js tests/native-messaging-audit.test.js tests/project-bayes-e2e.test.js tests/project-bayes.test.js tests/rate-limiter.test.js tests/schedule-manager.test.js tests/session-handoff.test.js tests/skill-generator.test.js tests/smart-learning.test.js tests/spike-and-sink.test.js tests/stripe-revenue.test.js tests/stripe-webhook-route.test.js tests/stripe-webhook-rotation.test.js tests/train-from-feedback.test.js tests/workflow-hardening-sprint.test.js tests/workflow-sentinel.test.js tests/test-suite-parity.test.js tests/a2ui-engine.test.js tests/webhook-delivery.test.js",
349
353
  "test:session-analyzer": "node --test tests/session-analyzer.test.js",
350
354
  "test:tessl": "node --test tests/tessl-export.test.js",
351
355
  "test:gates": "node --test tests/gate-templates.test.js tests/gates-engine.test.js tests/claim-verification.test.js tests/secret-scanner.test.js tests/prompt-guard.test.js tests/audit-trail.test.js tests/profile-router.test.js tests/workflow-sentinel.test.js tests/docker-sandbox-planner.test.js",
@@ -439,6 +443,7 @@
439
443
  "test:instagram-thumbgate-post": "node --test tests/instagram-thumbgate-post.test.js",
440
444
  "test:publish-instagram-thumbgate": "node --test tests/publish-instagram-thumbgate.test.js",
441
445
  "test:lesson-synthesis": "node --test tests/lesson-synthesis.test.js",
446
+ "test:lesson-canonical": "node --test tests/lesson-canonical.test.js",
442
447
  "test:background-governance": "node --test tests/background-governance.test.js",
443
448
  "test:memory-migration": "node --test tests/memory-migration.test.js",
444
449
  "test:prompt-dlp": "node --test tests/prompt-dlp.test.js",
@@ -467,6 +472,12 @@
467
472
  "test:reconcile-thumbgate-campaign": "node --test tests/reconcile-thumbgate-campaign.test.js",
468
473
  "test:schedule-thumbgate-campaign": "node --test tests/schedule-thumbgate-campaign.test.js",
469
474
  "test:social-reply-monitor": "node --test tests/social-reply-monitor.test.js",
475
+ "test:bluesky-atproto": "node --test tests/bluesky-atproto.test.js",
476
+ "test:social-reply-monitor-bluesky": "node --test tests/social-reply-monitor-bluesky.test.js",
477
+ "test:bluesky-delete-replies": "node --test tests/bluesky-delete-replies.test.js",
478
+ "test:architect-kit-memory-bridge": "node --test tests/architect-kit-memory-bridge.test.js",
479
+ "test:sonar-review-hotspots": "node --test tests/sonar-review-hotspots.test.js",
480
+ "integrations:architect-kit:import": "node scripts/integrations/architect-kit-memory-bridge.js",
470
481
  "test:sync-launch-assets": "node --test tests/sync-launch-assets.test.js",
471
482
  "test:reddit-publisher": "node --test tests/reddit-publisher.test.js",
472
483
  "test:engagement-audit": "node --test tests/engagement-audit.test.js",
@@ -508,6 +519,7 @@
508
519
  "test:high-roi": "node --test tests/high-roi.test.js tests/autonomous-workflow.test.js",
509
520
  "test:public-static-assets": "node --test tests/public-static-assets.test.js",
510
521
  "test:token-savings": "node --test tests/token-savings.test.js",
522
+ "test:numbers-page": "node --test tests/numbers-page.test.js",
511
523
  "test:workflow-gate-checkpoint": "node --test tests/workflow-gate-checkpoint.test.js tests/autonomous-workflow.test.js",
512
524
  "workflow:autonomous": "node scripts/autonomous-workflow.js",
513
525
  "test:lesson-export-import": "node --test tests/lesson-export-import.test.js",
@@ -26,10 +26,15 @@
26
26
  "downloadUrl": "https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-codex-plugin.zip",
27
27
  "installUrl": "https://thumbgate-production.up.railway.app/codex-plugin",
28
28
  "license": "https://opensource.org/licenses/MIT",
29
+ "dateModified": "2026-04-20",
29
30
  "creator": {
30
31
  "@type": "Person",
31
32
  "name": "Igor Ganapolsky",
32
- "url": "https://github.com/IgorGanapolsky"
33
+ "url": "https://github.com/IgorGanapolsky",
34
+ "sameAs": [
35
+ "https://github.com/IgorGanapolsky",
36
+ "https://www.linkedin.com/in/igorganapolsky"
37
+ ]
33
38
  },
34
39
  "offers": {
35
40
  "@type": "Offer",
@@ -189,6 +194,7 @@
189
194
  <div class="wrap">
190
195
  <div class="eyebrow">Codex MCP plugin + Pre-Action Gates</div>
191
196
  <h1>Give Codex a thumbs-down once. Block the repeat before it runs again.</h1>
197
+ <p class="sub" style="font-size:13px;opacity:0.85;">Updated: <time datetime="2026-04-20">2026-04-20</time> · by <a href="https://github.com/IgorGanapolsky" style="color:inherit;">Igor Ganapolsky</a></p>
192
198
  <p class="sub">ThumbGate wires Codex into local-first feedback memory, MCP tools, and hook enforcement. The launcher resolves <code>thumbgate@latest</code> when Codex starts, so published npm fixes reach your active MCP server after a restart.</p>
193
199
  <div class="actions">
194
200
  <a class="button primary" href="https://github.com/IgorGanapolsky/ThumbGate/releases/latest/download/thumbgate-codex-plugin.zip" target="_blank" rel="noopener" onclick="if(typeof plausible==='function')plausible('codex_plugin_download')">Download Codex plugin</a>
@@ -11,6 +11,26 @@
11
11
  <meta name="robots" content="noindex">
12
12
  <!-- Privacy-friendly analytics by Plausible -->
13
13
  <script defer data-domain="thumbgate-production.up.railway.app" src="https://plausible.io/js/script.js"></script>
14
+ <script type="application/ld+json">
15
+ {
16
+ "@context": "https://schema.org",
17
+ "@type": "WebApplication",
18
+ "name": "ThumbGate Dashboard",
19
+ "applicationCategory": "DeveloperApplication",
20
+ "operatingSystem": "Cross-platform",
21
+ "url": "https://thumbgate-production.up.railway.app/dashboard",
22
+ "dateModified": "2026-04-20",
23
+ "creator": {
24
+ "@type": "Person",
25
+ "name": "Igor Ganapolsky",
26
+ "url": "https://github.com/IgorGanapolsky",
27
+ "sameAs": [
28
+ "https://github.com/IgorGanapolsky",
29
+ "https://www.linkedin.com/in/igorganapolsky"
30
+ ]
31
+ }
32
+ }
33
+ </script>
14
34
  <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js"></script>
15
35
  <style>
16
36
  *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
@@ -200,6 +220,7 @@
200
220
 
201
221
  <div style="margin:0 0 24px;padding:24px;background:linear-gradient(135deg,rgba(34,211,238,0.08),rgba(74,222,128,0.05));border:1px solid rgba(34,211,238,0.2);border-radius:12px;">
202
222
  <h1 style="font-size:22px;font-weight:700;margin-bottom:8px;letter-spacing:-0.02em;">🔍 Operations Dashboard</h1>
223
+ <p style="font-size:12px;color:var(--text-muted);margin-bottom:8px;">Updated: <time datetime="2026-04-20">2026-04-20</time> · by <a href="https://github.com/IgorGanapolsky" style="color:inherit;">Igor Ganapolsky</a></p>
203
224
  <p style="font-size:14px;color:var(--text-muted);line-height:1.6;max-width:700px;">What's happening right now? Search memories, inspect active gates, manage your team, and export training data. <span style="color:var(--cyan);font-weight:600;">This is your control plane for AI agent behavior.</span></p>
204
225
  <div style="display:flex;gap:16px;margin-top:12px;font-size:12px;color:var(--text-muted);">
205
226
  <span>🔍 <strong style="color:var(--text);">Search</strong> — find any memory</span>
@@ -211,7 +232,7 @@
211
232
 
212
233
  <div class="demo-banner" id="demoBanner" style="display:none;">
213
234
  <span>📊 <strong>Demo Mode</strong> — sample data. Pro unlocks your personal dashboard with search, DPO export, and gate analytics.</span>
214
- <a href="https://buy.stripe.com/7sYcN5bmIf5IcSd8qf3sI0a" target="_blank" rel="noopener" style="background:#b85c2d;color:#fff;padding:6px 14px;border-radius:8px;text-decoration:none;font-weight:700;white-space:nowrap;">Start 7-day free trial</a>
235
+ <a href="/go/pro?utm_source=dashboard_demo" rel="noopener" style="background:#b85c2d;color:#fff;padding:6px 14px;border-radius:8px;text-decoration:none;font-weight:700;white-space:nowrap;">Start 7-day free trial</a>
215
236
  </div>
216
237
 
217
238
  <!-- STATS -->
@@ -1216,7 +1237,7 @@ function loadDemo() {
1216
1237
  '<span style="color:#ffb98a;font-weight:700;">Live demo data below.</span> ' +
1217
1238
  'Point ThumbGate at your own feedback to see <em>your</em> gates, lessons, and team signals — no signup required.' +
1218
1239
  '</div>' +
1219
- '<a href="https://buy.stripe.com/7sYcN5bmIf5IcSd8qf3sI0a" target="_blank" rel="noopener" ' +
1240
+ '<a href="/go/pro?utm_source=dashboard_live" rel="noopener" ' +
1220
1241
  '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>' +
1221
1242
  '</div>';
1222
1243
  document.getElementById('searchResults').innerHTML = upgradeBanner + teaserHtml;
package/public/index.html CHANGED
@@ -903,6 +903,24 @@ __GA_BOOTSTRAP__
903
903
  <p>The core concept explained in plain language: how thumbs up, thumbs down, and runtime enforcement work together to prevent repeated failures.</p>
904
904
  <div class="card-arrow">Read the guide →</div>
905
905
  </a>
906
+ <a class="seo-card" href="/guides/agent-harness-optimization">
907
+ <div class="seo-kicker">Harness</div>
908
+ <h3>AI Agent Harness Optimization</h3>
909
+ <p>Keep global prompts lean, load MCP schemas on demand, and turn harness lessons into Pre-Action Gates that block repeat failures.</p>
910
+ <div class="card-arrow">Audit your harness →</div>
911
+ </a>
912
+ <a class="seo-card" href="/guides/browser-automation-safety">
913
+ <div class="seo-kicker">Browser Safety</div>
914
+ <h3>Browser Automation Safety for AI Agents</h3>
915
+ <p>See how prompt injection, cross-app bridges, and silent connector installs turn browser-use into a governance problem, then audit what is already wired on disk.</p>
916
+ <div class="card-arrow">Read the browser safety guide →</div>
917
+ </a>
918
+ <a class="seo-card" href="/guides/native-messaging-host-security">
919
+ <div class="seo-kicker">Native Messaging</div>
920
+ <h3>Native Messaging Host Security</h3>
921
+ <p>Audit local browser bridges, missing host binaries, and pre-authorized extension paths before a desktop agent turns a one-off experiment into a durable integration.</p>
922
+ <div class="card-arrow">Run the bridge audit →</div>
923
+ </a>
906
924
  <a class="seo-card" href="/guides/claude-code-feedback">
907
925
  <div class="seo-kicker">Integration</div>
908
926
  <h3>Claude Code Feedback Memory That Enforces</h3>
@@ -974,7 +992,7 @@ __GA_BOOTSTRAP__
974
992
  <!-- HOW IT WORKS -->
975
993
  <section class="how-it-works" id="how-it-works">
976
994
  <div class="container">
977
- <div class="section-label">New in v1.14.1</div>
995
+ <div class="section-label">New in v1.15.0</div>
978
996
  <h2 class="section-title">Three steps to stop repeated AI failures</h2>
979
997
  <div class="steps">
980
998
  <div class="step">
@@ -1330,7 +1348,7 @@ __GA_BOOTSTRAP__
1330
1348
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
1331
1349
  <a href="/blog">Blog</a>
1332
1350
  </div>
1333
- <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.14.1</span>
1351
+ <span class="footer-copy">© 2026 Max Smith KDP LLC · MIT License · v1.15.0</span>
1334
1352
  </div>
1335
1353
  </footer>
1336
1354