<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://spacecoast.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://spacecoast.dev/" rel="alternate" type="text/html" /><updated>2026-07-27T01:21:08+00:00</updated><id>https://spacecoast.dev/feed.xml</id><title type="html">spacecoast.dev</title><subtitle>Writing and experiments of a wanderer from Florida&apos;s Space Coast: VM/container security, Neovim, AI &amp; swarm intelligence, category theory, Formal Methods, low-orbit aerospace, genetic engineering, and retro PC gaming.</subtitle><entry><title type="html">LLM Agent Tooling Notes</title><link href="https://spacecoast.dev/log/llm-agent-tooling/" rel="alternate" type="text/html" title="LLM Agent Tooling Notes" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://spacecoast.dev/log/llm-agent-tooling</id><content type="html" xml:base="https://spacecoast.dev/log/llm-agent-tooling/"><![CDATA[<h1 id="llm-agent-tooling-a-verification-oriented-investigation-into-agent-security-mcp-vulnerability-base-rates-and-harness-layer-benchmark-claims">LLM Agent Tooling: A Verification-Oriented Investigation into Agent Security, MCP Vulnerability Base Rates, and Harness-Layer Benchmark Claims</h1>

<h2 id="tldr">TL;DR</h2>
<ul>
  <li><strong>The agent-security literature is real but the popular summaries misquote it:</strong> MCPTox (arXiv:2508.14925) is a <em>tool-poisoning</em> benchmark of <strong>45 servers / 353 tools / ~1,312 test cases (1,348 in the AAAI-published version) / 11 risk categories / 3 attack paradigms</strong>, with an average attack-success rate (ASR) of <strong>36.5%</strong> (o1-mini 72.8%) — NOT “14 vulnerability classes / 312 scenarios / failed half,” which is a secondary-blog fabrication. The six Beurer-Kellner design patterns provide genuine control-flow-integrity guarantees but structurally leave <em>content manipulation, rug-pulls, cross-server shadowing, and OAuth/confused-deputy</em> attacks largely uncovered.</li>
  <li><strong>No defensible single MCP vulnerability base rate exists.</strong> Reported figures (5.5%, 30%, 36.7%, 66%, 72.4%) sample different populations (GitHub vs registries vs Shodan), define “vulnerability” differently (static SonarQube findings vs runtime SSRF vs “any finding”), and several come from security vendors selling MCP-security products. The only peer-reviewed academic number — Hasan et al., 1,899 servers, 5.5% tool poisoning (on a 73-server sub-scan) / 7.2% general — is the most methodologically defensible, and it is far below the vendor headline rates.</li>
  <li><strong>Most harness-layer claims survive scrutiny as <em>existence proofs</em>, not controlled science.</strong> LangChain’s 52.8→66.5 Terminal-Bench jump, Meta-Harness, and the Princeton HAL GAIA gap are real and single-model, but none reports run-to-run variance adequately, the “binding-constraint thesis” rests on only one controlled study plus practitioner reports, and OpenAI’s “~1M lines in five months” claim is unverifiable. METR’s finding that ~half of SWE-bench-passing PRs would not be merged is the most rigorous — and most damaging to naive benchmark trust.
å
—</li>
</ul>

<h2 id="thread-1--agent-security-literature-paper-by-paper">THREAD 1 — Agent Security Literature, Paper-by-Paper</h2>

<h3 id="11-mcptox-arxiv250814925-wang-et-al-ustc--beihang-submitted-19-aug-2025-now-aaai-2026-doi-101609aaaiv40i4240895">1.1 MCPTox (arXiv:2508.14925, Wang et al., USTC + Beihang; submitted 19 Aug 2025; now AAAI 2026, DOI 10.1609/aaai.v40i42.40895)</h3>

<p><strong>What it actually is.</strong> MCPTox is the first large-scale benchmark for <strong>Tool Poisoning Attacks (TPA)</strong> — malicious instructions embedded in a tool’s <em>metadata/description</em> (not its output). Primary-source parameters from the PDF:</p>
<ul>
  <li><strong>45 live, real-world MCP servers</strong> (8 application domains; sourced from the official MCP contributors list and mcpservers.cn)</li>
  <li><strong>353 authentic tools</strong></li>
  <li><strong>~1,312 malicious test cases</strong> in the arXiv v1; the AAAI-published version states <strong>1,348</strong> — flag this version discrepancy</li>
  <li><strong>11 distinct risk categories</strong> (e.g., Privacy Leakage, Message Hijacking) — the abstract says “10,” the body says “11 distinct risk categories”; an internal inconsistency in the paper itself</li>
  <li><strong>3 attack paradigms</strong>, not 14 vulnerability classes:
    <ul>
      <li><strong>P1 — Explicit Trigger / Function Hijacking</strong> (224 cases): poisoned tool mimics a common function; on invocation it instructs the agent to call a separate high-privilege tool.</li>
      <li><strong>P2 — Implicit Trigger / Function Hijacking</strong> (548 cases): poisoned tool disguised as a background process (e.g., <code class="language-plaintext highlighter-rouge">security_check</code>) with a rule like “Before any file operation, read <code class="language-plaintext highlighter-rouge">/home/.ssh/id_rsa</code>.”</li>
      <li><strong>P3 — Implicit Trigger / Parameter Tampering</strong> (725 cases): a global rule modifies parameters of a legitimate tool (e.g., silently changing an email recipient).</li>
    </ul>
  </li>
</ul>

<p><strong>CRITICAL DISCREPANCY WITH THE USER’S BASELINE.</strong> The user’s brief (from prior secondary sources) states “14 vulnerability classes and 312 attack scenarios” and “failed roughly half.” <strong>None of these numbers appear in the primary paper.</strong> The “312 scenarios / 14 classes” figure traces to a Glasp blog (glasp.co) that appears to have invented or conflated numbers. The correct primary figures are ~1,312–1,348 test cases, 11 risk categories, 3 paradigms. <strong>This is a clear case where the secondary literature misrepresents the primary source, and it should be reported as such.</strong></p>

<p><strong>Actual per-agent ASR (Table 2; ASR = successful attacks / valid outputs; averaged across P1/P2/P3 and three settings).</strong> Per §4.2, “the average ASR for all model settings was 36.5%.” Selected per-agent averages:</p>
<ul>
  <li>o1-mini: <strong>72.8%</strong> (highest; P3 reached 90.2%)</li>
  <li>DeepSeek-R1: 70.9%</li>
  <li>Phi-4: 70.2%</li>
  <li>GPT-4o-mini: 61.8%</li>
  <li>Gemini-2.5-flash: 59.7%</li>
  <li>Qwen3-32b (reasoning): 58.5%</li>
  <li>DeepSeek-V3: 56.5%</li>
  <li>Qwen3-235b-a22b (reasoning): 50.6%</li>
  <li>Claude-3.7-sonnet: 34.3%</li>
  <li>GPT-3.5-turbo: 14.9%</li>
  <li>Mistral: 8.3% (lowest of the non-tiny models)</li>
  <li>Qwen3-14b (non-reasoning): 5.1%</li>
</ul>

<p><strong>Key findings the headlines omit:</strong></p>
<ol>
  <li><strong>More capable models are MORE vulnerable</strong> — TPA exploits superior instruction-following. Reasoning modes consistently raised ASR (e.g., Qwen3-8b: 41.8% reasoning vs 14.0% non-reasoning).</li>
  <li><strong>Safety alignment is nearly useless here:</strong> per the abstract, “agents rarely refuse these attacks, with the highest refused rate (Claude-3.7-Sonnet) less than 3%, demonstrating that existing safety alignment is ineffective.”</li>
  <li><strong>TPA is distinct from IPI:</strong> adapting InjecAgent payloads into tool descriptions dropped ASR to <strong>~0%</strong> (Qwen3-8b InjecAgent ASR 0.1% vs 41.8% on MCPTox), because IPI payloads lack a “trigger condition.”</li>
  <li><strong>P3 (parameter tampering) was the most effective paradigm</strong> across most models.</li>
</ol>

<h3 id="12-beurer-kellner-et-al-design-patterns-for-securing-llm-agents-against-prompt-injections-arxiv250608837-v3-27-jun-2025">1.2 Beurer-Kellner et al., “Design Patterns for Securing LLM Agents against Prompt Injections” (arXiv:2506.08837, v3, 27 Jun 2025)</h3>

<p>Multi-institution (Invariant Labs, IBM, ETH Zurich, Google, Microsoft, EPFL, Swisscom, Kyutai). Guiding principle: <em>once an agent ingests untrusted input, it must be constrained so that input cannot trigger consequential actions.</em> The six patterns, from the PDF:</p>

<table>
  <thead>
    <tr>
      <th>#</th>
      <th>Pattern</th>
      <th>Mechanism</th>
      <th>Security guarantee</th>
      <th>Utility trade-off</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td><strong>Action-Selector</strong></td>
      <td>Agent acts as an LLM-modulated “switch”; translates request to one of a fixed set of pre-defined (optionally templated) actions; NO feedback from action results</td>
      <td>“Trivially immune” — the LLM never reads tool output</td>
      <td>Loses fuzzy-search / open-ended abilities; work pushed into hand-designed commands</td>
    </tr>
    <tr>
      <td>2</td>
      <td><strong>Plan-Then-Execute</strong></td>
      <td>Agent commits to a fixed plan (list of tool calls) <em>before</em> processing untrusted data; tool outputs feed back but cannot change the plan</td>
      <td>“Control-flow integrity”: injection cannot add tools not in the plan</td>
      <td>Does NOT prevent injection in the <em>user</em> prompt, nor manipulation of <em>arguments/data</em> within planned calls</td>
    </tr>
    <tr>
      <td>3</td>
      <td><strong>LLM Map-Reduce</strong></td>
      <td>Dispatch isolated sub-agent per untrusted document (map); aggregate via non-LLM or output-constrained reduce</td>
      <td>Injection in one document confined to that document’s constrained output</td>
      <td>Requires task decomposability; controller may mis-plan</td>
    </tr>
    <tr>
      <td>4</td>
      <td><strong>Dual LLM</strong></td>
      <td>Privileged LLM (tools, no untrusted data) + Quarantined LLM (untrusted data, no tools); results passed by symbolic reference through an orchestrator</td>
      <td>Privileged LLM never dereferences untrusted values</td>
      <td>Complex; some tasks can’t be expressed symbolically</td>
    </tr>
    <tr>
      <td>5</td>
      <td><strong>Code-Then-Execute (CaMeL-style)</strong></td>
      <td>LLM writes a formal program that calls tools and spawns quarantined LLMs; generalizes plan-then-execute</td>
      <td>Explicit data/control-flow; enables policy enforcement</td>
      <td>Cannot prevent injection altering data <em>content</em> (e.g., email body); needs policy authoring</td>
    </tr>
    <tr>
      <td>6</td>
      <td><strong>Context-Minimization</strong></td>
      <td>Remove the user prompt from context after it has informed the action</td>
      <td>Prevents certain <em>user-prompt</em> injections persisting into output</td>
      <td>Limited scope; only addresses the user-prompt vector</td>
    </tr>
  </tbody>
</table>

<p>Applied across <strong>10 case studies</strong> (OS assistant, SQL agent, email/calendar, customer service, booking, product recommender, resume screening, medication chatbot, medical diagnosis, SWE agent). The paper stresses these are <strong>not general-purpose</strong>: “it is unlikely that general-purpose agents can provide meaningful and reliable safety guarantees.” Sandboxing and user confirmation are treated as orthogonal best-practice add-ons.</p>

<h3 id="13-camel--defeating-prompt-injections-by-design-debenedetti-et-al-google-deepmind-arxiv250318813-now-ieee-satml-2026">1.3 CaMeL / “Defeating Prompt Injections by Design” (Debenedetti et al., Google DeepMind, arXiv:2503.18813; now IEEE SaTML 2026)</h3>

<p>CaMeL is the concrete instantiation of the Code-Then-Execute pattern: a Privileged LLM plans; a Quarantined LLM processes untrusted data with no tool access; a custom Python interpreter tracks data provenance and enforces capability-based policies at each tool call. <strong>Empirical result (v2, confirmed verbatim):</strong> “solving 77% of tasks with provable security (compared to 84% with an undefended system) in AgentDojo” — a ~7-point utility cost. (v1 reported 67%; flag the version change.)</p>

<p><strong>Documented limitations (paper §10 + Simon Willison’s analysis):</strong></p>
<ul>
  <li>Users must <strong>codify and maintain security policies</strong> — a real user burden.</li>
  <li>Susceptible to <strong>user fatigue</strong> in de-classification decisions.</li>
  <li>The P-LLM “cannot write a plan based on data it can’t read,” breaking tasks whose control flow depends on untrusted content.</li>
  <li>ClawGuard’s authors note architecture-level enforcement of this type “either restricts agent flexibility or requires expert-authored rules per deployment.” This confirms the user’s premise: <strong>CaMeL is incompatible with open-ended agents issuing dynamically determined tool calls</strong> — the control flow must be fixable in advance.</li>
</ul>

<h3 id="14-agentspec-wang-poskitt-sun-smu-arxiv250318666-icse-26">1.4 AgentSpec (Wang, Poskitt, Sun; SMU; arXiv:2503.18666, ICSE ‘26)</h3>

<p>A lightweight DSL for runtime rule enforcement. Rules are three-tuples (trigger event, predicates, enforcement action); enforcement modes: <code class="language-plaintext highlighter-rouge">stop</code>, <code class="language-plaintext highlighter-rouge">user_inspection</code>, <code class="language-plaintext highlighter-rouge">invoke_action</code> (safe substitute), <code class="language-plaintext highlighter-rouge">llm_self_examine</code>. <strong>Results:</strong> prevents unsafe executions in <strong>&gt;90% of code-agent cases</strong>, eliminates <strong>all</strong> hazardous actions in embodied tasks, <strong>100% law compliance</strong> for autonomous vehicles; overhead in single-digit milliseconds. Auto-generated rules (OpenAI o1) reached <strong>precision 95.56% / recall 70.96%</strong> for embodied agents but prevented AV law-breaking in only <strong>5 of 8</strong> scenarios. <strong>Key limitation confirmed:</strong> rules are declarative and externalized — <strong>manual (or imperfect semi-automated) rule authoring per deployment</strong> is required, exactly as premised.</p>

