thumbgate 1.27.20 → 1.28.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 (48) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.well-known/mcp/server-card.json +1 -1
  3. package/README.md +63 -42
  4. package/adapters/claude/.mcp.json +2 -2
  5. package/adapters/mcp/server-stdio.js +1 -1
  6. package/adapters/opencode/opencode.json +1 -1
  7. package/bin/cli.js +25 -8
  8. package/bin/postinstall.js +1 -1
  9. package/config/entitlement-public-keys.json +6 -0
  10. package/config/gates/default.json +1 -1
  11. package/config/github-about.json +2 -2
  12. package/config/merge-quality-checks.json +3 -0
  13. package/package.json +12 -4
  14. package/public/about.html +1 -4
  15. package/public/agent-manager.html +6 -6
  16. package/public/agents-cost-savings.html +3 -3
  17. package/public/ai-malpractice-prevention.html +1 -1
  18. package/public/blog.html +12 -9
  19. package/public/chatgpt-app.html +3 -3
  20. package/public/codex-enterprise.html +3 -3
  21. package/public/codex-plugin.html +5 -5
  22. package/public/compare.html +10 -10
  23. package/public/dashboard.html +1 -1
  24. package/public/federal.html +2 -2
  25. package/public/guide.html +14 -14
  26. package/public/index.html +81 -70
  27. package/public/install.html +14 -14
  28. package/public/learn.html +4 -17
  29. package/public/numbers.html +2 -2
  30. package/public/pricing.html +12 -19
  31. package/public/pro.html +2 -2
  32. package/scripts/agent-reward-model.js +13 -0
  33. package/scripts/bayes-optimal-gate.js +6 -1
  34. package/scripts/cli-feedback.js +17 -1
  35. package/scripts/commercial-offer.js +3 -3
  36. package/scripts/entitlement.js +250 -0
  37. package/scripts/export-databricks-bundle.js +5 -0
  38. package/scripts/export-dpo-pairs.js +6 -0
  39. package/scripts/export-hf-dataset.js +5 -0
  40. package/scripts/gates-engine.js +15 -3
  41. package/scripts/imperative-detector.js +85 -0
  42. package/scripts/intervention-policy.js +13 -0
  43. package/scripts/pr-manager.js +9 -22
  44. package/scripts/pro-local-dashboard.js +198 -0
  45. package/scripts/risk-scorer.js +6 -0
  46. package/scripts/seo-gsd.js +2 -2
  47. package/scripts/thompson-sampling.js +11 -2
  48. package/src/api/server.js +81 -10
@@ -24,7 +24,7 @@ __GA_BOOTSTRAP__
24
24
  "name": "ThumbGate",
25
25
  "applicationCategory": "DeveloperApplication",
26
26
  "operatingSystem": "macOS, Windows, Linux",
27
- "softwareVersion": "1.27.17",
27
+ "softwareVersion": "1.27.20",
28
28
  "description": "Local-first pre-action gates and feedback capture for AI coding agents.",
29
29
  "url": "__APP_ORIGIN__/install",
30
30
  "downloadUrl": "https://www.npmjs.com/package/thumbgate",
@@ -38,7 +38,7 @@ __GA_BOOTSTRAP__
38
38
  "https://www.npmjs.com/package/thumbgate",
39
39
  "https://open-vsx.org/extension/igorganapolsky/thumbgate",
40
40
  "https://marketplace.visualstudio.com/items?itemName=igorganapolsky.thumbgate",
41
- "https://github.com/IgorGanapolsky/ThumbGate/releases/tag/v1.27.17"
41
+ "https://github.com/IgorGanapolsky/ThumbGate/releases/tag/v1.27.20"
42
42
  ]
43
43
  }
44
44
  </script>
@@ -131,7 +131,7 @@ __GA_BOOTSTRAP__
131
131
  </nav>
132
132
  <header>
133
133
  <div class="container">
134
- <span class="eyebrow">Install paths verified for v1.27.17</span>
134
+ <span class="eyebrow">Install paths verified for v1.27.20</span>
135
135
  <h1>Install the agent guardrail before the next repeated mistake costs real money.</h1>
