thumbgate 1.27.14 → 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.
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/mcp/server-card.json +1 -1
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/mcp/server-stdio.js +1 -1
- package/adapters/opencode/opencode.json +1 -1
- package/bin/cli.js +52 -6
- package/package.json +12 -3
- package/public/index.html +2 -2
- package/public/numbers.html +2 -2
- package/scripts/agent-readiness.js +6 -1
- package/scripts/cli-feedback.js +14 -4
- package/scripts/hob-pack.js +591 -0
- package/scripts/llm-client.js +114 -1
- package/scripts/omlx-smoke.js +192 -0
|
@@ -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.
|
|
4
|
+
"version": "1.27.16",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Igor Ganapolsky",
|
|
7
7
|
"email": "ig5973700@gmail.com",
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"thumbgate": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["--yes", "--package", "thumbgate@1.27.
|
|
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.
|
|
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.
|
|
234
|
+
const SERVER_INFO = { name: 'thumbgate-mcp', version: '1.27.16' };
|
|
235
235
|
const COMMERCE_CATEGORIES = [
|
|
236
236
|
'product_recommendation',
|
|
237
237
|
'brand_compliance',
|
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
|
-
|
|
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 --
|
|
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.
|
|
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.
|
|
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.
|
|
1818
|
+
<span class="footer-copy">© 2026 ThumbGate · MIT License · npm v1.27.16</span>
|
|
1819
1819
|
</div>
|
|
1820
1820
|
</footer>
|
|
1821
1821
|
|
package/public/numbers.html
CHANGED
|
@@ -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.
|
|
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.
|
|
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>
|
|
@@ -222,7 +222,10 @@ function probeFeedbackCapture(projectRoot) {
|
|
|
222
222
|
const previousNoNudge = process.env.THUMBGATE_NO_NUDGE;
|
|
223
223
|
|
|
224
224
|
process.env.THUMBGATE_FEEDBACK_DIR = tempDir;
|
|
225
|
-
|
|
225
|
+
// Keep this probe isolated. Direct project scope intentionally overrides
|
|
226
|
+
// THUMBGATE_FEEDBACK_DIR in the runtime resolver, which is correct for real
|
|
227
|
+
// project writes but wrong for a doctor self-test.
|
|
228
|
+
delete process.env.THUMBGATE_PROJECT_DIR;
|
|
226
229
|
process.env.THUMBGATE_NO_NUDGE = '1';
|
|
227
230
|
|
|
228
231
|
try {
|
|
@@ -252,6 +255,7 @@ function probeFeedbackCapture(projectRoot) {
|
|
|
252
255
|
feedbackId: feedbackId || null,
|
|
253
256
|
memoryId: memoryId || null,
|
|
254
257
|
mode: 'isolated-temp-store',
|
|
258
|
+
feedbackDir: paths.FEEDBACK_DIR,
|
|
255
259
|
recommendation: (result.accepted && feedbackStored && memoryStored)
|
|
256
260
|
? 'Feedback capture writes durable feedback and memory records.'
|
|
257
261
|
: 'Feedback capture did not persist both feedback and memory records; run `npx thumbgate feedback-self-test --json`.',
|
|
@@ -265,6 +269,7 @@ function probeFeedbackCapture(projectRoot) {
|
|
|
265
269
|
feedbackId: null,
|
|
266
270
|
memoryId: null,
|
|
267
271
|
mode: 'isolated-temp-store',
|
|
272
|
+
feedbackDir: tempDir,
|
|
268
273
|
error: error && error.message ? error.message : String(error),
|
|
269
274
|
recommendation: 'Feedback capture probe failed; run `npx thumbgate feedback-self-test --json` for details.',
|
|
270
275
|
};
|
package/scripts/cli-feedback.js
CHANGED
|
@@ -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:
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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)
|