thumbgate 1.34.1 โ†’ 1.34.2

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,7 +1,7 @@
1
1
  {
2
2
  "name": "thumbgate",
3
3
  "description": "One ๐Ÿ‘Ž becomes a hard rule the agent cannot bypass. Captures thumbs-down feedback, distills it into PreToolUse Pre-Action Checks, enforced across every future Claude Code session.",
4
- "version": "1.34.1",
4
+ "version": "1.34.2",
5
5
  "author": {
6
6
  "name": "Igor Ganapolsky",
7
7
  "email": "ig5973700@gmail.com",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.34.1",
3
+ "version": "1.34.2",
4
4
  "description": "ThumbGate โ€” ๐Ÿ‘๐Ÿ‘Ž feedback that teaches your AI agent. Thumbs down a mistake, it never happens again.",
5
5
  "homepage": "https://thumbgate.ai",
6
6
  "transport": "stdio",
@@ -2,13 +2,13 @@
2
2
  "mcpServers": {
3
3
  "thumbgate": {
4
4
  "command": "npx",
5
- "args": ["--yes", "--package", "thumbgate@1.34.1", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.34.2", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.34.1", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.34.2", "thumbgate", "gate-check"]
12
12
  }
13
13
  }
14
14
  }
@@ -9,12 +9,12 @@ version: "1"
9
9
  skills:
10
10
  thumbgate-gate-check:
11
11
  description: "ThumbGate PreToolUse gate โ€” blocks known-bad tool calls"
12
- command: "npx --yes --package thumbgate@1.34.1 thumbgate gate-check"
12
+ command: "npx --yes --package thumbgate@1.34.2 thumbgate gate-check"
13
13
  trigger: pre_tool_use
14
14
 
15
15
  thumbgate-feedback:
16
16
  description: "ThumbGate feedback capture โ€” logs user prompt context"
17
- command: "npx --yes --package thumbgate@1.34.1 thumbgate hook-auto-capture"
17
+ command: "npx --yes --package thumbgate@1.34.2 thumbgate hook-auto-capture"
18
18
  trigger: user_prompt
19
19
 
20
20
  mcp:
@@ -23,6 +23,6 @@ mcp:
23
23
  args:
24
24
  - "--yes"
25
25
  - "--package"
26
- - "thumbgate@1.34.1"
26
+ - "thumbgate@1.34.2"
27
27
  - "thumbgate"
28
28
  - "serve"
@@ -328,7 +328,7 @@ const {
328
328
  finalizeSession: finalizeFeedbackSession,
329
329
  } = require('../../scripts/feedback-session');
330
330
 
331
- const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.34.1' };
331
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.34.2' };
332
332
  const COMMERCE_CATEGORIES = [
333
333
  'product_recommendation',
334
334
  'brand_compliance',
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.34.1",
10
+ "thumbgate@1.34.2",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.34.1",
3
+ "version": "1.34.2",
4
4
  "description": "ThumbGate Pre-Action Checks self-improve from ranked lessons and repeated failures, hard-block detected secret leaks, and block matches in strict mode.",
5
5
  "homepage": "https://thumbgate.ai",
6
6
  "repository": {
@@ -614,7 +614,7 @@
614
614
  "test:evolution": "node --test tests/workspace-evolver.test.js",
615
615
  "test:watcher": "node --test tests/jsonl-watcher.test.js",
616
616
  "test:autoresearch": "node --test tests/autoresearch.test.js",
617
- "test:ops": "node --test tests/qa-scenario-planner.test.js 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/financial-control-plane.test.js tests/gate-stats.test.js tests/gates-engine-upgrade-cta.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 tests/auto-context-packs.test.js tests/daily-block-cap.test.js tests/auto-promote-regression-gate.test.js",
617
+ "test:ops": "node --test tests/qa-scenario-planner.test.js 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/financial-control-plane.test.js tests/financial-spend-attack-matrix.test.js tests/gate-stats.test.js tests/gates-engine-upgrade-cta.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 tests/auto-context-packs.test.js tests/daily-block-cap.test.js tests/auto-promote-regression-gate.test.js",
618
618
  "test:session-analyzer": "node --test tests/session-analyzer.test.js",
619
619
  "test:tessl": "node --test tests/tessl-export.test.js",
620
620
  "test:gates": "node --test --test-concurrency=1 tests/gate-templates.test.js tests/gates-engine.test.js tests/claim-verification.test.js tests/universal-claim-evaluator.test.js tests/secret-scanner.test.js tests/secret-fixture-safety.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 tests/mcp-tools-suggest-fix.test.js tests/deny-network-egress-pattern.test.js tests/git-pathspec-scope.test.js tests/git-global-option-bypass.test.js tests/gate-evasion-matrix.test.js",
@@ -996,7 +996,7 @@
996
996
  "@google/genai": {
997
997
  "protobufjs": "7.6.5"
998
998
  },
999
- "brace-expansion": "5.0.8",
999
+ "brace-expansion": "5.0.9",
1000
1000
  "onnxruntime-web": {
1001
1001
  "protobufjs": "7.6.5"
1002
1002
  },
package/public/index.html CHANGED
@@ -5,7 +5,7 @@
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
- <meta name="thumbgate-version" content="1.34.1">
8
+ <meta name="thumbgate-version" content="1.34.2">
9
9
  __GOOGLE_SITE_VERIFICATION_META__
10
10
  <link rel="icon" type="image/png" href="/thumbgate-icon.png">
11
11
  <link rel="canonical" href="__APP_ORIGIN__/">
@@ -942,7 +942,7 @@ next decision recorded before execution</pre>
942
942
 
943
943
  <footer>
944
944
  <div class="shell footer-inner">
945
- <span>ThumbGate ยท MIT License ยท npm v1.34.1</span>
945
+ <span>ThumbGate ยท MIT License ยท npm v1.34.2</span>
946
946
  <div class="footer-links">
947
947
  <a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
948
948
  <a href="/guide">Technical setup</a>
@@ -25,7 +25,7 @@
25
25
  "alternateName": "thumbgate",
26
26
  "applicationCategory": "DeveloperApplication",
27
27
  "operatingSystem": "Cross-platform, Node.js >=18.18.0",
28
- "softwareVersion": "1.34.1",
28
+ "softwareVersion": "1.34.2",
29
29
  "url": "https://thumbgate-production.up.railway.app/numbers",
30
30
  "dateModified": "2026-08-03",
31
31
  "creator": {
@@ -202,7 +202,7 @@
202
202
  <main class="container">
203
203
  <h1>The Numbers</h1>
204
204
  <p class="subtitle">Generated first-party operational snapshot from the ThumbGate runtime. This is not customer traction, install volume, revenue, or proof that a configured gate has fired.</p>
205
- <div class="freshness">Updated: 2026-08-03 ยท Version 1.34.1</div>
205
+ <div class="freshness">Updated: 2026-08-03 ยท Version 1.34.2</div>
206
206
  <div class="truth-note"><strong>Read this first:</strong> configured checks are inventory. Recorded blocks and warnings are usage evidence. This snapshot currently reports 0 recorded hard-block event(s) and 0 recorded warning event(s).</div>
207
207
 
208
208
  <h2>Gate enforcement</h2>
@@ -78,6 +78,17 @@ const ECONOMIC_ACTION_PATTERNS = [
78
78
  /\b(?:finalize|pay|refund|send|update)\s+(?:a\s+)?(?:payout|refund|subscription|top-?up|transfer)\b/i,
79
79
  ];
80
80
 
81
+ // Host/path URL surfaces that open paid checkout or plan-upgrade flows.
82
+ // These are NOT covered by prose patterns alone (e.g. `open https://app.apollo.io/#/settings/plans/upgrade`
83
+ // or WebFetch { url: 'https://checkout.stripe.com/...' }) โ€” Apollo $588 incident class.
84
+ const ECONOMIC_URL_PATTERNS = [
85
+ /(?:https?:\/\/)?(?:www\.)?checkout\.stripe\.com\b/i,
86
+ /(?:https?:\/\/)?(?:www\.)?buy\.stripe\.com\b/i,
87
+ /(?:https?:\/\/)?(?:www\.)?billing\.stripe\.com\b/i,
88
+ /(?:https?:\/\/)?(?:www\.)?app\.apollo\.io\b[^\s"'`]*?(?:plans|upgrade|billing|checkout|subscription)/i,
89
+ /(?:https?:\/\/)?(?:www\.)?apollo\.io\b[^\s"'`]*?(?:plans|upgrade|billing|checkout|subscription)/i,
90
+ ];
91
+
81
92
  const SCREEN_TOOL_PATTERN = /(?:browser|computer|playwright|puppeteer|selenium|click|tap|press)/i;
82
93
  const SCREEN_MUTATION_PATTERN = /(?:click|double[_ -]?click|tap|press|select|submit|confirm|activate)/i;
83
94
  const SCREEN_OBSERVATION_PATTERN = /(?:screenshot|snapshot)/i;
@@ -343,13 +354,24 @@ function detectEconomicAction(toolName, toolInput = {}) {
343
354
  const screenMutationProse = isDeclaredScreenMutation(normalizedToolName, toolInput)
344
355
  ? [toolInput.goal, toolInput.description, toolInput.prompt, metadata.context]
345
356
  : [];
357
+ // WebFetch / browser navigate often put the spend surface only in url/uri/href.
358
+ const navigationTargets = [
359
+ toolInput.url,
360
+ toolInput.uri,
361
+ toolInput.href,
362
+ toolInput.link,
363
+ toolInput.navigate,
364
+ toolInput.target,
365
+ ].map((value) => String(value || '')).join(' ');
346
366
  const combined = [
347
367
  normalizedToolName.replace(/[_-]+/g, ' '),
348
368
  command,
349
369
  toolInput.action,
350
370
  toolInput.operation,
371
+ navigationTargets,
351
372
  ...screenMutationProse,
352
373
  ].map((value) => String(value || '')).join(' ');
374
+ if (ECONOMIC_URL_PATTERNS.some((pattern) => pattern.test(combined))) return true;
353
375
  return ECONOMIC_ACTION_PATTERNS.some((pattern) => pattern.test(combined));
354
376
  }
355
377
 
@@ -1581,6 +1603,7 @@ function financialError(message) {
1581
1603
 
1582
1604
  module.exports = {
1583
1605
  ECONOMIC_ACTION_PATTERNS,
1606
+ ECONOMIC_URL_PATTERNS,
1584
1607
  createPurchaseRequisition,
1585
1608
  buildActionAuthorization,
1586
1609
  detectEconomicAction,
@@ -164,6 +164,10 @@ const UNCONDITIONAL_HARD_FLOOR_GATE_IDS = new Set([
164
164
  'secret-exfiltration',
165
165
  'security-vuln-scan',
166
166
  'slopsquat-guard',
167
+ // Money path: even if a refactor later routes financial denials through
168
+ // applyEnforcementPosture, never demote spend blocks to warn-by-default.
169
+ // Apollo $588 incident class (2026-08).
170
+ 'financial-control',
167
171
  TASK_SCOPE_LEASE_EXPIRED_GATE_ID,
168
172
  ...SELF_PROTECT_HARD_FLOOR_GATE_IDS,
169
173
  ]);
@@ -175,12 +179,15 @@ const UNCONDITIONAL_HARD_FLOOR_GATE_IDS = new Set([
175
179
  // `git reset --hard`, or `git clean -f` silently allowed through. These four
176
180
  // map directly to CLAUDE.md's own hard-block list and must never be subject
177
181
  // to the daily cap discount, regardless of tier or strict-mode setting.
182
+ // financial-control is included for the same reason: a daily-cap discount on
183
+ // checkout/subscription spends would re-open the never-spend interlock.
178
184
  const CATASTROPHIC_DECLARATIVE_GATE_IDS = new Set([
179
185
  TASK_SCOPE_LEASE_EXPIRED_GATE_ID,
180
186
  'force-push',
181
187
  'git-reset-hard',
182
188
  'git-clean-force',
183
189
  'rm-rf-home-or-root',
190
+ 'financial-control',
184
191
  ]);
185
192
  const SELF_PROTECT_CONFIG_TARGET_PATTERN = /(?:^|\/)(?:config\/gates\/|config\/(?:budget|enforcement|mcp-allowlists)\.json$|\.thumbgate\/config\.json$|thumbgate\.json$)/i;
186
193
  const SELF_PROTECT_HOOK_TARGET_PATTERN = /(?:^|\/)(?:\.claude\/settings(?:\.local)?\.json|\.codex\/config\.toml|scripts\/hook-[^/]+\.(?:js|sh))$/i;
package/server.json CHANGED
@@ -8,13 +8,13 @@
8
8
  "source": "github",
9
9
  "url": "https://github.com/IgorGanapolsky/ThumbGate"
10
10
  },
11
- "version": "1.34.1",
11
+ "version": "1.34.2",
12
12
  "packages": [
13
13
  {
14
14
  "registryType": "npm",
15
15
  "registryBaseUrl": "https://registry.npmjs.org",
16
16
  "identifier": "thumbgate",
17
- "version": "1.34.1",
17
+ "version": "1.34.2",
18
18
  "runtimeHint": "npx",
19
19
  "runtimeArguments": [
20
20
  {