136
136
  <p class="lede">ThumbGate is live on the surfaces developers already use: npm, VS Code Marketplace, Open VSX, GitHub Release assets, and MCP Registry. If the risky workflow is already customer-visible, start with the Workflow Hardening Diagnostic instead of another generic install.</p>
137
137
  <div class="actions">
@@ -139,10 +139,10 @@ __GA_BOOTSTRAP__
139
139
  <a class="btn-secondary" href="/diagnostic?utm_source=install_page&utm_medium=owned_page&utm_campaign=marketplace_distribution">Harden one workflow</a>
140
140
  </div>
141
141
  <div class="proof-strip" aria-label="Verified live distribution surfaces">
142
- <div class="proof"><strong>npm</strong><span>thumbgate@1.27.17</span></div>
142
+ <div class="proof"><strong>npm</strong><span>thumbgate@1.27.20</span></div>
143
143
  <div class="proof"><strong>VS Code</strong><span>Marketplace version live</span></div>
144
144
  <div class="proof"><strong>Open VSX</strong><span>Antigravity-compatible path</span></div>
145
- <div class="proof"><strong>MCP Registry</strong><span>1.27.17 is latest</span></div>
145
+ <div class="proof"><strong>MCP Registry</strong><span>1.27.20 is latest</span></div>
146
146
  <div class="proof"><strong>GitHub Release</strong><span>VSIX, MCPB, Codex zip</span></div>
147
147
  </div>
148
148
  </div>
@@ -152,11 +152,11 @@ __GA_BOOTSTRAP__
152
152
  <h2>Choose the install path that matches your agent.</h2>
153
153
  <p class="section-lede">Use the local CLI path for immediate enforcement. Use marketplace installs where your editor supports them. Use the diagnostic path when you need a human-reviewed gate map for one risky workflow.</p>
154
154
  <div class="grid">
155
- <article class="card"><h3>CLI and MCP-compatible agents</h3><p>Fastest path for Claude Code, Cursor, Codex, Gemini CLI, Amp, Cline, OpenCode, and local MCP-compatible agents.</p><pre><code>npx -y thumbgate@1.27.17 doctor
156
- npx -y thumbgate@1.27.17 doctor --fix</code></pre></article>
155
+ <article class="card"><h3>CLI and MCP-compatible agents</h3><p>Fastest path for Claude Code, Cursor, Codex, Gemini CLI, Amp, Cline, OpenCode, and local MCP-compatible agents.</p><pre><code>npx -y thumbgate@1.27.20 doctor
156
+ npx -y thumbgate@1.27.20 doctor --fix</code></pre></article>
157
157
  <article class="card"><h3>Claude Desktop</h3><p>Use the npm-backed MCP server today. The Claude Desktop `.mcpb` directory submission packet is prepared separately.</p><pre><code>claude mcp add thumbgate -- npx --yes --package thumbgate thumbgate serve</code></pre></article>
158
- <article class="card"><h3>Cursor</h3><p>The public Cursor Marketplace listing is not live yet. Use the CLI wiring while the dashboard submission is resolved.</p><pre><code>npx -y thumbgate@1.27.17 init --agent cursor</code></pre></article>
159
- <article class="card"><h3>Codex</h3><p>Use the local adapter now. Public Codex self-serve plugin publishing is not open yet, so the GitHub Release asset is the distribution proof.</p><pre><code>npx -y thumbgate@1.27.17 init --agent codex</code></pre></article>
158
+ <article class="card"><h3>Cursor</h3><p>The public Cursor Marketplace listing is not live yet. Use the CLI wiring while the dashboard submission is resolved.</p><pre><code>npx -y thumbgate@1.27.20 init --agent cursor</code></pre></article>
159
+ <article class="card"><h3>Codex</h3><p>Use the local adapter now. Public Codex self-serve plugin publishing is not open yet, so the GitHub Release asset is the distribution proof.</p><pre><code>npx -y thumbgate@1.27.20 init --agent codex</code></pre></article>
160
160
  </div>
161
161
  </div>
162
162
  </section>
@@ -165,11 +165,11 @@ npx -y thumbgate@1.27.17 doctor --fix</code></pre></article>
165
165
  <h2>Verified public surfaces.</h2>
166
166
  <p class="section-lede">These are the surfaces safe to claim in public copy right now. Pending surfaces are listed so buyers do not get sent to dead marketplace pages.</p>