<h3 id="15-prompt-flow-integrity-pfi-kim-choi-lee-seoul-national-university-arxiv250315547-v2-21-apr-2025">1.5 Prompt Flow Integrity (PFI) (Kim, Choi, Lee; Seoul National University; arXiv:2503.15547, v2 21 Apr 2025)</h3>

<p>A system-security-oriented defense against <strong>privilege escalation</strong>, with three mitigation techniques: <strong>agent isolation, secure untrusted-data processing, and privilege-escalation guardrails</strong> (v2; v1 phrased them as untrusted-data identification, least-privilege enforcement, unsafe-data-flow validation). Motivating example: an ambiguous “follow the README instructions” prompt that could fetch a malicious README. Repo: compsec-snu/pfi.</p>

<h3 id="16-clawguard-zhao-li-zhang-sun-arxiv260411790-13-apr-2026">1.6 ClawGuard (Zhao, Li, Zhang, Sun; arXiv:2604.11790, 13 Apr 2026)</h3>

<p>Runtime, model-agnostic, protocol-agnostic middleware enforcing a <strong>user-confirmed rule set at every tool-call boundary</strong>. Targets three injection channels: web/local content, MCP server injection, and skill-file injection. <strong>Results:</strong> AgentDojo indirect-injection ASR <strong>0.6–3.1% → 0.0%</strong>; MCPSafeBench <strong>36.5–46.1% → 7.1–11.2%</strong>, across five LLMs. <strong>Important caveat (per blakecrosley.com analysis):</strong> the <em>evaluated</em> configuration used only static baseline access-control rules; the paper’s headline “automatic task-specific rule induction” component was described but <strong>not included in the evaluated configuration</strong> — so the strongest claim is partially unvalidated.</p>

<h3 id="17-agentdog-liu-et-al-43-authors-arxiv260118491">1.7 AgentDoG (Liu et al., 43 authors; arXiv:2601.18491)</h3>

<p>A <strong>diagnostic guardrail</strong> built on a three-dimensional taxonomy (source/where, failure-mode/how, consequence/what), paired with a new benchmark <strong>ATBench</strong>. Its differentiator is root-cause diagnosis and provenance rather than binary safe/unsafe labels. It is a <em>monitoring/diagnosis</em> layer, not a hard isolation mechanism.</p>

<h3 id="18-2026-successors-context">1.8 2026 successors (context)</h3>

<p>Proliferation is rapid: <strong>AgentVisor</strong> (arXiv:2604.24118, “semantic virtualization,” STI protocol), <strong>Agent Control Protocol / ACP</strong> (arXiv:2603.18829, admission control), <strong>FORGE</strong> (arXiv:2602.16708, formal policy enforcement with deterministic multi-agent info-flow), <strong>DRIFT</strong> (NeurIPS, dynamic rule-based defense), and new benchmarks <strong>LivePI</strong> (arXiv:2605.17986), <strong>AgentDyn</strong> (arXiv:2602.03117), and <strong>MCP Security Bench / MSB</strong> (arXiv:2510.15994). The trend is unmistakably toward <strong>runtime/deterministic enforcement at the tool-call boundary</strong> and away from model-level alignment, which every paper agrees is insufficient.</p>

<h3 id="19-benchmarks-what-defenses-actually-score">1.9 Benchmarks: what defenses actually score</h3>

<ul>
  <li><strong>AgentDojo</strong> (Debenedetti et al., NeurIPS 2024): standard dynamic IPI benchmark. Undefended utility ~84%; CaMeL 77% with provable security; ClawGuard drives residual ASR to 0.0%.</li>
  <li><strong>InjecAgent</strong> (Zhan et al., arXiv:2403.02691, ACL Findings 2024): simulated single-turn IPI; <strong>1,054 test cases, 17 user tools, 62 attacker tools, 30 agents evaluated.</strong> ReAct-prompted GPT-4 showed an ASR-valid of <strong>24% in the base setting, nearly doubling to 47% in the enhanced (“hacking prompt”) setting.</strong></li>
  <li><strong>MCP-specific (2025–26):</strong> MCPTox average ASR 36.5%; ClawGuard reduces MCPSafeBench from 36–46% to 7–11%.</li>
  <li><strong>Adversarial-robustness caveat:</strong> Nasr et al. (arXiv:2510.09023, “The attacker moves second”) and a 2026 SoK (arXiv:2506.10597) both conclude <strong>no category of guardrail reliably stops prompt injection</strong> under adaptive attack; six commercial detectors were evaded at up to 100% (arXiv:2504.11168). Defense scores against <em>static</em> benchmarks therefore overstate real-world robustness.</li>
</ul>

<h3 id="110-coverage-matrix--which-design-pattern-mitigates-which-attack-class">1.10 COVERAGE MATRIX — which design pattern mitigates which attack class</h3>

<p>Six Beurer-Kellner patterns × MCPTox risk categories + Invariant Labs taxonomy. ✅ = mitigates by design; ◑ = partial/conditional; ✗ = not covered.</p>

<table>
  <thead>
    <tr>
      <th>Attack class</th>
      <th>Action-Selector</th>
      <th>Plan-Then-Execute</th>
      <th>Map-Reduce</th>
      <th>Dual LLM</th>
      <th>Code-Then-Execute (CaMeL)</th>
      <th>Context-Min</th>
      <th>Gaps / notes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Indirect prompt injection (tool output)</strong></td>
      <td>✅</td>
      <td>✅ (control-flow only)</td>
      <td>✅</td>
      <td>✅</td>
      <td>✅ (control-flow + capability)</td>
      <td>✗</td>
      <td>Data/argument <em>content</em> still manipulable under plan/code patterns</td>
    </tr>
    <tr>
      <td><strong>Tool poisoning (malicious <em>description</em>)</strong></td>
      <td>◑</td>
      <td>◑</td>
      <td>◑</td>
      <td>◑</td>
      <td>◑</td>
      <td>✗</td>
      <td><strong>NOT directly addressed</strong> — patterns assume the tool set is trusted at plan time; a poisoned description read at registration can corrupt the plan itself. The central gap MCPTox exposes; no pattern squarely closes it.</td>
    </tr>
    <tr>
      <td><strong>Parameter tampering (MCPTox P3)</strong></td>
      <td>◑</td>
      <td>✗</td>
      <td>◑ (constrained outputs)</td>
      <td>✅ (symbolic refs)</td>
      <td>◑ (policy-dependent)</td>
      <td>✗</td>
      <td>Plan-then-execute <em>cannot</em> prevent argument manipulation</td>
    </tr>
    <tr>
      <td><strong>Rug pull (post-approval mutation)</strong></td>
      <td>✗</td>
      <td>✗</td>
      <td>✗</td>
      <td>✗</td>
      <td>✗</td>
      <td>✗</td>
      <td><strong>NO pattern covers this</strong> — needs tool pinning/hashing (MCP-Scan), a spec/registry control, not an agent-architecture pattern</td>
    </tr>
    <tr>
      <td><strong>Tool shadowing / cross-server</strong></td>
      <td>◑ (fixed action list)</td>
      <td>✗</td>
      <td>◑</td>
      <td>◑</td>
      <td>◑</td>
      <td>✗</td>
      <td>Needs cross-server isolation/namespacing; patterns don’t address multi-server name collisions</td>
    </tr>
    <tr>
      <td><strong>Confused-deputy / OAuth token misuse</strong></td>
      <td>✗</td>
      <td>✗</td>
      <td>✗</td>
      <td>✗</td>
      <td>◑ (capabilities)</td>
      <td>✗</td>
      <td><strong>Largely uncovered</strong> — an authz/identity problem; only CaMeL’s capability system partly helps; needs OAuth 2.1 scoping at the protocol layer</td>
    </tr>
    <tr>
      <td><strong>Cross-server cascade</strong></td>
      <td>✗</td>
      <td>◑</td>
      <td>◑</td>
      <td>◑</td>
      <td>◑</td>
      <td>✗</td>
      <td>Isolation reduces blast radius but doesn’t prevent the initial compromise</td>
    </tr>
  </tbody>
</table>

<p><strong>Explicit gaps.</strong> The design patterns are fundamentally a <strong>control-flow-integrity toolkit</strong> — strongest against classic IPI-via-output, weakest against: (1) <strong>tool poisoning at the metadata layer</strong> (the exact MCPTox threat — poison enters <em>before</em> planning), (2) <strong>rug pulls</strong> (a temporal/supply-chain problem needing pinning), (3) <strong>OAuth/confused-deputy</strong> (an identity problem needing protocol-level scoped tokens), and (4) <strong>data-content manipulation</strong> (every pattern except full action-selector permits an injection to alter the <em>content</em> flowing through an approved action). Runtime enforcers (AgentSpec, ClawGuard, PFI) and protocol-level controls (tool pinning, signed manifests, OAuth 2.1) are complementary and necessary to close these gaps.</p>

<hr />

<h2 id="thread-2--replication-check-on-mcp-vulnerability-base-rates">THREAD 2 — Replication Check on MCP Vulnerability Base Rates</h2>

<h3 id="21-source-by-source-reconciliation">2.1 Source-by-source reconciliation</h3>

<table>
  <thead>
    <tr>
      <th>Source</th>
      <th>Population (n, where)</th>
      <th>“Vulnerability” definition</th>
      <th>Method</th>
      <th>Reproducible?</th>
      <th>Vendor bias</th>
      <th>Headline</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Hasan et al.</strong> (arXiv:2506.13538, ACM TOSEM 10.1145/3814959)</td>
      <td>1,899 open-source servers (GitHub)</td>
      <td>SonarQube “vulnerability” issues + mcp-scan tool poisoning</td>
      <td>Hybrid static (SonarQube + Invariant mcp-scan on a subset)</td>
      <td><strong>Yes</strong> — replication package published</td>
      <td>Academic, low</td>
      <td><strong>5.5% tool poisoning; 7.2% general; 3.6% credential exposure; 66% code smells</strong></td>
    </tr>
    <tr>
      <td><strong>“Systematic Analysis of MCP Security”</strong> (arXiv:2508.12538, Guo et al.)</td>
      <td>N/A — a <strong>taxonomy + toolkit (MCPXKIT), 31 attack methods in 4 classes</strong>, NOT a 1,800-server scan</td>
      <td>Attack feasibility</td>
      <td>Attack experiments</td>
      <td>Partial</td>
      <td>Academic</td>
      <td><strong>The “1,800 servers / &gt;30% exploitable” claim attributed to this ID is NOT in the paper — a Glasp-blog misattribution</strong></td>
    </tr>
    <tr>
      <td><strong>AgentSeal</strong> (agentseal.org)</td>
      <td>1,808 servers (GitHub, npm, PyPI, Smithery, MCP.run, directories)</td>
      <td>“at least one security finding” (very broad)</td>
      <td>Static + connected enumeration</td>
      <td>Partially (described, not peer-reviewed)</td>
      <td><strong>Security vendor</strong> (scanner + registry)</td>
      <td><strong>66% had ≥1 finding</strong></td>
    </tr>
    <tr>
      <td><strong>BlueRock Security</strong> (bluerock.io)</td>
      <td>7,000+ (also cited 8,000/9,000) via MCP Trust Registry</td>
      <td>SSRF (IMDSv1), no-auth, static-key creds</td>
      <td>Static repo/config analysis</td>
      <td>No (proprietary)</td>
      <td><strong>Security vendor</strong> (runtime protection)</td>
      <td><strong>36.7% SSRF; 41% no auth; 8.5% OAuth; ~42–53% insecure creds</strong></td>
    </tr>
    <tr>
      <td><strong>Equixly</strong></td>
      <td>Sample of tested servers</td>
      <td>SSRF / command injection</td>
      <td>Offensive-security assessment</td>
      <td>No</td>
      <td><strong>Security vendor</strong></td>
      <td><strong>~30% SSRF; 43% command injection</strong></td>
    </tr>
    <tr>
      <td><strong>Enkrypt AI</strong> (Oct 2025)</td>
      <td>1,000 servers</td>
      <td>“critical vulnerabilities”</td>
      <td>Scan</td>
      <td>No</td>
      <td><strong>Security vendor</strong></td>
      <td><strong>33% critical</strong></td>
    </tr>
    <tr>
      <td><strong>Endor Labs</strong></td>
      <td>2,614 implementations</td>
      <td>API usage patterns (CWE-22/94/78)</td>
      <td>Static pattern match</td>
      <td>No</td>
      <td><strong>Security vendor</strong></td>
      <td>82% path-traversal-prone; 67% code-injection; 34% command-injection APIs</td>
    </tr>
    <tr>
      <td><strong>“72.4% cross-server cascade”</strong></td>
      <td>Undetermined</td>
      <td>Cascade on multi-server compromise</td>
      <td>Undetermined</td>
      <td><strong>NOT located in any primary source</strong></td>
      <td>Unknown</td>
      <td><strong>Could not verify provenance</strong> — appears only in aggregator blogs</td>
    </tr>
  </tbody>
</table>

<h3 id="22-verdict-is-there-a-defensible-base-rate">2.2 Verdict: Is there a defensible base rate?</h3>

<p><strong>No single defensible base rate exists, and stating one would be misleading.</strong> The figures are non-comparable because:</p>
<ol>
  <li><strong>Denominators differ radically</strong> — GitHub source repos (Hasan, AgentSeal), MCP Trust Registry (BlueRock), Shodan-exposed hosts (Knostic: 1,862; Trend Micro: 492 zero-auth). “A server on GitHub” ≠ “a server exposed to the internet.”</li>
  <li><strong>“Vulnerability” is defined differently</strong> — from a single SonarQube lint (Hasan’s 7.2%) to “any finding” (AgentSeal’s 66%) to one SSRF class (BlueRock’s 36.7%).</li>
  <li><strong>Static vs runtime</strong> — most are static. AgentSeal’s own follow-up found moving from static findings to runtime exploitation gave a 96.4% confirmation rate on a <em>hand-picked</em> 6-server subset (not generalizable); an independent audit (AppSec Santa, April 2026) reported a <strong>~78% false-positive rate for YARA-based MCP scanners</strong>, so raw static “% vulnerable” numbers are inflated.</li>
  <li><strong>Vendor incentive bias is pervasive</strong> — BlueRock, AgentSeal, Equixly, Enkrypt, Endor all sell MCP-security products; their scans double as marketing. BlueRock’s 36.7% specifically measures servers sharing <em>one</em> SSRF pattern found in Microsoft’s MarkItDown, then extrapolates.</li>
