thumbgate 1.23.1 → 1.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +5 -5
- package/.claude-plugin/plugin.json +2 -2
- package/.well-known/llms.txt +26 -11
- package/.well-known/mcp/server-card.json +8 -8
- package/README.md +69 -34
- 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 +39 -16
- package/bin/postinstall.js +11 -22
- package/config/gate-templates.json +72 -0
- package/config/github-about.json +1 -1
- package/config/post-deploy-marketing-pages.json +6 -1
- package/package.json +5 -5
- package/public/agent-manager.html +3 -3
- package/public/agents-cost-savings.html +3 -3
- package/public/ai-malpractice-prevention.html +278 -7
- package/public/blog.html +3 -3
- package/public/codex-enterprise.html +3 -3
- package/public/codex-plugin.html +4 -4
- package/public/compare.html +6 -6
- package/public/dashboard.html +211 -126
- package/public/guide.html +5 -5
- package/public/index.html +156 -47
- package/public/learn.html +24 -10
- package/public/lessons.html +2 -2
- package/public/numbers.html +6 -6
- package/public/pricing.html +6 -5
- package/public/pro.html +1 -0
- package/scripts/billing.js +17 -0
- package/scripts/commercial-offer.js +4 -1
- package/scripts/dashboard.js +53 -1
- package/scripts/gates-engine.js +3 -3
- package/scripts/plausible-server-events.js +2 -1
- package/scripts/rate-limiter.js +16 -12
- package/scripts/seo-gsd.js +167 -1
- package/scripts/telemetry-analytics.js +310 -0
- package/scripts/visitor-journey.js +172 -0
- package/src/api/server.js +65 -29
- package/adapters/chatgpt/openapi.yaml +0 -1705
|
@@ -444,6 +444,78 @@
|
|
|
444
444
|
"problem": "Blocks background agents from cloning, building, testing, or publishing unless they run in an isolated durable environment with logs.",
|
|
445
445
|
"roi": "Lets the team pursue unattended revenue and engineering workflows without turning local developer machines into the execution boundary.",
|
|
446
446
|
"rollout": "Enable for every agent that can run tests, push branches, deploy, publish content, change billing, or touch customer data."
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
"id": "block-unauthorized-practice-of-law",
|
|
450
|
+
"name": "Block unauthorized practice of law",
|
|
451
|
+
"category": "Legal Intake Safety",
|
|
452
|
+
"signal": "👎",
|
|
453
|
+
"defaultAction": "block",
|
|
454
|
+
"severity": "critical",
|
|
455
|
+
"pattern": "(outcome prediction|jurisdictional recommendation|[Yy]ou\\s+(should|could|might)\\s+(file|sue|claim)|strong case|likely\\s+(prevail|win|succeed))",
|
|
456
|
+
"problem": "Stops advice-shaped intake replies under ABA Rule 5.5.",
|
|
457
|
+
"roi": "Prevents malpractice exposure before delivery.",
|
|
458
|
+
"rollout": "Enable on every AI intake channel."
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"id": "require-conflict-check-before-intake",
|
|
462
|
+
"name": "Require conflict check before intake continues",
|
|
463
|
+
"category": "Legal Intake Safety",
|
|
464
|
+
"signal": "👎",
|
|
465
|
+
"defaultAction": "block",
|
|
466
|
+
"severity": "critical",
|
|
467
|
+
"pattern": "(collect_case_facts|schedule_consultation|intake_continue).*(missing|no|unchecked).*(conflict|adverse[_-]party|clearance)",
|
|
468
|
+
"problem": "Requires adverse-party clearance before sensitive facts.",
|
|
469
|
+
"roi": "Catches conflicts before privileged facts cross ethical walls.",
|
|
470
|
+
"rollout": "Use the firm's conflicts API or a synthetic pilot fixture."
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"id": "block-privileged-content-egress",
|
|
474
|
+
"name": "Block privileged content egress",
|
|
475
|
+
"category": "Legal Intake Safety",
|
|
476
|
+
"signal": "👎",
|
|
477
|
+
"defaultAction": "block",
|
|
478
|
+
"severity": "critical",
|
|
479
|
+
"pattern": "(send_email|api_call|external_request|schedule|crm_update).*(privileged|attorney[_-]client|work[_-]product|matter[_-]id|confidential)",
|
|
480
|
+
"problem": "Blocks outbound actions with privilege markers.",
|
|
481
|
+
"roi": "Prevents single-action privilege waiver.",
|
|
482
|
+
"rollout": "Define markers, start with hard block, then add in-tenant reroute."
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
"id": "require-approved-disclaimer-before-response",
|
|
486
|
+
"name": "Require approved disclaimer before response",
|
|
487
|
+
"category": "Legal Intake Safety",
|
|
488
|
+
"signal": "👎",
|
|
489
|
+
"defaultAction": "block",
|
|
490
|
+
"severity": "high",
|
|
491
|
+
"pattern": "(intake_response|client_reply).*((missing|no)\\s*(disclaimer|disclosure|non[_-]engagement)|(disclaimer|disclosure|non[_-]engagement)\\s*[:=]?\\s*(missing|none|no))",
|
|
492
|
+
"problem": "Requires firm-approved non-engagement language.",
|
|
493
|
+
"roi": "Reduces inadvertent client-relationship risk.",
|
|
494
|
+
"rollout": "Load approved disclaimer during pilot."
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
"id": "restrict-model-endpoint-to-approved-list",
|
|
498
|
+
"name": "Restrict model endpoint to approved list",
|
|
499
|
+
"category": "Legal Intake Safety",
|
|
500
|
+
"signal": "👎",
|
|
501
|
+
"defaultAction": "block",
|
|
502
|
+
"severity": "high",
|
|
503
|
+
"pattern": "(model_call|llm_request|api_endpoint).*(unapproved|unknown|public|consumer)",
|
|
504
|
+
"problem": "Blocks unapproved model endpoints.",
|
|
505
|
+
"roi": "Keeps data inside approved vendor boundaries.",
|
|
506
|
+
"rollout": "Allowlist endpoints during pilot."
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
"id": "require-attorney-review-before-routing",
|
|
510
|
+
"name": "Require attorney review before case routing",
|
|
511
|
+
"category": "Legal Intake Safety",
|
|
512
|
+
"signal": "👎",
|
|
513
|
+
"defaultAction": "block",
|
|
514
|
+
"severity": "high",
|
|
515
|
+
"pattern": "(route_to_attorney|assign_practice_area|schedule_consultation).*(no|missing).*(review|approval|supervisor)",
|
|
516
|
+
"problem": "Requires review before routing or scheduling.",
|
|
517
|
+
"roi": "Prevents bad prospect routing.",
|
|
518
|
+
"rollout": "Start strict; relax after pilot evidence."
|
|
447
519
|
}
|
|
448
520
|
]
|
|
449
521
|
}
|
package/config/github-about.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"repo": "IgorGanapolsky/ThumbGate",
|
|
3
3
|
"repositoryUrl": "https://github.com/IgorGanapolsky/ThumbGate",
|
|
4
|
-
"homepageUrl": "https://thumbgate
|
|
4
|
+
"homepageUrl": "https://thumbgate.ai",
|
|
5
5
|
"githubDescription": "Agent governance for ThumbGate: 👍/👎 become Pre-Action Checks that block repeat mistakes before code, money, or customer systems change.",
|
|
6
6
|
"metaDescription": "Stop paying for the same AI mistake twice. ThumbGate is machine-speed pre-action defense for AI coding agents and vibe coding workflows: 👍 thumbs up and 👎 thumbs down become history-aware lessons, shared lessons and org visibility, actionable remediations, agent surface inventory, and Pre-Action Checks that block repeat mistakes before the next tool call across Claude Code, Cursor, Codex, Gemini, Amp, Cline, and OpenCode.",
|
|
7
7
|
"topics": [
|
|
@@ -29,9 +29,14 @@
|
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"route": "/ai-malpractice-prevention",
|
|
32
|
-
"sentinel": "
|
|
32
|
+
"sentinel": "Pre-Execution Controls for Legal AI Agents",
|
|
33
33
|
"description": "Legal AI intake risk-controls page for law-firm pilot conversations"
|
|
34
34
|
},
|
|
35
|
+
{
|
|
36
|
+
"route": "/learn/background-agent-control-layer",
|
|
37
|
+
"sentinel": "Background agents need a control layer outside the model",
|
|
38
|
+
"description": "Background-agent AI-SDLC control-layer positioning page"
|
|
39
|
+
},
|
|
35
40
|
{
|
|
36
41
|
"route": "/llm-context.md",
|
|
37
42
|
"sentinel": "## What ThumbGate Is",
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "thumbgate",
|
|
3
|
-
"version": "1.23.
|
|
3
|
+
"version": "1.23.2",
|
|
4
4
|
"description": "ThumbGate self-improving agent governance: thumbs-up/down turns every mistake into a prevention rule and blocks repeat patterns. 33 pre-action checks, budget enforcement, and self-protection for Claude Code, Cursor, Codex, Gemini CLI, and Amp.",
|
|
5
|
-
"homepage": "https://thumbgate
|
|
5
|
+
"homepage": "https://thumbgate.ai",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "https://github.com/IgorGanapolsky/ThumbGate.git"
|
|
@@ -198,6 +198,7 @@
|
|
|
198
198
|
"scripts/verification-loop.js",
|
|
199
199
|
"scripts/verifier-scoring.js",
|
|
200
200
|
"scripts/verify-marketing-pages-deployed.js",
|
|
201
|
+
"scripts/visitor-journey.js",
|
|
201
202
|
"scripts/workflow-runs.js",
|
|
202
203
|
"scripts/workflow-sentinel.js",
|
|
203
204
|
"scripts/workspace-agent-routines.js",
|
|
@@ -209,7 +210,6 @@
|
|
|
209
210
|
"LICENSE",
|
|
210
211
|
"README.md",
|
|
211
212
|
"adapters/amp/skills/thumbgate-feedback/SKILL.md",
|
|
212
|
-
"adapters/chatgpt/openapi.yaml",
|
|
213
213
|
"adapters/claude/.mcp.json",
|
|
214
214
|
"adapters/codex/config.toml",
|
|
215
215
|
"adapters/forge/forge.yaml",
|
|
@@ -341,7 +341,7 @@
|
|
|
341
341
|
"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:zernio && 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:post-everywhere-zernio-default && npm run test:zernio-canonical-pollers && npm run test:zernio-status && 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: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:plan-gate && 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: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: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: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:community-course-platform-launch-kit && 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:social-dedupe-cleanup && 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: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:demo-voiceover && 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: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",
|
|
342
342
|
"test:hook-stop-verify-deploy": "node --test tests/hook-stop-verify-deploy.test.js",
|
|
343
343
|
"test:hook-stop-anti-claim": "node --test tests/hook-stop-anti-claim.test.js",
|
|
344
|
-
"test:plausible-server-events": "node --test tests/plausible-server-events.test.js",
|
|
344
|
+
"test:plausible-server-events": "node --test tests/plausible-server-events.test.js tests/plausible-poller.test.js",
|
|
345
345
|
"test:activation-tracker": "node --test tests/activation-tracker.test.js",
|
|
346
346
|
"test:unified-revenue-rollup": "node --test tests/unified-revenue-rollup.test.js",
|
|
347
347
|
"test:conversion-rate-stats": "node --test tests/conversion-rate-stats.test.js",
|
|
@@ -349,7 +349,7 @@
|
|
|
349
349
|
"test:stripe-checkout-diagnostic": "node --test tests/stripe-checkout-diagnostic.test.js",
|
|
350
350
|
"test:stripe-business-identity-probe": "node --test tests/stripe-business-identity-probe.test.js",
|
|
351
351
|
"test:ci-cd-hygiene-audit": "node --test tests/ci-cd-hygiene-audit.test.js",
|
|
352
|
-
"test:telemetry-export": "node --test tests/telemetry-export.test.js",
|
|
352
|
+
"test:telemetry-export": "node --test tests/telemetry-export.test.js tests/telemetry-analytics-quality.test.js",
|
|
353
353
|
"test:swarm-coordinator": "node --test tests/swarm-coordinator.test.js",
|
|
354
354
|
"test:session-report": "node --test tests/session-report.test.js",
|
|
355
355
|
"test:agent-reasoning-traces": "node --test tests/agent-reasoning-traces.test.js tests/agent-stack-survival-audit.test.js",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<meta property="og:title" content="ThumbGate for the Agent Manager">
|
|
10
10
|
<meta property="og:description" content="The role Anthropic named — Agent Manager — owns CLAUDE.md, the plugin marketplace, permissions, and which skills ship. ThumbGate is the runtime underneath all of that.">
|
|
11
11
|
<meta property="og:type" content="article">
|
|
12
|
-
<meta property="og:image" content="https://thumbgate
|
|
13
|
-
<link rel="canonical" href="https://thumbgate
|
|
12
|
+
<meta property="og:image" content="https://thumbgate.ai/og.png">
|
|
13
|
+
<link rel="canonical" href="https://thumbgate.ai/agent-manager">
|
|
14
14
|
<script type="application/ld+json">
|
|
15
15
|
{
|
|
16
16
|
"@context": "https://schema.org",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"datePublished": "2026-05-19",
|
|
21
21
|
"dateModified": "2026-05-19",
|
|
22
22
|
"author": { "@type": "Person", "name": "Igor Ganapolsky", "url": "https://github.com/IgorGanapolsky" },
|
|
23
|
-
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate
|
|
23
|
+
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
|
|
24
24
|
"about": [
|
|
25
25
|
{ "@type": "Thing", "name": "Agent Manager" },
|
|
26
26
|
{ "@type": "Thing", "name": "Claude Code rollout" },
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<meta property="og:title" content="FinOps for AI Agents — Prevention, Not Reporting">
|
|
10
10
|
<meta property="og:description" content="Cost dashboards tell you what your agents wasted last week. ThumbGate's PreToolUse gates stop the wasted tool calls before they fire — and `thumbgate cost` shows you the dollar amount.">
|
|
11
11
|
<meta property="og:type" content="article">
|
|
12
|
-
<meta property="og:image" content="https://thumbgate
|
|
13
|
-
<link rel="canonical" href="https://thumbgate
|
|
12
|
+
<meta property="og:image" content="https://thumbgate.ai/og.png">
|
|
13
|
+
<link rel="canonical" href="https://thumbgate.ai/agents-cost-savings">
|
|
14
14
|
<script type="application/ld+json">
|
|
15
15
|
{
|
|
16
16
|
"@context": "https://schema.org",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"datePublished": "2026-05-21",
|
|
21
21
|
"dateModified": "2026-05-21",
|
|
22
22
|
"author": { "@type": "Person", "name": "Igor Ganapolsky", "url": "https://github.com/IgorGanapolsky" },
|
|
23
|
-
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate
|
|
23
|
+
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
|
|
24
24
|
"about": [
|
|
25
25
|
{ "@type": "Thing", "name": "FinOps for AI" },
|
|
26
26
|
{ "@type": "Thing", "name": "Agent Cost Optimization" },
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<meta property="og:title" content="Pre-Execution Controls for Legal AI Agents">
|
|
10
10
|
<meta property="og:description" content="ThumbGate preloads firm-approved ground truth, checks legal AI actions before execution, and records audit evidence for law-firm innovation, risk, and pricing teams.">
|
|
11
11
|
<meta property="og:type" content="article">
|
|
12
|
-
<meta property="og:image" content="https://thumbgate
|
|
13
|
-
<link rel="canonical" href="https://thumbgate
|
|
12
|
+
<meta property="og:image" content="https://thumbgate.ai/og.png">
|
|
13
|
+
<link rel="canonical" href="https://thumbgate.ai/ai-malpractice-prevention">
|
|
14
14
|
<script type="application/ld+json">
|
|
15
15
|
{
|
|
16
16
|
"@context": "https://schema.org",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"datePublished": "2026-05-21",
|
|
21
21
|
"dateModified": "2026-05-25",
|
|
22
22
|
"author": { "@type": "Person", "name": "Igor Ganapolsky", "url": "https://github.com/IgorGanapolsky" },
|
|
23
|
-
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate
|
|
23
|
+
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
|
|
24
24
|
"about": [
|
|
25
25
|
{ "@type": "Thing", "name": "Legal AI Governance" },
|
|
26
26
|
{ "@type": "Thing", "name": "Unauthorized Practice of Law" },
|
|
@@ -280,13 +280,16 @@
|
|
|
280
280
|
.matrix td:nth-child(2)::before { content: "Pilot answer"; }
|
|
281
281
|
.matrix td:nth-child(3)::before { content: "Evidence to bring"; }
|
|
282
282
|
}
|
|
283
|
+
.demo-result { margin-top:1rem; padding:1rem; border-radius:8px; font-size:0.95rem; }
|
|
284
|
+
.demo-blocked { background:rgba(248,113,113,0.1); border:1px solid var(--red); }
|
|
285
|
+
.demo-cleared { background:rgba(52,211,153,0.1); border:1px solid var(--green); }
|
|
286
|
+
.audit-log { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size:0.85rem; background:#0f0f11; padding:0.75rem; border-radius:6px; margin-top:0.75rem; white-space:pre-wrap; color:var(--soft); }
|
|
283
287
|
</style>
|
|
284
288
|
</head>
|
|
285
289
|
<body>
|
|
286
290
|
<nav>
|
|
287
|
-
<a href="/" class="brand">ThumbGate</a>
|
|
291
|
+
<a href="/ai-malpractice-prevention" class="brand">ThumbGate</a>
|
|
288
292
|
<a href="/agent-manager">Agent Manager</a>
|
|
289
|
-
<a href="/codex-enterprise">Codex Enterprise</a>
|
|
290
293
|
<a href="/agents-cost-savings">FinOps for Agents</a>
|
|
291
294
|
<a href="/dashboard">Dashboard demo</a>
|
|
292
295
|
<a href="https://github.com/IgorGanapolsky/ThumbGate" target="_blank" rel="noopener">GitHub</a>
|
|
@@ -295,11 +298,25 @@
|
|
|
295
298
|
<div class="wrap">
|
|
296
299
|
<header class="hero">
|
|
297
300
|
<div>
|
|
301
|
+
<div style="display: inline-block; border-left: 3px solid #fbbf24; background: rgba(251, 191, 36, 0.08); padding: 0.7rem 1rem; margin-bottom: 1.25rem; border-radius: 0 6px 6px 0; max-width: 760px;">
|
|
302
|
+
<strong style="color: #fbbf24; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.08em; display: block; margin-bottom: 0.25rem;">Why this matters now — 2026</strong>
|
|
303
|
+
<span style="color: var(--text); font-size: 0.95rem; line-height: 1.55;">Sullivan & Cromwell apologized to a federal judge for AI-hallucinated citations — despite policies, mandatory training, and verification requirements. Gordon Rees did the same on a bankruptcy filing. The <a href="https://www.damiencharlotin.com/hallucinations/" target="_blank" rel="noopener" style="color: #fbbf24">public hallucination-cases database</a> now catalogs <strong>1,369+ rulings</strong>. The firms with policies still got sanctioned. <em>Policies are not enforcement.</em> A runtime gate is.</span>
|
|
304
|
+
</div>
|
|
298
305
|
<span class="eyebrow">Pre-read for law-firm AI governance pilots</span>
|
|
299
306
|
<h1>Pre-execution controls for legal AI agents.</h1>
|
|
300
307
|
<p class="lead">Block unauthorized advice, conflict-check failures, privilege leaks, and unapproved model calls before an intake agent replies, fetches records, schedules a meeting, or sends data outside the firm's approved boundary.</p>
|
|
308
|
+
<p style="color: var(--soft); font-size: 0.98rem; max-width: 760px; margin: 0 0 1.1rem; padding: 0.7rem 1rem; border-left: 3px solid var(--green); background: rgba(114, 227, 165, 0.06); border-radius: 0 6px 6px 0;">
|
|
309
|
+
<strong style="color: var(--green)">Predictability you can put in front of a client.</strong>
|
|
310
|
+
Pre-execution controls aren't just defensive — they make agentic-AI deployment <em>predictable enough to sell</em>. Innovation teams at law firms have always had to choose between speed and certainty. The runtime gate lets you have both: the agent moves at machine speed, the gate enforces firm-specific policy deterministically, and every decision ships an audit log your pricing partners can underwrite. <strong style="color: var(--soft)">Predictability. Insights. Value.</strong> The three things your innovation team already promises clients — extended to the agentic surface.
|
|
311
|
+
</p>
|
|
312
|
+
<p style="color: var(--soft); font-size: 0.95rem; max-width: 760px; margin: 0 0 1rem; padding: 0.55rem 0.85rem; border-left: 3px solid var(--cyan); background: rgba(45, 212, 191, 0.05); border-radius: 0 6px 6px 0;">
|
|
313
|
+
<strong style="color: var(--cyan)">The gate learns from your attorneys.</strong>
|
|
314
|
+
Every 👍 / 👎 an attorney logs on an AI answer becomes a lesson in your firm's local DB. Recurring patterns promote to deterministic rules. The next time a similar action is proposed, the rule fires before any human is asked to approve.
|
|
315
|
+
<a href="/learn/feedback-loop-vs-decision-layer" style="color: var(--cyan); white-space: nowrap;">How the feedback loop works →</a>
|
|
316
|
+
</p>
|
|
301
317
|
<div class="hero-actions">
|
|
302
318
|
<a class="cta" href="mailto:iganapolsky@gmail.com?subject=ThumbGate%2025-minute%20legal%20AI%20pilot%20walkthrough&body=Hi%20Igor%2C%0A%0AWe%27d%20like%20to%20review%20the%2025-minute%20ThumbGate%20legal%20AI%20intake%20pilot.%20Please%20send%20the%20meeting%20invite%20and%20demo%20materials.%0A%0ABest%2C">Book a 25-minute pilot walkthrough</a>
|
|
319
|
+
<a class="ghost" href="#live-gate-demos">Try the live gates →</a>
|
|
303
320
|
<a class="ghost" href="#demo">View the 25-minute demo plan</a>
|
|
304
321
|
</div>
|
|
305
322
|
<div class="proof-row" aria-label="Key proof points">
|
|
@@ -352,7 +369,7 @@
|
|
|
352
369
|
<main>
|
|
353
370
|
<section>
|
|
354
371
|
<h2>Why this is credible now.</h2>
|
|
355
|
-
<p class="section-lead">The market is not waiting for perfect AI. Large firms are adopting legal AI while ethics, security, and innovation teams are still formalizing the controls around it. ThumbGate fits that gap: it is not another research assistant; it is a control point around the assistants and agents a firm already wants to evaluate.</p>
|
|
372
|
+
<p class="section-lead">The market is not waiting for perfect AI. Large firms are adopting legal AI while ethics, security, and innovation teams are still formalizing the controls around it. ThumbGate fits that gap: it is not another research assistant; it is a control point around the assistants and agents a firm already wants to evaluate. Governance has to live outside the model's context window. If the agent can reason around the rule, it is not really a rule.</p>
|
|
356
373
|
<div class="grid">
|
|
357
374
|
<div class="card">
|
|
358
375
|
<span class="tag blue">Governance</span>
|
|
@@ -372,6 +389,32 @@
|
|
|
372
389
|
</div>
|
|
373
390
|
</section>
|
|
374
391
|
|
|
392
|
+
<section>
|
|
393
|
+
<h2>The pilot is an AI-SDLC control layer, not a chatbot demo.</h2>
|
|
394
|
+
<p class="section-lead">The strongest buyer framing is simple: the firm may already have agents, copilots, research tools, and intake experiments. What it still needs is the system around those agents: triggers, isolated runs, approved context, visibility, and controls that live outside the model prompt.</p>
|
|
395
|
+
<div class="grid">
|
|
396
|
+
<div class="card">
|
|
397
|
+
<span class="tag blue">Trigger</span>
|
|
398
|
+
<h3>Define what starts legal AI work</h3>
|
|
399
|
+
<p>A pilot run should begin from a scoped intake event, not an open-ended prompt. The event carries practice area, jurisdiction, allowed tools, reviewer role, and done criteria.</p>
|
|
400
|
+
</div>
|
|
401
|
+
<div class="card">
|
|
402
|
+
<span class="tag amber">Context</span>
|
|
403
|
+
<h3>Load only approved firm ground truth</h3>
|
|
404
|
+
<p>Disclaimers, adverse-party fixtures, model allowlists, routing policy, and supervision rules should be versioned inputs, not improvised chat context.</p>
|
|
405
|
+
</div>
|
|
406
|
+
<div class="card">
|
|
407
|
+
<span class="tag green">Controls</span>
|
|
408
|
+
<h3>Block before the action happens</h3>
|
|
409
|
+
<p>Pre-action gates stop advice-shaped replies, conflict-precheck bypass, and confidential egress before the agent sends, fetches, schedules, or calls out.</p>
|
|
410
|
+
</div>
|
|
411
|
+
</div>
|
|
412
|
+
<div class="callout" style="margin-top:1rem;">
|
|
413
|
+
<p><strong>Executive takeaway:</strong> ThumbGate does not ask a law firm to trust a bigger prompt. It gives risk, innovation, and security teams a reviewable control point between the agent and the next privileged action.</p>
|
|
414
|
+
<p><a href="/learn/background-agent-control-layer">Read the background-agent control-layer brief →</a></p>
|
|
415
|
+
</div>
|
|
416
|
+
</section>
|
|
417
|
+
|
|
375
418
|
<section>
|
|
376
419
|
<h2>Yes, the pilot can start with preloaded ground truth.</h2>
|
|
377
420
|
<p class="section-lead">The first pilot should not ask the model to discover the firm's risk posture. ThumbGate should load the approved rule pack before the first intake simulation, then prove that the agent is physically stopped when a proposed action violates that pack.</p>
|
|
@@ -476,9 +519,237 @@
|
|
|
476
519
|
<h2>Recommended 30-day pilot.</h2>
|
|
477
520
|
<p>Start narrow: one intake channel, one practice-area workflow, one adverse-party fixture, one approved-model routing policy, and one audit export format.</p>
|
|
478
521
|
<p>Deliverables: preloaded rule pack, demo agent, screenshot set, 60-second walkthrough clip, security data-flow note, pilot metrics, and a go/no-go rollout recommendation.</p>
|
|
479
|
-
<p
|
|
522
|
+
<p style="margin:1.2rem 0 0.6rem;color:var(--amber);font-size:1.1rem;font-weight:700;">Pilot setup fee: $2,500 – $7,500 flat (scope-dependent). No per-seat or per-query billing during the pilot.</p>
|
|
523
|
+
<div style="display:flex;gap:1rem;flex-wrap:wrap;margin-top:1rem;">
|
|
524
|
+
<a class="cta" href="mailto:iganapolsky@gmail.com?subject=ThumbGate%2025-minute%20legal%20AI%20pilot%20walkthrough&body=Hi%20Igor%2C%0A%0AWe%27d%20like%20to%20review%20the%2025-minute%20ThumbGate%20legal%20AI%20intake%20pilot.%20Please%20send%20the%20meeting%20invite%20and%20demo%20materials.%0A%0ABest%2C">Book a 25-minute pilot walkthrough</a>
|
|
525
|
+
<a class="ghost" href="/dashboard">View the live dashboard demo</a>
|
|
526
|
+
</div>
|
|
480
527
|
</div>
|
|
481
528
|
</section>
|
|
529
|
+
|
|
530
|
+
<section id="live-gate-demos">
|
|
531
|
+
<h2>Live gate demos — try them yourself</h2>
|
|
532
|
+
<div style="border-left: 3px solid var(--cyan); background: rgba(34, 211, 238, 0.06); padding: 0.85rem 1.1rem; margin: 0 0 1.5rem; border-radius: 0 6px 6px 0;">
|
|
533
|
+
<strong style="color: var(--cyan)">Monitor vs enforce.</strong> <span style="color: var(--text)">Agent observability tools log what your agent <em>did</em>. ThumbGate gates what your agent is <em>about to do</em> — runtime block before execution, not retrospective alert after the harm. SIEM ingestion is the audit trail. The PreToolUse hook is the prevention.</span>
|
|
534
|
+
</div>
|
|
535
|
+
<p style="color:var(--muted); margin-bottom:1.5rem">These simulators use the exact same deterministic PreToolUse logic that runs in production. No LLM calls on the enforcement path — just fast, auditable pattern matching.</p>
|
|
536
|
+
|
|
537
|
+
<!-- UPL Gate Simulator -->
|
|
538
|
+
<div class="card" style="margin-bottom:2rem">
|
|
539
|
+
<h3 style="color:var(--cyan); margin-bottom:0.75rem">1. UPL Gate — advice-shaped output detector</h3>
|
|
540
|
+
<p style="font-size:0.95rem; color:var(--muted)">Type what a client might ask an intake bot. The gate detects predictions, recommendations, or jurisdictional legal analysis from a non-attorney source and blocks delivery.</p>
|
|
541
|
+
<textarea id="upl-input" placeholder="E.g. 'Based on the facts you described, you likely have a strong claim for breach of contract and could recover significant damages.'" style="width:100%; height:90px; background:#0f0f11; color:var(--text); border:1px solid var(--line); border-radius:8px; padding:0.75rem; font-size:0.95rem; resize:vertical; margin:0.75rem 0"></textarea>
|
|
542
|
+
<button onclick="runUPLDemo()" class="cta" style="padding:0.6rem 1.1rem; font-size:0.9rem">Run through UPL Gate</button>
|
|
543
|
+
<div id="upl-result" class="demo-result" style="display:none"></div>
|
|
544
|
+
</div>
|
|
545
|
+
|
|
546
|
+
<!-- Conflict Check Simulator -->
|
|
547
|
+
<div class="card" style="margin-bottom:2rem">
|
|
548
|
+
<h3 style="color:var(--cyan); margin-bottom:0.75rem">2. Conflict Gate — adverse party clearance</h3>
|
|
549
|
+
<p style="font-size:0.95rem; color:var(--muted)">Enter a prospective client or party name. The gate checks against a sample adverse-parties list (real firms maintain much larger lists).</p>
|
|
550
|
+
<div style="display:flex; gap:0.75rem; align-items:flex-end; margin:0.75rem 0; flex-wrap:wrap">
|
|
551
|
+
<div style="flex:1; min-width:240px">
|
|
552
|
+
<label style="font-size:0.8rem; color:var(--muted); display:block; margin-bottom:0.25rem">Party / Company Name</label>
|
|
553
|
+
<input id="conflict-input" type="text" placeholder="Latam Real Capital" value="Latam Real Capital S.A." style="width:100%; background:#0f0f11; color:var(--text); border:1px solid var(--line); border-radius:8px; padding:0.6rem; font-size:0.95rem">
|
|
554
|
+
</div>
|
|
555
|
+
<button onclick="runConflictDemo()" class="cta" style="padding:0.6rem 1.1rem; font-size:0.9rem; white-space:nowrap">Check Against Adverse List</button>
|
|
556
|
+
</div>
|
|
557
|
+
<div style="font-size:0.8rem; color:var(--muted); margin-bottom:0.5rem">Sample adverse list (synthetic, illustrative): Latam Real Capital S.A. (real estate #M-2847), Hospitalia Holdings (hospitality M&A #M-2911), NovaIA Latam (AI venture #M-2755)</div>
|
|
558
|
+
<div id="conflict-result" class="demo-result" style="display:none"></div>
|
|
559
|
+
</div>
|
|
560
|
+
|
|
561
|
+
<!-- Privilege Egress Simulator -->
|
|
562
|
+
<div class="card">
|
|
563
|
+
<h3 style="color:var(--cyan); margin-bottom:0.75rem">3. Egress Gate — privilege marker detector</h3>
|
|
564
|
+
<p style="font-size:0.95rem; color:var(--muted)">Paste content an agent might try to send to an external LLM (e.g. deposition summary request). The gate blocks if it detects privilege markers.</p>
|
|
565
|
+
<textarea id="privilege-input" placeholder="Please summarize this deposition transcript. [Attorney Work Product - Matter M-2847 - Confidential]" style="width:100%; height:90px; background:#0f0f11; color:var(--text); border:1px solid var(--line); border-radius:8px; padding:0.75rem; font-size:0.95rem; resize:vertical; margin:0.75rem 0"></textarea>
|
|
566
|
+
<button onclick="runPrivilegeDemo()" class="cta" style="padding:0.6rem 1.1rem; font-size:0.9rem">Attempt External LLM Call</button>
|
|
567
|
+
<div id="privilege-result" class="demo-result" style="display:none"></div>
|
|
568
|
+
</div>
|
|
569
|
+
|
|
570
|
+
<script>
|
|
571
|
+
function escapeHtml(s) {
|
|
572
|
+
return String(s).replace(/[&<>"']/g, function(c) {
|
|
573
|
+
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
// Produces the same JSON shape a production ThumbGate gate would stream to the firm's SIEM.
|
|
577
|
+
// Includes ISO 27001 control mapping so procurement can map evidence to controls without translation.
|
|
578
|
+
window.__thumbgateBuildAudit = function(args) {
|
|
579
|
+
return {
|
|
580
|
+
audit_id: args.audit_id,
|
|
581
|
+
timestamp_iso: args.timestamp_iso,
|
|
582
|
+
rule: { id: args.rule_id, version: args.rule_version, matched: args.matched },
|
|
583
|
+
blocked_call: {
|
|
584
|
+
agent: args.agent,
|
|
585
|
+
input_excerpt: String(args.input || '').slice(0, 280),
|
|
586
|
+
matter_context: args.matter_context
|
|
587
|
+
},
|
|
588
|
+
action: args.action,
|
|
589
|
+
reviewer: null,
|
|
590
|
+
iso_27001_controls: args.iso_controls,
|
|
591
|
+
generated_by: 'ThumbGate PreToolUse Gate (sample export — production version streams to your SIEM)',
|
|
592
|
+
sample_disclaimer: 'Synthetic audit record for evaluation. No real client data referenced.'
|
|
593
|
+
};
|
|
594
|
+
};
|
|
595
|
+
window.__thumbgateDownloadAudit = function(payload, filename) {
|
|
596
|
+
try {
|
|
597
|
+
var json = JSON.stringify(payload, null, 2);
|
|
598
|
+
var blob = new Blob([json], { type: 'application/json' });
|
|
599
|
+
var url = URL.createObjectURL(blob);
|
|
600
|
+
var a = document.createElement('a');
|
|
601
|
+
a.href = url; a.download = filename;
|
|
602
|
+
document.body.appendChild(a); a.click();
|
|
603
|
+
document.body.removeChild(a);
|
|
604
|
+
setTimeout(function() { URL.revokeObjectURL(url); }, 10000);
|
|
605
|
+
} catch (e) { console.error('audit download failed', e); }
|
|
606
|
+
};
|
|
607
|
+
window.__thumbgateAuditRegistry = {};
|
|
608
|
+
window.__thumbgateAuditByKey = function(key) {
|
|
609
|
+
var entry = window.__thumbgateAuditRegistry[key];
|
|
610
|
+
if (!entry) return;
|
|
611
|
+
window.__thumbgateDownloadAudit(entry.payload, entry.filename);
|
|
612
|
+
};
|
|
613
|
+
window.__thumbgateAuditButton = function(key, payload, filename) {
|
|
614
|
+
window.__thumbgateAuditRegistry[key] = { payload: payload, filename: filename };
|
|
615
|
+
return '<button class="cta" style="margin-top:0.5rem; padding:0.45rem 0.9rem; font-size:0.82rem; background:transparent; color:var(--cyan); border:1px solid var(--cyan)" ' +
|
|
616
|
+
'onclick="__thumbgateAuditByKey(\'' + key + '\')">' +
|
|
617
|
+
'Download audit JSON (sample) ↓</button>';
|
|
618
|
+
};
|
|
619
|
+
function runUPLDemo() {
|
|
620
|
+
var input = document.getElementById('upl-input').value.trim();
|
|
621
|
+
var resultDiv = document.getElementById('upl-result');
|
|
622
|
+
if (!input) { resultDiv.style.display = 'none'; return; }
|
|
623
|
+
var advicePatterns = ['you have a strong case', 'likely to win', 'you should', 'recommend that you', 'based on the facts you described', 'in my opinion', 'the best course is', 'you are entitled to'];
|
|
624
|
+
var lower = input.toLowerCase();
|
|
625
|
+
var blocked = false;
|
|
626
|
+
var reason = '';
|
|
627
|
+
for (var i = 0; i < advicePatterns.length; i++) {
|
|
628
|
+
if (lower.indexOf(advicePatterns[i]) !== -1) { blocked = true; reason = advicePatterns[i]; break; }
|
|
629
|
+
}
|
|
630
|
+
if (blocked) {
|
|
631
|
+
var uplPayload = __thumbgateBuildAudit({
|
|
632
|
+
audit_id: 'UPL-2847-20260526-091204',
|
|
633
|
+
timestamp_iso: '2026-05-26T09:12:04Z',
|
|
634
|
+
rule_id: 'UPL_RULE_05.5_ADVICE_SHAPE',
|
|
635
|
+
rule_version: '3.2',
|
|
636
|
+
matched: 'advice-shaped output from non-attorney source ("' + reason + '")',
|
|
637
|
+
agent: 'website-intake-bot-v2',
|
|
638
|
+
input: input,
|
|
639
|
+
matter_context: 'New client intake (web)',
|
|
640
|
+
action: 'REPLACE + LOG + NOTIFY_ATTORNEY',
|
|
641
|
+
iso_controls: ['A.5.34 (Privacy & PII protection)', 'A.5.24 (Information security incident management)']
|
|
642
|
+
});
|
|
643
|
+
resultDiv.innerHTML =
|
|
644
|
+
'<div class="demo-blocked">' +
|
|
645
|
+
'<strong style="color:#f87171">BLOCKED — UPL Gate fired</strong><br>' +
|
|
646
|
+
'Detected advice-shaped pattern: "' + escapeHtml(reason) + '"<br><br>' +
|
|
647
|
+
'<strong>Corrective action taken:</strong><br>' +
|
|
648
|
+
'Response replaced with: <em>"That\'s a legal question best answered by a licensed attorney. I can schedule a 30-minute consultation with one of our [practice area] attorneys — would [time] work for you?"</em><br><br>' +
|
|
649
|
+
'<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: UPL_RULE_05.5_ADVICE_SHAPE v3.2\nRule matched: advice-shaped output from non-attorney source\nAction: REPLACE + LOG + NOTIFY_ATTORNEY\nAudit ID: UPL-2847-20260526-091204\nMatter context: New client intake (web)\nAgent: website-intake-bot-v2</div>' +
|
|
650
|
+
__thumbgateAuditButton('upl', uplPayload, 'ThumbGate-Audit-UPL-2847-2026-05-26.json') +
|
|
651
|
+
'</div>';
|
|
652
|
+
} else {
|
|
653
|
+
resultDiv.innerHTML =
|
|
654
|
+
'<div class="demo-cleared">' +
|
|
655
|
+
'<strong style="color:#34d399">CLEARED — no UPL pattern detected</strong><br>' +
|
|
656
|
+
'Response would be delivered as-is. (In production this would still be logged for training.)' +
|
|
657
|
+
'</div>';
|
|
658
|
+
}
|
|
659
|
+
resultDiv.style.display = 'block';
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
function runConflictDemo() {
|
|
663
|
+
var party = document.getElementById('conflict-input').value.trim().toLowerCase();
|
|
664
|
+
var resultDiv = document.getElementById('conflict-result');
|
|
665
|
+
if (!party) { resultDiv.style.display = 'none'; return; }
|
|
666
|
+
var adverseList = ['latam real capital', 'latam real', 'hospitalia holdings', 'hospitalia', 'novaia latam', 'novaia'];
|
|
667
|
+
var isAdverse = adverseList.some(function(a) { return party.indexOf(a) !== -1; });
|
|
668
|
+
if (isAdverse) {
|
|
669
|
+
var conflictPayload = __thumbgateBuildAudit({
|
|
670
|
+
audit_id: 'CONF-2911-20260526-091204',
|
|
671
|
+
timestamp_iso: '2026-05-26T09:12:04Z',
|
|
672
|
+
rule_id: 'CONFLICT_RULE_1.7_ADVERSE',
|
|
673
|
+
rule_version: '4.1',
|
|
674
|
+
matched: 'adverse-parties list match for "' + party + '"',
|
|
675
|
+
agent: 'doc-fetch-agent-v1',
|
|
676
|
+
input: party,
|
|
677
|
+
matter_context: 'New M&A intake — preliminary conflict check',
|
|
678
|
+
action: 'BLOCK + REDIRECT + LOG',
|
|
679
|
+
iso_controls: ['A.5.10 (Acceptable use of information)', 'A.5.24 (Information security incident management)', 'A.8.10 (Information deletion)']
|
|
680
|
+
});
|
|
681
|
+
resultDiv.innerHTML =
|
|
682
|
+
'<div class="demo-blocked">' +
|
|
683
|
+
'<strong style="color:#f87171">BLOCKED — Conflict Gate fired</strong><br>' +
|
|
684
|
+
'"' + escapeHtml(party) + '" matches adverse party in existing matter.<br><br>' +
|
|
685
|
+
'<strong>Corrective action:</strong> Fetch blocked. Agent redirected to: <em>"This party appears as adverse in matter M-2847. Contact ethics screen lead before proceeding."</em><br><br>' +
|
|
686
|
+
'<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: CONFLICT_RULE_1.7_ADVERSE v4.1\nMatched: adverse-parties list\nAction: BLOCK + REDIRECT + LOG\nAudit ID: CONF-2911-20260526-091204\nRequesting matter: New M&A intake\nAgent: doc-fetch-agent-v1</div>' +
|
|
687
|
+
__thumbgateAuditButton('conflict', conflictPayload, 'ThumbGate-Audit-CONF-2911-2026-05-26.json') +
|
|
688
|
+
'</div>';
|
|
689
|
+
} else {
|
|
690
|
+
resultDiv.innerHTML =
|
|
691
|
+
'<div class="demo-cleared">' +
|
|
692
|
+
'<strong style="color:#34d399">CLEARED — no conflict found</strong><br>' +
|
|
693
|
+
'Positive clearance recorded. Agent may proceed with intake.<br><br>' +
|
|
694
|
+
'<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: CONFLICT_RULE_1.7_ADVERSE v4.1\nResult: CLEAR (no match in adverse list)\nAction: ALLOW + LOG\nAudit ID: CONF-2912-20260526-091204</div>' +
|
|
695
|
+
'</div>';
|
|
696
|
+
}
|
|
697
|
+
resultDiv.style.display = 'block';
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
function runPrivilegeDemo() {
|
|
701
|
+
var input = document.getElementById('privilege-input').value.trim();
|
|
702
|
+
var resultDiv = document.getElementById('privilege-result');
|
|
703
|
+
if (!input) { resultDiv.style.display = 'none'; return; }
|
|
704
|
+
var privMarkers = ['attorney work product', 'privileged', 'confidential - attorney client', 'matter m-', 'm-2847', 'm-2911'];
|
|
705
|
+
var lower = input.toLowerCase();
|
|
706
|
+
var blocked = false;
|
|
707
|
+
var marker = '';
|
|
708
|
+
for (var i = 0; i < privMarkers.length; i++) {
|
|
709
|
+
if (lower.indexOf(privMarkers[i]) !== -1) { blocked = true; marker = privMarkers[i]; break; }
|
|
710
|
+
}
|
|
711
|
+
if (blocked) {
|
|
712
|
+
var privilegePayload = __thumbgateBuildAudit({
|
|
713
|
+
audit_id: 'PRIV-2755-20260526-091204',
|
|
714
|
+
timestamp_iso: '2026-05-26T09:12:04Z',
|
|
715
|
+
rule_id: 'EGRESS_RULE_1.6_PRIVILEGE',
|
|
716
|
+
rule_version: '2.8',
|
|
717
|
+
matched: 'privilege marker in outbound payload ("' + marker + '")',
|
|
718
|
+
agent: 'brief-assistant-v3',
|
|
719
|
+
input: input,
|
|
720
|
+
matter_context: 'Outbound LLM call from attorney workspace',
|
|
721
|
+
action: 'BLOCK + REDIRECT_TO_TENANT_LLM + LOG',
|
|
722
|
+
iso_controls: ['A.5.34 (Privacy & PII protection)', 'A.5.14 (Information transfer)', 'A.8.24 (Use of cryptography)']
|
|
723
|
+
});
|
|
724
|
+
resultDiv.innerHTML =
|
|
725
|
+
'<div class="demo-blocked">' +
|
|
726
|
+
'<strong style="color:#f87171">BLOCKED — Egress Gate fired</strong><br>' +
|
|
727
|
+
'Detected privilege marker: "' + escapeHtml(marker) + '"<br><br>' +
|
|
728
|
+
'<strong>Corrective action:</strong> Outbound call to external LLM blocked. Redirected to in-tenant Azure OpenAI (BAA-protected) or internal summarizer.<br><br>' +
|
|
729
|
+
'<div class="audit-log">[2026-05-26 09:12:04] PreToolUse gate: EGRESS_RULE_1.6_PRIVILEGE v2.8\nRule matched: privilege marker in outbound payload\nAction: BLOCK + REDIRECT_TO_TENANT_LLM + LOG\nAudit ID: PRIV-2755-20260526-091204\nContent hash: sha256:7f3a... (truncated)\nAgent: brief-assistant-v3</div>' +
|
|
730
|
+
__thumbgateAuditButton('privilege', privilegePayload, 'ThumbGate-Audit-PRIV-2755-2026-05-26.json') +
|
|
731
|
+
'</div>';
|
|
732
|
+
} else {
|
|
733
|
+
resultDiv.innerHTML =
|
|
734
|
+
'<div class="demo-cleared">' +
|
|
735
|
+
'<strong style="color:#34d399">CLEARED — no privilege markers detected</strong><br>' +
|
|
736
|
+
'Content would be sent to external LLM (in production this would still trigger logging + optional human review flag).' +
|
|
737
|
+
'</div>';
|
|
738
|
+
}
|
|
739
|
+
resultDiv.style.display = 'block';
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// Keyboard support: Enter submits, Shift+Enter inserts newline
|
|
743
|
+
var uplEl = document.getElementById('upl-input');
|
|
744
|
+
if (uplEl) uplEl.addEventListener('keydown', function(e) {
|
|
745
|
+
if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); runUPLDemo(); }
|
|
746
|
+
});
|
|
747
|
+
var privEl = document.getElementById('privilege-input');
|
|
748
|
+
if (privEl) privEl.addEventListener('keydown', function(e) {
|
|
749
|
+
if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); runPrivilegeDemo(); }
|
|
750
|
+
});
|
|
751
|
+
</script>
|
|
752
|
+
</section>
|
|
482
753
|
</main>
|
|
483
754
|
|
|
484
755
|
<footer class="footer">
|
package/public/blog.html
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
/>
|
|
12
12
|
<link
|
|
13
13
|
rel="canonical"
|
|
14
|
-
href="https://thumbgate
|
|
14
|
+
href="https://thumbgate.ai/blog"
|
|
15
15
|
/>
|
|
16
16
|
<meta
|
|
17
17
|
property="og:title"
|
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
<meta property="og:type" content="website" />
|
|
25
25
|
<meta
|
|
26
26
|
property="og:url"
|
|
27
|
-
content="https://thumbgate
|
|
27
|
+
content="https://thumbgate.ai/blog"
|
|
28
28
|
/>
|
|
29
29
|
<script type="application/ld+json">
|
|
30
30
|
{
|
|
31
31
|
"@context": "https://schema.org",
|
|
32
32
|
"@type": "Blog",
|
|
33
33
|
"name": "ThumbGate Blog",
|
|
34
|
-
"url": "https://thumbgate
|
|
34
|
+
"url": "https://thumbgate.ai/blog",
|
|
35
35
|
"publisher": { "@type": "Organization", "name": "ThumbGate" },
|
|
36
36
|
"blogPost": [
|
|
37
37
|
{
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<meta property="og:title" content="ThumbGate for Codex in the Enterprise">
|
|
10
10
|
<meta property="og:description" content="Dell-distributed or self-hosted, Codex agents repeat the same mistakes. ThumbGate is the governance layer underneath — capture, promote, audit.">
|
|
11
11
|
<meta property="og:type" content="article">
|
|
12
|
-
<meta property="og:image" content="https://thumbgate
|
|
13
|
-
<link rel="canonical" href="https://thumbgate
|
|
12
|
+
<meta property="og:image" content="https://thumbgate.ai/og.png">
|
|
13
|
+
<link rel="canonical" href="https://thumbgate.ai/codex-enterprise">
|
|
14
14
|
<script type="application/ld+json">
|
|
15
15
|
{
|
|
16
16
|
"@context": "https://schema.org",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"datePublished": "2026-05-20",
|
|
21
21
|
"dateModified": "2026-05-20",
|
|
22
22
|
"author": { "@type": "Person", "name": "Igor Ganapolsky", "url": "https://github.com/IgorGanapolsky" },
|
|
23
|
-
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate
|
|
23
|
+
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
|
|
24
24
|
"about": [
|
|
25
25
|
{ "@type": "Thing", "name": "OpenAI Codex" },
|
|
26
26
|
{ "@type": "Thing", "name": "Dell Codex Enterprise" },
|