167
167
  <div class="status-list">
168
- <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://www.npmjs.com/package/thumbgate">npm package</a></strong><span>`thumbgate@1.27.17` is the canonical runtime install.</span></div></div>
169
- <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://marketplace.visualstudio.com/items?itemName=igorganapolsky.thumbgate">VS Code Marketplace</a></strong><span>Marketplace version-list API includes `1.27.17`.</span></div></div>
170
- <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://open-vsx.org/extension/igorganapolsky/thumbgate">Open VSX</a></strong><span>Public registry latest version is `1.27.17`; use this path for VS Code-compatible IDEs that consume Open VSX.</span></div></div>
171
- <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://registry.modelcontextprotocol.io/v0/servers?search=thumbgate">MCP Registry</a></strong><span>Public search returns `io.github.IgorGanapolsky/thumbgate` version `1.27.17` as latest.</span></div></div>
172
- <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://github.com/IgorGanapolsky/ThumbGate/releases/tag/v1.27.17">GitHub Release</a></strong><span>Includes VSIX, Claude Desktop `.mcpb`, Claude review zip, and Codex plugin zip assets.</span></div></div>
168
+ <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://www.npmjs.com/package/thumbgate">npm package</a></strong><span>`thumbgate@1.27.20` is the canonical runtime install.</span></div></div>
169
+ <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://marketplace.visualstudio.com/items?itemName=igorganapolsky.thumbgate">VS Code Marketplace</a></strong><span>Marketplace version-list API includes `1.27.20`.</span></div></div>
170
+ <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://open-vsx.org/extension/igorganapolsky/thumbgate">Open VSX</a></strong><span>Public registry latest version is `1.27.20`; use this path for VS Code-compatible IDEs that consume Open VSX.</span></div></div>
171
+ <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://registry.modelcontextprotocol.io/v0/servers?search=thumbgate">MCP Registry</a></strong><span>Public search returns `io.github.IgorGanapolsky/thumbgate` version `1.27.20` as latest.</span></div></div>
172
+ <div class="status"><span class="badge live">LIVE</span><div><strong><a href="https://github.com/IgorGanapolsky/ThumbGate/releases/tag/v1.27.20">GitHub Release</a></strong><span>Includes VSIX, Claude Desktop `.mcpb`, Claude review zip, and Codex plugin zip assets.</span></div></div>
173
173
  <div class="status"><span class="badge pending">PENDING</span><div><strong>Claude Desktop directory</strong><span>Official MCPB form is reachable; submission needs account/email/file-upload approval.</span></div></div>
174
174
  <div class="status"><span class="badge blocked">BLOCKED</span><div><strong>Cursor public Marketplace</strong><span>Public listing returns "Marketplace Plugin Not Found"; dashboard requires sign-in to inspect or resubmit.</span></div></div>
175
175
  <div class="status"><span class="badge pending">PENDING</span><div><strong>Codex public directory</strong><span>OpenAI docs say public plugin publishing and self-serve management are coming soon.</span></div></div>
package/public/learn.html CHANGED
@@ -112,12 +112,6 @@
112
112
  "url": "https://thumbgate.ai/learn/from-prototype-to-production",
113
113
  "name": "From git init to v1.17.0 in 70 days: an honest ThumbGate build log"
114
114
  },
115
- {
116
- "@type": "ListItem",
117
- "position": 13,
118
- "url": "https://thumbgate.ai/learn/pretix-stripe-connect-marketplaces",
119
- "name": "Building a Pretix + Stripe Connect Plugin for Live-Music Venues"
120
- },
121
115
  {
122
116
  "@type": "ListItem",
123
117
  "position": 7,
@@ -128,7 +122,7 @@
128
122
  "@type": "ListItem",
129
123
  "position": 7,
130
124
  "url": "https://thumbgate.ai/guides/cursor-agent-guardrails",
131
- "name": "Cursor Guardrails That Block Repeated Mistakes"
125
+ "name": "Cursor Guardrails That Catch Repeated Mistakes"
132
126
  },
