thumbgate 1.30.0 โ†’ 1.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.well-known/mcp/server-card.json +1 -1
  3. package/README.md +54 -16
  4. package/adapters/claude/.mcp.json +2 -2
  5. package/adapters/forge/forge.yaml +3 -3
  6. package/adapters/mcp/server-stdio.js +66 -8
  7. package/adapters/opencode/opencode.json +1 -1
  8. package/bench/observability-eval-suite.json +2 -2
  9. package/bin/cli.js +147 -31
  10. package/config/evals/generation-quality-golden.json +95 -0
  11. package/config/evals/rag-answer-quality-golden.json +91 -0
  12. package/config/evals/retrieval-hybrid-ablation.json +66 -0
  13. package/config/evals/retrieval-ranking-golden.json +522 -0
  14. package/config/gates/default.json +217 -50
  15. package/config/mcp-allowlists.json +212 -206
  16. package/config/model-tiers.json +7 -2
  17. package/glama.json +6 -0
  18. package/package.json +60 -8
  19. package/public/assets/diagrams/before-after.svg +17 -16
  20. package/public/assets/diagrams/hero-thumbs.svg +68 -0
  21. package/public/assets/diagrams/loop.svg +19 -13
  22. package/public/assets/diagrams/self-improving-thumbs-loop.svg +105 -0
  23. package/public/compare.html +1 -0
  24. package/public/dashboard.html +126 -28
  25. package/public/evaluations.html +1 -1
  26. package/public/index.html +142 -13
  27. package/public/numbers.html +3 -2
  28. package/public/pricing.html +143 -30
  29. package/scripts/a-plus-evidence-scorecard.js +303 -0
  30. package/scripts/async-eval-observability.js +36 -11
  31. package/scripts/audit-trail.js +37 -1
  32. package/scripts/auto-promote-gates.js +149 -34
  33. package/scripts/colbert-style-maxsim.js +236 -0
  34. package/scripts/cross-encoder-reranker.js +356 -126
  35. package/scripts/dashboard-chat.js +350 -17
  36. package/scripts/document-intake.js +283 -7
  37. package/scripts/eval-quality-suite.js +204 -0
  38. package/scripts/feedback-loop.js +115 -7
  39. package/scripts/feedback-paths.js +32 -13
  40. package/scripts/feedback-quality.js +53 -0
  41. package/scripts/filesystem-search.js +17 -7
  42. package/scripts/gates-engine.js +17 -0
  43. package/scripts/harness-tool-names.js +70 -0
  44. package/scripts/hook-runtime.js +10 -3
  45. package/scripts/lesson-db.js +16 -5
  46. package/scripts/lesson-embedding-index.js +67 -20
  47. package/scripts/lesson-embedding-maintenance.js +177 -0
  48. package/scripts/lesson-reranker.js +55 -9
  49. package/scripts/lesson-retrieval.js +305 -29
  50. package/scripts/lesson-search.js +22 -8
  51. package/scripts/llm-client.js +304 -15
  52. package/scripts/model-tier-router.js +593 -0
  53. package/scripts/pragmatic-hybrid-search.js +379 -0
  54. package/scripts/rag-document-pipeline.js +461 -0
  55. package/scripts/rag-structured-output.js +441 -0
  56. package/scripts/ragas-style-metrics.js +351 -0
  57. package/scripts/request-envelope.js +178 -0
  58. package/scripts/rerank-pipeline.js +370 -0
  59. package/scripts/rerank-quality-eval.js +155 -0
  60. package/scripts/retrieval-hybrid-ablation.js +120 -0
  61. package/scripts/retrieval-quality-tier.js +118 -0
  62. package/scripts/secret-scanner.js +395 -4
  63. package/scripts/self-distill-agent.js +7 -1
  64. package/scripts/self-healing-check.js +25 -0
  65. package/scripts/skill-packs.js +183 -0
  66. package/scripts/slow-loop.js +72 -0
  67. package/scripts/statusline-links.js +1 -1
  68. package/scripts/statusline.sh +8 -1
  69. package/scripts/telemetry-analytics.js +13 -1
  70. package/scripts/thumbgate-search.js +98 -6
  71. package/scripts/tier-budget-guard.js +186 -0
  72. package/scripts/tool-registry.js +46 -0
  73. package/scripts/vector-store.js +108 -4
  74. package/scripts/verify-marketing-pages-deployed.js +85 -3
  75. package/server.json +44 -0
  76. package/smithery.yaml +17 -0
  77. package/src/api/server.js +194 -13
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thumbgate",
3
- "version": "1.30.0",
3
+ "version": "1.31.0",
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": {
@@ -28,6 +28,7 @@
28
28
  "scripts/agent-memory-lifecycle.js",
29
29
  "scripts/agent-readiness-plan.js",
30
30
  "scripts/agent-readiness.js",
31
+ "scripts/a-plus-evidence-scorecard.js",
31
32
  "scripts/agent-operations-planner.js",
32
33
  "scripts/agent-reasoning-traces.js",
33
34
  "scripts/agent-reward-model.js",
@@ -53,6 +54,7 @@
53
54
  "scripts/bot-detection.js",
54
55
  "scripts/build-metadata.js",
55
56
  "scripts/classifier-routing.js",
57
+ "scripts/colbert-style-maxsim.js",
56
58
  "scripts/cross-encoder-reranker.js",
57
59
  "scripts/chatgpt-ads-readiness-pack.js",
58
60
  "scripts/claude-feedback-sync.js",
@@ -83,6 +85,11 @@
83
85
  "scripts/deepseek-v4-runtime-guardrails.js",
84
86
  "scripts/docker-sandbox-planner.js",
85
87
  "scripts/document-intake.js",
88
+ "scripts/rag-document-pipeline.js",
89
+ "scripts/ragas-style-metrics.js",
90
+ "scripts/skill-packs.js",
91
+ "scripts/lesson-embedding-maintenance.js",
92
+ "scripts/retrieval-hybrid-ablation.js",
86
93
  "scripts/document-workflow-governance.js",