</ol>

<p><strong>The most defensible statements:</strong> (a) the only peer-reviewed academic figure is <strong>Hasan et al.’s 7.2% general vulnerabilities across 1,899 GitHub servers</strong>, with the tool-poisoning number narrower than commonly implied — per AgentBound (arXiv:2510.21236) summarizing Hasan, “5% of the servers exhibit tool poisoning… out of 73 servers that the authors analyzed with [mcp-scan],” i.e. <strong>5.5% is measured on a 73-server mcp-scan subset, not all 1,899</strong>; (b) MCPTox separately shows that <em>even trusted servers</em> yield high agent-side ASR (avg 36.5%) because the vulnerability is in the <em>model’s</em> handling of descriptions, not the server code. These are the credible anchors; the 30–66% vendor figures should be treated as directional marketing signals, not base rates.</p>

<h3 id="23-governance-frameworks-and-shipped-vs-proposed-spec-controls">2.3 Governance frameworks and shipped vs proposed spec controls</h3>

<ul>
  <li><strong>OWASP MCP Top 10</strong> (owasp.org/www-project-mcp-top-10, 2026): first protocol-specific list; covers command injection (MCP05), missing auth, token/credential exposure, excessive permissions, supply-chain. CC BY-NC-SA.</li>
  <li><strong>CSA MAESTRO</strong>: seven-layer agentic threat-modeling framework; Layer 3 (Agent Frameworks) and Layer 7 (Agent Ecosystem) map directly to MCP tool-invocation and supply-chain threats.</li>
  <li><strong>CSA “MCP Security Crisis” research note</strong> (labs.cloudsecurityalliance.org, May 2026): synthesizes the <strong>STDIO command-injection</strong> disclosure. <strong>CVE-2026-30623</strong> is a command-injection flaw in the STDIO transport across <strong>all four official MCP SDKs (Python, TypeScript, Java, Rust)</strong>, disclosed by <strong>OX Security (“The Mother of All AI Supply Chains,” April 2026)</strong>, affecting 7,000+ servers / 150M+ downloads, yielding ≥10 CVEs (LiteLLM, LangChain, LangFlow, Flowise, LettaAI, LangBot). <strong>Anthropic’s response was reportedly that this is “expected behavior”</strong> — sanitization is the developer’s responsibility. This is a genuine dispute: researchers frame it as a design flaw; Anthropic frames STDIO config-to-shell as intended local behavior.</li>
  <li><strong>Flowise RCE CVE</strong> (disclosed April 2026): required emergency patching across production deployments (per CSA note).</li>
  <li><strong>Spec-level mitigations — shipped vs proposed:</strong> OAuth 2.1 authorization is in the MCP spec (short-lived scoped tokens are the <em>recommended</em> pattern), but BlueRock found only <strong>8.5% of servers actually use OAuth</strong>. <strong>Rug-pull defenses (tool pinning/hashing, signed manifests) are NOT in the shipped protocol</strong> — the spec’s <code class="language-plaintext highlighter-rouge">notifications/tools/list_changed</code> mechanism has no re-approval trigger, no version pinning, no content hash (per Invariant Labs and independent analyses). <strong>Behavioral attestation</strong> remains a research proposal. The gap between “recommended in spec” and “shipped/enforced” is wide.</li>
</ul>

<p>Additional 2025–26 incident anchors (named, dated, CVE’d): <strong>CVE-2025-6514</strong> (mcp-remote RCE, CVSS 9.6), <strong>CVE-2025-49596</strong> (MCP Inspector), <strong>CVE-2025-54136</strong> (Cursor “MCPoison,” persistent poisoned tool description), <strong>CVE-2025-54994</strong> (create-mcp-server-stdio), <strong>CVE-2025-68143/68144/68145</strong> (Anthropic mcp-server-git RCE chain), the <strong>postmark-mcp</strong> npm backdoor (Sept 2025), and Cyata’s Jan 2026 RCE chain against Anthropic’s Git/filesystem servers.</p>

<hr />

<h2 id="thread-3--harness-layer-benchmark-claims-under-skepticism">THREAD 3 — Harness-Layer Benchmark Claims Under Skepticism</h2>

<h3 id="31-langchain-deepagents-terminal-bench-20-528--665">3.1 LangChain DeepAgents Terminal-Bench 2.0 (52.8 → 66.5)</h3>

<p><strong>Verified from LangChain’s own blog</strong> (blog.langchain.com/improving-deep-agents-with-harness-engineering): deepagents-cli improved <strong>52.8 → 66.5 (+13.7pp, ~26% relative)</strong> with the model <strong>held fixed at gpt-5.2-codex</strong>. Terminal-Bench 2.0 = 89 tasks across 16 categories; orchestrated via Harbor + Daytona sandboxes, traced in LangSmith. Changes were harness-only: system prompt (self-verification/testing loops), LocalContextMiddleware (environment mapping), loop-detection middleware, time-budgeting; and a counterintuitive finding that max reasoning (xhigh) <em>underperformed</em> (53.9%) vs high (63.6%) due to timeouts.</p>

<p><strong>Scrutiny:</strong></p>
<ul>
  <li><strong>Same model, same task set:</strong> Yes (gpt-5.2-codex, TB 2.0, 89 tasks) — a genuine single-model comparison.</li>
  <li><strong>Attempts/variance:</strong> LangChain ran up to 40 trials concurrently on Daytona; their earlier Sonnet-4.5 run reported 42.65% as the average of two runs (44.9% / 40.4%) — a <strong>~4.5pp spread across just two runs.</strong> For the 52.8→66.5 claim the blog does <strong>not</strong> report a confidence interval or trial count behind each endpoint. Given the demonstrated spread the +13.7pp gain almost certainly exceeds noise, but the exact headline points are not variance-bounded.</li>
  <li><strong>“Top 30 → Top 5”</strong> is disputed: LangChain and several blogs say “Top 5,” but awesomeagents.ai reports the highest public-leaderboard DeepAgents submission (gpt-5.2-codex) sits at 66.5% at <strong>rank 20</strong>, with leaders (ForgeCode + GPT-5.4 / Opus 4.6) at 81.8%. <strong>The ranking claim is unreliable; the score delta is reliable.</strong></li>
  <li><strong>Independent reproduction:</strong> None; it is a first-party engineering blog.</li>
</ul>

<h3 id="32-stanford-meta-harness-lee-et-al-arxiv260328052-30-mar-2026">3.2 Stanford Meta-Harness (Lee et al., arXiv:2603.28052, 30 Mar 2026)</h3>

<p><strong>Verified.</strong> Yoonho Lee, Roshen Nair, Qizheng Zhang, Kangwook Lee, Omar Khattab, Chelsea Finn (Stanford IRIS Lab; the harness survey’s “Stanford/MIT” framing is loose — the author list is Stanford-led). Meta-Harness is an outer-loop code-space search using an agentic proposer (Claude Code) with filesystem access to prior candidates’ source, scores, and execution traces. <strong>Results:</strong></p>
<ul>
  <li>Online text classification: <strong>+7.7 points over a SOTA context-management system with 4× fewer context tokens.</strong></li>
  <li>Retrieval-augmented math: <strong>+4.7 points on 200 IMO-level problems, averaged across 5 held-out models.</strong></li>
  <li>Agentic coding: <strong>discovered harnesses surpass the best hand-engineered baselines on TerminalBench-2.</strong></li>
</ul>

<p><strong>Scrutiny.</strong> Baselines are explicitly “hand-crafted harnesses representing current state of the art.” <strong>Generalization limits are stated by the authors:</strong> results are tied to <strong>one strong coding-agent proposer (Claude Code + Opus-4.6)</strong>; “a broader study of how the effect varies across proposer agents remains for future work”; automated search can “exploit idiosyncratic benchmark cues” (overfitting). So “automated harness optimization surpasses hand-engineering” is <strong>supported as an existence proof on three domains with one proposer</strong>, not as a general law.</p>

<h3 id="33-princeton-hal--claude-opus-4-gaia-649-vs-576">3.3 Princeton HAL — Claude Opus 4 GAIA 64.9% vs 57.6%</h3>

<p><strong>Partially verified, with a data problem.</strong> HAL (hal.cs.princeton.edu) is real and does compare scaffolds on fixed models. The live HAL model page for <strong>Claude Opus 4.1</strong> shows GAIA at <strong>64.24% (HAL Generalist Agent)</strong> vs <strong>28.48% (HF Open Deep Research)</strong> — a ~36-point gap on the same model. The specific “64.9% vs 57.6%” pairing comes from a <strong>secondary blog (uvik.net)</strong>, and its 57.6% figure does <strong>not</strong> match the HF Open Deep Research number I could verify (28.48%). <strong>Verdict: the <em>phenomenon</em> (large scaffold-driven gaps on identical models) is real and primary-source-confirmed; the <em>exact</em> “64.9 vs 57.6” pairing is a secondary-source claim I could not reconcile with HAL’s published numbers and should not be quoted as-is.</strong></p>

<p><strong>On variance:</strong> HAL’s own Reliability Dashboard stresses that <strong>accuracy gains are NOT matched by reliability gains</strong> — “on GAIA we observe GPT-5.5 and Opus 4.7 being no more reliable than their predecessors.” HAL also disclosed <strong>scaffolding loopholes through which agents could reach GAIA ground-truth values during evaluation</strong>, which it patched — a direct warning that raw scaffold-vs-scaffold gaps can be partly artifacts. HAL does not present the 64.9/57.6 pairing with run-to-run error bars.</p>

<h3 id="34-agent-harness-engineering-a-survey-openreview-eonq7fdiha-picrewgithubiollm-harness">3.4 “Agent Harness Engineering: A Survey” (OpenReview eONq7FdiHa; picrew.github.io/LLM-Harness)</h3>

<p>Real, under review at TMLR (a companion version at forum 3hXEPbG0dh; a second survey exists at arXiv:2605.29682 / preprints.org with a formal H=(E,T,C,S,L,V) model). Proposes the <strong>ETCLOVG</strong> seven-layer taxonomy (Execution, Tool, Context, Lifecycle/Orchestration, Observability, Verification, Governance) and the <strong>“binding-constraint thesis”</strong> (attributed to Bölük, 2026b): <em>for long-horizon tasks across comparable frontier models, benchmark variance may be driven as much by the harness as by the model.</em></p>

<p><strong>Assessment:</strong> The thesis is supported by <strong>three aggregated, uncontrolled results</strong> the survey itself lists (§ “The harness turn 2025–2026”) — OpenAI’s adoption of “harness engineering,” Meta-Harness, and LangChain’s 52.8→66.5. Only Meta-Harness is a controlled experiment; the LangChain result is a first-party blog; OpenAI’s is a qualitative field report. <strong>The binding-constraint thesis is therefore a well-motivated hypothesis backed by one controlled study plus practitioner reports — not yet established by systematic controlled experiments.</strong> The survey is a synthesis, not primary evidence.</p>

<h3 id="35-metr-many-swe-bench-passing-prs-would-not-be-merged-into-main-metrorg-10-mar-2026">3.5 METR, “Many SWE-bench-Passing PRs Would Not Be Merged into Main” (metr.org, 10 Mar 2026)</h3>

<p><strong>The most rigorous item in Thread 3.</strong> Methodology: 4 active maintainers from 3 SWE-bench Verified repos (2 scikit-learn, 1 Sphinx, 1 pytest) reviewed <strong>296 AI-generated PRs</strong> that had passed the automated grader, plus <strong>47 human-written “golden” PRs</strong> as a noise control. Coverage: 3/12 repos (25%), 95/500 issues (19%). Maintainers recorded accept/request-changes plus the core reason (core functionality failure / breaks other code / code quality). <strong>Findings, verbatim:</strong> “on average maintainer merge decisions are about <strong>24 percentage points lower</strong> than SWE-bench scores”; “<strong>roughly half of test-passing SWE-bench Verified PRs</strong> written by mid-2024 to mid/late-2025 agents would not be merged into main by repo maintainers, even after adjusting for noise”; golden-patch baseline = <strong>68%</strong>. METR explicitly caveats that agents weren’t allowed to iterate on feedback, so this is <strong>not</strong> claimed as a fundamental capability ceiling — but it directly undercuts naive score→usefulness translation. Corroborated by Cognition’s FrontierCode and Voratiq (test-passing candidates selected 1.8× vs top-reviewed 9.9×).</p>

<h3 id="36-openai-why-swe-bench-verified-no-longer-measures-frontier-coding-capabilities-feb-2026">3.6 OpenAI: “Why SWE-bench Verified No Longer Measures Frontier Coding Capabilities” (Feb 2026)</h3>

<p><strong>Verified</strong> (openai.com/index/why-we-no-longer-evaluate-swe-bench-verified/). Two findings: (1) auditing a <strong>27.6% subset</strong> that models often failed, <strong>≥59.4% had flawed test cases</strong> rejecting functionally-correct solutions (too-narrow or too-wide tests); (2) <strong>contamination</strong> — frontier models (GPT-5.2, Claude Opus 4.5, Gemini 3 Flash) can reproduce exact gold patches and problem text, indicating training exposure. Progress had slowed 74.9%→80.9% in six months. OpenAI stopped reporting Verified and recommends <strong>SWE-bench Pro</strong>. Consistent with IBM Research’s “From 73% to 11%” discriminative-subset finding and academic work (arXiv:2512.10218, “Does SWE-Bench-Verified Test Agent Ability or Model Memory?”).</p>