133
127
  {
134
128
  "@type": "ListItem",
@@ -299,7 +293,7 @@
299
293
 
300
294
  <div class="container">
301
295
  <h1>Learn: AI Agent Safety</h1>
302
- <p class="hero-sub">Practical guides for developers who use AI coding agents and want them to stop repeating the same mistakes. Every article ends with something you can ship today.</p>
296
+ <p class="hero-sub">Practical guides for developers who use AI coding agents and want them to catch repeating the same mistakes. Every article ends with something you can ship today.</p>
303
297
  <p class="hero-sub" style="font-size:0.85rem;margin-top:-1rem;">Updated: <time datetime="2026-04-20">2026-04-20</time> · by <a href="https://github.com/IgorGanapolsky" style="color:inherit;">Igor Ganapolsky</a></p>
304
298
 
305
299
  <div class="article-grid">
@@ -313,7 +307,7 @@
313
307
 
314
308
  <a href="/learn/stop-ai-agent-force-push" class="article-card">
315
309
  <h3>How to Stop AI Agents From Force-Pushing to Main</h3>
316
- <p>Your agent just ran git push --force on main. Again. Here is how to make that physically impossible with a pre-action check that takes two minutes to set up.</p>
310
+ <p>Your agent just ran git push --force on main. Again. Here is how to flag and log it by default — and hard-block it under strict enforcement mode — with a pre-action check that takes two minutes to set up.</p>
317
311
  <span class="article-tag">Claude Code</span>
318
312
  <span class="article-tag">Git Safety</span>
319
313
  <span class="article-tag">Pre-Action Checks</span>
@@ -429,13 +423,6 @@
429
423
  <span class="article-tag">Shipping in Public</span>
430
424
  </a>
431
425
 
432
- <a href="/learn/pretix-stripe-connect-marketplaces" class="article-card">
433
- <h3>Building a Pretix + Stripe Connect Plugin for Live-Music Venues</h3>
434
- <p>How to design a multi-venue Stripe Connect ticketing plugin on Pretix, keeping venues as Merchant of Record without messy platform-fee tax reporting.</p>
435
- <span class="article-tag">Stripe Connect</span>
436
- <span class="article-tag">Pretix</span>
437
- <span class="article-tag">Case Study</span>
438
- </a>
439
426
  </div>
440
427
 
441
428
  <h2>Popular buyer questions</h2>
@@ -498,7 +485,7 @@
498
485
  </a>
499
486
 
500
487
  <a href="/guides/cursor-agent-guardrails" class="article-card">
501
- <h3>Cursor Guardrails That Block Repeated Mistakes</h3>
488
+ <h3>Cursor Guardrails That Catch Repeated Mistakes</h3>
502
489
  <p>For Cursor users who need to keep speed while adding a runtime enforcement layer that does more than prompt politely.</p>
503
490
  <span class="article-tag">Cursor</span>
504
491
  <span class="article-tag">Guardrails</span>
@@ -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.20",
28
+ "softwareVersion": "1.28.0",
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.20</div>
205
+ <div class="freshness">Updated: 2026-05-07 · Version 1.28.0</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>
@@ -101,8 +101,8 @@ __GA_BOOTSTRAP__
101
101
  "@context": "https://schema.org",
102
102
  "@type": "FAQPage",
103
103
  "mainEntity": [
104
- { "@type": "Question", "name": "What does Pro add over the free CLI?", "acceptedAnswer": { "@type": "Answer", "text": "Free gives you 2 captures/day and 3 active rules, running entirely on your machine. Pro is the hosted layer: unlimited captures, unlimited rules, lesson sync across machines, a dashboard without self-hosting, managed adapter updates, and DPO export. You're paying for infrastructure we run, not features we hide." } },
105
- { "@type": "Question", "name": "Does ThumbGate send my code to the cloud?", "acceptedAnswer": { "@type": "Answer", "text": "No. The CLI is local-first — no data leaves your machine. Pro and Enterprise add hosted sync for dashboards and shared lessons, but your source code stays local." } },
104
+ { "@type": "Question", "name": "What does Pro add over the free CLI?", "acceptedAnswer": { "@type": "Answer", "text": "Free gives you 2 captures/day and 3 active rules, running on your machine. Pro removes solo caps and adds personal recall, dashboard proof, managed adapters, and DPO export. Enterprise adds shared hosted lessons and org visibility." } },
105
+ { "@type": "Question", "name": "Does ThumbGate send my code to the cloud?", "acceptedAnswer": { "@type": "Answer", "text": "No. The CLI is local-first — no source code leaves your machine. Pro adds personal proof and exports; Enterprise adds shared hosted lessons and org dashboards." } },
106
106
  { "@type": "Question", "name": "When should I pick Enterprise over Pro?", "acceptedAnswer": { "@type": "Answer", "text": "When one engineer's correction should protect the whole team. Enterprise shares the lesson database across the org so a fix in one repo prevents the same mistake in every repo." } },
107
107
  { "@type": "Question", "name": "Can I cancel anytime?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. Pro and Enterprise are month-to-month with a 7-day refund window on the first charge. Cancel from the billing portal and your subscription ends at the period close." } }
108
108
  ]