87
94
  "scripts/durability/step.js",
88
95
  "scripts/evolution-state.js",
@@ -91,6 +98,7 @@
91
98
  "scripts/explore.js",
92
99
  "scripts/export-databricks-bundle.js",
93
100
  "scripts/entitlement.js",
101
+ "scripts/eval-quality-suite.js",
94
102
  "config/entitlement-public-keys.json",
95
103
  "scripts/external-customer-audit.js",
96
104
  "scripts/stripe-revenue-catalog.js",
@@ -114,6 +122,7 @@
114
122
  "scripts/grafana-revenue-evidence.js",
115
123
  "scripts/gate-stats.js",
116
124
  "scripts/gate-templates.js",
125
+ "scripts/harness-tool-names.js",
117
126
  "scripts/gates-engine.js",
118
127
  "scripts/gemini-embedding-policy.js",
119
128
  "scripts/growth-campaigns.js",
@@ -159,6 +168,7 @@
159
168
  "scripts/meta-agent-loop.js",
160
169
  "scripts/model-access-eligibility.js",
161
170
  "scripts/model-migration-readiness.js",
171
+ "scripts/model-tier-router.js",
162
172
  "scripts/multimodal-retrieval-plan.js",
163
173
  "scripts/native-messaging-audit.js",
164
174
  "scripts/natural-language-harness.js",
@@ -197,6 +207,11 @@
197
207
  "scripts/rate-limiter.js",
198
208
  "scripts/reasoning-efficiency-guardrails.js",
199
209
  "scripts/repeat-metric.js",
210
+ "scripts/rerank-pipeline.js",
211
+ "scripts/rerank-quality-eval.js",
212
+ "scripts/request-envelope.js",
213
+ "scripts/retrieval-quality-tier.js",
214
+ "scripts/tier-budget-guard.js",
200
215
  "scripts/revenue-action-eligibility.js",
201
216
  "scripts/revenue-evidence-remediation.js",
202
217
  "scripts/reward-hacking-guardrails.js",
@@ -224,6 +239,7 @@
224
239
  "scripts/single-use-credential-gate.js",
225
240
  "scripts/skill-generator.js",
226
241
  "scripts/skill-rag-router.js",
242
+ "scripts/slow-loop.js",
227
243
  "scripts/slo-alert-engine.js",
228
244
  "scripts/spec-gate.js",
229
245
  "scripts/stripe-credentials.js",
@@ -336,7 +352,12 @@
336
352
  "src/",
337
353
  "scripts/generate-eval-scorecard.js",
338
354
  "scripts/refresh-proof-pack.js",
339
- "scripts/generate-case-study-outreach.js"
355
+ "scripts/generate-case-study-outreach.js",
356
+ "scripts/rag-structured-output.js",
357
+ "scripts/pragmatic-hybrid-search.js",
358
+ "server.json",
359
+ "glama.json",
360
+ "smithery.yaml"
340
361
  ],