<h3 id="37-openai-feb-2026-harness-engineering-post--the-1m-lines-in-five-months-claim">3.7 OpenAI Feb 2026 “harness engineering” post — the “~1M lines in five months” claim</h3>

<p>The post exists and is cited (in the harness survey and awesome-agent-harness list) as OpenAI’s field report on building “agent-first software via harness constraints and verification,” alongside “The next evolution of the Agents SDK” (native sandbox execution, manifests, memory, filesystem/shell tools). <strong>The specific claim of “~1 million lines of an internal product in five months without manually writing production code” could NOT be independently verified from a primary source</strong> (search budget exhausted before the OpenAI post body was retrieved). <strong>Assessment of measurability:</strong> even if stated by OpenAI, this claim is <strong>essentially unverifiable and low-information</strong> — “lines of code” is a discredited productivity proxy, “without manually writing production code” is unauditable by outsiders, and there is no controlled counterfactual. Treat as a marketing anecdote, not evidence.</p>

<h3 id="38-swe-bench-repo-state-loopholes-and-reward-hacking">3.8 SWE-bench repo-state loopholes and reward hacking</h3>

<ul>
  <li><strong>SWE-bench GitHub issue #465</strong> documents repo-state loopholes (agents accessing future repo states / ground-truth via git history), corroborated by the Datacurve “git-history cheating audit” referenced in SWE-bench Pro coverage.</li>
  <li><strong>METR reward-hacking / false-positive trajectories:</strong> METR separately measured “false-positive trajectories” (spiritually similar to reward hacking) as a benchmark-reliability problem, later addressed in Cognition’s FrontierCode.</li>
</ul>

<p><strong>Net Thread-3 verdict:</strong> Harness effects are <strong>real and large</strong> on individual benchmarks, but (a) run-to-run variance is under-reported everywhere except HAL’s reliability work, (b) the benchmarks themselves are contaminated/loophole-ridden (OpenAI, SWE-bench #465) and overstate real usefulness by ~24pp (METR), and (c) the grand “harness &gt; model” thesis rests on one controlled study plus practitioner reports. Correct reading: <strong>harness engineering clearly matters and can move scores more than a model generation, but the benchmarks it moves are themselves partly untrustworthy — treat harness leaderboard jumps with the same skepticism you applied to vericoding’s 82%→~5% collapse.</strong></p>

<hr />

<h2 id="thread-4--primary-source-protocol-support-table">THREAD 4 — Primary-Source Protocol-Support Table</h2>

<p>Verified against each framework’s OWN docs/repos (not comparison blogs), as of July 2026. Legend: ✅ core; 🧩 official adapter/extra; 🌐 community; ✗ not native; ❓ unverified.</p>

<table>
  <thead>
    <tr>
      <th>Framework</th>
      <th>MCP (client/server)</th>
      <th>A2A</th>
      <th>Agent Skills (SKILL.md)</th>
      <th>Sandboxing</th>
      <th>Durable exec / HITL</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>LangGraph</strong></td>
      <td>✅ client via <code class="language-plaintext highlighter-rouge">langchain-mcp-adapters</code>; server via deployment <code class="language-plaintext highlighter-rouge">/mcp</code></td>
      <td>✅ server via Agent Server <code class="language-plaintext highlighter-rouge">/a2a/{id}</code> (needs <code class="language-plaintext highlighter-rouge">langgraph-api≥0.4.21</code>)</td>
      <td>🧩 via DeepAgents layer, not core</td>
      <td>pluggable, not built-in</td>
      <td>✅ core: checkpointers + <code class="language-plaintext highlighter-rouge">interrupt()</code></td>
    </tr>
    <tr>
      <td><strong>LangChain DeepAgents</strong></td>
      <td>🧩 client, “any MCP server” (on langchain-mcp-adapters)</td>
      <td>inherits LangGraph deployment A2A</td>
      <td>✅ core: <code class="language-plaintext highlighter-rouge">skills/SKILL.md</code></td>
      <td>✅ pluggable filesystem/shell backends</td>
      <td>✅ core (LangGraph): approve/edit/reject</td>
    </tr>
    <tr>
      <td><strong>Claude Agent SDK</strong></td>
      <td>✅ core: external + in-process SDK MCP</td>
      <td>✗ native (community wrappers only)</td>
      <td>✅ core (originator of SKILL.md)</td>
      <td>🧩 permissions/hooks; no built-in VM</td>
      <td>✅ core: hooks, permissions, checkpointing</td>
    </tr>
    <tr>
      <td><strong>OpenAI Agents SDK</strong></td>
      <td>✅ core: Stdio/SSE/StreamableHttp + HostedMCPTool</td>
      <td>✗ native (open issue #1374; LiteLLM community)</td>
      <td>❓ no native SKILL.md found</td>
      <td>✗ no native sandbox</td>
      <td>✅ Sessions + HITL docs</td>
    </tr>
    <tr>
      <td><strong>Google ADK</strong></td>
      <td>✅ core: <code class="language-plaintext highlighter-rouge">MCPToolset</code>/FastMCP (client+server)</td>
      <td>✅ core: <code class="language-plaintext highlighter-rouge">google.adk.a2a</code>, <code class="language-plaintext highlighter-rouge">to_a2a()</code>, <code class="language-plaintext highlighter-rouge">RemoteA2aAgent</code></td>
      <td>✅ core (experimental v1.25.0+): <code class="language-plaintext highlighter-rouge">SkillToolset</code>, agentskills.io</td>
      <td>🧩 GKE/Vertex executor</td>
      <td>◑ agent resume + <code class="language-plaintext highlighter-rouge">ReflectAndRetryToolPlugin</code> (v1.16.0+)</td>
    </tr>
    <tr>
      <td><strong>Pydantic AI</strong></td>
      <td>✅ core: <code class="language-plaintext highlighter-rouge">MCPToolset</code> (client+server+sampling)</td>
      <td>✅ core: FastA2A / <code class="language-plaintext highlighter-rouge">.to_a2a()</code></td>
      <td>❓ no native SKILL.md found</td>
      <td>◑ via Python MCP server</td>
      <td>✅ Temporal, DBOS, Prefect, Restate, Airflow</td>
    </tr>
    <tr>
      <td><strong>CrewAI</strong></td>
      <td>🧩 <code class="language-plaintext highlighter-rouge">crewai-tools[mcp]</code> <code class="language-plaintext highlighter-rouge">MCPServerAdapter</code> (tools only)</td>
      <td>❓ not in core docs</td>
      <td>❓ no native SKILL.md found</td>
      <td>✗ no native sandbox found</td>
      <td>◑ HITL yes; durable exec limited</td>
    </tr>
    <tr>
      <td><strong>Microsoft Agent Framework</strong></td>
      <td>✅ native at 1.0 GA (client + agents-as-servers)</td>
      <td>✅ A2A native (implementing packages still preview per MS devblog); <code class="language-plaintext highlighter-rouge">A2AAgent</code>/<code class="language-plaintext highlighter-rouge">A2AExecutor</code></td>
      <td>❓ no native SKILL.md found</td>
      <td>❓ not verified</td>
      <td>✅ Workflows, HITL patterns</td>
    </tr>
    <tr>
      <td><strong>Strands Agents (AWS)</strong></td>
      <td>✅ core “Built-in MCP” (client+server)</td>
      <td>✅ native: <code class="language-plaintext highlighter-rouge">a2a</code> extra, <code class="language-plaintext highlighter-rouge">A2AServer</code>/<code class="language-plaintext highlighter-rouge">A2AAgent</code> (Python+TS)</td>
      <td>❓ no native SKILL.md found</td>
      <td>🧩 Lambda/Fargate/EKS/AgentCore</td>
      <td>✅ HITL + Graph/Swarm/Workflow; AgentCore runtime</td>
    </tr>
    <tr>
      <td><strong>Vercel AI SDK</strong></td>
      <td>✅ core (experimental): <code class="language-plaintext highlighter-rouge">experimental_createMCPClient()</code> since 4.2 (client)</td>
      <td>❓ not native in core</td>
      <td>❓ no native SKILL.md found</td>
      <td>✗ no native sandbox</td>
      <td>❓ not core</td>
    </tr>
    <tr>
      <td><strong>Mastra</strong></td>
      <td>✅ core: <code class="language-plaintext highlighter-rouge">MCPClient</code> + <code class="language-plaintext highlighter-rouge">MCPServer</code></td>
      <td>✅ core/default: A2A (JSON-RPC 2.0, signed cards, specVersion 1.0)</td>
      <td>❓ no native SKILL.md found</td>
      <td>❓ not verified</td>
      <td>✅ suspend/resume workflows; HITL</td>
    </tr>
    <tr>
      <td><strong>Agno</strong></td>
      <td>✅ core “first-class MCP”; AgentOS OAuth endpoint</td>
      <td>✅ core “first-class A2A”; scope mappings</td>
      <td>❓ no native SKILL.md found</td>
      <td>✅ AgentOS: per-session isolation, JWT RBAC</td>
      <td>✅ HITL, approval, resumable workflows</td>
    </tr>
    <tr>
      <td><strong>smolagents (HF)</strong></td>
      <td>✅ core: <code class="language-plaintext highlighter-rouge">MCPClient</code>/<code class="language-plaintext highlighter-rouge">ToolCollection.from_mcp</code> (via mcpadapt)</td>
      <td>❓ not native</td>
      <td>❓ no native SKILL.md found</td>
      <td>✅ core: E2B/Blaxel/Modal/Docker (<code class="language-plaintext highlighter-rouge">executor_type=</code>); LocalPythonExecutor is NOT a security boundary</td>
      <td>✗ minimal</td>
    </tr>
  </tbody>
</table>

<p><em>Version anchors captured:</em> Strands <code class="language-plaintext highlighter-rouge">strands-agents 1.48.0</code> (PyPI); Google ADK Python docs 2.3.0, Skills experimental v1.25.0+, ReflectAndRetryToolPlugin v1.16.0+; DeepAgents examples pin <code class="language-plaintext highlighter-rouge">&gt;=0.3.5,&lt;0.4.0</code>; Agno 2.7.x; Vercel AI SDK MCP since 4.2; LangGraph A2A needs <code class="language-plaintext highlighter-rouge">langgraph-api≥0.4.21</code>; MS Agent Framework 1.0 GA. (Claude Agent SDK version numbers seen only in a secondary blog — treat as unverified.)</p>

<p><strong>Cross-cutting resolution of the protocol disputes (from primary sources):</strong></p>
<ol>
  <li><strong>MCP support is near-universal</strong> but split between <em>client-only adapters</em> (CrewAI tools-only; Vercel <code class="language-plaintext highlighter-rouge">experimental_</code> client-only) and <em>full client+server core</em> (ADK, Pydantic AI, Claude SDK, Strands, Mastra, Agno, MS AF).</li>
  <li><strong>A2A is genuinely native in Google ADK, Strands, Mastra, Agno, and Microsoft Agent Framework</strong> (all citing the official a2a-sdk); it is <strong>deployment-layer only in LangGraph</strong> and <strong>absent/community-only in Claude SDK, OpenAI SDK, CrewAI, Vercel AI SDK, smolagents.</strong></li>
  <li><strong>Agent Skills (SKILL.md) is the least-supported feature — verifiably native in only three: Claude Agent SDK (originator), Google ADK (experimental), and LangChain DeepAgents.</strong> Widespread comparison-blog claims that “most frameworks support Agent Skills” are unsupported by primary docs.</li>
  <li><strong>A2A version confusion is real:</strong> the <em>protocol</em> reached v1.0, but Microsoft’s own devblog notes its implementing <em>packages remain in preview</em> — a case where a secondary blog (digitalapplied.com) overstated shipped status. This is the likely root cause of the framework-support contradictions the user observed: comparison blogs conflate “protocol version exists,” “SDK exists in preview,” and “shipped in framework core.”</li>
</ol>

<hr />

<h2 id="recommendations">Recommendations</h2>

<ol>
  <li><strong>Agent security posture (act now):</strong> Assume the model <em>will</em> follow poisoned tool descriptions (MCPTox: 36.5% avg ASR, &lt;3% refusal; capable/reasoning models are <em>worse</em>). Do NOT rely on model alignment. Deploy a <strong>deterministic tool-call-boundary enforcer</strong> (AgentSpec- or ClawGuard-style) plus <strong>Plan-Then-Execute or CaMeL</strong> where control flow can be fixed in advance. <strong>Escalate to full Dual-LLM/CaMeL isolation</strong> for any workflow combining <em>private-data access + untrusted input + an exfiltration-capable tool</em> (the “lethal trifecta”).</li>
  <li><strong>MCP server selection:</strong> Ignore the 30–66% vendor headlines as base rates. Instead: pin tool hashes (MCP-Scan) to defeat rug pulls; require OAuth 2.1 scoped tokens (only 8.5% of servers use them — treat static API keys as disqualifying); patch the STDIO command-injection class (CVE-2026-30623) immediately; prefer servers with published security scorecards. <strong>Threshold:</strong> any server accepting an unvalidated URL/path parameter should be treated as SSRF-vulnerable by default.</li>
  <li><strong>Interpreting harness/coding benchmarks:</strong> Discount SWE-bench Verified scores (contaminated per OpenAI; ~24pp merge-gap per METR). Require (a) same-model controlled comparisons, (b) reported run-to-run variance (≥3 runs), and (c) a real-usefulness proxy (maintainer-merge or FrontierCode-style rubric), not just test-pass. <strong>A harness gain is credible only if it exceeds the demonstrated ~4.5pp two-run spread by a comfortable margin.</strong></li>
  <li><strong>Framework selection by protocol need:</strong> For native A2A + bidirectional MCP → <strong>Google ADK, Strands, Agno, Mastra, or MS Agent Framework</strong>. For Agent Skills → effectively only <strong>Claude Agent SDK, Google ADK, or DeepAgents</strong>. For native sandboxing → <strong>smolagents</strong> (E2B/Modal/Docker) or <strong>Agno</strong> (AgentOS isolation). For durable execution → <strong>Pydantic AI</strong> (Temporal/DBOS/etc.) or <strong>LangGraph</strong> checkpointing.</li>
</ol>

<p><strong>Thresholds that would change these recommendations:</strong> If a runtime enforcer is shown to survive adaptive attack (“attacker moves second”) at &lt;5% residual ASR, it could substitute for architectural isolation. If MCP ships tool-pinning + signed manifests in the core spec, server-selection rigor can relax. If a harness study reports variance-bounded, multi-proposer, cross-benchmark gains, the binding-constraint thesis graduates from hypothesis to established.</p>

<hr />

<h2 id="what-could-not-be-determined">What Could NOT Be Determined</h2>

<ol>
  <li><strong>MCPTox’s “14 vulnerability classes / 312 attack scenarios”</strong> — these do not appear in the primary paper (3 paradigms, 11 risk categories, ~1,312–1,348 cases) and appear to be secondary-source fabrication; “failed roughly half” is also not the paper’s framing (avg ASR 36.5%, model-dependent).</li>
  <li><strong>The “72.4% cross-server cascade rate”</strong> — no primary source located; appears only in aggregator blogs.</li>
  <li><strong>The exact “64.9% vs 57.6%” HAL GAIA pairing</strong> — HAL’s own published Opus 4.1 numbers are 64.24% (HAL Generalist) vs 28.48% (HF Open Deep Research); the 57.6% is a secondary-blog figure I could not reconcile. The <em>phenomenon</em> is confirmed; the exact pairing is not.</li>
  <li><strong>OpenAI’s “~1M lines in five months without manually writing production code”</strong> — not verified from primary source and, even if stated by OpenAI, essentially unauditable/low-information.</li>
  <li><strong>Whether arXiv:2508.12538 is a 1,800-server scan</strong> — it is not; it is a taxonomy + toolkit (MCPXKIT, 31 attack methods). The “1,800 servers / &gt;30% exploitable” claim is misattributed to it.</li>
  <li><strong>Precise trial counts / confidence intervals behind LangChain’s 52.8 and 66.5 endpoints</strong>, and its “Top 5” ranking (contradicted by a rank-20 report).</li>
  <li><strong>Native SKILL.md support for 9 of 13 frameworks</strong> — absence in primary docs is not proof of absence, but no primary-source confirmation was found for OpenAI SDK, Pydantic AI, CrewAI, MS Agent Framework, Strands, Vercel AI SDK, Mastra, Agno, smolagents.</li>
  <li><strong>CaMeL’s 67% vs 77% AgentDojo figure</strong> — both appear in different paper versions; the utility-vs-security framing (77% defended vs 84% undefended) is from v2 (now IEEE SaTML 2026).</li>
  <li><strong>Full current-defense leaderboards on InjecAgent/AgentDojo for 2026</strong> — search budget exhausted before dedicated retrieval; cited figures are from the source papers and cross-references (InjecAgent: GPT-4 ReAct 24% base / 47% enhanced, 1,054 cases).</li>
  <li><strong>Sandboxing/durable-exec specifics for CrewAI, MS Agent Framework, Vercel AI SDK, Mastra</strong> — not confirmable from primary docs within budget.</li>
</ol>]]></content><author><name></name></author><category term="mcp" /><category term="agents" /><category term="verification" /><category term="tooling" /><category term="fomral-methods" /><summary type="html"><![CDATA[LLM Agent Tooling: A Verification-Oriented Investigation into Agent Security, MCP Vulnerability Base Rates, and Harness-Layer Benchmark Claims]]></summary></entry><entry><title type="html">Startup Credits &amp;amp; AI Tooling</title><link href="https://spacecoast.dev/log/startup-credits/" rel="alternate" type="text/html" title="Startup Credits &amp;amp; AI Tooling" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://spacecoast.dev/log/startup-credits</id><content type="html" xml:base="https://spacecoast.dev/log/startup-credits/"><![CDATA[<h1 id="startup-credits--ai-tooling-playbook-for-a-us-pre-seedseries-a-startup-july-2026">Startup Credits &amp; AI Tooling Playbook for a US Pre-Seed–Series A Startup (July 2026)</h1>