@@ -178,13 +178,6 @@ __GA_BOOTSTRAP__
178
178
  box-shadow: 0 0 40px var(--cyan-dim), inset 0 1px 0 rgba(34, 211, 238, 0.15);
179
179
  position: relative;
180
180
  }
181
- .price-card.highlight::before {
182
- content: "Most popular";
183
- position: absolute; top: -10px; left: 50%; transform: translateX(-50%);
184
- background: var(--cyan); color: var(--bg);
185
- padding: 3px 12px; border-radius: 6px;
186
- font-size: 11px; font-weight: 700; letter-spacing: 0.5px; text-transform: uppercase;
187
- }
188
181
 
189
182
  .tier { font-size: 13px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); font-weight: 600; margin-bottom: 8px; }
190
183
  .price-card.highlight .tier { color: var(--cyan); }
@@ -284,12 +277,12 @@ __GA_BOOTSTRAP__
284
277
  <div class="price-card">
285
278
  <div class="tier" style="color:var(--cyan);">Free</div>
286
279
  <div class="price">$0</div>
287
- <div class="price-sub">Block repeated mistakes daily. Forever free for solo devs.</div>
280
+ <div class="price-sub">Catch repeated mistakes daily. Forever free for solo devs.</div>
288
281
  <ul>
289
282
  <li>2 feedback captures/day (10 total) — enough to see the value</li>
290
283
  <li>Up to 3 active prevention rules</li>
291
- <li>All MCP integrations (Claude Code, Cursor, Codex, Gemini, Amp)</li>
292
- <li>PreToolUse hook blocking with built-in safety checks</li>
284
+ <li>All MCP integrations (Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode)</li>
285
+ <li>PreToolUse hook flags and logs risky calls — hard-blocks the catastrophic classes (secret exfil, rm -rf, supply-chain) by default; full hard enforcement in strict mode</li>
293
286
  <li>Runs 100% local — no account, no signup, no data leaves your machine</li>
294
287
  </ul>
295
288
  <a class="btn-install" href="/go/install?utm_source=pricing&utm_medium=free_card&cta_id=pricing_install_free&cta_placement=free_card" data-pricing-cta data-cta-id="pricing_install_free" data-cta-placement="free_card" data-tier="free" data-plan-id="free" data-price="0" onclick="try{posthog.capture('pricing_cta_click',{cta:'install_free',tier:'free',placement:'pricing_page'})}catch(_){};try{plausible('pricing_cta_click',{props:{cta:'install_free',tier:'free'}})}catch(_){}">Install free</a>
@@ -299,12 +292,12 @@ __GA_BOOTSTRAP__
299
292
  <div class="tier">Pro</div>
300
293
  <div class="price">$19<span>/mo</span></div>
301
294
  <div class="price-sub">
302
- <strong>Don't buy a tool — buy hosted sync + compatibility insurance.</strong> The free CLI runs your gates locally, but Pro is what we operate for you: secure SQLite sync across all your machines (saving you from managing database migrations manually across developer boxes) and active adapter maintenance to stay compatible with weekly breaking updates in Claude Code, Cursor, and Cline.
295
+ <strong>Don't buy a tool — buy proof + compatibility insurance.</strong> The free CLI runs your gates locally. Pro removes the solo caps and adds the personal dashboard, recall, exports, and active adapter maintenance to stay compatible with weekly breaking updates in Claude Code, Cursor, and Cline. Shared hosted lesson databases are Enterprise.
303
296
  </div>
