thumbgate 1.27.15 → 1.27.16

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.27.8",
4
+ "version": "1.27.16",
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.27.8",
3
+ "version": "1.27.16",
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.27.8", "thumbgate", "serve"]
5
+ "args": ["--yes", "--package", "thumbgate@1.27.16", "thumbgate", "serve"]
6
6
  }
7
7
  },
8
8
  "hooks": {
9
9
  "preToolUse": {
10
10
  "command": "npx",
11
- "args": ["--yes", "--package", "thumbgate@1.27.8", "thumbgate", "gate-check"]
11
+ "args": ["--yes", "--package", "thumbgate@1.27.16", "thumbgate", "gate-check"]
12
12
  }
13
13
  }
14
14
  }
@@ -231,7 +231,7 @@ const {
231
231
  finalizeSession: finalizeFeedbackSession,
232
232
  } = require('../../scripts/feedback-session');
233
233
 
234
- const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.27.8' };
234
+ const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.27.16' };
235
235
  const COMMERCE_CATEGORIES = [
236
236
  'product_recommendation',
237
237
  'brand_compliance',
@@ -7,7 +7,7 @@
7
7
  "npx",
8
8
  "--yes",
9
9
  "--package",
10
- "thumbgate@1.27.8",
10
+ "thumbgate@1.27.16",
11
11
  "thumbgate",
12
12
  "serve"
13
13
  ],
package/bin/cli.js CHANGED
@@ -33,7 +33,7 @@ const os = require('os');
33
33
  const path = require('path');
34
34
  const crypto = require('crypto');
35
35
  const http = require('http');