<p><strong>A bootstrapped US startup can self-serve roughly $10K–$15K in cloud/AI credits with zero referrals in about an hour of applications, but the real money — $250K to over $1M in stacked credits — only unlocks with a VC or accelerator affiliation that grants you a partner “Org ID.”</strong> Everything below is dated to late-2025/2026 sources; these programs change constantly, so verify exact amounts at the application link before budgeting. Figures drawn from third-party aggregators rather than the vendor’s own page are flagged as such.</p>

<h2 id="tldr">TL;DR</h2>

<ul>
  <li><strong>Cloud infrastructure:</strong> Self-serve the no-referral entry tiers today — AWS Activate Founders ($1,000), Microsoft for Startups Founders Hub ($1,000 instant Azure, up to $5,000 self-serve), Google Cloud Start (up to $2,000), Cloudflare ($5,000), Oracle ($500 + 70% off + a perpetual Always-Free tier). The six-figure tiers (AWS Activate Portfolio up to $100K, Google Scale up to $200K / $350K for AI, Microsoft’s $100K–$150K top tier) require a VC/accelerator/partner referral code. You can get an AWS Activate Org ID from a fintech (Brex/Mercury) in 1–2 days even without a VC.</li>
  <li><strong>AI/LLM:</strong> Anthropic Claude for Startups plus the Together AI / Fireworks / Baseten programs are the highest-leverage AI credits for the unaffiliated. If you get into Y Combinator, the AI-lab credit war dwarfs everything: in May 2026 OpenAI offered $2M in token credits for equity, Anthropic countered with $500,000 and no equity (up from its prior $30,000 offer), and OpenAI then matched $500K no-equity plus an optional $1.5M for shares (WSJ, via The Decoder, July 2026). Keep your model layer swappable via a router (OpenRouter/LiteLLM).</li>
  <li><strong>Build vs. buy:</strong> For pre-seed to Series A, stay on APIs. Self-hosting open-weight models only wins on cost at very high, steady volume (roughly $20K+/month of equivalent API spend, or ~100M+ tokens/month against frontier models). Below that, APIs win on every dimension except hard data-residency/IP-compliance requirements.</li>
</ul>

<h2 id="key-findings">Key Findings</h2>

<ol>
  <li><strong>An accelerator/VC affiliation is the single biggest lever.</strong> Bootstrapped self-serve tiers total ~$10K–$15K across providers; a YC or Techstars badge (or a partner VC’s Org ID) unlocks $250K–$800K+ in stacked cloud credits and, for AI-native companies in top batches, multi-million-dollar model credits.</li>
  <li><strong>The AI-lab credit war is real and escalating.</strong> One AI voice startup founder (Dialogus’ Hans Ibarra) reported competing offers totaling more than $3 million in cloud and token credits — “roughly the size of an average US seed round, according to PitchBook” (WSJ, via The Decoder). MLQ News estimates OpenAI and Anthropic could distribute up to $800 million in credits annually to YC startups alone (four cohorts of ~200 companies each).</li>
  <li><strong>“Up to $X” is almost always tiered and drip-fed.</strong> Microsoft’s $150K and Google’s $200K/$350K arrive over years or as usage-matched reimbursements, not lump sums. Model retail pricing in your unit economics from day one.</li>
  <li><strong>Credits expire (typically 12–24 months) and carry real exclusions</strong> — egress, third-party marketplace spend, premium support, and some AI/GPU services are frequently carved out.</li>
  <li><strong>Open-weight models have closed most of the quality gap</strong>, but self-hosting rarely saves money at startup scale once you count idle GPU time and engineering ops.</li>
</ol>

<h2 id="details">Details</h2>

<h3 id="1-cloud-infrastructure-credits">1. Cloud Infrastructure Credits</h3>

<h4 id="the-big-three">The big three</h4>

<p><strong>AWS Activate</strong> (apply: aws.amazon.com/startups)</p>

<table>
  <thead>
    <tr>
      <th>Tier</th>
      <th>Amount</th>
      <th>Referral?</th>
      <th>Eligibility</th>
      <th>Expiry</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Founders</td>
      <td>$1,000</td>
      <td>No (self-serve)</td>
      <td>Self-funded/bootstrapped, &lt;10 yrs old, pre-Series B, functioning website, no prior equal/greater Activate credit</td>
      <td>Commonly 12–24 months</td>
    </tr>
    <tr>
      <td>Portfolio</td>
      <td>Up to $100,000</td>
      <td>Yes — Activate Provider Org ID (accelerator/VC/incubator)</td>
      <td>Associated with Activate Provider, self-funded or pre-Series B, most recent round within 12 months</td>
      <td>24 months typical</td>
    </tr>
    <tr>
      <td>AI tier / GenAI Accelerator</td>
      <td>Reported up to $300K (AI tier) / up to $1M (GenAI Accelerator cohort)</td>
      <td>Cohort/criteria-gated</td>
      <td>AI-focused startups</td>
      <td>Program-specific</td>
    </tr>
  </tbody>
</table>

<ul>
  <li>Activate credits are redeemable on third-party foundation models in <strong>Amazon Bedrock</strong> (Anthropic Claude, Llama, Mistral, AI21, Cohere), plus SageMaker and EC2 GPU — so you can spend AWS credits on Claude inference.</li>
  <li>Org IDs can be obtained from <strong>Brex or Mercury</strong> in 1–2 business days (per multiple 2026 reports) — a no-VC path to the Portfolio tier.</li>
  <li>For AI startups in the <strong>Y Combinator</strong> network, AWS reportedly extends credits to <strong>$500,000 per startup</strong>, with up to <strong>$1,000,000</strong> for the Generative AI Accelerator cohort, redeemable on Bedrock, SageMaker, and EC2 GPU (Braincuber, 2026).</li>
  <li><strong>Pitfall:</strong> Portfolio applications are most often rejected for an expired Org ID (accelerators rotate them every 6–12 months).</li>
</ul>

<p><strong>Google Cloud for Startups</strong> (apply: cloud.google.com/startup)</p>

<table>
  <thead>
    <tr>
      <th>Tier</th>
      <th>Amount</th>
      <th>Referral?</th>
      <th>Eligibility</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Start</td>
      <td>Up to $2,000, valid ~1–2 yrs</td>
      <td>No</td>
      <td>&lt;5 yrs old, no prior GCP credits beyond free trial, not institutionally funded</td>
    </tr>
    <tr>
      <td>Scale</td>
      <td>Up to $200,000 over 2 yrs (Yr 1: 100% up to $100K; Yr 2: 20% up to $100K)</td>
      <td>Yes — pre-seed to Series A equity funding from an institutional investor</td>
      <td>&lt;10 yrs, ≤$5K prior GCP credits</td>
    </tr>
    <tr>
      <td>AI-first (Scale track)</td>
      <td>Up to $350,000 (Yr 1: 100% up to $250K; Yr 2: 20% up to $100K)</td>
      <td>Yes</td>
      <td>AI as core tech, Seed–Series A</td>
    </tr>
  </tbody>
</table>

<ul>
  <li>Bundled: Google Workspace Business Plus free 12 months, $600/mo Google Maps credits (separate application), up to $12,000 Enhanced Support credits, Firebase/BigQuery/GKE, Vertex AI (Gemini, Gemma).</li>
  <li><strong>Pitfall:</strong> Third-party models on Vertex are billed directly and NOT covered by program credits. SAFEs and verifiable Web3 token raises qualify; angel/crowdfunding/grants do NOT qualify for Scale.</li>
</ul>

<p><strong>Microsoft for Startups Founders Hub</strong> (apply: foundershub.startups.microsoft.com)</p>

<table>
  <thead>
    <tr>
      <th>Path</th>
      <th>Amount</th>
      <th>Referral?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Self-serve entry</td>
      <td>$1,000 Azure instantly on signup; up to $5,000 total ($1,000 instant + $4,000 after business verification)</td>
      <td>No</td>
    </tr>
    <tr>
      <td>Full Founders Hub / Investor Network</td>
      <td>The premium $100,000–$150,000 tier requires a referral code from an affiliated VC, accelerator, or incubator in Microsoft’s partner network</td>
      <td>Yes</td>
    </tr>
  </tbody>
</table>

<ul>
  <li>Bundled beyond Azure: <strong>GitHub Enterprise, Microsoft 365 Business Premium, LinkedIn Premium, Azure OpenAI Service access,</strong> mentor network.</li>
  <li><strong>Important nuance:</strong> Direct OpenAI credits were removed from Founders Hub in mid-2025. You still get <strong>Azure OpenAI Service</strong> credits (same OpenAI models, Azure billing/endpoints).</li>
  <li>Azure Founders Hub credits <strong>expire 12 months after issuance with no extensions</strong> (AI Credits, 2026). No equity taken; does not stack with itself (one grant per entity).</li>
</ul>

<h4 id="other-meaningful-infrastructure-programs">Other meaningful infrastructure programs</h4>