304
297
  <ul>
305
- <li><strong>Hosted lesson sync</strong> — corrections follow you across machines, no manual export</li>
306
- <li><strong>Managed adapter matrix</strong> — we track runtime changes in Claude Code, Cursor, Codex, Gemini, Amp so you don't</li>
307
- <li><strong>Hosted dashboard</strong> — see every blocked action, every rule that fired, without running your own server</li>
298
+ <li><strong>Personal lesson recall</strong> — search and reuse your own corrections across sessions</li>
299
+ <li><strong>Managed adapter matrix</strong> — we track runtime changes in Claude Code, Cursor, Codex, Gemini, Amp, Cline, OpenCode so you don't</li>
300
+ <li><strong>Personal dashboard</strong> — see every flagged and blocked action and every rule that fired</li>
308
301
  <li><strong>Unlimited prevention rules</strong> — free caps at 3 auto-promoted rules</li>
309
302
  <li><strong>DPO + HuggingFace export</strong> — training data from your real corrections</li>
310
303
  <li><strong>Auto-connect</strong> — new agent surfaces appear automatically after setup</li>
@@ -346,7 +339,7 @@ __GA_BOOTSTRAP__
346
339
  <div class="faq-list">
347
340
  <div class="faq-item">
348
341
  <div class="faq-q">What does Pro add over the free CLI?</div>
349
- <div class="faq-a">Free gives you 2 captures/day and 3 active rules, running entirely on your machine. Pro is the hosted layer: unlimited captures, unlimited rules, lesson sync across machines, a dashboard without self-hosting, managed adapter updates, and DPO export. You're paying for infrastructure we run, not features we hide.</div>
342
+ <div class="faq-a">Free gives you 2 captures/day and 3 active rules, running on your machine. Pro removes solo caps and adds personal recall, dashboard proof, managed adapters, and DPO export. Enterprise adds shared hosted lessons and org visibility.</div>
350
343
  </div>
351
344
  <div class="faq-item">
352
345
  <div class="faq-q">Why not just use an enterprise AI control plane?</div>
@@ -354,7 +347,7 @@ __GA_BOOTSTRAP__
354
347
  </div>
355
348
  <div class="faq-item">
356
349
  <div class="faq-q">Does ThumbGate send my code to the cloud?</div>
357
- <div class="faq-a">No. The CLI is local-first and no source code leaves your machine. Pro and Enterprise add hosted sync for dashboards and shared lessons, but your code stays local.</div>
350
+ <div class="faq-a">No. The CLI is local-first and no source code leaves your machine. Pro adds personal proof and exports; Enterprise adds shared hosted lessons and org dashboards.</div>
358
351
  </div>
359
352
  <div class="faq-item">
360
353
  <div class="faq-q">When should I pick Enterprise over Pro?</div>
@@ -366,7 +359,7 @@ __GA_BOOTSTRAP__
366
359
  </div>
367
360
  <div class="faq-item">
368
361
  <div class="faq-q">What happens if I stop paying?</div>
369
- <div class="faq-a">You keep the free CLI with 5-rule cap. Your existing rules and captures stay on your machine. You lose dashboard access, lesson search, exports, and auto-connect.</div>
362
+ <div class="faq-a">You keep the free CLI, capped at 3 active rules and 2 captures/day. Existing rules and captures stay on your machine. You lose the personal dashboard, managed adapters, exports, and higher limits. Shared hosted lessons and org dashboards are Enterprise.</div>
370
363
  </div>
371
364
  </div>
372
365
  </div>
package/public/pro.html CHANGED
@@ -842,7 +842,7 @@ __GA_BOOTSTRAP__
842
842
  <div class="container">
843
843
  <div class="section-label">Why operators pay</div>
844
844
  <h2 class="section-title">Pro is not "more memory." It is a tighter operating loop around one operator's real failures.</h2>
845
- <p class="section-intro">The paid story is simple: free helps you install and block repeated mistakes locally. Pro helps you debug those blocks faster, export the learning, and show proof when a workflow owner asks what changed.</p>
845
+ <p class="section-intro">The paid story is simple: free helps you install and catch repeated mistakes locally. Pro helps you debug those blocks faster, export the learning, and show proof when a workflow owner asks what changed.</p>
846
846
  <div class="grid-3">