341
362
  "scripts": {
342
363
  "canary:snapshot": "node scripts/gate-decision-canary.js --snapshot",
@@ -439,7 +460,7 @@
439
460
  "social:prospect:bluesky": "node scripts/social-bluesky-prospecting.js",
440
461
  "social:prospect:bluesky:dry": "node scripts/social-bluesky-prospecting.js --dry-run",
441
462
  "social:reply-publish:bluesky:dry": "node scripts/social-reply-monitor-bluesky.js --publish-approved --dry-run",
442
- "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:proof-pack-cadence && npm run test:grafana-revenue-evidence && npm run test:billing && npm run test:billing-setup && 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:canary && 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:release-window && 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:verification-evidence && 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:entitlement && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:imperative-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:xss-checkout-escape && 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:stop-hook-json-contract && 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:jsonl-window && npm run test:observability-env && npm run test:public-bundle-ratchet && npm run test:pack-runtime-integrity && npm run test:hook-self-protection && npm run test:self-protect-enforcement && npm run test:never-bypass-branch-protection && 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:service-checkout-price-integrity && npm run test:cursor-marketplace-doctor && npm run test:plugin-hooks-manifest && npm run test:okara-money-promo-automation && npm run test:retrieval-window && npm run test:risk-quality && npm run test:eval-mining && npm run test:state-backup && npm run test:eval-golden && npm run test:task-scope-lease",
463
+ "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:proof-pack-cadence && npm run test:grafana-revenue-evidence && npm run test:billing && npm run test:billing-setup && 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:canary && 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:release-window && 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:verification-evidence && 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:entitlement && npm run test:export-dpo-pairs && npm run test:export-hf-dataset && npm run test:license && npm run test:imperative-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:xss-checkout-escape && 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:stop-hook-json-contract && 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:jsonl-window && npm run test:observability-env && npm run test:glama-mcp && npm run test:prove-glama-mcp && npm run test:public-bundle-ratchet && npm run test:pack-runtime-integrity && npm run test:hook-self-protection && npm run test:self-protect-enforcement && npm run test:never-bypass-branch-protection && 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:rag-pipeline && npm run test:autonomous-reliability && 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:service-checkout-price-integrity && npm run test:cursor-marketplace-doctor && npm run test:plugin-hooks-manifest && npm run test:okara-money-promo-automation && npm run test:retrieval-window && npm run test:risk-quality && npm run test:eval-mining && npm run test:state-backup && npm run test:eval-golden && npm run test:task-scope-lease && npm run test:evaluations-page && npm run test:agent-install-paths && npm run test:mcp-gate-check && npm run test:adapter-pins && npm run test:secret-egress && npm run test:harness-tool-names && npm run test:feedback-reward && npm run test:capability-wiring",
443
464
  "test:python": "python3 -m pytest tests/*.py",
444
465
  "test:check-update": "node --test tests/check-update.test.js",
445
466
  "test:hook-stop-verify-deploy": "node --test tests/hook-stop-verify-deploy.test.js",
@@ -490,9 +511,11 @@
490
511
  "eval:feedback-quality": "python3 scripts/feedback_quality_eval.py",
491
512
  "eval:classifier": "python3 scripts/eval_gate_classifier.py",
492
513
  "eval:rag": "node scripts/eval-rag.js",
493
- "test:eval-rag": "node --test tests/eval-rag.test.js",
514
+ "eval:quality": "node scripts/eval-quality-suite.js",
515
+ "test:eval-quality": "node --test tests/ragas-style-metrics.test.js tests/retrieval-ranking-eval.test.js tests/ir-metrics.test.js",
516
+ "test:eval-rag": "node --test tests/eval-rag.test.js tests/retrieval-hybrid-ablation.test.js",
494
517
  "eval:async-observability": "node scripts/async-eval-observability.js",
495
- "test:async-eval-observability": "node --test tests/async-eval-observability.test.js",
518
+ "test:async-eval-observability": "node --test tests/async-eval-observability.test.js tests/rag-answer-metrics.test.js",
496
519
  "test:decision-trace": "node --test tests/decision-trace.test.js",
497
520
  "test:feedback-fallback": "node --test tests/feedback-fallback.test.js",
498
521
  "test:metaclaw": "node --test tests/metaclaw-features.test.js",
@@ -669,8 +692,11 @@
669
692
  "test:data-governance": "node --test tests/data-governance.test.js",
670
693
  "test:lesson-inference": "node --test tests/conversation-context.test.js tests/lesson-inference.test.js tests/lesson-prompt-shape.test.js tests/lesson-stats-review-origin.test.js",
671
694
  "test:lesson-retrieval": "node --test tests/lesson-retrieval.test.js",
672
- "test:lesson-semantic-retrieval": "node --test tests/lesson-semantic-retrieval.test.js",
695
+ "test:lesson-semantic-retrieval": "node --test tests/lesson-semantic-retrieval.test.js tests/lesson-embedding-maintenance.test.js",
673
696
  "test:cross-encoder": "node --test tests/cross-encoder-reranker.test.js",
697
+ "test:colbert-maxsim": "node --test tests/colbert-style-maxsim.test.js",
698
+ "test:rerank-pipeline": "node --test tests/rerank-pipeline.test.js",
699
+ "eval:rerank": "node scripts/rerank-quality-eval.js",
674
700
  "test:reflector-agent": "node --test tests/reflector-agent.test.js",
675
701
  "test:public-core-boundary": "node --test tests/public-core-boundary.test.js",
676
702
  "test:feedback-session": "node --test tests/feedback-session.test.js",
@@ -820,9 +846,10 @@
820
846
  "test:dashboard-page-clickability": "playwright test tests/e2e/dashboard-page-clickability.spec.js",
821
847
  "test:agent-manager-page-clickability": "playwright test tests/e2e/agent-manager-page-clickability.spec.js",
822
848
  "test:pricing-page-clickability": "playwright test tests/e2e/pricing-page-clickability.spec.js",
823
- "test:proof:truth": "node --test tests/knowledge-entropy.test.js tests/mcp-wiring-doctor.test.js tests/sequence-guard.test.js tests/slopsquat-guard.test.js tests/slopsquat-stress.test.js tests/truth-and-proof.test.js tests/wire-proof-gate.test.js tests/adaptive-reliability.test.js tests/coderabbit-patterns.test.js",
849
+ "test:proof:truth": "node --test tests/knowledge-entropy.test.js tests/mcp-wiring-doctor.test.js tests/sequence-guard.test.js tests/slopsquat-guard.test.js tests/slopsquat-stress.test.js tests/truth-and-proof.test.js tests/wire-proof-gate.test.js tests/adaptive-reliability.test.js tests/coderabbit-patterns.test.js && npm run test:capability-wiring && npm run test:colbert-maxsim && npm run test:rerank-pipeline && npm run test:eval-quality && npm run test:llm-gateway && npm run test:request-envelope && npm run test:a-plus-evidence",
824
850
  "build:grok-plugin": "node scripts/build-grok-plugin.js",
825
851
  "feedback:ingest": "node scripts/ingest-manual-feedback.js",
852
+ "feedback:slow-loop": "node -e \"console.log(JSON.stringify(require('./scripts/slow-loop').runSlowLoop(), null, 2))\"",
826
853
  "verify-proof": "node scripts/require-proof.js",
827
854
  "test:mcp-oauth-reviewer": "node --test tests/mcp-oauth-reviewer.test.js",
828
855
  "test:dashboard-chat": "node --test tests/dashboard-chat.test.js",
@@ -869,7 +896,31 @@
869
896
  "proof-pack:refresh:check": "node scripts/refresh-proof-pack.js --check",
870
897
  "proof-pack:schedule": "node scripts/schedule-manager.js install --label proof-pack-scorecard --spec 'daily 06:15' --command 'npm run proof-pack:refresh' --workingDirectory .",
871
898
  "outreach:case-study": "node scripts/generate-case-study-outreach.js",
872
- "test:proof-pack-cadence": "node --test tests/refresh-proof-pack.test.js tests/case-study-outreach.test.js"
899
+ "test:proof-pack-cadence": "node --test tests/refresh-proof-pack.test.js tests/case-study-outreach.test.js",
900
+ "test:evaluations-page": "node --test tests/evaluations-page.test.js",
901
+ "prove:rag": "node scripts/prove-rag-pipeline.js",
902
+ "test:rag-pipeline": "node --test tests/rag-document-pipeline.test.js tests/rag-structured-output.test.js tests/rag-stage-contracts.test.js tests/prove-rag-pipeline.test.js tests/ir-metrics.test.js tests/retrieval-ranking-eval.test.js tests/pragmatic-hybrid-search.test.js",
903
+ "eval:ranking": "node scripts/retrieval-ranking-eval.js",
904
+ "test:ir-metrics": "node --test tests/ir-metrics.test.js tests/retrieval-ranking-eval.test.js",
905
+ "test:pragmatic-hybrid": "node --test tests/pragmatic-hybrid-search.test.js",
906
+ "explore:reliability": "node scripts/autonomous-reliability-explorer.js --seed=1 --iterations=12",
907
+ "test:autonomous-reliability": "node --test tests/autonomous-reliability-explorer.test.js tests/prove-reliability.test.js",
908
+ "prove:reliability": "node scripts/prove-reliability.js",
909
+ "explore:reliability:ci": "node scripts/prove-reliability.js --seed=42 --iterations=10",
910
+ "test:glama-mcp": "node --test tests/glama-mcp-start-contract.test.js",
911
+ "prove:glama-mcp": "node scripts/prove-glama-mcp-start.js",
912
+ "test:prove-glama-mcp": "node --test tests/prove-glama-mcp-start.test.js",
913
+ "test:agent-install-paths": "node --test tests/agent-install-paths.test.js",
914
+ "test:mcp-gate-check": "node --test tests/mcp-gate-check-tool.test.js",
915
+ "test:adapter-pins": "node --test tests/adapter-version-pins.test.js",
916
+ "test:secret-egress": "node --test tests/secret-egress-gate.test.js",
917
+ "test:harness-tool-names": "node --test tests/harness-tool-names.test.js",
918
+ "test:feedback-reward": "node --test tests/feedback-reward-score.test.js",
919
+ "test:capability-wiring": "node --test tests/capability-wiring-ratchet.test.js",
920
+ "test:llm-gateway": "node --test tests/llm-gateway-provider.test.js",
921
+ "test:request-envelope": "node --test tests/request-envelope.test.js",
922
+ "test:a-plus-evidence": "node --test tests/a-plus-evidence-scorecard.test.js",
923
+ "score:a-plus": "node scripts/a-plus-evidence-scorecard.js"
873
924
  },