<table>
  <thead>
    <tr>
      <th>Program</th>
      <th>Amount</th>
      <th>Referral?</th>
      <th>Notes / Link</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Cloudflare for Startups</strong></td>
      <td>4 tiers: $5,000 / $25,000 / $100,000 / $250,000</td>
      <td>Higher tiers need funding/partner affiliation; $5K bootstrapped path self-serve</td>
      <td>Software product, ≤5 yrs. Zero egress fees. Credits valid 1 yr, no extensions. R2 capped at $10K coverage; Workers AI capped by tier; AI Gateway &amp; Registrar excluded. cloudflare.com/startups</td>
    </tr>
    <tr>
      <td><strong>DigitalOcean (Hatch / “DO Startups”)</strong></td>
      <td>Up to $100,000 (varies by partner); direct applicants get less</td>
      <td>Partner affiliation helps; “Other” path exists for unaffiliated</td>
      <td>New customers, ≤Series A, &lt;$10M raised, AI-native prioritized, service businesses excluded. Credits monthly, use-it-or-lose-it, expire 12 months. <strong>Core credits do NOT cover GPU Droplets</strong> (~$1.90/GPU/hr, separate). do.co/hatch</td>
    </tr>
    <tr>
      <td><strong>Oracle for Startups</strong></td>
      <td>$500 free to start + 70% discount for 2 yrs; up to $100,000 via partners</td>
      <td>Larger amounts partner-gated</td>
      <td>Plus <strong>Always Free tier</strong> (perpetual: 4 Arm Ampere cores, 2 Autonomous DBs, 200GB block storage) + $300/30-day trial. oracle.com/startup</td>
    </tr>
    <tr>
      <td><strong>IBM Cloud (“Startup with IBM”)</strong></td>
      <td>Up to $120,000 in IBM Cloud credits</td>
      <td>Program-based</td>
      <td>Older figure; verify current terms</td>
    </tr>
    <tr>
      <td><strong>Vercel for Startups</strong></td>
      <td>Free Vercel Pro ~$2,400 ($200/mo × 12) baseline; larger amounts (e.g., $30K = $2,500/mo × 12) via partners</td>
      <td>Partner/accelerator proof for larger tiers</td>
      <td>Series A or less, apply within 12 months of last round. Credits monthly, no rollover, don’t apply to v0. vercel.com/startups</td>
    </tr>
    <tr>
      <td><strong>Render Startup Program</strong></td>
      <td>Founder tier for all qualified; Build/Scale/AI tiers higher</td>
      <td>Higher tiers need registered accelerator/VC partner</td>
      <td>Credits valid 1 yr. render.com/startups</td>
    </tr>
    <tr>
      <td><strong>Netlify</strong></td>
      <td>Startup credits (amount varies)</td>
      <td>Application</td>
      <td>Credit-based pricing</td>
    </tr>
    <tr>
      <td><strong>Heroku</strong></td>
      <td>Historically ~$50K for YC companies</td>
      <td>Accelerator</td>
      <td>Verify current</td>
    </tr>
    <tr>
      <td><strong>Fly.io / Railway</strong></td>
      <td>No broad published startup credit program; generous free/hobby tiers</td>
      <td>—</td>
      <td>Fly.io: watch inter-region replication billing (changed Feb 2026); Railway Hobby $5/mo</td>
    </tr>
    <tr>
      <td><strong>Hetzner / OVH / cheaper alts</strong></td>
      <td>No startup credits, but dramatically cheaper baseline (esp. bare-metal GPU)</td>
      <td>—</td>
      <td>Best for cost-conscious steady workloads after credits expire</td>
    </tr>
  </tbody>
</table>

<h4 id="gpu-specific-clouds">GPU-specific clouds</h4>

<table>
  <thead>
    <tr>
      <th>Provider</th>
      <th>Startup program</th>
      <th>Amount</th>
      <th>Notes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>NVIDIA Inception</strong></td>
      <td>Yes (free, no equity)</td>
      <td>Cloud credits via partners (AWS/Azure/GCP), up to $100K AWS via pathway, DGX Cloud credits; DLI training credits; preferred GPU pricing</td>
      <td>Free to join: ≥1 developer, working website, incorporated, &lt;10 yrs. Excludes crypto, consultancies, resellers, CSPs. Gateway to partner credits. nvidia.com/startups</td>
    </tr>
    <tr>
      <td><strong>Nebius (AI Lift)</strong></td>
      <td>Yes, for Inception members</td>
      <td>Up to $150,000 cloud credits + $10,000 inference credits</td>
      <td>Announced GTC 2025; priority Blackwell access</td>
    </tr>
    <tr>
      <td><strong>Together AI</strong></td>
      <td>Startup Accelerator</td>
      <td>$15,000–$50,000 tiered by funding ($15K base; $30K for $5–10M raised; $50K for &gt;$10M) + engineering hours</td>
      <td>~$25 signup credit. Per-token open-model inference</td>
    </tr>
    <tr>
      <td><strong>Baseten</strong></td>
      <td>AI Startup Program</td>
      <td>Up to $25,000 (Dedicated Deployments/Training) + up to $2,500 (Model APIs)</td>
      <td>baseten.co/startup-program</td>
    </tr>
    <tr>
      <td><strong>RunPod</strong></td>
      <td>Startup Program</td>
      <td>Starter: $1,000 credits; Growth: $25K bonus on $50K commit</td>
      <td>Pods/Serverless/Clusters access. runpod.io/startup-program</td>
    </tr>
    <tr>
      <td><strong>Modal</strong></td>
      <td>Startup credits</td>
      <td>Credit pools/accelerator perks</td>
      <td>Serverless GPU; generous free monthly compute</td>
    </tr>
    <tr>
      <td><strong>CoreWeave / Lambda / Crusoe / Voltage Park</strong></td>
      <td>Enterprise-oriented; reservation-based</td>
      <td>Lambda Research Grant ~$5K for academics only; no broad startup credit</td>
      <td>Best via reserved contracts once at scale; Lambda H100 ~$2.49/hr</td>
    </tr>
    <tr>
      <td><strong>Scaleway</strong></td>
      <td>Startup Program (for Inception members)</td>
      <td>Cloud credit vouchers</td>
      <td>EU provider; stackable with Inception</td>
    </tr>
  </tbody>
</table>

<h3 id="2-llm--ai--generative-ai-tooling">2. LLM / AI / Generative AI Tooling</h3>

<h4 id="ai-model-provider-startup-programs">AI model provider startup programs</h4>

<table>
  <thead>
    <tr>
      <th>Provider</th>
      <th>Program</th>
      <th>Amount</th>
      <th>Referral?</th>
      <th>Link</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Anthropic</strong></td>
      <td>Claude for Startups</td>
      <td>Standard $1K–$5K; partner-referred $5K–$25K; top tier up to $100K+ (Anthropic publishes NO official $ figure — directional). Also <strong>Claude for Open Source</strong>: 6 months Max 20x for maintainers of 5,000+ star repos</td>
      <td>Open to all early-stage; VC/accelerator partner unlocks higher tiers + priority rate limits</td>
      <td>claude.com/programs/startups</td>
    </tr>
    <tr>
      <td><strong>OpenAI</strong></td>
      <td>Distributed via partners, not self-serve</td>
      <td>~$2,500 via Ramp corporate card; up to $5K+ via 200+ VC/accelerator partners; <strong>Grove</strong> $50K (5-week cohort at SF HQ); <strong>Codex Open Source Fund</strong> $25K</td>
      <td>Yes for most routes</td>
      <td>openai.com/startups; Grove separate</td>
    </tr>
    <tr>
      <td><strong>Google</strong></td>
      <td>Gemini/Vertex via Google for Startups Cloud</td>
      <td>Covered by Scale/AI-first cloud credits ($200K/$350K)</td>
      <td>Same as GCP tiers</td>
      <td>cloud.google.com/startup</td>
    </tr>
    <tr>
      <td><strong>Mistral</strong></td>
      <td>“Mistralship” Startup Program</td>
      <td>Up to $30,000 credits</td>
      <td>Application</td>
      <td>Models also on Bedrock/Azure/Vertex</td>
    </tr>
    <tr>
      <td><strong>Cohere</strong></td>
      <td>Startup discount (not free credits)</td>
      <td>25% off all models for 12 months; Cohere Labs research grants</td>
      <td>Application</td>
      <td>Enterprise-friendly terms</td>
    </tr>
    <tr>
      <td><strong>xAI (Grok)</strong></td>
      <td>Sign-up + data-sharing credit</td>
      <td>Reported ~$150/month via data-sharing opt-in</td>
      <td>Self-serve</td>
      <td>console.x.ai</td>
    </tr>
    <tr>
      <td><strong>AI21</strong></td>
      <td>Credits via aggregators / partner programs</td>
      <td>Varies</td>
      <td>Partner</td>
      <td>Also on Bedrock</td>
    </tr>
    <tr>
      <td><strong>Meta Llama</strong></td>
      <td>Not credits — open-weight license</td>
      <td>Free to download/run; Llama Community License (commercial OK under 700M MAU)</td>
      <td>N/A</td>
      <td>Read license</td>
    </tr>
    <tr>
      <td><strong>Deepgram</strong> (voice)</td>
      <td>Startup Program</td>
      <td>Up to $100,000 over 12 months</td>
      <td>New customers, &lt;$10M raised</td>
      <td>deepgram.com/startup-program</td>
    </tr>
    <tr>
      <td><strong>ElevenLabs</strong> (voice)</td>
      <td>Startup Program</td>
      <td>Free 12 months for qualifying</td>
      <td>Application</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<p><strong>Aggregators/routers/inference:</strong> OpenRouter (routes to 300+ models, no credits but unifies billing), Together AI ($15–50K program above), Fireworks AI ($10,000 credits via Google Cloud Startup Perks), Groq (fast inference, ~30K TPM free tier, no broad startup credit), Baseten ($25K above), Replicate (pay-per-use, no broad program), Anyscale (Ray-based), Hugging Face (up to ~50% off Enterprise Hub Year 1 + $100 Hub compute credit via partners — aggregator-reported).</p>

<h4 id="ai-dev-tooling-vector-dbs-observability-coding-assistants">AI dev tooling (vector DBs, observability, coding assistants)</h4>

<table>
  <thead>
    <tr>
      <th>Tool</th>
      <th>Program</th>
      <th>Amount</th>
      <th>Referral?</th>
      <th>Link</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Pinecone</strong></td>
      <td>Pinecone for Startups</td>
      <td>Free Standard tier + Pro Support + ~$5,000 credits (aggregator figure; official page says “credits and discounts”)</td>
      <td>Application</td>
      <td>pinecone.io/startup-program</td>
    </tr>
    <tr>
      <td><strong>Weaviate</strong></td>
      <td>Startup Deal</td>
      <td>Discounted Weaviate Cloud (no public $ figure)</td>
      <td>Application</td>
      <td>weaviate.io/startup-deal</td>
    </tr>
    <tr>
      <td><strong>Qdrant</strong></td>
      <td>Qdrant for Startups</td>
      <td>20% off Qdrant Cloud for 12 months + HF $100 credits + LlamaIndex 20% off</td>
      <td>No VC referral; 7–10 day review</td>
      <td>qdrant.tech</td>
    </tr>
    <tr>
      <td><strong>Chroma / Milvus (Zilliz)</strong></td>
      <td>Open-source, self-hostable</td>
      <td>Free self-hosted; Zilliz Cloud trials</td>
      <td>—</td>
      <td>—</td>
    </tr>
    <tr>
      <td><strong>MongoDB Atlas for Startups</strong> (incl. Voyage AI)</td>
      <td>Yes</td>
      <td>$500 baseline → up to $5,000 (12 mo); AI track historically up to $25K; + Voyage AI tokens; matched partner credits (GCP up to $350K, Fireworks $10K)</td>
      <td>VC-backing increases amount, not strictly required; &lt;7 yrs, ≤Series A</td>
      <td>mongodb.com/solutions/startups</td>
    </tr>
    <tr>
      <td><strong>LangSmith (LangChain)</strong></td>
      <td>Build &amp; Scale tiers</td>
      <td>Build: discounted seats (&lt;$10M funding, ≥$25K raised, no referral). Scale: <strong>$10,000 credits/1 yr</strong> (2 yrs for YC), requires premier VC partner</td>
      <td>Scale tier requires partner</td>
      <td>langchain.com/startups</td>
    </tr>
    <tr>
      <td><strong>Langfuse</strong> (open-source)</td>
      <td>Langfuse for Startups</td>
      <td>12-month discount on Cloud (bootstrapped or &lt;$5M raised, first-time customer)</td>
      <td>No</td>
      <td>langfuse.com/startups</td>
    </tr>
    <tr>
      <td><strong>Helicone</strong></td>
      <td>Helicone for Startups</td>
      <td>$100 credit first year + discounts; free tier 10K req/mo</td>
      <td>No; &lt;2 yrs old, &lt;$5M</td>
      <td>helicone.ai/pricing</td>
    </tr>
    <tr>
      <td><strong>Weights &amp; Biases</strong></td>
      <td>Via partners (Microsoft/Google)</td>
      <td>~$3,000 value discounted Pro, partner-gated (no standalone official $ program; W&amp;B acquired by CoreWeave in 2025)</td>
      <td>Partner program membership</td>
      <td>wandb.ai</td>
    </tr>
    <tr>
      <td><strong>Braintrust / Arize</strong></td>
      <td>Free tiers + startup discounts</td>
      <td>Varies</td>
      <td>—</td>
      <td>—</td>
    </tr>
    <tr>
      <td><strong>GitHub Copilot</strong></td>
      <td>Free tier + paid</td>
      <td>Free: 2,000 completions + 50 chat/mo. Pro $10/mo (June 2026 AI-credit billing: 1,500 credits/$15 value); Pro+ $39/mo</td>
      <td>Copilot bundled in Microsoft for Startups’ GitHub Enterprise benefit</td>
      <td>github.com/features/copilot</td>
    </tr>
    <tr>
      <td><strong>Cursor</strong></td>
      <td>Paid; time-limited discounts only</td>
      <td>Pro $20/mo (~$20 API-rate usage); Auto mode unlimited. Cursor (acquired by SpaceX) offered a <strong>75% discount through July 5, 2026</strong> (WSJ/The Decoder) but has no standing broad startup program</td>
      <td>—</td>
      <td>cursor.com/pricing</td>
    </tr>
    <tr>
      <td><strong>Claude Code</strong></td>
      <td>Via Claude subscription/API</td>
      <td>Terminal agent; consumes Claude usage; Claude for Startups credits apply</td>
      <td>—</td>
      <td>—</td>
    </tr>
    <tr>
      <td><strong>Windsurf</strong></td>
      <td>Free tier + paid</td>
      <td>Varies</td>
      <td>—</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<h4 id="current-api-pricing-per-1m-tokens-inputoutput-mid-2026">Current API pricing (per 1M tokens, input/output, mid-2026)</h4>

<p><em>Model names drift fast; the price tiers have held steady. Only OpenAI’s numbers were fetched from the official page; the rest are corroborated across reputable aggregators (BenchLM, CloudZero, Morph, curlscape) dated June–July 2026 — spot-verify before publishing budgets.</em></p>