36
- const { execSync, execFileSync, execFile, spawn } = require('child_process');
36
+ const { execSync, execFileSync, execFile, spawn, spawnSync } = require('child_process');
37
37
  const {
38
38
  codexAutoUpdateCliEntry,
39
39
  codexAutoUpdateMcpEntry,
@@ -1328,7 +1328,45 @@ function feedbackSelfTest() {
1328
1328
  const memoryId = result.memoryRecord && result.memoryRecord.id;
1329
1329
  const feedbackStored = Boolean(feedbackId && feedbackRows.some((row) => row.id === feedbackId));
1330
1330
  const memoryStored = Boolean(memoryId && memoryRows.some((row) => row.id === memoryId));
1331
- const ok = Boolean(result.accepted && feedbackStored && memoryStored);
1331
+
1332
+ let hookProbe = null;
1333
+ if (args.hook) {
1334
+ const hookPrompt = args['hook-prompt'] || (
1335
+ normalized === 'down'
1336
+ ? `thumbs down ${context}`
1337
+ : `thumbs up ${context}`
1338
+ );
1339
+ const hookResult = spawnSync(process.execPath, [__filename, 'hook-auto-capture'], {
1340
+ encoding: 'utf8',
1341
+ timeout: 10000,
1342
+ env: {
1343
+ ...process.env,
1344
+ THUMBGATE_FEEDBACK_DIR: paths.FEEDBACK_DIR,
1345
+ THUMBGATE_NO_NUDGE: '1',
1346
+ CLAUDE_USER_PROMPT: hookPrompt,
1347
+ },
1348
+ });
1349
+ const hookFeedbackRows = readJsonlEntries(paths.FEEDBACK_LOG_PATH);
1350
+ const hookMemoryRows = readJsonlEntries(paths.MEMORY_LOG_PATH);
1351
+ const hookLatestFeedback = hookFeedbackRows[hookFeedbackRows.length - 1] || null;
1352
+ const hookLatestMemory = hookMemoryRows[hookMemoryRows.length - 1] || null;
1353
+ hookProbe = {
1354
+ ok: hookResult.status === 0
1355
+ && Boolean(hookLatestFeedback)
1356
+ && hookLatestFeedback.submittedContext === hookPrompt
1357
+ && hookLatestFeedback.actionType !== 'no-action'
1358
+ && Boolean(hookLatestMemory),
1359
+ prompt: hookPrompt,
1360
+ exitCode: hookResult.status,
1361
+ feedbackId: hookLatestFeedback ? hookLatestFeedback.id : null,
1362
+ memoryId: hookLatestMemory ? hookLatestMemory.id : null,
1363
+ actionType: hookLatestFeedback ? hookLatestFeedback.actionType : null,
1364
+ stdoutPreview: String(hookResult.stdout || '').slice(0, 500),
1365
+ stderrPreview: String(hookResult.stderr || '').slice(0, 500),
1366
+ };
1367
+ }
1368
+
1369
+ const ok = Boolean(result.accepted && feedbackStored && memoryStored && (!hookProbe || hookProbe.ok));
1332
1370
 
1333
1371
  const payload = {
1334
1372
  ok,
@@ -1341,6 +1379,7 @@ function feedbackSelfTest() {
1341
1379
  memoryStored,
1342
1380
  isolated,
1343
1381
  feedbackDir: paths.FEEDBACK_DIR,
1382
+ hookProbe,
1344
1383
  nextDogfoodCommand: `npx thumbgate capture --feedback=${normalized} --context=${shellSingleQuote(context)}`,
1345
1384
  };
1346
1385
 
@@ -1353,6 +1392,9 @@ function feedbackSelfTest() {
1353
1392
  console.log(` Stored lesson: ${memoryId}`);
1354
1393
  console.log(` Storage : ${paths.FEEDBACK_DIR}`);
1355
1394
  console.log(` Mode : ${isolated ? 'isolated test store' : 'active ThumbGate store'}`);
1395
+ if (hookProbe) {
1396
+ console.log(` Hook capture : PASS (${hookProbe.feedbackId}, ${hookProbe.memoryId})`);
1397
+ }
1356
1398
  console.log('\nDogfood in chat with:');
1357
1399
  console.log(` thumbs ${normalized}: ${context}`);
1358
1400
  } else {
@@ -1361,6 +1403,9 @@ function feedbackSelfTest() {
1361
1403
  console.log(` Accepted : ${payload.accepted}`);
1362
1404
  console.log(` Feedback stored: ${feedbackStored}`);
1363
1405
  console.log(` Memory stored : ${memoryStored}`);
1406
+ if (hookProbe) {
1407
+ console.log(` Hook capture : ${hookProbe.ok ? 'true' : 'false'} (${hookProbe.actionType || 'no-action'})`);
1408
+ }
1364
1409
  console.log(` Storage : ${paths.FEEDBACK_DIR}`);
1365
1410
  }
1366
1411
 
@@ -2691,7 +2736,7 @@ function hookAutoCapture() {
2691
2736
  || readStdinText().trim();
2692
2737
  const { evaluatePromptGuard } = require(path.join(PKG_ROOT, 'scripts', 'prompt-guard'));
2693
2738
  const { processInlineFeedback, formatCliOutput } = require(path.join(PKG_ROOT, 'scripts', 'cli-feedback'));
2694
- const { detectFeedbackSignal } = require(path.join(PKG_ROOT, 'scripts', 'feedback-quality'));
2739
+ const { detectFeedbackSignal, isGenericFeedbackText } = require(path.join(PKG_ROOT, 'scripts', 'feedback-quality'));
2695
2740
  const { loadOptionalModule } = require(path.join(PKG_ROOT, 'scripts', 'private-core-boundary'));
2696
2741
  const { recordConversationEntry, readRecentConversationWindow } = loadOptionalModule(
2697
2742
  path.join(PKG_ROOT, 'scripts', 'feedback-history-distiller'),
@@ -2719,6 +2764,7 @@ function hookAutoCapture() {
2719
2764
  }
2720
2765
 
2721
2766
  const signal = detected.signal;
2767
+ const genericPrompt = isGenericFeedbackText(prompt, signal === 'down' ? 'negative' : 'positive');
2722
2768
  const conversationWindow = readRecentConversationWindow({ limit: 8 });
2723
2769
  const result = processInlineFeedback({
2724
2770
  signal,
@@ -2726,8 +2772,8 @@ function hookAutoCapture() {
2726
2772
  chatHistory: signal === 'down'
2727
2773
  ? conversationWindow.map((entry) => ({ role: entry.author === 'assistant' ? 'assistant' : 'user', content: entry.text || '' }))
2728
2774
  : undefined,
2729
- whatWentWrong: signal === 'down' ? prompt : undefined,
2730
- whatWorked: signal === 'up' ? prompt : undefined,
2775
+ whatWentWrong: signal === 'down' && !genericPrompt ? prompt : undefined,
2776
+ whatWorked: signal === 'up' && !genericPrompt ? prompt : undefined,
2731
2777
  });
2732
2778
  process.stdout.write(formatCliOutput(result) + '\n');
2733
2779
  }
@@ -3162,7 +3208,7 @@ const _wantsHelp = _cliSubArgs.includes('--help') || _cliSubArgs.includes('-h');
3162
3208
  const SUBCOMMAND_HELP = {
3163
3209
  capture: 'Usage: npx thumbgate capture --feedback=up|down --context="..." [--what-worked="..."] [--what-went-wrong="..."] [--what-to-change="..."] [--tags=a,b]',
3164
3210
  feedback: 'Usage: npx thumbgate feedback --feedback=up|down --context="..." [--what-worked="..."] [--what-went-wrong="..."] [--what-to-change="..."] [--tags=a,b]',
3165
- 'feedback-self-test': 'Usage: npx thumbgate feedback-self-test [--json] [--persist] [--feedback=up|down]\n\nCapture a synthetic thumbs signal and verify feedback-log + memory-log writes. Defaults to an isolated test store; use --persist to dogfood the active ThumbGate store.',
3211
+ 'feedback-self-test': 'Usage: npx thumbgate feedback-self-test [--json] [--persist] [--hook] [--feedback=up|down]\n\nCapture a synthetic thumbs signal and verify feedback-log + memory-log writes. Defaults to an isolated test store; use --hook to also prove UserPromptSubmit-style raw prompt auto-capture.',
3166
3212
  dogfood: 'Usage: npx thumbgate dogfood [--json] [--persist] [--feedback=up|down]\n\nAlias for feedback-self-test.',
3167
3213
  stats: 'Usage: npx thumbgate stats\n\nShow gate enforcement statistics: blocked/warned counts, active gates, time saved.',
3168
3214
  trial: 'Usage: npx thumbgate trial\n\nShow Pro trial status, remaining days, and upgrade path.',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.27.15",
3
+ "version": "1.27.16",
4
4
  "description": "ThumbGate self-improving agent governance: thumbs-up/down turns every mistake into a prevention rule and blocks repeat patterns. 36 pre-action checks, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
5
5
  "homepage": "https://thumbgate.ai",
6
6
  "repository": {
@@ -106,6 +106,7 @@
106
106
  "scripts/growth-campaigns.js",
107
107
  "scripts/harness-selector.js",
108
108
  "scripts/hf-papers.js",
109
+ "scripts/hob-pack.js",
109
110
  "scripts/hook-runtime.js",
110
111
  "scripts/hook-stop-anti-claim.js",
111
112
  "scripts/hook-thumbgate-cache-updater.js",
@@ -146,6 +147,7 @@
146
147
  "scripts/natural-language-harness.js",
147
148
  "scripts/noop-detect.js",
148
149
  "scripts/obsidian-export.js",
150
+ "scripts/omlx-smoke.js",
149
151
  "scripts/operational-integrity.js",
150
152
  "scripts/oss-pr-opportunity-scout.js",
151
153
  "scripts/otel-declarative-config.js",
@@ -312,12 +314,17 @@
312
314
  "stripe:live": "node scripts/stripe-live-status.js",
313
315
  "stripe:webhook:audit": "node scripts/rotate-stripe-webhook-secret.js --audit",
314
316
  "stripe:webhook:disable-legacy": "node scripts/rotate-stripe-webhook-secret.js --disable-legacy",
317
+ "omlx:smoke": "node scripts/omlx-smoke.js",
318
+ "omlx:smoke:chat": "node scripts/omlx-smoke.js --chat",
319
+ "omlx:smoke:json": "node scripts/omlx-smoke.js --json",
315
320
  "zai:smoke": "node scripts/zai-smoke.js",
316
321
  "gtm:revenue-loop": "node scripts/autonomous-sales-agent.js",
317
322
  "gtm:aiventyx": "node scripts/aiventyx-marketplace-plan.js",
318
323
  "gtm:chatgpt": "node scripts/chatgpt-gpt-revenue-pack.js",
319
324
  "gtm:codex": "node scripts/codex-marketplace-revenue-pack.js",
320
325
  "gtm:linkedin": "node scripts/linkedin-workflow-hardening-pack.js",
326
+ "gtm:hob-pack": "node scripts/hob-pack.js",
327
+ "gtm:hob-pack:write": "node scripts/hob-pack.js --write",
321
328
  "gtm:okara-automation": "node scripts/okara-money-promo-automation.js",
322
329
  "gtm:okara-automation:write": "node scripts/okara-money-promo-automation.js --write",
323
330
  "gtm:roo-sunset": "node scripts/roo-sunset-demand-pack.js",
@@ -378,7 +385,7 @@
378
385
  "social:prospect:bluesky": "node scripts/social-bluesky-prospecting.js",
379
386
  "social:prospect:bluesky:dry": "node scripts/social-bluesky-prospecting.js --dry-run",
380
387
  "social:reply-publish:bluesky:dry": "node scripts/social-reply-monitor-bluesky.js --publish-approved --dry-run",
381
- "test": "npm run test:python && 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:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:post-everywhere-channels && 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:repeat-metric && npm run test:noop-detect && npm run test:action-receipts && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:memory-scope-readiness && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operational-dashboard && npm run test:operator-artifacts && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:mcp-tool-annotations && npm run test:mcp-oauth && npm run test:mcp-oauth-flow && npm run test:plan-gate && npm run test:ai-component-inventory && 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:audit-pr-bot-contamination && npm run test:stripe-bootstrap-saas-catalog && 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:statusline-cache-aggregate && npm run test:public-repo-hygiene && npm run test:no-internal-orchestration-leaks && 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:lesson-semantic-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:predictive-credible-range && 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-archived-product-guard && npm run test:postgres-guard && npm run test:checkout-bot-guard && npm run test:checkout-pro-confirmation-gate && npm run test:pricing-page-telemetry && 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:telemetry-tracked-link-slug && npm run test:prompt-eval && 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:competitive-positioning-marketing && npm run test:medium-weekly && 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:agent-reasoning-traces && npm run test:judge-reward && npm run test:llm-behavior-monitor && npm run test:prompting-os && npm run test:single-use-credential-gate && npm run test:structured-prompt-driven && 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 && npm run test:actionable-remediations && npm run test:gemini-embedding-policy && npm run test:agent-design-governance && npm run test:public-core-boundary && npm run test:hook-stop-verify-deploy && npm run test:hook-stop-anti-claim && npm run test:plausible-server-events && npm run test:activation-tracker && npm run test:activation-onboarding && npm run test:unified-revenue-rollup && npm run test:conversion-rate-stats && npm run test:external-customer-audit && npm run test:telemetry-export && npm run test:stripe-checkout-diagnostic && npm run test:stripe-business-identity-probe && npm run test:revenue-observability-doctor && npm run test:public-bundle-ratchet && npm run test:stripe-payment-link-update && npm run test:ci-cd-hygiene-audit && npm run test:verify-marketing-pages-deployed && npm run test:install-email-capture && npm run test:install-shim && npm run test:hook-runtime-subcommands && npm run test:implementation-notes && npm run test:daily-block-cap && npm run test:free-to-paid-conversion-units && npm run test:metrics-real-endpoint && npm run test:cli-trial-and-help && npm run test:cost-cli && npm run test:silent-failure-cluster && npm run test:proof:truth && node --test tests/adaptive-reliability.test.js && npm run test:mcp-oauth-reviewer && npm run test:dfcx-gate && npm run test:dfcx-gate-server && npm run test:vertex-scorer && npm run test:dashboard-chat && npm run test:gitar-integration && npm run test:secret-redaction && npm run test:discoverable-skills && npm run test:discoverable-skill-skills && npm run test:sync-telemetry && npm run test:leak-scanner && npm run test:team-sync && npm run test:eval-rag && npm run test:async-eval-observability && npm run test:letta-adapter && npm run test:policy-engine-adapter && npm run test:tool-contract-validator && npm run test:check-update && npm run test:hermes-gate && npm run test:memory-provider-enforcement-bridge && npm run test:publisher-credential-guards && npm run test:reddit-browser-notification-watch && npm run test:payment-rails",
388
+ "test": "npm run test:python && 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:platform-limits && npm run test:post-video && npm run test:post-everywhere-instagram && npm run test:post-everywhere-channels && 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:repeat-metric && npm run test:noop-detect && npm run test:action-receipts && npm run test:feedback-to-rules && npm run test:memory-firewall && npm run test:memory-scope-readiness && npm run test:belief-update && npm run test:hosted-config && npm run test:operational-summary && npm run test:operational-dashboard && npm run test:operator-artifacts && npm run test:operator-key-auth && npm run test:cloudflare-sandbox && npm run test:mcp-config && npm run test:mcp-tool-annotations && npm run test:mcp-oauth && npm run test:mcp-oauth-flow && npm run test:plan-gate && npm run test:ai-component-inventory && 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:audit-pr-bot-contamination && npm run test:stripe-bootstrap-saas-catalog && 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:statusline-cache-aggregate && npm run test:public-repo-hygiene && npm run test:no-internal-orchestration-leaks && 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:lesson-semantic-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:predictive-credible-range && 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-archived-product-guard && npm run test:postgres-guard && npm run test:checkout-bot-guard && npm run test:checkout-pro-confirmation-gate && npm run test:pricing-page-telemetry && 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:telemetry-tracked-link-slug && npm run test:prompt-eval && 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:competitive-positioning-marketing && npm run test:medium-weekly && 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:agent-reasoning-traces && npm run test:judge-reward && npm run test:llm-behavior-monitor && npm run test:prompting-os && npm run test:single-use-credential-gate && npm run test:structured-prompt-driven && 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 && npm run test:actionable-remediations && npm run test:gemini-embedding-policy && npm run test:agent-design-governance && npm run test:public-core-boundary && npm run test:hook-stop-verify-deploy && npm run test:hook-stop-anti-claim && npm run test:plausible-server-events && npm run test:activation-tracker && npm run test:activation-onboarding && npm run test:unified-revenue-rollup && npm run test:conversion-rate-stats && npm run test:external-customer-audit && npm run test:telemetry-export && npm run test:stripe-checkout-diagnostic && npm run test:stripe-business-identity-probe && npm run test:revenue-observability-doctor && npm run test:public-bundle-ratchet && npm run test:stripe-payment-link-update && npm run test:ci-cd-hygiene-audit && npm run test:verify-marketing-pages-deployed && npm run test:install-email-capture && npm run test:install-shim && npm run test:hook-runtime-subcommands && npm run test:implementation-notes && npm run test:daily-block-cap && npm run test:free-to-paid-conversion-units && npm run test:metrics-real-endpoint && npm run test:cli-trial-and-help && npm run test:cost-cli && npm run test:silent-failure-cluster && npm run test:proof:truth && node --test tests/adaptive-reliability.test.js && npm run test:mcp-oauth-reviewer && npm run test:dfcx-gate && npm run test:dfcx-gate-server && npm run test:vertex-scorer && npm run test:dashboard-chat && npm run test:gitar-integration && npm run test:secret-redaction && npm run test:discoverable-skills && npm run test:discoverable-skill-skills && npm run test:sync-telemetry && npm run test:leak-scanner && npm run test:team-sync && npm run test:eval-rag && npm run test:async-eval-observability && npm run test:letta-adapter && npm run test:policy-engine-adapter && npm run test:tool-contract-validator && npm run test:check-update && npm run test:hermes-gate && npm run test:memory-provider-enforcement-bridge && npm run test:publisher-credential-guards && npm run test:reddit-browser-notification-watch && npm run test:payment-rails && npm run test:cursor-marketplace-doctor && npm run test:okara-money-promo-automation",
382
389
  "test:python": "python3 -m pytest tests/*.py",
383
390
  "test:check-update": "node --test tests/check-update.test.js",
384
391
  "test:hook-stop-verify-deploy": "node --test tests/hook-stop-verify-deploy.test.js",
@@ -653,6 +660,7 @@
653
660
  "test:ai-search-visibility": "node --test tests/ai-search-visibility.test.js",
654
661
  "test:security-scanner": "node --test tests/security-scanner.test.js",
655
662
  "test:llm-client": "node --test tests/llm-client.test.js",
663
+ "test:omlx-smoke": "node --test tests/omlx-smoke.test.js",
656
664
  "test:model-candidates": "node --test tests/model-candidates.test.js",
657
665
  "test:managed-lesson-agent": "node --test tests/managed-lesson-agent.test.js",
658
666
  "agent:run": "node scripts/managed-lesson-agent.js",
@@ -689,12 +697,13 @@
689
697
  "test:gate-coherence": "node --test tests/gate-coherence.test.js",
690
698
  "test:gate-eval": "node --test tests/gate-eval.test.js",
691
699
  "gate-eval:ci": "node scripts/gate-eval.js run",
700
+ "test:hob-pack": "node --test tests/hob-pack.test.js",
692
701
  "test:ai-engineering-stack-guardrails": "node --test tests/ai-engineering-stack-guardrails.test.js",
693
702
  "test:ai-component-inventory": "node --test tests/ai-component-inventory.test.js",
694
703
  "test:interaction-model": "node --test tests/interaction-model.test.js tests/interaction-model-e2e.test.js",
695
704
  "aws-blocks:guardrails": "node scripts/aws-blocks-guardrails.js",
696
705
  "test:aws-blocks-guardrails": "node --test tests/aws-blocks-guardrails.test.js",
697
- "test:high-roi": "node --test tests/high-roi.test.js tests/model-candidates.test.js tests/autonomous-workflow.test.js tests/high-roi-agent-workflows.test.js tests/interaction-model.test.js tests/interaction-model-e2e.test.js tests/code-graph-guardrails.test.js tests/proxy-pointer-rag-guardrails.test.js tests/rag-precision-guardrails.test.js tests/ai-engineering-stack-guardrails.test.js tests/long-running-agent-context-guardrails.test.js tests/reasoning-efficiency-guardrails.test.js tests/deepseek-v4-runtime-guardrails.test.js tests/upstream-contribution-engine.test.js tests/proactive-agent-eval-guardrails.test.js tests/reward-hacking-guardrails.test.js tests/chatgpt-ads-readiness-pack.test.js tests/oss-pr-opportunity-scout.test.js tests/agent-design-governance.test.js tests/gemini-embedding-policy.test.js tests/openclaw-agent-governance-kit.test.js tests/agent-operations-planner.test.js tests/aws-blocks-guardrails.test.js",
706
+ "test:high-roi": "node --test tests/high-roi.test.js tests/model-candidates.test.js tests/autonomous-workflow.test.js tests/high-roi-agent-workflows.test.js tests/interaction-model.test.js tests/interaction-model-e2e.test.js tests/code-graph-guardrails.test.js tests/proxy-pointer-rag-guardrails.test.js tests/rag-precision-guardrails.test.js tests/ai-engineering-stack-guardrails.test.js tests/long-running-agent-context-guardrails.test.js tests/reasoning-efficiency-guardrails.test.js tests/deepseek-v4-runtime-guardrails.test.js tests/upstream-contribution-engine.test.js tests/proactive-agent-eval-guardrails.test.js tests/reward-hacking-guardrails.test.js tests/chatgpt-ads-readiness-pack.test.js tests/oss-pr-opportunity-scout.test.js tests/agent-design-governance.test.js tests/gemini-embedding-policy.test.js tests/openclaw-agent-governance-kit.test.js tests/agent-operations-planner.test.js tests/aws-blocks-guardrails.test.js tests/hob-pack.test.js",
698
707
  "test:public-static-assets": "node --test tests/public-static-assets.test.js",
699
708
  "test:token-savings": "node --test tests/token-savings.test.js",
700
709
  "test:cost-cli": "node --test tests/cost-cli.test.js tests/conversion-receipt.test.js",
package/public/index.html CHANGED
@@ -20,7 +20,7 @@ __GOOGLE_SITE_VERIFICATION_META__
20
20
  <meta property="og:image" content="https://thumbgate.ai/og.png">
21
21
  <meta name="twitter:card" content="summary_large_image">
22
22
  <meta name="twitter:image" content="https://thumbgate.ai/og.png">
23
- <meta name="thumbgate-version" content="1.27.8">
23
+ <meta name="thumbgate-version" content="1.27.16">
24
24
  <meta name="keywords" content="ThumbGate, thumbgate, AI agent orchestration, AI experience orchestration, agentic development cycle, AC/DC framework, Guide Generate Verify Solve, agent enforcement layer, save LLM tokens, reduce Claude API cost, reduce OpenAI cost, AI agent token savings, prevent LLM retries, prevent hallucination retries, stop AI token waste, pre-action checks, agent governance, Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode, workflow hardening, context engineering, AI authenticity, brand authenticity AI">
25
25
  <link rel="canonical" href="__APP_ORIGIN__/">
26
26
  <link rel="alternate" type="text/markdown" title="ThumbGate LLM context" href="__APP_ORIGIN__/llm-context.md">
@@ -1815,7 +1815,7 @@ __GA_BOOTSTRAP__
1815
1815
  <a href="https://www.linkedin.com/in/igorganapolsky" target="_blank" rel="noopener">LinkedIn</a>
1816
1816
  <a href="/blog">Blog</a>
1817
1817
  </div>
1818
- <span class="footer-copy">© 2026 ThumbGate · MIT License · npm v1.27.8</span>
1818
+ <span class="footer-copy">© 2026 ThumbGate · MIT License · npm v1.27.16</span>
1819
1819
  </div>
1820
1820
  </footer>
1821
1821
 
@@ -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.27.8",
28
+ "softwareVersion": "1.27.16",
29
29
  "url": "https://thumbgate.ai/numbers",
30
30
  "dateModified": "2026-05-07",
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-05-07 · Version 1.27.8</div>
205
+ <div class="freshness">Updated: 2026-05-07 · Version 1.27.16</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>
@@ -14,6 +14,7 @@
14
14
  */
15
15
 
16
16
  const { captureFeedback } = require('./feedback-loop');
17
+ const { isGenericFeedbackText, normalizeFeedbackSignal } = require('./feedback-quality');
17
18
  const { loadOptionalModule } = require('./private-core-boundary');
18
19
  // `history-distiller` is a PRIVATE_CORE_MODULE — present in this checkout and
19
20
  // in ThumbGate-Core, but intentionally excluded from the public npm tarball.
@@ -47,15 +48,21 @@ const RST = '\x1b[0m';
47
48
  */
48
49
  function processInlineFeedback({ signal, context, chatHistory, whatWentWrong, whatWorked } = {}) {
49
50
  const isDown = signal === 'down' || signal === 'negative';
51
+ const normalizedQualitySignal = normalizeFeedbackSignal(isDown ? 'down' : 'up');
52
+ const providedContext = String(context || '').trim();
53
+ const genericContext = isGenericFeedbackText(providedContext, normalizedQualitySignal);
54
+ const effectiveWhatWentWrong = whatWentWrong || (isDown && providedContext && !genericContext ? providedContext : undefined);
55
+ const effectiveWhatWorked = whatWorked || (!isDown && providedContext && !genericContext ? providedContext : undefined);
50
56
 
51
57
  // 1. Capture the feedback
52
58
  let feedbackResult;
53
59
  try {
54
60
  feedbackResult = captureFeedback({
55
61
  signal: isDown ? 'down' : 'up',
56
- context: context || (isDown ? 'Thumbs down from CLI' : 'Thumbs up from CLI'),
57
- whatWentWrong: whatWentWrong || undefined,
58
- whatWorked: whatWorked || undefined,
62
+ context: providedContext,
63
+ chatHistory,
64
+ whatWentWrong: effectiveWhatWentWrong,
65
+ whatWorked: effectiveWhatWorked,
59
66
  });
60
67
  } catch (err) {
61
68
  feedbackResult = { accepted: false, reason: err.message };
@@ -97,7 +104,10 @@ function formatCliOutput(result) {
97
104
  process.stderr.write(`✅ Feedback captured (${feedbackId}${memoryId ? `, ${memoryId}` : ''})\n`);
98
105
  }
99
106
  } else {
100
- lines.push(`${R}Feedback not accepted: ${(result.feedbackResult && result.feedbackResult.reason) || 'unknown'}${RST}`);
107
+ const clarification = result.feedbackResult && result.feedbackResult.needsClarification
108
+ ? ` ${result.feedbackResult.prompt || result.feedbackResult.message || ''}`.trimEnd()
109
+ : '';
110
+ lines.push(`${R}Feedback not accepted: ${(result.feedbackResult && result.feedbackResult.reason) || 'unknown'}${clarification ? ` — ${clarification}` : ''}${RST}`);
101
111
  }
102
112
 
103
113
  // Distilled lesson (if thumbs down)