thumbgate 1.34.3 → 1.37.1
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/.agents/skills/cyberstrike-compare-not-clone/SKILL.md +36 -0
- package/.agents/skills/gitlab-sandbox-allowlist-not-trust/SKILL.md +77 -0
- package/.agents/skills/jit-harness-compare-not-clone/SKILL.md +34 -0
- package/.agents/skills/openui-catalog-compose-honesty/SKILL.md +64 -0
- package/.agents/skills/zvec-grep-compare-not-clone/SKILL.md +34 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/llms.txt +1 -0
- package/.well-known/mcp/server-card.json +1 -1
- package/CONTRIBUTING.md +95 -0
- package/README.md +195 -632
- package/THIRD_PARTY_NOTICES.md +89 -0
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/forge/forge.yaml +3 -3
- package/adapters/future-agi/.mcp.json +8 -0
- package/adapters/future-agi/FUTURE_AGI.md +23 -0
- package/adapters/future-agi/config.toml +3 -0
- package/adapters/future-agi/future-agi-bridge.js +9 -0
- package/adapters/future-agi/opencode.json +8 -0
- package/adapters/herdr/herdr-plugin.toml +18 -0
- package/adapters/mcp/server-stdio.js +238 -25
- package/adapters/opencode/opencode.json +1 -1
- package/adapters/workos/WORKOS.md +52 -0
- package/bin/cli.js +373 -5
- package/bin/futureagi-bridge +9 -0
- package/config/gate-templates.json +653 -4
- package/config/gates/actor-critic-audit.json +34 -0
- package/config/gates/default.json +21 -2
- package/config/gates/five-walls-governance.json +34 -0
- package/config/gates/future-agi-guardrails.json +34 -0
- package/config/gates/radware-threat-defense-2026.json +61 -0
- package/config/gates/simatree-data-governance.json +33 -0
- package/config/mcp-allowlists.json +4 -0
- package/config/merge-quality-checks.json +10 -1
- package/config/model-candidates.json +382 -24
- package/config/model-tiers.json +18 -0
- package/config/post-deploy-marketing-pages.json +10 -0
- package/config/progressive/01-wire-only.json +11 -0
- package/config/progressive/02-dashboard-empty-ok.json +10 -0
- package/config/progressive/03-one-lesson.json +10 -0
- package/config/progressive/04-warn-fires.json +11 -0
- package/config/progressive/05-strict-optional.json +11 -0
- package/config/progressive/README.md +15 -0
- package/config/schemas/broker-execution-receipt.schema.json +139 -0
- package/config/schemas/provider-execution-attestation-v1.schema.json +58 -0
- package/conformance/provider-attestation/vectors.json +320 -0
- package/docs/specs/provider-execution-attestation-v1.md +69 -0
- package/openapi/openapi.yaml +15 -0
- package/package.json +401 -147
- package/public/about.html +2 -2
- package/public/ai-malpractice-prevention.html +7 -7
- package/public/blog/a-10-dollar-vps-is-not-a-computer.html +143 -0
- package/public/blog/a-receipt-is-not-world-state.html +388 -0
- package/public/blog/git-at-agent-scale.html +374 -0
- package/public/blog/no-llm-in-the-gate.html +133 -0
- package/public/blog.html +80 -0
- package/public/case-studies.html +16 -1
- package/public/compare.html +28 -0
- package/public/diagnostic.html +216 -7
- package/public/docs/connectors.html +39 -0
- package/public/federal.html +2 -2
- package/public/founders.html +639 -0
- package/public/index.html +87 -9
- package/public/install.html +8 -8
- package/public/learn.html +39 -0
- package/public/numbers.html +2 -2
- package/public/peter.html +310 -0
- package/public/platform-partners.html +119 -0
- package/public/pricing.html +24 -3
- package/public/privacy.html +117 -0
- package/public/pro.html +17 -0
- package/public/support.html +62 -0
- package/public/terms.html +130 -0
- package/public/third-party-notices.html +95 -0
- package/public/yt.html +351 -0
- package/scripts/action-receipts.js +133 -3
- package/scripts/adaptive-governance-arena.js +349 -0
- package/scripts/admin-override.js +205 -0
- package/scripts/agent-action-inventory.js +869 -0
- package/scripts/agent-audit-trace.js +42 -2
- package/scripts/agent-egress-policy.js +1117 -0
- package/scripts/agent-memory-lifecycle.js +141 -2
- package/scripts/agent-operations-planner.js +441 -1
- package/scripts/agent-readiness.js +68 -0
- package/scripts/agent-security-central.js +647 -0
- package/scripts/allowlist-bridge-honesty.js +417 -0
- package/scripts/async-job-runner.js +102 -11
- package/scripts/audit-trail.js +212 -0
- package/scripts/auto-promote-gates.js +178 -27
- package/scripts/billing.js +1 -1
- package/scripts/broker-execution-receipts.js +719 -0
- package/scripts/budget-aware-gates-proof.js +423 -0
- package/scripts/claude-feedback-sync.js +29 -3
- package/scripts/claw-harness-production.js +237 -0
- package/scripts/cli-progress.js +111 -0
- package/scripts/cli-schema.js +163 -1
- package/scripts/codex-runbook-flywheel.js +318 -0
- package/scripts/context-footprint.js +186 -0
- package/scripts/contextfs.js +143 -61
- package/scripts/dashboard-limits.js +27 -0
- package/scripts/dashboard.js +279 -9
- package/scripts/deepseek-v4-runtime-guardrails.js +72 -6
- package/scripts/docker-sandbox-planner.js +18 -0
- package/scripts/double-blind-eval-protocol.js +252 -0
- package/scripts/edotenv-rl-gateway.js +259 -0
- package/scripts/ensure-production-search-corpus.js +162 -0
- package/scripts/eval-holdout.js +311 -0
- package/scripts/feedback-aggregate.js +21 -2
- package/scripts/feedback-loop.js +87 -5
- package/scripts/feedback-quality.js +9 -0
- package/scripts/file-ledger-lock.js +4 -1
- package/scripts/financial-control-plane.js +41 -1
- package/scripts/find-dormant-requires.js +118 -0
- package/scripts/fs-utils.js +84 -8
- package/scripts/gate-stats.js +2 -2
- package/scripts/gates-engine.js +859 -58
- package/scripts/generate-case-study-outreach.js +24 -15
- package/scripts/git-at-scale.js +628 -0
- package/scripts/governance-conflict-audit.js +1650 -0
- package/scripts/governance-difficulty-curriculum.js +328 -0
- package/scripts/graphrag-retrieval.js +275 -0
- package/scripts/gurobi-optimizer.js +324 -0
- package/scripts/gurobi_optimizer.py +485 -0
- package/scripts/harness-selector.js +82 -1
- package/scripts/hidden-entry-points.js +284 -0
- package/scripts/human-escalation.js +199 -1
- package/scripts/hybrid-feedback-context.js +152 -19
- package/scripts/intent-governed-execution.js +602 -0
- package/scripts/intervention-policy.js +123 -20
- package/scripts/jit-harness-compose.js +628 -0
- package/scripts/jsonl-watcher.js +10 -0
- package/scripts/lesson-embedding-index.js +95 -12
- package/scripts/lesson-retrieval.js +105 -19
- package/scripts/local-model-profile.js +19 -2
- package/scripts/mailer/resend-mailer.js +1 -1
- package/scripts/matryoshka-embedding.js +235 -0
- package/scripts/mcp-oauth.js +42 -4
- package/scripts/mcp-session-handles.js +1016 -0
- package/scripts/mcp-wiring-doctor.js +314 -0
- package/scripts/memory-firewall.js +115 -2
- package/scripts/memory-scope-readiness.js +299 -0
- package/scripts/memory-vs-rag-route.js +161 -0
- package/scripts/model-tier-router.js +148 -21
- package/scripts/nvidia-specdecode-al-doctor.js +536 -0
- package/scripts/openui-catalog-compose-honesty.js +593 -0
- package/scripts/operational-integrity.js +19 -1
- package/scripts/override-audit.js +213 -0
- package/scripts/package-manager-honesty-doctor.js +458 -0
- package/scripts/pr-manager.js +63 -1
- package/scripts/prove-herdr-adapter.js +52 -0
- package/scripts/prove-memory-pyramid-and-symbolic-canvas.js +95 -0
- package/scripts/prove-workos.js +73 -0
- package/scripts/provider-attestation-conformance.js +192 -0
- package/scripts/provider-receipt-contract.js +136 -0
- package/scripts/qwen38-max-cost-optimizer.js +401 -0
- package/scripts/radware-threat-defense.js +280 -0
- package/scripts/rag-embedding-identity.js +221 -0
- package/scripts/rag-precision-guardrails.js +112 -2
- package/scripts/remote-feedback-capture.js +159 -0
- package/scripts/research-agent-harness.js +256 -0
- package/scripts/rsi-safety-hillclimb.js +200 -0
- package/scripts/rule-sprawl.js +188 -0
- package/scripts/schedule-manager.js +147 -0
- package/scripts/self-heal.js +8 -0
- package/scripts/session-lease.js +415 -0
- package/scripts/simatree-data-governance.js +347 -0
- package/scripts/slo-alert-engine.js +172 -7
- package/scripts/solver-parity.js +539 -0
- package/scripts/stealth-memory-injection-gate.js +333 -0
- package/scripts/switchyard-router.js +366 -0
- package/scripts/telemetry-analytics.js +84 -27
- package/scripts/temporal-decay-weighting.js +138 -0
- package/scripts/test-all.js +165 -0
- package/scripts/token-savings.js +42 -0
- package/scripts/tool-kpi-tracker.js +108 -5
- package/scripts/tool-registry.js +193 -5
- package/scripts/universal-claim-evaluator.js +14 -2
- package/scripts/vector-store.js +279 -9
- package/scripts/workflow-notebook.js +391 -0
- package/scripts/workflow-sentinel.js +111 -12
- package/scripts/workos-production-guard.js +260 -0
- package/scripts/workspace-search-route.js +515 -0
- package/server.json +2 -2
- package/src/agent-identity-boundary.js +76 -0
- package/src/agent-retrieval-cache.js +155 -0
- package/src/alert-noise-ledger.js +502 -0
- package/src/api/server.js +802 -185
- package/src/git-fast-cache.js +220 -0
- package/src/git-wal-sync.js +156 -0
- package/src/hash-anchored-edit.js +82 -0
- package/src/hermes-platform-protocol.js +475 -0
- package/src/hermes-sync-plane.js +241 -0
- package/src/index.js +30 -1
- package/src/iso42001-compliance-guard.js +97 -0
- package/src/latency-budget.js +244 -0
- package/src/mcp-writeguard.js +316 -0
- package/src/miminions-adapter.js +106 -0
- package/src/pipeline-compass.js +104 -0
- package/src/ppl-alert-pipeline.js +284 -0
- package/src/rendezvous-router.js +90 -0
- package/src/security-questionnaire.js +195 -0
package/public/about.html
CHANGED
|
@@ -60,7 +60,7 @@ __GOOGLE_SITE_VERIFICATION_META__
|
|
|
60
60
|
"addressRegion": "FL",
|
|
61
61
|
"addressCountry": "US"
|
|
62
62
|
},
|
|
63
|
-
"email": "
|
|
63
|
+
"email": "support@thumbgate.ai",
|
|
64
64
|
"sameAs": [
|
|
65
65
|
"https://github.com/IgorGanapolsky",
|
|
66
66
|
"https://www.linkedin.com/in/igor-ganapolsky-5324b7330",
|
|
@@ -137,7 +137,7 @@ footer{padding:2rem 1.5rem;color:#64748b;font-size:.9rem;text-align:center}
|
|
|
137
137
|
|
|
138
138
|
<section class="section">
|
|
139
139
|
<h2>For hire</h2>
|
|
140
|
-
<p>Available for fixed-price engagements ≥ $2K and ongoing retainers. Standard rate $120–150/hr 1099. Strong signal on Stripe Connect & Billing audits, RAG + LLM evaluation harnesses, and React Native + Android engineering. Email <a href="mailto:
|
|
140
|
+
<p>Available for fixed-price engagements ≥ $2K and ongoing retainers. Standard rate $120–150/hr 1099. Strong signal on Stripe Connect & Billing audits, RAG + LLM evaluation harnesses, and React Native + Android engineering. Email <a href="mailto:support@thumbgate.ai">support@thumbgate.ai</a> or reach me on <a href="https://www.upwork.com/freelancers/~01b5f08ed8b1a9a3c1">Upwork</a>.</p>
|
|
141
141
|
</section>
|
|
142
142
|
|
|
143
143
|
<h2>Links</h2>
|
|
@@ -323,12 +323,12 @@
|
|
|
323
323
|
Litigation & arbitration teams and in-house counsel are adopting AI case-intelligence and drafting copilots that touch privileged correspondence, pleadings, and matter files. Those tools make the agent <em>capable</em>; they don't give risk, ethics, and innovation owners a control point or a defensible record of what the agent was about to do. ThumbGate is the governance layer <em>around</em> them — a deterministic gate on the next action, attorney 👍/👎 promoted to firm rules, and an exportable audit trail — the evidence procurement (and your professional-liability review) actually ask for before agents run on multi-million-dollar matters.
|
|
324
324
|
</p>
|
|
325
325
|
<div class="hero-actions">
|
|
326
|
-
<a class="cta" href="mailto:
|
|
326
|
+
<a class="cta" href="mailto:support@thumbgate.ai?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>
|
|
327
327
|
<a class="ghost" href="#live-gate-demos">Try the live gates →</a>
|
|
328
328
|
<a class="ghost" href="#demo">View the 25-minute demo plan</a>
|
|
329
329
|
</div>
|
|
330
330
|
<p style="font-size: 0.85rem; color: var(--muted); margin: -0.5rem 0 1.2rem; max-width: 760px;">
|
|
331
|
-
Button not opening your mail client? <button type="button" onclick="__thumbgateCopyPilotEmail(this)" style="padding:0.35rem 0.7rem; font-size:0.85rem; background:transparent; color:var(--cyan); border:1px solid var(--cyan); border-radius:5px; cursor:pointer; vertical-align: baseline;">Copy the email instead</button> or write to <span style="color: var(--text); user-select: all; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;">
|
|
331
|
+
Button not opening your mail client? <button type="button" onclick="__thumbgateCopyPilotEmail(this)" style="padding:0.35rem 0.7rem; font-size:0.85rem; background:transparent; color:var(--cyan); border:1px solid var(--cyan); border-radius:5px; cursor:pointer; vertical-align: baseline;">Copy the email instead</button> or write to <span style="color: var(--text); user-select: all; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;">support@thumbgate.ai</span> directly.
|
|
332
332
|
</p>
|
|
333
333
|
<div class="proof-row" aria-label="Key proof points">
|
|
334
334
|
<div class="proof"><strong>Preloaded controls</strong><span>Firm policy, approved disclaimers, adverse-party lists, routing rules, and model endpoint allowlists.</span></div>
|
|
@@ -546,11 +546,11 @@
|
|
|
546
546
|
</div>
|
|
547
547
|
</div>
|
|
548
548
|
<div style="display:flex;gap:1rem;flex-wrap:wrap;margin-top:1rem;">
|
|
549
|
-
<a class="cta" href="mailto:
|
|
549
|
+
<a class="cta" href="mailto:support@thumbgate.ai?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>
|
|
550
550
|
<a class="ghost" href="/dashboard">View the live dashboard demo</a>
|
|
551
551
|
</div>
|
|
552
552
|
<p style="font-size:0.85rem; color:var(--muted); margin:0.75rem 0 0;">
|
|
553
|
-
Button not opening your mail client (common on Gmail Web / iPhone)? <button type="button" onclick="__thumbgateCopyPilotEmail(this)" style="padding:0.35rem 0.7rem; font-size:0.85rem; background:transparent; color:var(--cyan); border:1px solid var(--cyan); border-radius:5px; cursor:pointer; vertical-align: baseline;">Copy the email instead</button> or write to <span style="color: var(--text); user-select: all; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;">
|
|
553
|
+
Button not opening your mail client (common on Gmail Web / iPhone)? <button type="button" onclick="__thumbgateCopyPilotEmail(this)" style="padding:0.35rem 0.7rem; font-size:0.85rem; background:transparent; color:var(--cyan); border:1px solid var(--cyan); border-radius:5px; cursor:pointer; vertical-align: baseline;">Copy the email instead</button> or write to <span style="color: var(--text); user-select: all; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;">support@thumbgate.ai</span> directly.
|
|
554
554
|
</p>
|
|
555
555
|
</div>
|
|
556
556
|
</section>
|
|
@@ -615,7 +615,7 @@
|
|
|
615
615
|
}
|
|
616
616
|
window.__thumbgateCopyPilotEmail = function(btn) {
|
|
617
617
|
var body = "Hi Igor,\n\nWe'd like to review the 25-minute ThumbGate legal AI intake pilot. Please send the meeting invite and demo materials.\n\nBest,";
|
|
618
|
-
var full = "To:
|
|
618
|
+
var full = "To: support@thumbgate.ai\nSubject: ThumbGate 25-minute legal AI pilot walkthrough\n\n" + body;
|
|
619
619
|
var done = function(label) {
|
|
620
620
|
var orig = btn.dataset.origLabel || btn.textContent;
|
|
621
621
|
btn.dataset.origLabel = orig;
|
|
@@ -625,9 +625,9 @@
|
|
|
625
625
|
if (navigator.clipboard && navigator.clipboard.writeText) {
|
|
626
626
|
navigator.clipboard.writeText(full)
|
|
627
627
|
.then(function() { done('Copied — paste into Gmail or any mail client'); })
|
|
628
|
-
.catch(function() { done('Copy failed — email
|
|
628
|
+
.catch(function() { done('Copy failed — email support@thumbgate.ai directly'); });
|
|
629
629
|
} else {
|
|
630
|
-
done('Email
|
|
630
|
+
done('Email support@thumbgate.ai directly');
|
|
631
631
|
}
|
|
632
632
|
};
|
|
633
633
|
// Produces the same JSON shape a production ThumbGate gate would stream to the firm's SIEM.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>A $10 VPS is not a Computer | ThumbGate</title>
|
|
7
|
+
<meta name="description" content="Cursor publishes engineering notes with a date, a topic, a named author, and a read time. We stole that format. The substance: thumbgate.ai is a pre-action gate; thumbgate.app is $10 hosted Hermes chat. Neither is Perplexity Computer." />
|
|
8
|
+
<meta property="og:title" content="A $10 VPS is not a Computer" />
|
|
9
|
+
<meta property="og:description" content="File names are not Hands. Hosted Hermes POSTs chat completions. thumbgate.ai evaluates the tool call before it runs." />
|
|
10
|
+
<meta property="og:type" content="article" />
|
|
11
|
+
<meta property="og:url" content="https://thumbgate.ai/blog/a-10-dollar-vps-is-not-a-computer" />
|
|
12
|
+
<link rel="canonical" href="https://thumbgate.ai/blog/a-10-dollar-vps-is-not-a-computer" />
|
|
13
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png" />
|
|
14
|
+
<meta property="og:image" content="https://thumbgate.ai/og.png" />
|
|
15
|
+
<script type="application/ld+json">
|
|
16
|
+
{
|
|
17
|
+
"@context": "https://schema.org",
|
|
18
|
+
"@type": "BlogPosting",
|
|
19
|
+
"headline": "A $10 VPS is not a Computer",
|
|
20
|
+
"datePublished": "2026-08-19",
|
|
21
|
+
"author": { "@type": "Person", "name": "Igor Ganapolsky" },
|
|
22
|
+
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
|
|
23
|
+
"mainEntityOfPage": "https://thumbgate.ai/blog/a-10-dollar-vps-is-not-a-computer",
|
|
24
|
+
"description": "thumbgate.ai is a pre-action gate. thumbgate.app is $10 hosted Hermes chat on a fenced VPS. Mapping OpenClaw or Cua onto that stack fails a falsifier."
|
|
25
|
+
}
|
|
26
|
+
</script>
|
|
27
|
+
<style>
|
|
28
|
+
:root { color-scheme: dark; --bg:#080b10; --panel:#111722; --text:#f5f7fb; --muted:#9ca8ba; --line:#273246; --cyan:#38d7ff; --green:#56e39f; --max:760px; }
|
|
29
|
+
* { box-sizing: border-box; }
|
|
30
|
+
body { margin:0; color:var(--text); background:var(--bg); font:16px/1.7 Inter,ui-sans-serif,system-ui,-apple-system,sans-serif; }
|
|
31
|
+
a { color:var(--cyan); }
|
|
32
|
+
.shell { width:min(calc(100% - 40px),var(--max)); margin:0 auto; }
|
|
33
|
+
header { padding:22px 0; border-bottom:1px solid var(--line); }
|
|
34
|
+
header a { color:var(--muted); text-decoration:none; font-weight:700; }
|
|
35
|
+
header a:hover { color:var(--text); }
|
|
36
|
+
.brand { color:var(--text); font-weight:850; text-decoration:none; }
|
|
37
|
+
.crumb { color:var(--muted); font-size:13px; }
|
|
38
|
+
.crumb a { color:var(--muted); }
|
|
39
|
+
article { padding:48px 0 80px; }
|
|
40
|
+
.meta { color:var(--muted); font:700 12px/1.2 ui-monospace,Menlo,monospace; letter-spacing:.08em; text-transform:uppercase; }
|
|
41
|
+
.byline { margin:0 0 28px; color:var(--muted); font-size:14px; }
|
|
42
|
+
h1 { margin:14px 0 18px; font-size:clamp(32px,5vw,46px); line-height:1.08; letter-spacing:-.04em; }
|
|
43
|
+
h2 { margin:36px 0 12px; font-size:24px; letter-spacing:-.03em; }
|
|
44
|
+
p, li { color:var(--muted); }
|
|
45
|
+
p { margin:0 0 16px; }
|
|
46
|
+
ul { margin:0 0 18px; padding-left:1.2em; }
|
|
47
|
+
li { margin-bottom:8px; }
|
|
48
|
+
strong { color:var(--text); }
|
|
49
|
+
.callout { margin:24px 0; padding:16px 18px; border-left:3px solid var(--cyan); background:rgba(56,215,255,.06); color:var(--muted); }
|
|
50
|
+
.cta { display:inline-flex; margin-top:8px; margin-right:10px; padding:12px 18px; border-radius:10px; background:var(--green); color:#06130d; font-weight:850; text-decoration:none; }
|
|
51
|
+
code { color:var(--cyan); font-family:ui-monospace,Menlo,monospace; font-size:0.95em; }
|
|
52
|
+
pre { overflow:auto; padding:14px 16px; border:1px solid var(--line); border-radius:10px; background:#0c1118; color:var(--text); font:13px/1.5 ui-monospace,Menlo,monospace; }
|
|
53
|
+
.related { margin-top:48px; padding-top:28px; border-top:1px solid var(--line); }
|
|
54
|
+
.related h2 { margin-top:0; font-size:18px; }
|
|
55
|
+
.related a { display:block; margin:8px 0; }
|
|
56
|
+
footer { padding:28px 0 48px; border-top:1px solid var(--line); color:var(--muted); font-size:13px; }
|
|
57
|
+
</style>
|
|
58
|
+
</head>
|
|
59
|
+
<body>
|
|
60
|
+
<header>
|
|
61
|
+
<div class="shell" style="display:flex;justify-content:space-between;gap:16px;align-items:center;">
|
|
62
|
+
<a class="brand" href="/blog">ThumbGate / Blog</a>
|
|
63
|
+
<span class="crumb"><a href="/blog">Blog</a> / <a href="/blog">research</a></span>
|
|
64
|
+
</div>
|
|
65
|
+
</header>
|
|
66
|
+
<article class="shell">
|
|
67
|
+
<div class="meta">2026-08-19 · research</div>
|
|
68
|
+
<h1>A $10 VPS is not a Computer</h1>
|
|
69
|
+
<p class="byline">Igor Ganapolsky · 7 min read</p>
|
|
70
|
+
<p>
|
|
71
|
+
<a href="https://cursor.com/blog">Cursor’s blog</a> is nice because it is first-party, dated, tagged, and signed. A research post names the author and how long it takes to read. Related posts sit at the bottom. There is no clapbait. We are not affiliated with Cursor. We stole that <strong>format</strong> for <a href="https://thumbgate.ai/blog">thumbgate.ai/blog</a>.
|
|
72
|
+
</p>
|
|
73
|
+
<p>
|
|
74
|
+
The substance is a falsifier we almost failed. Someone pasted an OpenClaw / E2B / Cua blueprint and asked us to assemble Manager / Factory / Hands on hosted Hermes. The mapping looked tidy: an economic router, a cloud runner, a “browser sidecar.” File names are not a product.
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
<h2>What the runner actually does</h2>
|
|
78
|
+
<p>
|
|
79
|
+
The hosted worker is <code>hermes-cloud-runner</code>. Its <code>execute()</code> function POSTs one prompt to <code>/chat/completions</code> and returns the assistant text. A grep of that service for <code>playwright</code>, <code>cua</code>, <code>e2b</code>, or <code>openclaw</code> is empty. That is Factory as chat, not a GUI sandbox.
|
|
80
|
+
</p>
|
|
81
|
+
<pre>async function execute(config, task) {
|
|
82
|
+
const response = await fetch(`${config.openaiBaseUrl}/chat/completions`, {
|
|
83
|
+
method: 'POST',
|
|
84
|
+
body: JSON.stringify({
|
|
85
|
+
model: config.model,
|
|
86
|
+
messages: [...context, { role: 'user', content: task.prompt }],
|
|
87
|
+
}),
|
|
88
|
+
});
|
|
89
|
+
return payload.choices?.[0]?.message?.content;
|
|
90
|
+
}</pre>
|
|
91
|
+
<p>
|
|
92
|
+
The control plane can <em>require</em> a hosted browser sidecar when a prompt matches <code>HOSTED_BROWSER_CUE_RES</code> (playwright, computer-use, screenshot-and-click). <code>browserHealthUrl()</code> is a health probe. Requiring a name in policy is not driving Gmail. Hands, if we are honest, is <code>POLICY_CUE_NOT_DRIVER</code>.
|
|
93
|
+
</p>
|
|
94
|
+
<div class="callout">
|
|
95
|
+
Presence of a similarly named file is not causation. If you cannot name the falsifier, you have a story.
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<h2>Two URLs, two jobs</h2>
|
|
99
|
+
<p>
|
|
100
|
+
<strong>thumbgate.ai</strong> is the pre-action gate: evaluate the proposed tool call, block unsafe ones, leave a receipt. Local <code>npx thumbgate init</code>. Public MIT. It is not a general-purpose digital worker.
|
|
101
|
+
</p>
|
|
102
|
+
<p>
|
|
103
|
+
<strong>thumbgate.app</strong> is hosted Hermes on a fenced VPS: $10/month, 14-day trial, approvals in the browser. Give it a job. It answers in chat. It does not become Perplexity Computer because we added a Give → Works → Approve strip on the landing page.
|
|
104
|
+
</p>
|
|
105
|
+
<p>
|
|
106
|
+
We run a doctor that inspects those files instead of relabeling them:
|
|
107
|
+
</p>
|
|
108
|
+
<pre>hosted-computer doctor --json
|
|
109
|
+
# weAreOpenClaw: false
|
|
110
|
+
# factory.kind: CHAT_COMPLETIONS_ONLY
|
|
111
|
+
# hands.kind: POLICY_CUE_NOT_DRIVER</pre>
|
|
112
|
+
<p>
|
|
113
|
+
<code>hosted-computer route "install openclaw"</code> exits 2 (<code>CLONE_FORBIDDEN</code>). That is cheaper than vendoring a second product we do not operate.
|
|
114
|
+
</p>
|
|
115
|
+
|
|
116
|
+
<h2>What we did not steal</h2>
|
|
117
|
+
<ul>
|
|
118
|
+
<li>Cursor Origin / WAL-as-truth Git hosting. Client-side pack hygiene is a different steal.</li>
|
|
119
|
+
<li>Perplexity Computer connectors, Pro/Max, or months-long Gmail workflows.</li>
|
|
120
|
+
<li>OpenClaw, Eigent, E2B, trycua/Cua, or Agent S on the daily Mac or the VPS.</li>
|
|
121
|
+
<li>Invented traction. Cash is $0 until a stranger pays Stripe.</li>
|
|
122
|
+
</ul>
|
|
123
|
+
<p>
|
|
124
|
+
<a href="https://nousresearch.com/">Nous Hermes</a> is the agent runtime we host; we are not affiliated with Nous Research. The $10 offer is the fenced VPS, not a Computer clone.
|
|
125
|
+
</p>
|
|
126
|
+
<p>
|
|
127
|
+
<a class="cta" href="https://thumbgate.app/?utm_source=blog&utm_medium=article&utm_campaign=cursor-blog-format-20260819&cta_id=cursor-blog-format-20260819_blog_home">Give hosted Hermes a job →</a>
|
|
128
|
+
<a class="cta" href="https://www.npmjs.com/package/thumbgate">npx thumbgate init</a>
|
|
129
|
+
</p>
|
|
130
|
+
|
|
131
|
+
<div class="related">
|
|
132
|
+
<h2>Related posts</h2>
|
|
133
|
+
<a href="/blog/process-over-outcome-gates">Process over outcome: gates for self-improving coding loops</a>
|
|
134
|
+
<a href="/blog/inside-your-boundary">AI inside your boundary: governance without relaxing controls</a>
|
|
135
|
+
</div>
|
|
136
|
+
</article>
|
|
137
|
+
<footer>
|
|
138
|
+
<div class="shell">
|
|
139
|
+
Format stolen from <a href="https://cursor.com/blog">cursor.com/blog</a>. Not affiliated. Not a Computer.
|
|
140
|
+
</div>
|
|
141
|
+
</footer>
|
|
142
|
+
</body>
|
|
143
|
+
</html>
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>A receipt is not world-state | ThumbGate</title>
|
|
7
|
+
<meta
|
|
8
|
+
name="description"
|
|
9
|
+
content="thumbgate.ai evaluates the tool call, blocks the unsafe ones, and leaves a receipt. A receipt is not proof of production, CI, or a completed task. First-party research note with TOC, author, and related posts."
|
|
10
|
+
/>
|
|
11
|
+
<meta property="og:title" content="A receipt is not world-state" />
|
|
12
|
+
<meta
|
|
13
|
+
property="og:description"
|
|
14
|
+
content="Evaluate, then block, then leave evidence. A gate log line is not world-state. thumbgate.ai publishes that research on first-party HTML."
|
|
15
|
+
/>
|
|
16
|
+
<meta property="og:type" content="article" />
|
|
17
|
+
<meta property="og:url" content="https://thumbgate.ai/blog/a-receipt-is-not-world-state" />
|
|
18
|
+
<link rel="canonical" href="https://thumbgate.ai/blog/a-receipt-is-not-world-state" />
|
|
19
|
+
<link rel="icon" type="image/png" href="/thumbgate-icon.png" />
|
|
20
|
+
<meta property="og:image" content="https://thumbgate.ai/og.png" />
|
|
21
|
+
<script defer data-domain="thumbgate.ai" src="https://plausible.io/js/script.js"></script>
|
|
22
|
+
<script type="application/ld+json">
|
|
23
|
+
{
|
|
24
|
+
"@context": "https://schema.org",
|
|
25
|
+
"@type": "BlogPosting",
|
|
26
|
+
"headline": "A receipt is not world-state",
|
|
27
|
+
"datePublished": "2026-08-19",
|
|
28
|
+
"dateModified": "2026-08-19",
|
|
29
|
+
"author": { "@type": "Person", "name": "Igor Ganapolsky" },
|
|
30
|
+
"publisher": { "@type": "Organization", "name": "ThumbGate", "url": "https://thumbgate.ai" },
|
|
31
|
+
"mainEntityOfPage": "https://thumbgate.ai/blog/a-receipt-is-not-world-state",
|
|
32
|
+
"image": "https://thumbgate.ai/og.png",
|
|
33
|
+
"keywords": "Infrastructure Firewall, Reliability Gateway, PreToolUse, Thompson Sampling, DPO, completion claim, ThumbGate",
|
|
34
|
+
"description": "thumbgate.ai is a pre-action control: evaluate the proposed tool call, block unsafe actions, leave evidence. A receipt is not proof of production or task completion.",
|
|
35
|
+
"wordCount": 1680,
|
|
36
|
+
"timeRequired": "PT11M",
|
|
37
|
+
"articleSection": "research"
|
|
38
|
+
}
|
|
39
|
+
</script>
|
|
40
|
+
<script type="application/ld+json">
|
|
41
|
+
{
|
|
42
|
+
"@context": "https://schema.org",
|
|
43
|
+
"@type": "FAQPage",
|
|
44
|
+
"mainEntity": [
|
|
45
|
+
{
|
|
46
|
+
"@type": "Question",
|
|
47
|
+
"name": "What does thumbgate.ai actually do?",
|
|
48
|
+
"acceptedAnswer": {
|
|
49
|
+
"@type": "Answer",
|
|
50
|
+
"text": "It evaluates a proposed AI coding-agent tool call before the harness runs it, can block unsafe actions, and writes a receipt for the decision. Local install is npx thumbgate init. It does not retrain a model."
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"@type": "Question",
|
|
55
|
+
"name": "Does a ThumbGate receipt prove production is live?",
|
|
56
|
+
"acceptedAnswer": {
|
|
57
|
+
"@type": "Answer",
|
|
58
|
+
"text": "No. A receipt proves the gate ran on that tool call. Production live requires GET /health buildSha equal to the claimed main SHA. CI green requires terminal required checks on that exact SHA."
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"@type": "Question",
|
|
63
|
+
"name": "Is a listed MCP tool the same as an invocable tool?",
|
|
64
|
+
"acceptedAnswer": {
|
|
65
|
+
"@type": "Answer",
|
|
66
|
+
"text": "No. Discovery must equal the tools the active profile and packaged runtime can actually call. A catalog row is not a side effect."
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
</script>
|
|
72
|
+
<style>
|
|
73
|
+
:root {
|
|
74
|
+
color-scheme: dark;
|
|
75
|
+
--bg: #080b10;
|
|
76
|
+
--panel: #111722;
|
|
77
|
+
--text: #f5f7fb;
|
|
78
|
+
--muted: #9ca8ba;
|
|
79
|
+
--line: #273246;
|
|
80
|
+
--cyan: #38d7ff;
|
|
81
|
+
--green: #56e39f;
|
|
82
|
+
--max: 1120px;
|
|
83
|
+
--article: 760px;
|
|
84
|
+
}
|
|
85
|
+
* { box-sizing: border-box; }
|
|
86
|
+
body {
|
|
87
|
+
margin: 0;
|
|
88
|
+
color: var(--text);
|
|
89
|
+
background: var(--bg);
|
|
90
|
+
font: 16px/1.7 Inter, ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
91
|
+
}
|
|
92
|
+
a { color: var(--cyan); }
|
|
93
|
+
.shell { width: min(calc(100% - 40px), var(--max)); margin: 0 auto; }
|
|
94
|
+
header { padding: 22px 0; border-bottom: 1px solid var(--line); }
|
|
95
|
+
header a { color: var(--muted); text-decoration: none; font-weight: 700; }
|
|
96
|
+
header a:hover { color: var(--text); }
|
|
97
|
+
.brand { color: var(--text); font-weight: 850; text-decoration: none; }
|
|
98
|
+
.crumb { color: var(--muted); font-size: 13px; }
|
|
99
|
+
.crumb a { color: var(--muted); }
|
|
100
|
+
.layout {
|
|
101
|
+
display: grid;
|
|
102
|
+
grid-template-columns: minmax(0, var(--article)) 220px;
|
|
103
|
+
gap: 48px;
|
|
104
|
+
align-items: start;
|
|
105
|
+
padding: 48px 0 80px;
|
|
106
|
+
}
|
|
107
|
+
article { min-width: 0; }
|
|
108
|
+
.meta {
|
|
109
|
+
color: var(--muted);
|
|
110
|
+
font: 700 12px/1.2 ui-monospace, Menlo, monospace;
|
|
111
|
+
letter-spacing: .08em;
|
|
112
|
+
text-transform: uppercase;
|
|
113
|
+
}
|
|
114
|
+
.byline { margin: 0 0 28px; color: var(--muted); font-size: 14px; }
|
|
115
|
+
h1 {
|
|
116
|
+
margin: 14px 0 18px;
|
|
117
|
+
font-size: clamp(32px, 5vw, 46px);
|
|
118
|
+
line-height: 1.08;
|
|
119
|
+
letter-spacing: -.04em;
|
|
120
|
+
}
|
|
121
|
+
h2 { margin: 36px 0 12px; font-size: 24px; letter-spacing: -.03em; }
|
|
122
|
+
h2 a { color: inherit; text-decoration: none; }
|
|
123
|
+
h2 a:hover { color: var(--cyan); }
|
|
124
|
+
h3 { margin: 24px 0 8px; font-size: 18px; }
|
|
125
|
+
p, li { color: var(--muted); }
|
|
126
|
+
p { margin: 0 0 16px; }
|
|
127
|
+
ul, ol { margin: 0 0 18px; padding-left: 1.2em; }
|
|
128
|
+
li { margin-bottom: 8px; }
|
|
129
|
+
strong { color: var(--text); }
|
|
130
|
+
.callout {
|
|
131
|
+
margin: 24px 0;
|
|
132
|
+
padding: 16px 18px;
|
|
133
|
+
border-left: 3px solid var(--cyan);
|
|
134
|
+
background: rgba(56, 215, 255, .06);
|
|
135
|
+
color: var(--muted);
|
|
136
|
+
}
|
|
137
|
+
.cta {
|
|
138
|
+
display: inline-flex;
|
|
139
|
+
margin-top: 8px;
|
|
140
|
+
margin-right: 10px;
|
|
141
|
+
padding: 12px 18px;
|
|
142
|
+
border-radius: 10px;
|
|
143
|
+
background: var(--green);
|
|
144
|
+
color: #06130d;
|
|
145
|
+
font-weight: 850;
|
|
146
|
+
text-decoration: none;
|
|
147
|
+
}
|
|
148
|
+
.cta.ghost {
|
|
149
|
+
background: transparent;
|
|
150
|
+
border: 1px solid var(--line);
|
|
151
|
+
color: var(--text);
|
|
152
|
+
}
|
|
153
|
+
code { color: var(--cyan); font-family: ui-monospace, Menlo, monospace; font-size: 0.95em; }
|
|
154
|
+
pre {
|
|
155
|
+
overflow: auto;
|
|
156
|
+
padding: 14px 16px;
|
|
157
|
+
border: 1px solid var(--line);
|
|
158
|
+
border-radius: 10px;
|
|
159
|
+
background: #0c1118;
|
|
160
|
+
color: var(--text);
|
|
161
|
+
font: 13px/1.5 ui-monospace, Menlo, monospace;
|
|
162
|
+
}
|
|
163
|
+
table { width: 100%; border-collapse: collapse; margin: 16px 0 24px; font-size: 14px; }
|
|
164
|
+
th, td { border: 1px solid var(--line); padding: 10px 12px; text-align: left; vertical-align: top; }
|
|
165
|
+
th { background: var(--panel); color: var(--text); }
|
|
166
|
+
.toc {
|
|
167
|
+
position: sticky;
|
|
168
|
+
top: 24px;
|
|
169
|
+
padding: 16px 0 0;
|
|
170
|
+
}
|
|
171
|
+
.toc h2 {
|
|
172
|
+
margin: 0 0 12px;
|
|
173
|
+
font: 800 11px/1.2 ui-monospace, Menlo, monospace;
|
|
174
|
+
letter-spacing: .12em;
|
|
175
|
+
text-transform: uppercase;
|
|
176
|
+
color: var(--muted);
|
|
177
|
+
}
|
|
178
|
+
.toc a {
|
|
179
|
+
display: block;
|
|
180
|
+
margin: 0 0 10px;
|
|
181
|
+
color: var(--muted);
|
|
182
|
+
text-decoration: none;
|
|
183
|
+
font-size: 13px;
|
|
184
|
+
line-height: 1.35;
|
|
185
|
+
}
|
|
186
|
+
.toc a:hover { color: var(--text); }
|
|
187
|
+
.related { margin-top: 48px; padding-top: 28px; border-top: 1px solid var(--line); }
|
|
188
|
+
.related h2 { margin-top: 0; font-size: 18px; }
|
|
189
|
+
.related a { display: block; margin: 8px 0; }
|
|
190
|
+
footer { padding: 28px 0 48px; border-top: 1px solid var(--line); color: var(--muted); font-size: 13px; }
|
|
191
|
+
@media (max-width: 960px) {
|
|
192
|
+
.layout { grid-template-columns: 1fr; gap: 28px; }
|
|
193
|
+
.toc { position: static; padding: 0 0 8px; border-bottom: 1px solid var(--line); }
|
|
194
|
+
}
|
|
195
|
+
</style>
|
|
196
|
+
</head>
|
|
197
|
+
<body>
|
|
198
|
+
<header>
|
|
199
|
+
<div class="shell" style="display:flex;justify-content:space-between;gap:16px;align-items:center;">
|
|
200
|
+
<a class="brand" href="/blog">ThumbGate / Blog</a>
|
|
201
|
+
<span class="crumb"><a href="/blog">Blog</a> / <a href="/blog">research</a></span>
|
|
202
|
+
</div>
|
|
203
|
+
</header>
|
|
204
|
+
<div class="shell layout">
|
|
205
|
+
<article>
|
|
206
|
+
<div class="meta">2026-08-19 · research</div>
|
|
207
|
+
<h1>A receipt is not world-state</h1>
|
|
208
|
+
<p class="byline">Igor Ganapolsky · 11 min read</p>
|
|
209
|
+
<p>
|
|
210
|
+
<a href="https://cursor.com/blog">Cursor’s blog</a> is the publishing surface we wanted: first-party HTML, a research tag, a named author, a read time, a table of contents, and related posts at the bottom. No clapbait. No third-party writing platform as the canonical URL. We are not affiliated with Cursor. We stole that <strong>format</strong> for <a href="https://thumbgate.ai/blog">thumbgate.ai/blog</a>.
|
|
211
|
+
</p>
|
|
212
|
+
<p>
|
|
213
|
+
The substance is the product at that same domain. <strong>thumbgate.ai</strong> is an Infrastructure Firewall for AI coding agents: evaluate the proposed tool call, block the unsafe ones, leave evidence. Agents keep treating the evidence artifact as the world. That is the failure this post names.
|
|
214
|
+
</p>
|
|
215
|
+
|
|
216
|
+
<h2 id="the-three-word-product"><a href="#the-three-word-product">#</a> The three-word product</h2>
|
|
217
|
+
<p>
|
|
218
|
+
ThumbGate is not a training stack and it is not a hosted digital worker. It sits on the PreToolUse boundary every capable harness already exposes — Claude Code, Cursor, Codex, Gemini CLI, Amp, Cline, OpenCode — after the model has chosen a tool and before the tool runs.
|
|
219
|
+
</p>
|
|
220
|
+
<p>Three verbs, in order:</p>
|
|
221
|
+
<ol>
|
|
222
|
+
<li><strong>Evaluate</strong> the fully resolved action (command, path, URL, MCP call) against a deterministic rule set.</li>
|
|
223
|
+
<li><strong>Block</strong> (or warn, or allow) before the side effect. Secret-exfiltration is a hard floor. Destructive git and filesystem classes escalate under STRICT.</li>
|
|
224
|
+
<li><strong>Leave evidence</strong> — a receipt with verdict, gate identity, and the action that was judged.</li>
|
|
225
|
+
</ol>
|
|
226
|
+
<div class="callout">
|
|
227
|
+
The Reliability Gateway is capture → remember → re-rank → gate. Memory without the last step is a diary. Thompson Sampling ranks candidate prevention rules; DPO export is a downstream artifact, not the enforcement path.
|
|
228
|
+
</div>
|
|
229
|
+
<p>
|
|
230
|
+
Local start is <code>npx thumbgate init</code>. The npm package is <code>thumbgate</code>. Public code is MIT on purpose. Hosted operation, adapter coverage, and the dashboard are the paid surfaces; they are not a second intelligence repo pretending the public shell is empty. See <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/VERIFICATION_EVIDENCE.md">VERIFICATION_EVIDENCE.md</a>.
|
|
231
|
+
</p>
|
|
232
|
+
|
|
233
|
+
<h2 id="what-a-receipt-is"><a href="#what-a-receipt-is">#</a> What a receipt is</h2>
|
|
234
|
+
<p>
|
|
235
|
+
A receipt is the durable record of <em>one decision at the tool-call boundary</em>. It is useful because it is small, local, and inspectable:
|
|
236
|
+
</p>
|
|
237
|
+
<ul>
|
|
238
|
+
<li>verdict: allow, warn, or deny</li>
|
|
239
|
+
<li>which gate fired, and whether the source was committed policy or a promoted lesson</li>
|
|
240
|
+
<li>the tool name plus resolved arguments — the action, not the agent’s narration of the action</li>
|
|
241
|
+
<li>a timestamp you can put next to a session, a worktree, and a git SHA</li>
|
|
242
|
+
</ul>
|
|
243
|
+
<p>
|
|
244
|
+
MCP attempts, including denied and failed calls, must emit tool KPI telemetry. Task completion claims require an idempotent task-outcome receipt <em>and</em> verification evidence. Those are two different objects. Mixing them is how “we gated it” becomes “it shipped.”
|
|
245
|
+
</p>
|
|
246
|
+
<pre>allow | warn | deny
|
|
247
|
+
gateId, source, toolName
|
|
248
|
+
resolvedArgs (command | path | url)
|
|
249
|
+
ts, sessionId, worktree</pre>
|
|
250
|
+
|
|
251
|
+
<h2 id="what-a-receipt-is-not"><a href="#what-a-receipt-is-not">#</a> What a receipt is not</h2>
|
|
252
|
+
<p>
|
|
253
|
+
Adjacent agent OS and marketplace products learned this the expensive way: a signed receipt is not proof the world moved. We apply the same honesty to our own control plane.
|
|
254
|
+
</p>
|
|
255
|
+
<table>
|
|
256
|
+
<thead>
|
|
257
|
+
<tr><th>Artifact</th><th>Proves</th><th>Does not prove</th></tr>
|
|
258
|
+
</thead>
|
|
259
|
+
<tbody>
|
|
260
|
+
<tr>
|
|
261
|
+
<td>Gate receipt</td>
|
|
262
|
+
<td>This tool call was evaluated and this verdict returned</td>
|
|
263
|
+
<td>The command ran, the file landed, production rebuilt</td>
|
|
264
|
+
</tr>
|
|
265
|
+
<tr>
|
|
266
|
+
<td>MCP listing</td>
|
|
267
|
+
<td>A catalog row exists for a name</td>
|
|
268
|
+
<td>The active profile can invoke it</td>
|
|
269
|
+
</tr>
|
|
270
|
+
<tr>
|
|
271
|
+
<td>public-proof.json</td>
|
|
272
|
+
<td>The fields the contract actually emits</td>
|
|
273
|
+
<td>A count you inferred because the filename sounded quantitative</td>
|
|
274
|
+
</tr>
|
|
275
|
+
<tr>
|
|
276
|
+
<td>“CI green”</td>
|
|
277
|
+
<td>Required checks on <em>some</em> SHA</td>
|
|
278
|
+
<td>Required checks on <strong>the SHA you are claiming</strong></td>
|
|
279
|
+
</tr>
|
|
280
|
+
<tr>
|
|
281
|
+
<td>Agent “done”</td>
|
|
282
|
+
<td>The model emitted a completion sentence</td>
|
|
283
|
+
<td>Tests, merge, or <code>/health</code></td>
|
|
284
|
+
</tr>
|
|
285
|
+
</tbody>
|
|
286
|
+
</table>
|
|
287
|
+
<p>
|
|
288
|
+
This is not pedantry. On 2026-07-30 a completion claim without the matching evidence class was a thumbs-down. The contract stayed: never say done, shipped, live, or fixed without the artifact that is authoritative for that claim.
|
|
289
|
+
</p>
|
|
290
|
+
|
|
291
|
+
<h2 id="the-completion-claim-contract"><a href="#the-completion-claim-contract">#</a> The completion claim contract</h2>
|
|
292
|
+
<p>When the claim is about ThumbGate itself, the evidence class is closed:</p>
|
|
293
|
+
<table>
|
|
294
|
+
<thead>
|
|
295
|
+
<tr><th>Claim</th><th>Required evidence before the word</th></tr>
|
|
296
|
+
</thead>
|
|
297
|
+
<tbody>
|
|
298
|
+
<tr>
|
|
299
|
+
<td>Code on <code>main</code></td>
|
|
300
|
+
<td>Merge commit SHA is tip (or ancestor) of <code>origin/main</code></td>
|
|
301
|
+
</tr>
|
|
302
|
+
<tr>
|
|
303
|
+
<td>Production live</td>
|
|
304
|
+
<td><code>GET /health</code> <code>buildSha</code> equals that SHA (and version when versioned)</td>
|
|
305
|
+
</tr>
|
|
306
|
+
<tr>
|
|
307
|
+
<td>CI green</td>
|
|
308
|
+
<td>Terminal required checks on <strong>that exact SHA</strong>, not an older branch run</td>
|
|
309
|
+
</tr>
|
|
310
|
+
</tbody>
|
|
311
|
+
</table>
|
|
312
|
+
<p>
|
|
313
|
+
Partial stays partial. A mid-flight Railway rebuild is not “deployed.” A dashboard screenshot is not <code>/health</code>. An empty grep is not “no matches” unless you named the surface you searched.
|
|
314
|
+
</p>
|
|
315
|
+
<div class="callout">
|
|
316
|
+
Absence is not evidence. Zero rows from the wrong index is a measurement error, not a clean bill of health. Production monitoring is not healthy until at least 20 measured task outcomes and 20 observed tool calls pass the configured threshold set — not because twenty is magic, because we refuse to call a silent pipeline healthy.
|
|
317
|
+
</div>
|
|
318
|
+
|
|
319
|
+
<h2 id="listing-is-not-invocable"><a href="#listing-is-not-invocable">#</a> Listing is not invocable</h2>
|
|
320
|
+
<p>
|
|
321
|
+
MCP discovery must equal the tools callable by the active profile and the packaged runtime. Side-effect annotations must be truthful. Declared structured outputs must validate. A compare page that ranks a vendor is not an adapter. An adapter file that is not in <code>SUPPORTED_AGENTS</code> is not support.
|
|
322
|
+
</p>
|
|
323
|
+
<p>
|
|
324
|
+
The same rule applies to this blog. A hub card is not a live URL until <code>public/blog/<slug>.html</code> exists, the server maps <code>/blog/*</code> from that directory, and <code>/sitemap.xml</code> auto-includes the file. Tests in <code>tests/blog-hub.test.js</code> pin the contract so a future agent cannot add JSON-LD for a post that is not on disk.
|
|
325
|
+
</p>
|
|
326
|
+
|
|
327
|
+
<h2 id="why-first-party"><a href="#why-first-party">#</a> Why first-party HTML</h2>
|
|
328
|
+
<p>
|
|
329
|
+
Cursor’s research posts are crawlable, canonical, and owned. That is the GEO surface that actually compounds: JSON-LD <code>BlogPosting</code> plus <code>FAQPage</code>, a stable slug, related posts that keep the reader on <code>thumbgate.ai</code>, linguistic struts an LLM parser can quote (Infrastructure Firewall, Reliability Gateway, Thompson Sampling, DPO, PreToolUse).
|
|
330
|
+
</p>
|
|
331
|
+
<p>What we did not steal:</p>
|
|
332
|
+
<ul>
|
|
333
|
+
<li>Cursor Origin / Continuity Git hosting. Client-side pack hygiene is a different lane.</li>
|
|
334
|
+
<li>A writing-platform canonical URL. This page is the canonical URL.</li>
|
|
335
|
+
<li>Invented traction. A research post is not a paid-pilot announcement.</li>
|
|
336
|
+
</ul>
|
|
337
|
+
<p>
|
|
338
|
+
If you want the gate on a repo you actually run agents against:
|
|
339
|
+
</p>
|
|
340
|
+
<p>
|
|
341
|
+
<a class="cta" href="https://thumbgate.ai/guide?utm_source=blog&utm_medium=article&utm_campaign=receipt-not-world-state-20260819&cta_id=receipt-not-world-state-20260819_blog_guide">Read the setup guide →</a>
|
|
342
|
+
<a class="cta ghost" href="https://www.npmjs.com/package/thumbgate">npx thumbgate init</a>
|
|
343
|
+
</p>
|
|
344
|
+
<p>
|
|
345
|
+
Source: <a href="https://github.com/IgorGanapolsky/ThumbGate">github.com/IgorGanapolsky/ThumbGate</a>.
|
|
346
|
+
Evidence index: <a href="https://github.com/IgorGanapolsky/ThumbGate/blob/main/VERIFICATION_EVIDENCE.md">VERIFICATION_EVIDENCE.md</a>.
|
|
347
|
+
</p>
|
|
348
|
+
|
|
349
|
+
<h2 id="faq"><a href="#faq">#</a> FAQ</h2>
|
|
350
|
+
<h3>What does thumbgate.ai actually do?</h3>
|
|
351
|
+
<p>
|
|
352
|
+
It evaluates a proposed AI coding-agent tool call before the harness runs it, can block unsafe actions, and writes a receipt for the decision. It does not retrain a model.
|
|
353
|
+
</p>
|
|
354
|
+
<h3>Does a ThumbGate receipt prove production is live?</h3>
|
|
355
|
+
<p>
|
|
356
|
+
No. A receipt proves the gate ran on that tool call. Production live requires <code>GET /health</code> <code>buildSha</code> equal to the claimed main SHA.
|
|
357
|
+
</p>
|
|
358
|
+
<h3>Is a listed MCP tool the same as an invocable tool?</h3>
|
|
359
|
+
<p>
|
|
360
|
+
No. Discovery must equal the tools the active profile and packaged runtime can actually call.
|
|
361
|
+
</p>
|
|
362
|
+
|
|
363
|
+
<div class="related">
|
|
364
|
+
<h2>Related posts</h2>
|
|
365
|
+
<a href="/blog/process-over-outcome-gates">Process over outcome: gates for self-improving coding loops</a>
|
|
366
|
+
<a href="/blog/inside-your-boundary">AI inside your boundary: governance without relaxing controls</a>
|
|
367
|
+
<a href="/learn/feedback-loop-vs-decision-layer">Feedback loop vs decision layer</a>
|
|
368
|
+
</div>
|
|
369
|
+
</article>
|
|
370
|
+
<nav class="toc" aria-label="Table of contents">
|
|
371
|
+
<h2>Table of Contents</h2>
|
|
372
|
+
<a href="#the-three-word-product">The three-word product</a>
|
|
373
|
+
<a href="#what-a-receipt-is">What a receipt is</a>
|
|
374
|
+
<a href="#what-a-receipt-is-not">What a receipt is not</a>
|
|
375
|
+
<a href="#the-completion-claim-contract">The completion claim contract</a>
|
|
376
|
+
<a href="#listing-is-not-invocable">Listing is not invocable</a>
|
|
377
|
+
<a href="#why-first-party">Why first-party HTML</a>
|
|
378
|
+
<a href="#faq">FAQ</a>
|
|
379
|
+
</nav>
|
|
380
|
+
</div>
|
|
381
|
+
<footer>
|
|
382
|
+
<div class="shell">
|
|
383
|
+
Format stolen from <a href="https://cursor.com/blog">cursor.com/blog</a>. Not affiliated.
|
|
384
|
+
Canonical: <a href="https://thumbgate.ai/blog/a-receipt-is-not-world-state">thumbgate.ai/blog/a-receipt-is-not-world-state</a>.
|
|
385
|
+
</div>
|
|
386
|
+
</footer>
|
|
387
|
+
</body>
|
|
388
|
+
</html>
|