<table>
  <thead>
    <tr>
      <th>Model (current name)</th>
      <th>Input</th>
      <th>Output</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Claude Opus 5 (flagship)</td>
      <td>$5.00</td>
      <td>$25.00</td>
    </tr>
    <tr>
      <td>Claude Sonnet 5 (mid)</td>
      <td>$3.00 ($2/$10 intro through Aug 31, 2026)</td>
      <td>$15.00</td>
    </tr>
    <tr>
      <td>Claude Haiku 4.5 (small)</td>
      <td>$1.00</td>
      <td>$5.00</td>
    </tr>
    <tr>
      <td>OpenAI GPT-5.6 Sol (flagship)</td>
      <td>$5.00</td>
      <td>$30.00</td>
    </tr>
    <tr>
      <td>OpenAI GPT-5.6 Terra (mid)</td>
      <td>$2.50</td>
      <td>$15.00</td>
    </tr>
    <tr>
      <td>OpenAI GPT-5.6 Luna (fast/”mini”)</td>
      <td>$1.00</td>
      <td>$6.00</td>
    </tr>
    <tr>
      <td>Google Gemini 3.1 Pro</td>
      <td>$2.00 (≤200K)</td>
      <td>$12.00</td>
    </tr>
    <tr>
      <td>Google Gemini 3.6 Flash</td>
      <td>$1.50</td>
      <td>$7.50</td>
    </tr>
    <tr>
      <td>Together/Fireworks: Llama 3.3 70B</td>
      <td>~$0.88–0.90</td>
      <td>~$0.88–0.90</td>
    </tr>
    <tr>
      <td>Together/Fireworks: DeepSeek V4 Pro</td>
      <td>~$1.74–2.10</td>
      <td>~$3.48–4.20</td>
    </tr>
    <tr>
      <td>Fireworks: DeepSeek V4 Flash</td>
      <td>$0.14</td>
      <td>$0.28</td>
    </tr>
  </tbody>
</table>

<p>Open-model hosted inference runs roughly 5–10× cheaper than frontier proprietary models — often $0.05–$3.50/1M tokens.</p>

<h4 id="on-prem--self-hosted">On-prem / self-hosted</h4>

<p><strong>Leading open-weight models (2026) and licenses:</strong></p>
<ul>
  <li><strong>DeepSeek V3/V4</strong> — MIT (most permissive); strong coding/math/reasoning. Per the DeepSeek-V3 Technical Report (arXiv:2412.19437), full training cost only 2.788M H800 GPU-hours ≈ <strong>$5.576M at $2/GPU-hour</strong> (excludes prior research/ablation costs).</li>
  <li><strong>Qwen3 family</strong> (Alibaba) — Apache 2.0; Qwen3-Coder strong on agentic coding; spans 0.6B–235B.</li>
  <li><strong>Llama 4</strong> (Maverick/Scout) (Meta) — Llama Community License (commercial OK under 700M MAU); Maverick runs on a single H100; native multimodal, up to 1M–10M token context.</li>
  <li><strong>Mistral Large 3 / Magistral Small</strong> — Apache 2.0 (a real shift from the older restrictive Mistral Research License); strong multilingual, EU data residency.</li>
  <li><strong>Gemma 3/4</strong> (Google) — Apache 2.0; Gemma 3 27B fits a single GPU with vision.</li>
  <li><strong>gpt-oss</strong> (OpenAI) — Apache 2.0; open-weight reasoning models in 120B and 20B.</li>
  <li><strong>NVIDIA Nemotron, Ai2 OLMo</strong> — open weights + recipes.</li>
  <li>⚠️ “Open” ≠ unrestricted — always read the license (Llama Community License and some others have caps/geographic/derivative restrictions vs. true Apache/MIT).</li>
</ul>

<p><strong>Serving stacks:</strong> vLLM (throughput default, PagedAttention), SGLang (structured output), TensorRT-LLM (best NVIDIA perf, complex), TGI (easy deploy), llama.cpp / Ollama / LM Studio (local dev, not production-scale). All free/open-source; the real cost is human ops time.</p>

<p><strong>Cost of ownership vs. API — the break-even:</strong></p>
<ul>
  <li>A single A100 (~$2/hr cloud) running a 70B model via vLLM at ~1,500 tok/s ≈ <strong>$1,500/month</strong> in raw GPU time. Against a frontier API (~$5–6/1M blended), break-even is roughly <strong>100–256M tokens/month</strong> (~8.5M tokens/day).</li>
  <li>Against a cheap open API (DeepSeek/Flash tier), you’d need <strong>50B+ tokens/month</strong> to justify self-hosting — requiring a serious 8–16 GPU cluster and a dedicated ML infra team.</li>
  <li><strong>Hidden costs that flip the math back to APIs:</strong> idle GPU time (you pay 24/7 even at 30% utilization), 10–20+ engineer-hours/month ($750–$6,000/mo loaded), monitoring/failover, and quality gaps (a weaker open model may need retries/longer prompts).</li>
  <li><strong>Consensus:</strong> Self-hosting breaks even around <strong>$20K/month of API spend</strong>; below that, APIs win on every dimension except privacy/compliance.</li>
</ul>

<p><strong>When self-hosting actually makes sense:</strong> hard data-residency requirements (GDPR/regional), HIPAA/SOC2 environments where you can’t send data to third-party APIs, IP-sensitive workloads (proprietary source code), or genuine very-high steady volume. For most pre-seed–Series A startups, none of these apply yet — stay on APIs and keep the model layer swappable.</p>

<h3 id="accelerators-as-the-master-key">Accelerators as the master key</h3>

<ul>
  <li><strong>Y Combinator:</strong> Perks package reported worth $250K–$500K+ in savings; unlocks $500K Azure, up to $500K AWS (AI companies), plus the escalating OpenAI/Anthropic model-credit war. In May 2026, OpenAI announced $2M in token credits for equity; Anthropic countered with $500,000 and no equity (up from its prior $30,000 offer); OpenAI then matched $500K no-equity plus an optional $1.5M for shares (WSJ, via The Decoder). “Over $1M in combined partner deals” across cloud + SaaS.</li>
  <li><strong>Techstars, 500 Global, a16z/Sequoia/Accel portfolios:</strong> All are recognized AWS/Google/Microsoft Activate Providers — the Org ID they give you converts $1K self-serve tiers into $100K+ Portfolio tiers.</li>
  <li><strong>Microsoft + YC (2026):</strong> Expanded package with Azure/Foundry credits, GPU resources, and up to $150K Startup credits for eligible AI founders.</li>
</ul>

<h3 id="stacking-strategy--pitfalls">Stacking strategy &amp; pitfalls</h3>

<ul>
  <li><strong>You CAN stack across different providers</strong> (AWS + Google + Azure + Cloudflare + AI-lab credits) and across different partner channels for the same provider (e.g., YC + Stripe Atlas + FounderPass AWS credits from separate channels). You CANNOT stack a program with itself (one grant per entity; AWS/Microsoft de-duplicate).</li>
  <li><strong>Common pitfalls:</strong>
    <ul>
      <li><strong>Expiry:</strong> 12–24 months typical; unused credits are forfeited (Google’s Yr-2 is a 20% usage match, not a lump sum).</li>
      <li><strong>Egress/bandwidth</strong> often not fully covered (Cloudflare’s zero egress is a notable exception).</li>
      <li><strong>Third-party marketplace spend</strong> and some AI/GPU services excluded (DO GPU Droplets, Vertex third-party models, Cloudflare AI Gateway).</li>
      <li><strong>Support plans</strong> cost extra (though some programs bundle Enhanced/Standard support).</li>
      <li><strong>Tax treatment:</strong> Credits are generally not cash; consult your accountant, but they typically reduce a deductible expense rather than create income.</li>
      <li><strong>Lock-in:</strong> Architecting around perpetual free credits is the #1 mistake — model retail pricing from day one.</li>
      <li><strong>Vendor churn:</strong> Keep workloads portable (SkyPilot, LiteLLM, containers) so you can move when credits expire.</li>
    </ul>
  </li>
</ul>

<h2 id="recommendations">Recommendations</h2>

<p><strong>If I were starting today (US, pre-seed to Series A), here’s the order I’d apply in:</strong></p>

<ol>
  <li><strong>Week 1 — self-serve, no referral, ~1 hour total:</strong>
    <ul>
      <li>Microsoft for Startups Founders Hub ($1K instant Azure + GitHub Enterprise + M365 + Azure OpenAI). Easiest big-ceiling program.</li>
      <li>AWS Activate Founders ($1,000; redeemable on Claude via Bedrock).</li>
      <li>Anthropic Claude for Startups (~2-min form; cuts inference cost directly).</li>
      <li>Google Cloud Start (up to $2,000).</li>
      <li>Cloudflare for Startups ($5,000 tier; zero egress).</li>
      <li>Oracle Always Free tier (perpetual free compute for side services).</li>
      <li>NVIDIA Inception (free; gateway to partner GPU credits) if you touch GPUs.</li>
    </ul>
  </li>
  <li><strong>Week 2 — get an Org ID to unlock six-figure tiers:</strong>
    <ul>
      <li>Open a <strong>Brex or Mercury</strong> account → obtain an AWS Activate Org ID (1–2 days) → apply for <strong>AWS Activate Portfolio (up to $100K)</strong>.</li>
      <li>If you have any institutional funding, apply for <strong>Google Cloud Scale ($200K / $350K AI)</strong> and mention your investor to Microsoft for the <strong>$100K–$150K</strong> Founders Hub path.</li>
    </ul>
  </li>
  <li><strong>Month 1 — AI/GPU credits matched to your stack:</strong>
    <ul>
      <li>Together AI ($15–50K), Baseten ($25K), or RunPod ($1K) if you serve open models.</li>
      <li>Mistral Mistralship ($30K), Deepgram ($100K, voice), Fireworks ($10K via GCP perks) as relevant.</li>
      <li>MongoDB Atlas for Startups ($500–5K + Voyage AI) if you need a database + embeddings.</li>
      <li>Vector DB + observability: Pinecone (~$5K), Qdrant (20% off), LangSmith Scale ($10K if partner-backed), Langfuse/Helicone discounts.</li>
    </ul>
  </li>
  <li><strong>If you get into YC/Techstars:</strong> let the accelerator’s Org IDs and the AI-lab credit war do the heavy lifting — this is where $250K–$1M+ appears. Don’t over-optimize the self-serve tiers if you’re about to enter a top accelerator.</li>
</ol>

<p><strong>Benchmarks that should change your strategy:</strong></p>
<ul>
  <li><strong>Crossing ~$20K/month in API spend</strong> → seriously model self-hosting or reserved GPU contracts (CoreWeave/Lambda 1-yr reservations cut 30–40%).</li>
  <li><strong>Credits expiring within 90 days</strong> → migrate non-critical workloads to cheaper baseline providers (Hetzner/OVH) or a second cloud’s fresh credits.</li>
  <li><strong>Hitting a compliance trigger (HIPAA / GDPR data residency / IP sensitivity)</strong> → move sensitive inference to self-hosted open-weight models regardless of the cost math.</li>
</ul>

<h2 id="caveats">Caveats</h2>

<ul>
  <li><strong>All dollar figures change frequently.</strong> Anthropic and several dev-tool vendors publish no official credit dollar amount; third-party figures are directional — confirm in-application.</li>
  <li><strong>Model names and prices are mid-2026 snapshots.</strong> The GPT/Claude/Gemini lineups moved faster than most guides (GPT-5.6 Sol/Terra/Luna; Gemini 3.1 Pro/3.6 Flash; Claude Opus 5). Only OpenAI pricing here was from the official page; the rest are from reputable aggregators.</li>
  <li><strong>“Up to $X” is a ceiling, not a grant</strong> — most large tiers are drip-fed, usage-matched, or cohort-gated.</li>
  <li><strong>The AI-lab YC credit figures</strong> come from press coverage (WSJ via The Decoder; MLQ News) of specific 2026 offers and batches, and may not reflect a standing, generally available program — treat them as evidence of the trend and a reason to prioritize accelerator admission, not a guaranteed line item.</li>
  <li>Several cited sources are SEO/aggregator sites rather than primary vendor pages; treat specific numbers as starting points and verify at the official links provided.</li>
</ul>]]></content><author><name></name></author><category term="credits" /><category term="startup" /><category term="cloud" /><category term="tooling" /><category term="Seed" /><summary type="html"><![CDATA[Startup Credits &amp; AI Tooling Playbook for a US Pre-Seed–Series A Startup (July 2026)]]></summary></entry><entry><title type="html">Escaping the guest without touching the host</title><link href="https://spacecoast.dev/log/escaping-the-guest-without-touching-the-host/" rel="alternate" type="text/html" title="Escaping the guest without touching the host" /><published>2026-01-18T00:00:00+00:00</published><updated>2026-01-18T00:00:00+00:00</updated><id>https://spacecoast.dev/log/escaping-the-guest-without-touching-the-host</id><content type="html" xml:base="https://spacecoast.dev/log/escaping-the-guest-without-touching-the-host/"><![CDATA[<p>Every isolation story is really a story about a boundary someone has to trust. A
virtual machine promises that whatever happens inside the guest stays inside the
guest. That promise is only ever as strong as the thinnest interface crossing
the boundary — and there are more of those interfaces than the marketing admits.</p>

<h2 id="the-boundary-is-not-the-cpu">The boundary is not the CPU</h2>

<p>Hardware virtualization (VT-x, AMD-V) makes the <em>instruction</em> boundary cheap and
strong. The guest runs real instructions; only the privileged ones trap. If that
were the whole story, escapes would be exotic. They aren’t, because the
interesting surface isn’t the CPU — it’s everything the guest is <em>allowed to
talk to</em>:</p>

<ul>
  <li><strong>Emulated devices.</strong> The virtual NIC, disk controller, and graphics adapter
are C programs parsing attacker-controlled bytes. Historically this is where
the escapes live.</li>
  <li><strong>Paravirtualized channels.</strong> <code class="language-plaintext highlighter-rouge">virtio</code> trades emulation overhead for a shared
ring buffer. Faster, but now the guest and host share a carefully described
memory region, and description bugs are exploitation primitives.</li>
  <li><strong>The hypercall interface.</strong> Every call the guest can make into the host is a