874
925
  "keywords": [
875
926
  "mcp",
@@ -930,6 +981,7 @@
930
981
  "apache-arrow": "^18.1.0",
931
982
  "better-sqlite3": "^12.9.0",
932
983
  "dotenv": "^17.4.2",
984
+ "js-yaml": "4.3.0",
933
985
  "playwright-core": "^1.59.1",
934
986
  "protobufjs": "^8.7.1",
935
987
  "stripe": "^22.2.0"
@@ -1,21 +1,22 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 280" role="img" aria-labelledby="t d">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 300" role="img" aria-labelledby="t d">
2
2
  <title id="t">Before and after ThumbGate</title>
3
- <desc id="d">Without ThumbGate the same mistake repeats. With ThumbGate the second attempt is caught.</desc>
4
- <rect width="960" height="280" fill="#0a0a0b"/>
5
- <g font-family="system-ui,sans-serif">
3
+ <desc id="d">Without ThumbGate the same mistake repeats. With ThumbGate one thumbs-down becomes a local pre-action gate that can refresh or expire.</desc>
4
+ <rect width="960" height="300" rx="24" fill="#0a0a0b"/>
5
+ <g font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif">
6
6
  <!-- WITHOUT -->
7
- <rect x="40" y="36" width="400" height="208" rx="20" fill="#1a1012" stroke="#f87171" stroke-width="2"/>
8
- <text x="240" y="72" text-anchor="middle" fill="#f87171" font-size="18" font-weight="900">WITHOUT</text>
9
- <text x="240" y="118" text-anchor="middle" fill="#f5f5f7" font-size="20" font-weight="700">๐Ÿ”ฅ force-push / bad shell</text>
10
- <text x="240" y="152" text-anchor="middle" fill="#e5e7eb" font-size="16">You clean it upโ€ฆ</text>
11
- <text x="240" y="182" text-anchor="middle" fill="#e5e7eb" font-size="16">โ€ฆand it happens again.</text>
12
- <text x="240" y="218" text-anchor="middle" fill="#9ca3af" font-size="14">time ร— trust ร— risk</text>
7
+ <rect x="36" y="36" width="420" height="228" rx="22" fill="#1a1012" stroke="#f87171" stroke-width="2.5"/>
8
+ <text x="246" y="78" text-anchor="middle" fill="#f87171" font-size="16" font-weight="900" letter-spacing="1.5">WITHOUT THUMBGATE</text>
9
+ <text x="246" y="130" text-anchor="middle" fill="#f5f5f7" font-size="28" font-weight="800">๐Ÿ”ฅ force-push ยท bad shell</text>
10
+ <text x="246" y="172" text-anchor="middle" fill="#e5e7eb" font-size="18">You clean it upโ€ฆ</text>
11
+ <text x="246" y="204" text-anchor="middle" fill="#e5e7eb" font-size="18">โ€ฆand the agent does it again.</text>
12
+ <text x="246" y="240" text-anchor="middle" fill="#9ca3af" font-size="14">time ร— trust ร— risk ร— token burn</text>
13
+
13
14
  <!-- WITH -->
14
- <rect x="520" y="36" width="400" height="208" rx="20" fill="#0c1a14" stroke="#4ade80" stroke-width="2"/>
15
- <text x="720" y="72" text-anchor="middle" fill="#4ade80" font-size="18" font-weight="900">WITH THUMBGATE</text>
16
- <text x="720" y="118" text-anchor="middle" fill="#f5f5f7" font-size="20" font-weight="700">๐Ÿ‘Ž once</text>
17
- <text x="720" y="152" text-anchor="middle" fill="#e5e7eb" font-size="16">Rule saved locally</text>
18
- <text x="720" y="182" text-anchor="middle" fill="#e5e7eb" font-size="16">Next attempt is checked</text>
19
- <text x="720" y="218" text-anchor="middle" fill="#9ca3af" font-size="14">one correction โ†’ permanent gate</text>
15
+ <rect x="504" y="36" width="420" height="228" rx="22" fill="#0c1a14" stroke="#4ade80" stroke-width="2.5"/>
16
+ <text x="714" y="78" text-anchor="middle" fill="#4ade80" font-size="16" font-weight="900" letter-spacing="1.5">WITH THUMBGATE</text>
17
+ <text x="714" y="130" text-anchor="middle" fill="#f5f5f7" font-size="32" font-weight="900">๐Ÿ‘Ž once</text>
18
+ <text x="714" y="172" text-anchor="middle" fill="#e5e7eb" font-size="18">Rule saved locally</text>
19
+ <text x="714" y="204" text-anchor="middle" fill="#e5e7eb" font-size="18">Next attempt is gated</text>
20
+ <text x="714" y="240" text-anchor="middle" fill="#9ca3af" font-size="14">one correction โ†’ local gate (auto-promoted gates expire)</text>
20
21
  </g>
21
22
  </svg>
@@ -0,0 +1,68 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 360" role="img" aria-labelledby="title desc">
2
+ <title id="title">ThumbGate: thumbs up and thumbs down become pre-action gates</title>
3
+ <desc id="desc">Two large thumbs icons feeding a gate that decides ALLOW, WARN, or DENY before an AI agent tool call runs.</desc>
4
+ <defs>
5
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
6
+ <stop offset="0%" stop-color="#0a1018"/>
7
+ <stop offset="100%" stop-color="#111a28"/>
8
+ </linearGradient>
9
+ <linearGradient id="gate" x1="0" y1="0" x2="1" y2="1">
10
+ <stop offset="0%" stop-color="#22d3ee"/>
11
+ <stop offset="100%" stop-color="#4ade80"/>
12
+ </linearGradient>
13
+ <filter id="glow">
14
+ <feDropShadow dx="0" dy="0" stdDeviation="12" flood-color="#22d3ee" flood-opacity="0.35"/>
15
+ </filter>
16
+ <filter id="soft">
17
+ <feDropShadow dx="0" dy="10" stdDeviation="14" flood-color="#000" flood-opacity="0.4"/>
18
+ </filter>
19
+ </defs>
20
+ <rect width="640" height="360" rx="24" fill="url(#bg)"/>
21
+
22
+ <!-- Brand line -->
23
+ <text x="32" y="42" fill="#22d3ee" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12" font-weight="800" letter-spacing="2">THUMBGATE</text>
24
+ <text x="32" y="68" fill="#f5f7fb" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="22" font-weight="800">Named for the signal. Built for the gate.</text>
25
+
26
+ <!-- Big thumbs up -->
27
+ <g filter="url(#soft)" transform="translate(48, 100)">
28
+ <rect width="150" height="190" rx="24" fill="#0d1f18" stroke="#4ade80" stroke-width="2.5"/>
29
+ <circle cx="75" cy="78" r="54" fill="#4ade80" opacity="0.12"/>
30
+ <g transform="translate(35, 35) scale(2.1)" fill="none" stroke="#4ade80" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round">
31
+ <path d="M7 22V13a2 2 0 0 1 2-2h2.5l3.2-7.2A2.5 2.5 0 0 1 17 2.5 3.5 3.5 0 0 1 20.5 6v5H28a3 3 0 0 1 3 3.4l-1.6 9A3 3 0 0 1 26.5 26H9a2 2 0 0 1-2-2z"/>
32
+ <path d="M7 13H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3"/>
33
+ </g>
34
+ <text x="75" y="158" text-anchor="middle" fill="#4ade80" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="28" font-weight="900">๐Ÿ‘</text>
35
+ <text x="75" y="182" text-anchor="middle" fill="#9db8ad" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13" font-weight="700">good pattern</text>
36
+ </g>
37
+
38
+ <!-- Big thumbs down -->
39
+ <g filter="url(#soft)" transform="translate(220, 100)">
40
+ <rect width="150" height="190" rx="24" fill="#1f1014" stroke="#ff6480" stroke-width="2.5"/>
41
+ <circle cx="75" cy="78" r="54" fill="#ff6480" opacity="0.12"/>
42
+ <g transform="translate(35, 40) scale(2.1)" fill="none" stroke="#ff6480" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round">
43
+ <path d="M7 2v9a2 2 0 0 0 2 2h2.5l3.2 7.2A2.5 2.5 0 0 0 17 21.5 3.5 3.5 0 0 0 20.5 18v-5H28a3 3 0 0 0 3-3.4l-1.6-9A3 3 0 0 0 26.5-2H9a2 2 0 0 0-2 2z" transform="translate(0 6)"/>
44
+ <path d="M7 11H4a2 2 0 0 1-2-2V0a2 2 0 0 1 2-2h3" transform="translate(0 6)"/>
45
+ </g>
46
+ <text x="75" y="158" text-anchor="middle" fill="#ff8a9a" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="28" font-weight="900">๐Ÿ‘Ž</text>
47
+ <text x="75" y="182" text-anchor="middle" fill="#b899a0" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13" font-weight="700">never again</text>
48
+ </g>
49
+
50
+ <!-- Arrow into gate -->
51
+ <path d="M385 195 H420" stroke="#22d3ee" stroke-width="4" stroke-linecap="round"/>
52
+ <path d="M410 185 L425 195 L410 205" fill="none" stroke="#22d3ee" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
53
+
54
+ <!-- Gate panel -->
55
+ <g filter="url(#glow)" transform="translate(440, 90)">
56
+ <rect width="168" height="210" rx="24" fill="#0c1622" stroke="url(#gate)" stroke-width="3"/>
57
+ <text x="84" y="42" text-anchor="middle" fill="#22d3ee" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12" font-weight="800" letter-spacing="1.5">PRE-ACTION GATE</text>
58
+ <!-- mini shield / gate -->
59
+ <path d="M84 68 C64 76 56 88 56 108 C56 128 72 142 84 148 C96 142 112 128 112 108 C112 88 104 76 84 68 Z" fill="none" stroke="#8cf5d1" stroke-width="4"/>
60
+ <text x="84" y="118" text-anchor="middle" fill="#e7fbff" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="900">TG</text>
61
+ <rect x="22" y="168" width="46" height="24" rx="12" fill="rgba(86,227,159,0.12)" stroke="#56e39f"/>
62
+ <text x="45" y="184" text-anchor="middle" fill="#56e39f" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="10" font-weight="800">ALLOW</text>
63
+ <rect x="74" y="168" width="42" height="24" rx="12" fill="rgba(255,209,102,0.12)" stroke="#ffd166"/>
64
+ <text x="95" y="184" text-anchor="middle" fill="#ffd166" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="10" font-weight="800">WARN</text>
65
+ <rect x="122" y="168" width="42" height="24" rx="12" fill="rgba(255,100,124,0.12)" stroke="#ff647c"/>
66
+ <text x="143" y="184" text-anchor="middle" fill="#ff647c" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="10" font-weight="800">DENY</text>
67
+ </g>
68
+ </svg>
@@ -1,34 +1,40 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 280" role="img" aria-labelledby="t d">
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 300" role="img" aria-labelledby="t d">
2
2
  <title id="t">ThumbGate feedback loop</title>
3
- <desc id="d">Agent proposes a tool call, ThumbGate decides allow warn or deny, feedback becomes a rule.</desc>
4
- <rect width="960" height="280" fill="#0a0a0b"/>
3
+ <desc id="d">Agent proposes a tool call, ThumbGate decides allow warn or deny, thumbs feedback becomes a rule that closes the loop.</desc>
4
+ <rect width="960" height="300" rx="24" fill="#0a0a0b"/>
5
5
  <defs>
6
6
  <marker id="arr" markerWidth="10" markerHeight="10" refX="8" refY="4" orient="auto"><path d="M0,0 L8,4 L0,8 Z" fill="#22d3ee"/></marker>
7
+ <marker id="arrG" markerWidth="10" markerHeight="10" refX="8" refY="4" orient="auto"><path d="M0,0 L8,4 L0,8 Z" fill="#4ade80"/></marker>
7
8
  <linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#22d3ee"/><stop offset="1" stop-color="#4ade80"/></linearGradient>
8
9
  </defs>
10
+
9
11
  <!-- Step 1 -->
10
- <rect x="40" y="70" width="180" height="110" rx="18" fill="#161618" stroke="#333"/>
12
+ <rect x="40" y="70" width="180" height="120" rx="18" fill="#161618" stroke="#333"/>
11
13
  <circle cx="70" cy="100" r="16" fill="#222" stroke="#22d3ee" stroke-width="2"/>
12
14
  <text x="70" y="105" text-anchor="middle" fill="#22d3ee" font-family="system-ui,sans-serif" font-size="14" font-weight="800">1</text>
13
- <text x="130" y="120" text-anchor="middle" fill="#f5f5f7" font-family="system-ui,sans-serif" font-size="18" font-weight="800">Agent</text>
15
+ <text x="130" y="118" text-anchor="middle" fill="#f5f5f7" font-family="system-ui,sans-serif" font-size="18" font-weight="800">Agent</text>
14
16
  <text x="130" y="146" text-anchor="middle" fill="#9ca3af" font-family="system-ui,sans-serif" font-size="13">proposes a tool</text>
15
- <line x1="230" y1="125" x2="290" y2="125" stroke="#22d3ee" stroke-width="3" marker-end="url(#arr)"/>
17
+ <line x1="230" y1="130" x2="290" y2="130" stroke="#22d3ee" stroke-width="3" marker-end="url(#arr)"/>
18
+
16
19
  <!-- Step 2 -->
17
- <rect x="300" y="50" width="240" height="150" rx="18" fill="#07151a" stroke="url(#g)" stroke-width="2.5"/>
20
+ <rect x="300" y="50" width="240" height="160" rx="18" fill="#07151a" stroke="url(#g)" stroke-width="2.5"/>
18
21
  <circle cx="340" cy="90" r="16" fill="#0d2530" stroke="#22d3ee" stroke-width="2"/>
19
22
  <text x="340" y="95" text-anchor="middle" fill="#22d3ee" font-family="system-ui,sans-serif" font-size="14" font-weight="800">2</text>
20
23
  <text x="420" y="95" text-anchor="middle" fill="#22d3ee" font-family="system-ui,sans-serif" font-size="20" font-weight="900">ThumbGate</text>
21
24
  <text x="420" y="130" text-anchor="middle" fill="#f5f5f7" font-family="system-ui,sans-serif" font-size="16" font-weight="700">ALLOW ยท WARN ยท DENY</text>
22
25
  <text x="420" y="158" text-anchor="middle" fill="#9ca3af" font-family="system-ui,sans-serif" font-size="13">before the tool runs</text>
23
- <line x1="550" y1="125" x2="610" y2="125" stroke="#22d3ee" stroke-width="3" marker-end="url(#arr)"/>
26
+ <text x="420" y="184" text-anchor="middle" fill="#4ade80" font-family="system-ui,sans-serif" font-size="18" font-weight="800">๐Ÿ‘ ๐Ÿ‘Ž</text>
27
+ <line x1="550" y1="130" x2="610" y2="130" stroke="#22d3ee" stroke-width="3" marker-end="url(#arr)"/>
28
+
24
29
  <!-- Step 3 -->
25
- <rect x="620" y="70" width="180" height="110" rx="18" fill="#161618" stroke="#333"/>
30
+ <rect x="620" y="70" width="180" height="120" rx="18" fill="#161618" stroke="#333"/>
26
31
  <circle cx="650" cy="100" r="16" fill="#222" stroke="#4ade80" stroke-width="2"/>
27
32
  <text x="650" y="105" text-anchor="middle" fill="#4ade80" font-family="system-ui,sans-serif" font-size="14" font-weight="800">3</text>
28
- <text x="710" y="120" text-anchor="middle" fill="#f5f5f7" font-family="system-ui,sans-serif" font-size="18" font-weight="800">Action</text>
33
+ <text x="710" y="118" text-anchor="middle" fill="#f5f5f7" font-family="system-ui,sans-serif" font-size="18" font-weight="800">Action</text>
29
34
  <text x="710" y="146" text-anchor="middle" fill="#9ca3af" font-family="system-ui,sans-serif" font-size="13">shell ยท git ยท db</text>
35
+
30
36
  <!-- Feedback loop -->
31
- <path d="M710 185 C710 240 130 240 130 185" fill="none" stroke="#4ade80" stroke-width="3" stroke-dasharray="6 4" marker-end="url(#arr)"/>
32
- <rect x="280" y="218" width="280" height="36" rx="18" fill="#0d1b14" stroke="#4ade80"/>
33
- <text x="420" y="241" text-anchor="middle" fill="#4ade80" font-family="system-ui,sans-serif" font-size="14" font-weight="700">๐Ÿ‘ ๐Ÿ‘Ž feedback โ†’ lesson โ†’ rule</text>
37
+ <path d="M710 200 C710 250 130 250 130 200" fill="none" stroke="#4ade80" stroke-width="3" stroke-dasharray="6 4" marker-end="url(#arrG)"/>
38
+ <rect x="260" y="232" width="320" height="40" rx="20" fill="#0d1b14" stroke="#4ade80"/>
39
+ <text x="420" y="258" text-anchor="middle" fill="#4ade80" font-family="system-ui,sans-serif" font-size="15" font-weight="800">๐Ÿ‘ ๐Ÿ‘Ž feedback โ†’ lesson โ†’ rule โ†’ gate</text>
34
40
  </svg>
@@ -0,0 +1,105 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 420" role="img" aria-labelledby="title desc">
2
+ <title id="title">How ThumbGate self-improves from thumbs up and thumbs down</title>
3
+ <desc id="desc">Closed loop: you give thumbs up or thumbs down, ThumbGate stores a local lesson, promotes a prevention rule, and gates the next tool call before it runs.</desc>
4
+ <defs>
5
+ <linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
6
+ <stop offset="0%" stop-color="#081018"/>
7
+ <stop offset="100%" stop-color="#0d121c"/>
8
+ </linearGradient>
9
+ <linearGradient id="ring" x1="0" y1="0" x2="1" y2="1">
10
+ <stop offset="0%" stop-color="#22d3ee"/>
11
+ <stop offset="100%" stop-color="#4ade80"/>
12
+ </linearGradient>
13
+ <linearGradient id="upGlow" x1="0" y1="0" x2="0" y2="1">
14
+ <stop offset="0%" stop-color="#56e39f"/>
15
+ <stop offset="100%" stop-color="#1f9d62"/>
16
+ </linearGradient>
17
+ <linearGradient id="downGlow" x1="0" y1="0" x2="0" y2="1">
18
+ <stop offset="0%" stop-color="#ff8a9a"/>
19
+ <stop offset="100%" stop-color="#e11d48"/>
20
+ </linearGradient>
21
+ <filter id="soft" x="-20%" y="-20%" width="140%" height="140%">
22
+ <feDropShadow dx="0" dy="12" stdDeviation="16" flood-color="#000" flood-opacity="0.45"/>
23
+ </filter>
24
+ <marker id="arr" markerWidth="10" markerHeight="10" refX="8" refY="4" orient="auto">
25
+ <path d="M0,0 L8,4 L0,8 Z" fill="#22d3ee"/>
26
+ </marker>
27
+ <marker id="arrG" markerWidth="10" markerHeight="10" refX="8" refY="4" orient="auto">
28
+ <path d="M0,0 L8,4 L0,8 Z" fill="#4ade80"/>
29
+ </marker>
30
+ </defs>
31
+
32
+ <rect width="1100" height="420" rx="28" fill="url(#bg)"/>
33
+
34
+ <!-- Header -->
35
+ <text x="48" y="48" fill="#e8eef7" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="28" font-weight="800">Yes โ€” self-improving. Not the model. The gate.</text>
36
+ <text x="48" y="78" fill="#9ca8ba" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15">Your ๐Ÿ‘ / ๐Ÿ‘Ž teach local rules. Next matching tool call is checked before it runs.</text>
37
+
38
+ <!-- Giant thumbs pair -->
39
+ <g filter="url(#soft)" transform="translate(48, 110)">
40
+ <!-- Thumbs up card -->
41
+ <rect x="0" y="0" width="150" height="180" rx="22" fill="#0d1f18" stroke="#4ade80" stroke-width="2"/>
42
+ <circle cx="75" cy="72" r="42" fill="url(#upGlow)" opacity="0.18"/>
43
+ <!-- thumbs-up hand icon -->
44
+ <g transform="translate(42, 38) scale(1.45)" fill="none" stroke="#4ade80" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round">
45
+ <path d="M7 22V13a2 2 0 0 1 2-2h2.5l3.2-7.2A2.5 2.5 0 0 1 17 2.5 3.5 3.5 0 0 1 20.5 6v5H28a3 3 0 0 1 3 3.4l-1.6 9A3 3 0 0 1 26.5 26H9a2 2 0 0 1-2-2z"/>
46
+ <path d="M7 13H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3"/>
47
+ </g>
48
+ <text x="75" y="148" text-anchor="middle" fill="#4ade80" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="800">๐Ÿ‘ Keep</text>
49
+ <text x="75" y="170" text-anchor="middle" fill="#8fa09a" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">reinforce good pattern</text>
50
+
51
+ <!-- Thumbs down card -->
52
+ <rect x="170" y="0" width="150" height="180" rx="22" fill="#1f1014" stroke="#ff6480" stroke-width="2"/>
53
+ <circle cx="245" cy="72" r="42" fill="url(#downGlow)" opacity="0.18"/>
54
+ <!-- thumbs-down hand icon -->
55
+ <g transform="translate(212, 38) scale(1.45)" fill="none" stroke="#ff6480" stroke-width="3.2" stroke-linecap="round" stroke-linejoin="round">
56
+ <path d="M7 2v9a2 2 0 0 0 2 2h2.5l3.2 7.2A2.5 2.5 0 0 0 17 21.5 3.5 3.5 0 0 0 20.5 18v-5H28a3 3 0 0 0 3-3.4l-1.6-9A3 3 0 0 0 26.5-2H9a2 2 0 0 0-2 2z" transform="translate(0 8)"/>
57
+ <path d="M7 11H4a2 2 0 0 1-2-2V0a2 2 0 0 1 2-2h3" transform="translate(0 8)"/>
58
+ </g>
59
+ <text x="245" y="148" text-anchor="middle" fill="#ff8a9a" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="800">๐Ÿ‘Ž Fix</text>
60
+ <text x="245" y="170" text-anchor="middle" fill="#b08a93" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="12">never repeat this</text>
61
+ </g>
62
+
63
+ <!-- Arrow to lesson -->
64
+ <path d="M340 200 H390" stroke="#22d3ee" stroke-width="3" marker-end="url(#arr)"/>
65
+
66
+ <!-- Step 2: Local lesson -->
67
+ <g filter="url(#soft)">
68
+ <rect x="400" y="130" width="180" height="140" rx="20" fill="#111722" stroke="#273246" stroke-width="2"/>
69
+ <text x="490" y="168" text-anchor="middle" fill="#22d3ee" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12" font-weight="800" letter-spacing="1.2">LOCAL LESSON</text>
70
+ <text x="490" y="202" text-anchor="middle" fill="#f5f7fb" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="800">SQLite memory</text>
71
+ <text x="490" y="228" text-anchor="middle" fill="#9ca8ba" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">survives sessions</text>
72
+ <text x="490" y="248" text-anchor="middle" fill="#9ca8ba" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">not model weights</text>
73
+ </g>
74
+
75
+ <path d="M590 200 H640" stroke="#22d3ee" stroke-width="3" marker-end="url(#arr)"/>
76
+
77
+ <!-- Step 3: Rule / gate -->
78
+ <g filter="url(#soft)">
79
+ <rect x="650" y="130" width="180" height="140" rx="20" fill="#0c1820" stroke="url(#ring)" stroke-width="2.5"/>
80
+ <text x="740" y="168" text-anchor="middle" fill="#22d3ee" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12" font-weight="800" letter-spacing="1.2">PREVENTION RULE</text>
81
+ <text x="740" y="202" text-anchor="middle" fill="#f5f7fb" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="18" font-weight="800">Auto-promoted</text>
82
+ <text x="740" y="228" text-anchor="middle" fill="#9ca8ba" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">from repeats</text>
83
+ <text x="740" y="248" text-anchor="middle" fill="#9ca8ba" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="13">stale rules expire</text>
84
+ </g>
85
+
86
+ <path d="M840 200 H890" stroke="#22d3ee" stroke-width="3" marker-end="url(#arr)"/>
87
+
88
+ <!-- Step 4: Gate next action -->
89
+ <g filter="url(#soft)">
90
+ <rect x="900" y="118" width="168" height="164" rx="20" fill="#111722" stroke="#273246" stroke-width="2"/>
91
+ <text x="984" y="152" text-anchor="middle" fill="#22d3ee" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="12" font-weight="800" letter-spacing="1.2">NEXT TOOL CALL</text>
92
+ <rect x="922" y="168" width="52" height="26" rx="13" fill="rgba(86,227,159,0.12)" stroke="#56e39f"/>
93
+ <text x="948" y="186" text-anchor="middle" fill="#56e39f" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11" font-weight="800">ALLOW</text>
94
+ <rect x="982" y="168" width="48" height="26" rx="13" fill="rgba(255,209,102,0.12)" stroke="#ffd166"/>
95
+ <text x="1006" y="186" text-anchor="middle" fill="#ffd166" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11" font-weight="800">WARN</text>
96
+ <rect x="948" y="206" width="52" height="26" rx="13" fill="rgba(255,100,124,0.12)" stroke="#ff647c"/>
97
+ <text x="974" y="224" text-anchor="middle" fill="#ff647c" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11" font-weight="800">DENY</text>
98
+ <text x="984" y="258" text-anchor="middle" fill="#f5f7fb" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="700">before it runs</text>
99
+ </g>
100
+
101
+ <!-- Closing the loop dashed arrow back -->
102
+ <path d="M984 300 C984 360 120 360 120 300" fill="none" stroke="#4ade80" stroke-width="3" stroke-dasharray="8 6" marker-end="url(#arrG)"/>
103
+ <rect x="360" y="332" width="380" height="40" rx="20" fill="#0d1b14" stroke="#4ade80"/>
104
+ <text x="550" y="358" text-anchor="middle" fill="#4ade80" font-family="-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif" font-size="15" font-weight="800">Loop closes ยท under your control ยท no model retrain</text>
105
+ </svg>
@@ -296,6 +296,7 @@
296
296
  <li><a href="/compare/arcade">ThumbGate vs Arcade</a> โ€” coding-agent guardrails vs enterprise API auth delegation</li>
297
297
  <li><a href="/compare/databricks-unity-ai-gateway">ThumbGate vs Databricks Unity AI Gateway</a> โ€” enterprise gateway vs local pre-action gates</li>
298
298
  <li><a href="/compare/hermes-everos-memory">ThumbGate vs Hermes and EverOS</a> โ€” local-first behavior gates vs passive agent memory stores</li>
299
+ <li><a href="/compare/far-ai">ThumbGate vs FAR.AI</a> โ€” runtime agent enforcement vs frontier safety research and evaluation</li>
299
300
  </ul>
300
301
 
301
302
  <h2>How It Works</h2>