847
847
  <div class="feature-card">
848
848
  <h3>Debug the exact block in minutes</h3>
@@ -880,7 +880,7 @@ __GA_BOOTSTRAP__
880
880
  <div class="split-card free">
881
881
  <div class="split-kicker">Stay on Free</div>
882
882
  <h3>The local install is still the right first step</h3>
883
- <p>If you only need local recall, Pre-Action Checks, MCP setup, and a way to stop repeated mistakes on one machine, keep the free install and move fast.</p>
883
+ <p>If you only need local recall, Pre-Action Checks, MCP setup, and a way to catch repeated mistakes on one machine, keep the free install and move fast.</p>
884
884
  <ul>
885
885
  <li>Local-first recall, lessons, and enforcement.</li>
886
886
  <li>No cloud account required.</li>
@@ -11,6 +11,7 @@
11
11
 
12
12
  const path = require('node:path');
13
13
  const { loadEpisodes } = require('./session-episode-store');
14
+ const { requireLearnedModelsEntitlement } = require('./entitlement');
14
15
 
15
16
  const HIGH_RISK_TAGS = new Set([
16
17
  'billing',
@@ -163,6 +164,10 @@ function isRlTuple(value) {
163
164
  }
164
165
 
165
166
  function buildPreferencePairs(episodes = [], options = {}) {
167
+ requireLearnedModelsEntitlement({
168
+ ...(options.entitlement || {}),
169
+ label: 'agent reward preference-pair generation',
170
+ });
166
171
  const tuples = episodes
167
172
  .map((episode) => episodeToRlTuple(episode, options))
168
173
  .sort((a, b) => a.reward.total - b.reward.total);
@@ -181,6 +186,10 @@ function buildPreferencePairs(episodes = [], options = {}) {
181
186
  }
182
187
 
183
188
  function rankGateCandidatesByReward(episodes = [], options = {}) {
189
+ requireLearnedModelsEntitlement({
190
+ ...(options.entitlement || {}),
191
+ label: 'agent reward gate ranking',
192
+ });
184
193
  const minOccurrences = Math.max(1, Number(options.minOccurrences || 2));
185
194
  const buckets = new Map();
186
195
 
@@ -305,6 +314,10 @@ function allocateTestTimeCompute(action = {}) {
305
314
  }
306
315
 
307
316
  function buildRewardReport(episodes = [], options = {}) {
317
+ requireLearnedModelsEntitlement({
318
+ ...(options.entitlement || {}),
319
+ label: 'agent reward model report',
320
+ });
308
321
  const tuples = episodes.map((episode) => episodeToRlTuple(episode, options));
309
322
  const rewards = tuples.map((tuple) => tuple.reward.total);
310
323
  const averageReward = rewards.length ? round(rewards.reduce((sum, value) => sum + value, 0) / rewards.length) : 0;
@@ -32,6 +32,7 @@
32
32
 
33
33
  const fs = require('node:fs');
34
34
  const path = require('node:path');
35
+ const { requireLearnedModelsEntitlement } = require('./entitlement');
35
36
 
36
37
  // Baseline loss matrix. `default` applies when no tag-specific override
37
38
  // matches. Higher = more expensive. The asymmetry below reflects the
@@ -181,7 +182,11 @@ function computeBayesPosterior({ tags, riskByTag, baseRate, modelProbability } =
181
182
  *
182
183
  * This reduces to the usual Bayes classifier when both costs are equal.
183
184
  */
184
- function bayesOptimalDecision(posterior, tags, lossMatrix = DEFAULT_LOSS_MATRIX) {
185
+ function bayesOptimalDecision(posterior, tags, lossMatrix = DEFAULT_LOSS_MATRIX, options = {}) {
186
+ requireLearnedModelsEntitlement({
187
+ ...(options.entitlement || {}),
188
+ label: 'Bayes-optimal gate decisioning',
189
+ });
185
190
  const pHarmful = clip(Number(posterior?.pHarmful), 0, 1);
186
191
  const pSafe = clip(Number(posterior?.pSafe ?? 1 - pHarmful), 0, 1);
187
192
  const cFalseAllow = resolveCost(lossMatrix?.falseAllow || {}, tags);
@@ -29,6 +29,7 @@ const G = '\x1b[32m';
29
29
  const R = '\x1b[31m';
30
30
  const C = '\x1b[36m';
31
31
  const M = '\x1b[35m';
32
+ const Y = '\x1b[33m';
32
33
  const D = '\x1b[90m';
33
34
  const BD = '\x1b[1m';
34
35
  const RST = '\x1b[0m';
@@ -73,7 +74,15 @@ function processInlineFeedback({ signal, context, chatHistory, whatWentWrong, wh
73
74
  const recentLesson = getRecentLesson();
74
75
  const stats = getLessonStats();
75
76
 
76
- return { feedbackResult, distillResult, recentLesson, stats };
77
+ // 4. If the user wrote an explicit "never …" / "always …" directive, surface
78
+ // an OFFER (never auto-act): "never" on a thumbs-down → offer force-gate now.
79
+ let forceGateHint = null;
80
+ try {
81
+ const { suggestForceGate } = require('./imperative-detector');
82
+ forceGateHint = suggestForceGate({ signal, text: whatWentWrong || whatWorked || context });
83
+ } catch { /* detector optional; never block capture on it */ }
84
+
85
+ return { feedbackResult, distillResult, recentLesson, stats, forceGateHint };
77
86
  }
78
87
 
79
88
  /**
@@ -100,6 +109,13 @@ function formatCliOutput(result) {
100
109
  lines.push(`${R}Feedback not accepted: ${(result.feedbackResult && result.feedbackResult.reason) || 'unknown'}${RST}`);
101
110
  }
102
111
 
112
+ // Explicit-directive offer (e.g. "never …" → offer immediate force-gate).
113
+ if (result.forceGateHint && result.forceGateHint.message) {
114
+ const color = result.forceGateHint.kind === 'force-gate-offer' ? Y : D;
115
+ lines.push('');
116
+ lines.push(`${color}💡 ${result.forceGateHint.message}${RST}`);
117
+ }
118
+
103
119
  // Distilled lesson (if thumbs down)
104
120
  if (result.distillResult) {
105
121
  lines.push('');
@@ -67,11 +67,11 @@ function buildCaptureReceipt({ signal, feedbackId, memoryId, actionType } = {})
67
67
  memoryId ? ` Local memory : ${memoryId}` : ' Local memory : saved locally',
68
68
  actionType ? ` Rule pressure : ${actionType}` : ' Rule pressure : available for promotion',
69
69
  ' Free today : this proof protects this local machine',
70
- ' Pro sync : keep this lesson, rule, and dashboard synced across machines and agent runtimes',
70
+ ' Pro recall : keep this lesson searchable, exportable, and visible',
71
71
  ' Next proof : npx thumbgate stats',
72
72
  ' Cost proof : npx thumbgate cost',
73
73
  '',
74
- ` Solo Pro : ${PRO_PRICE_LABEL} for hosted sync, search, dashboard, and exports`,
74
+ ` Solo Pro : ${PRO_PRICE_LABEL} for recall, dashboard, adapters, and exports`,
75
75
  ` Upgrade : ${trackedProUrl('cli_capture_receipt', actionType || normalizedSignal.toLowerCase())}`,
76
76
  ` Enterprise : ${ENTERPRISE_PRICE_LABEL}; start with one repeated workflow failure`,
77
77
  ' https://thumbgate.ai/#workflow-sprint-intake',
@@ -105,7 +105,7 @@ function buildStatsReceipt(stats = {}) {
105
105
  lines.push(` Failure pressure : ${negatives} negative ${pluralize(negatives, 'signal')}`);
106
106
  }
107
107
  lines.push(' Show the buyer : npx thumbgate cost');
108
- lines.push(' Pro sync value : keep these lessons/rules visible across laptops, CI, containers, and agent runtimes');
108
+ lines.push(' Pro recall value : keep lessons/rules searchable, exportable, and visible');
109
109
  lines.push(` Solo Pro : ${trackedProUrl('cli_stats_receipt', 'proof_seen')}`);
110
110
  lines.push(' Enterprise : https://thumbgate.ai/#workflow-sprint-intake');
111
111
  lines.push('');