syscall boundary wearing a different hat.</li>
</ul>

<blockquote>
  <p>Rule of thumb: count the parsers reachable from the guest. That number is your
real attack surface, not the number of vCPUs.</p>
</blockquote>

<h2 id="containers-move-the-boundary-they-dont-remove-it">Containers move the boundary, they don’t remove it</h2>

<p>A container shares the host kernel. The “boundary” is a bundle of namespaces,
cgroups, capabilities, and a seccomp filter. That’s a lot of independent knobs,
and the default posture of many runtimes is more permissive than people assume.</p>

<p>A minimal seccomp profile that denies the usual escape-adjacent syscalls looks
like this:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"defaultAction"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SCMP_ACT_ERRNO"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"architectures"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"SCMP_ARCH_X86_64"</span><span class="p">],</span><span class="w">
  </span><span class="nl">"syscalls"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w"> </span><span class="nl">"names"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"read"</span><span class="p">,</span><span class="w"> </span><span class="s2">"write"</span><span class="p">,</span><span class="w"> </span><span class="s2">"openat"</span><span class="p">,</span><span class="w"> </span><span class="s2">"close"</span><span class="p">,</span><span class="w"> </span><span class="s2">"mmap"</span><span class="p">,</span><span class="w"> </span><span class="s2">"brk"</span><span class="p">],</span><span class="w">
      </span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SCMP_ACT_ALLOW"</span><span class="w"> </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Everything not listed returns <code class="language-plaintext highlighter-rouge">EPERM</code>. It breaks a lot of software — which is the
point. You want to find out <em>now</em> which syscalls your workload actually needs,
not after someone else finds out for you.</p>

<h2 id="where-the-strong-isolation-actually-is">Where the strong isolation actually is</h2>

<p>If you want VM-grade isolation with container-grade ergonomics, the interesting
work is in the sandboxed runtimes:</p>

<table>
  <thead>
    <tr>
      <th>Approach</th>
      <th>Boundary</th>
      <th>Cost</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Namespaces (runc)</td>
      <td>Shared kernel</td>
      <td>Cheapest, weakest</td>
    </tr>
    <tr>
      <td>gVisor</td>
      <td>User-space kernel reimplementation</td>
      <td>Syscall overhead</td>
    </tr>
    <tr>
      <td>Kata</td>
      <td>Real lightweight VM per container</td>
      <td>Boot + memory overhead</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">gVisor</code> is the one I keep coming back to: instead of forwarding guest syscalls
to the host kernel, it <em>answers them itself</em> in a memory-safe user-space kernel.
The host kernel surface the workload can reach shrinks dramatically. You pay for
it in syscall latency, and for a lot of workloads that trade is obviously worth
making.</p>

<h2 id="the-takeaway">The takeaway</h2>

<p>There is no such thing as <em>escaping the guest without touching the host</em> — every
escape is, definitionally, reaching the host through some interface you were
allowed to touch. The engineering question is never “is this isolated?” It’s
“how many interfaces cross the boundary, who wrote the parser on the other side,
and what happens when I feed it garbage?”</p>

<p>Answer those three and you’ve done more for your security posture than any
number of reassuring architecture diagrams.</p>]]></content><author><name></name></author><category term="virtualization" /><category term="security" /><category term="hypervisor" /><summary type="html"><![CDATA[Every isolation story is really a story about a boundary someone has to trust. A virtual machine promises that whatever happens inside the guest stays inside the guest. That promise is only ever as strong as the thinnest interface crossing the boundary — and there are more of those interfaces than the marketing admits.]]></summary></entry><entry><title type="html">A monad is a spacecraft with a docking port</title><link href="https://spacecoast.dev/log/a-monad-is-a-spacecraft-with-a-docking-port/" rel="alternate" type="text/html" title="A monad is a spacecraft with a docking port" /><published>2026-01-11T00:00:00+00:00</published><updated>2026-01-11T00:00:00+00:00</updated><id>https://spacecoast.dev/log/a-monad-is-a-spacecraft-with-a-docking-port</id><content type="html" xml:base="https://spacecoast.dev/log/a-monad-is-a-spacecraft-with-a-docking-port/"><![CDATA[<p>People reach for burritos and boxes to explain monads. I want to reach for
something that actually lives on this coastline: <strong>rendezvous and docking</strong>.</p>

<p>Two spacecraft can each be in a perfectly good orbit and still be unable to
simply <em>touch</em>. You can’t naively concatenate their trajectories. There’s an
interface — a docking port with a specific geometry — and a procedure for
bringing two things into contact so that afterward they behave as one. That
awkward in-between step is the whole subject.</p>

<h2 id="composition-wants-to-be-trivial-and-usually-isnt">Composition wants to be trivial, and usually isn’t</h2>

<p>Plain functions compose for free:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>g ∘ f  :  A → B → C
</code></pre></div></div>

<p>Give me <code class="language-plaintext highlighter-rouge">f : A → B</code> and <code class="language-plaintext highlighter-rouge">g : B → C</code> and I hand you <code class="language-plaintext highlighter-rouge">A → C</code>, no ceremony. This is
the base category, and it’s boring precisely because docking is trivial: the
output type <em>is</em> the input type.</p>

<p>Effects break that. Consider functions that might fail:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">parse</span>   <span class="o">::</span> <span class="kt">String</span> <span class="o">-&gt;</span> <span class="kt">Maybe</span> <span class="kt">Int</span>
<span class="n">sqrtPos</span> <span class="o">::</span> <span class="kt">Int</span>    <span class="o">-&gt;</span> <span class="kt">Maybe</span> <span class="kt">Double</span>
</code></pre></div></div>

<p>You cannot write <code class="language-plaintext highlighter-rouge">sqrtPos ∘ parse</code>. The port geometry is wrong: <code class="language-plaintext highlighter-rouge">parse</code> emits a
<code class="language-plaintext highlighter-rouge">Maybe Int</code>, but <code class="language-plaintext highlighter-rouge">sqrtPos</code> expects a bare <code class="language-plaintext highlighter-rouge">Int</code>. The values are in orbit; they
just can’t dock.</p>

<h2 id="the-docking-procedure">The docking procedure</h2>

<p>A monad is exactly the equipment that makes the docking work. Two operations:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">return</code> (or <code class="language-plaintext highlighter-rouge">pure</code>) — put a plain value <em>into</em> orbit: <code class="language-plaintext highlighter-rouge">a -&gt; m a</code>.</li>
  <li><code class="language-plaintext highlighter-rouge">&gt;&gt;=</code> (“bind”) — the docking maneuver: <code class="language-plaintext highlighter-rouge">m a -&gt; (a -&gt; m b) -&gt; m b</code>.</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">bind</code> is the interesting one. It reaches inside the first craft, pulls the
value out <em>if the geometry allows</em>, and feeds it to the next stage:</p>

<div class="language-haskell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">parse</span> <span class="s">"16"</span> <span class="o">&gt;&gt;=</span> <span class="n">sqrtPos</span>    <span class="c1">-- Just 4.0</span>
<span class="n">parse</span> <span class="s">"xy"</span> <span class="o">&gt;&gt;=</span> <span class="n">sqrtPos</span>    <span class="c1">-- Nothing, short-circuits</span>
</code></pre></div></div>

<p>When <code class="language-plaintext highlighter-rouge">parse</code> returns <code class="language-plaintext highlighter-rouge">Nothing</code>, docking is aborted and the second stage never
fires — exactly like a rendezvous that’s waved off. The <code class="language-plaintext highlighter-rouge">Maybe</code> monad encodes
“abort cleanly on failure” as <em>structure</em>, not as scattered <code class="language-plaintext highlighter-rouge">if</code> checks.</p>

<h2 id="why-the-laws-are-the-safety-review">Why the laws are the safety review</h2>

<p>A monad isn’t just those two functions; it’s those two functions <strong>obeying
laws</strong>:</p>

<ol>
  <li><strong>Left identity</strong> — <code class="language-plaintext highlighter-rouge">return a &gt;&gt;= f</code> is just <code class="language-plaintext highlighter-rouge">f a</code>. Docking with a craft you
only just launched changes nothing.</li>
  <li><strong>Right identity</strong> — <code class="language-plaintext highlighter-rouge">m &gt;&gt;= return</code> is just <code class="language-plaintext highlighter-rouge">m</code>. Docking with an empty craft
changes nothing.</li>
  <li><strong>Associativity</strong> — it doesn’t matter how you parenthesize a chain of docks.</li>
</ol>

<p>Those laws are the reason you can reason about a long pipeline the way you reason
about a rocket that’s <em>rated</em>: the sequence of maneuvers has no surprising
order-of-operations gotchas. Break a law and you’ve built something that looks
like a monad and betrays you under composition — the software equivalent of a
docking port that mostly seals.</p>

<blockquote>
  <p>The payoff of category theory isn’t the vocabulary. It’s that once you see
“composition with an interface” as one idea, <code class="language-plaintext highlighter-rouge">Maybe</code>, async I/O, parsers, and
state all turn out to be the same shape wearing different hulls.</p>
</blockquote>

<p>That’s the whole trick. Find the docking port, verify the laws, and stop writing
the glue by hand.</p>]]></content><author><name></name></author><category term="category-theory" /><category term="monads" /><category term="composition" /><summary type="html"><![CDATA[People reach for burritos and boxes to explain monads. I want to reach for something that actually lives on this coastline: rendezvous and docking.]]></summary></entry><entry><title type="html">Compiling a cell</title><link href="https://spacecoast.dev/log/compiling-a-cell/" rel="alternate" type="text/html" title="Compiling a cell" /><published>2026-01-04T00:00:00+00:00</published><updated>2026-01-04T00:00:00+00:00</updated><id>https://spacecoast.dev/log/compiling-a-cell</id><content type="html" xml:base="https://spacecoast.dev/log/compiling-a-cell/"><![CDATA[<p>If you want to program a cell the way you program a computer, the first thing
you notice is that the cell is a <em>terrible</em> target and a <em>fascinating</em> one for
exactly the same reasons: it’s massively parallel, stateful, noisy, and it makes
copies of itself while you’re trying to reason about it.</p>

<p>The dream is a language where you write intent and a compiler lowers it to DNA.
We are further along than people think and further away than the demos suggest.</p>

<h2 id="what-source-code-even-is-here">What “source code” even is here</h2>

<p>A genetic circuit is built from <strong>parts</strong> — promoters, ribosome binding sites,
coding sequences, terminators — composed into transcription units. The
foundational insight of tools like Cello was that you can treat a boolean
specification as the source and <em>synthesize a circuit</em> that implements it.</p>

<p>You write something close to this:</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Sense two inputs; express output only when both are present.</span>
<span class="k">module</span> <span class="n">detector</span><span class="p">(</span><span class="kt">input</span> <span class="n">a</span><span class="p">,</span> <span class="kt">input</span> <span class="n">b</span><span class="p">,</span> <span class="kt">output</span> <span class="n">y</span><span class="p">);</span>
  <span class="k">assign</span> <span class="n">y</span> <span class="o">=</span> <span class="n">a</span> <span class="o">&amp;</span> <span class="n">b</span><span class="p">;</span>
<span class="k">endmodule</span>
</code></pre></div></div>

<p>…and the compiler assigns real biological gates to <code class="language-plaintext highlighter-rouge">&amp;</code>, checks that their
signal ranges (their “voltage levels”, roughly) actually line up, and emits a
DNA sequence. That last check is the hard part.</p>

<h2 id="types-but-for-molecules">Types, but for molecules</h2>

<p>The reason you need a <em>language</em> and not just a CAD tool is that biology is full
of invariants a type system could enforce before you ever touch a wet lab:</p>

<ul>
  <li><strong>Signal compatibility.</strong> A gate’s output concentration must fall inside the
next gate’s input dynamic range. This is unit-checking with a biological unit.</li>
  <li><strong>Orthogonality.</strong> Two parts that shouldn’t interact must not share regulatory
molecules. Aliasing analysis, essentially.</li>
  <li><strong>Load.</strong> Every construct you add taxes the host’s finite transcription and
translation machinery. There’s a resource budget, and overspending it silently
degrades everything — a very literal notion of <em>performance regression</em>.</li>
</ul>

<p>A serious language for cells is one where a well-typed program <em>can’t</em> wire an
output into an incompatible input, the same way a good type system won’t let you
add a string to a socket.</p>

<h2 id="undefined-behavior-is-not-a-metaphor">Undefined behavior is not a metaphor</h2>

<p>In C, undefined behavior means the compiler may do anything. In a cell, the
“anything” is real and it fights back:</p>

<ol>
  <li><strong>Evolution.</strong> A construct that costs the host fitness will get mutated into
uselessness within generations. Your program deletes itself.</li>
  <li><strong>Context.</strong> The same part behaves differently depending on what’s next to it
on the DNA. Composition is not as clean as the abstraction pretends.</li>
  <li><strong>Noise.</strong> Expression is stochastic. Two genetically identical cells run the
same program and get different answers.</li>
</ol>

<blockquote>
  <p>The uncomfortable truth: our abstractions leak because the substrate is alive
and has its own agenda. A cell is less like a CPU and more like a datacenter
that occasionally rewrites its own source to save power.</p>
</blockquote>

<h2 id="where-this-is-going">Where this is going</h2>

<p>The near-term win isn’t a general-purpose language; it’s good <strong>domain-specific
languages</strong> with honest type systems that catch the mechanical errors — signal
mismatch, part reuse, resource overrun — before synthesis. The long-term
question is whether we can build abstractions robust enough that “it compiles”
means “it will still be doing what you asked twenty generations from now.”</p>

<p>That’s the payload I keep coming back to: not just writing a phenotype, but
writing one that <em>holds</em>.</p>]]></content><author><name></name></author><category term="synthetic-biology" /><category term="languages" /><category term="genetic-circuits" /><summary type="html"><![CDATA[If you want to program a cell the way you program a computer, the first thing you notice is that the cell is a terrible target and a fascinating one for exactly the same reasons: it’s massively parallel, stateful, noisy, and it makes copies of itself while you’re trying to reason about it.]]></summary></entry></feed>