This is an earlier note (July 2026). A newer Klima integrator note is live, as of 2026-08-18. Read the current one at vealth.net/klima →
Capability brief · Integrator's read · Unlisted

The agent-readiness of the rail we already retire through

Six evidenced findings, credit-first. EcoWealth calls v0.x402.klimalabs.com/api (x402 = a web-native way for AI agents to pay per use) and the Retirement Aggregator on Base, in production every day until retirements are stopped by operator order as of 2026-08-04: this is the audit we'd want if the roles were reversed: not "is Klima good," but "can an agent that has never read your source code still find, price, and execute a retirement, and trust what the well-known paths tell it?"

Read this first. Independent recon by EcoWealth Corporation. Not requested, produced, reviewed, or endorsed by Klima Protocol, Carbonmark, or Klima Labs. Passive reads only: plain HTTP GETs, standard well-known paths, one documented free liveness probe (/api/health), no scanning, fuzzing, auth bypass, or state-changing call. Captured 2026-07-16; every URL below is independently re-runnable.
Baseline, stated up front Klima Protocol and Carbonmark run one of the most agent-forward documentation stacks we've reviewed: two real llms.txt files (the file AI assistants read first) with distinct, thoughtful content; two full GitBook llms-full.txt exports (78–80 KB each) with a dynamic agent Q&A mechanism; a complete, real OpenAPI 3.1 spec (84 KB); a Wix Site MCP (the protocol that lets an AI assistant call your tools) endpoint with six named tools; and a published Claude-Code/Base-MCP skill plugin on GitHub. The findings below are about the gaps inside that effort, not a claim that the effort is missing.

The bottom line, in plain English

No jargon. Klima and Carbonmark are ahead of almost everyone on agent docs; every fix below is about the standard discovery paths finally telling the truth, so the agents you built this rail for can actually reach it. Here is what each one is worth.

Real files instead of soft-200 phantoms → the agents you built this for stop being told a door exists when it doesn't

Every agent-shaped path returns a 200 (or a 400) byte-identical to your homepage, so a discovering agent thinks an agent-card and security.txt exist when they don't; honest 404s mean agents find what's real and act on it, instead of parsing a phantom.

A standard x402 manifest at the standard door → any generic payment client can find and pay your rail without custom code

Your live x402 retirement service sits at a Klima-specific address while the cross-vendor discovery path 404s, so a standard x402 agent can't reach it without integration work; publishing the manifest opens the rail to every agent that follows the convention.

An agent layer on the app where retirement happens → the transactional surface itself becomes reachable by agents

The domain where a retirement actually executes carries zero agent-discovery layer; adding one means an agent can go from finding you to completing a retirement without a human in the loop.

One feed on carbon.fyi → the aggregator built to fix fractured discourse can finally be read by machines

carbon.fyi ships no robots.txt, no feed, nothing machine-readable, yet its whole value is being readable without a browser; a single feed lets assistants and crawlers surface its content to the market it was built for.

1 · Credit: a genuinely layered agent-documentation stack

Credit 1

Four independent agent-surfaces, all real

www.klimaprotocol.com/llms.txt (200, 3,438 B) names a dedicated blog post, "Carbon Retirement Over HTTP: The Klima x402 Endpoint," and links docs/whitepaper/app. www.carbonmark.com/llms.txt (200, 4,918 B) documents a four-step agent flow (discover → quote → retire → certificate), a gasless EIP-712 relay, an "AI Agent Integrations" page, and a Wix Site MCP endpoint (/_api/mcp) with six callable tools (GetBusinessDetails, SearchInSite, CallWixSiteAPI, …). docs.klimaprotocol.com and docs.carbonmark.com (GitBook) both ship real llms.txt + llms-full.txt (5,973 B / 80,307 B and 3,799 B / 78,738 B) plus a dynamic ?ask=<question> mechanism on every page. api.carbonmark.com/openapi.json is a real, complete OpenAPI 3.1.0 spec (84,155 B, version v19) any function-calling agent can ingest directly. github.com/KlimaDAO publishes Klima-Protocol-x402-MCP-documentation (pushed 2026-06-29), an actual Claude-Code skill plugin (klima-retire.md, v0.2.0) with GET-only, no-auth endpoints designed for chat-only agent surfaces.

# every one of these returns 200 with real, distinct content curl -s https://www.klimaprotocol.com/llms.txt | head -3 curl -s https://www.carbonmark.com/llms.txt | grep -A2 "Agentic Carbon Retirement" curl -s https://docs.carbonmark.com/llms-full.txt | wc -c # 78738 curl -s https://api.carbonmark.com/openapi.json | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['info']['title'], d['info']['version'])"

Sources: www.klimaprotocol.com/llms.txt · www.carbonmark.com/llms.txt · docs.klimaprotocol.com/llms-full.txt · docs.carbonmark.com/llms-full.txt · api.carbonmark.com/openapi.json · github.com/KlimaDAO/Klima-Protocol-x402-MCP-documentation

2 · The soft-200 (and soft-400) desert

Gap 2

A 200 that means nothing, and a 400 that means the same nothing

On www.klimaprotocol.com, every agent-shaped path other than /llms.txt (/llms-full.txt, /ai.txt, /.well-known/agent-card.json, /.well-known/ai-plugin.json, /.well-known/security.txt, /.well-known/x402) returns HTTP 200 with a body byte-identical (85,662 B) to the homepage and to a nonsense-path control (/this-nonsense-control-xyz123.txt). That's a Next.js SPA catch-all dressed as success: an agent checking "is this 200?" is told an agent-card.json and a security.txt exist when neither does. On www.carbonmark.com (Wix), the same non-llms.txt paths return HTTP 400 "Bad Request" with an identical 2,204–2,205-byte error body, again indistinguishable from the control. Two different platforms, the same failure mode: status code says "found," body says "not really."

# klimaprotocol.com: every size below is identical (soft-200) for p in llms-full.txt ai.txt .well-known/agent-card.json .well-known/x402 this-nonsense-control-xyz123.txt; do curl -s -o /dev/null -w "%{http_code}:%{size_download} " https://www.klimaprotocol.com/$p done # → 200:85662 200:85662 200:85662 200:85662 200:85662 # carbonmark.com: every size below is identical (soft-400) for p in llms-full.txt ai.txt .well-known/agent-card.json .well-known/x402 this-nonsense-control-xyz123.txt; do curl -s -o /dev/null -w "%{http_code}:%{size_download} " https://www.carbonmark.com/$p done # → 400:2204 400:2204 400:2205 400:2204 400:2204

Sources: www.klimaprotocol.com/.well-known/agent-card.json · www.carbonmark.com/.well-known/security.txt · nonsense-path controls on both hosts

3 · Where retirement actually happens, nothing is legible

Gap 3

app.klimaprotocol.com: real robots.txt, true 404s everywhere else

The application domain, where a human (or agent) actually executes a retirement in the UI, ships a real robots.txt (200, explicitly Disallow: /api/) and a real sitemap.xml (200). But llms.txt, llms-full.txt, ai.txt, /.well-known/agent-card.json, /.well-known/ai-plugin.json, /.well-known/security.txt, /.well-known/x402, and /openapi.json are ALL true 404s: a Next.js branded 404 page, byte-identical (5,763 B) across every one of them, including the nonsense-path control. Unlike finding 2, these are honest 404s, not soft-200s, but the transactional surface itself carries zero agent-discovery layer, real or fake.

for p in llms.txt ai.txt .well-known/agent-card.json .well-known/x402 openapi.json this-nonsense-control-xyz123.txt; do curl -s -o /dev/null -w "%{http_code}:%{size_download} " https://app.klimaprotocol.com/$p done # → 404:5763 404:5763 404:5763 404:5763 404:5763 404:5763 (true 404, control-matched) curl -s -o /dev/null -w "%{http_code}\n" https://app.klimaprotocol.com/robots.txt # → 200

Sources: app.klimaprotocol.com/robots.txt · app.klimaprotocol.com/.well-known/agent-card.json

4 · The branded "x402 endpoint" isn't x402-standard

Credit · CLOSED by Klima 4

Real, live, versioned service: at the wrong door for a generic x402 client — fixed

Re-checked 2026-07-30: this is resolved, and then some. GET /.well-known/x402 now returns 200 with a full x402 v2 manifest: per-action JSON Schemas, an error registry, a changelog at /.well-known/x402-changelog.json, and a versionedHosts block. The finding below is kept as originally captured on 2026-07-16 so the record stays honest, not because it still stands. Credit where it is due: this is the door being put where the standard says it should be.

The manifest also documents something we learned the hard way the same week. versionedHosts reads: "The bare host serves the latest release. Pin v1.x402.klimalabs.com to stay on this major across future releases." We were calling the bare host, v1 shipped on 2026-07-27 with a breaking change to prepare-auth, and our unpinned rail followed it. Pin the major.

x402.klimalabs.com/api/health is genuinely live: {"ok":true,"service":"x402-klima-ra-new","version":"0.2.1","x402FacilitatorVersion":2}: this is the exact endpoint EcoWealth's own production code calls. But the actual cross-vendor x402 discovery convention, GET /.well-known/x402, returns a clean, honest 404 ({"error":"not_found"}). The published GitHub skill (klima-retire.md v0.2.0) confirms why: the live shape is plain GET endpoints (discover/quote/prepare/retire), no auth, with the protocol fee collected inside the on-chain settlement transaction itself, not an HTTP 402 challenge/response with a signed X-PAYMENT header, which is what the name "x402" implies and what EcoWealth's own EWP gates implement (standard accepts[] exact-scheme, self-settled EIP-3009, no facilitator). A generic x402-aware payment client, ours, or any agent that discovers the standard the way Coinbase itself describes it, can't find or pay this endpoint without Klima-specific integration code first.

curl -s https://x402.klimalabs.com/api/health # → {"ok":true,"service":"x402-klima-ra-new","version":"0.2.1","x402FacilitatorVersion":2} # captured 2026-07-16. That un-prefixed host now serves major v1; the same probe # against https://v0.x402.klimalabs.com/api/health returns version 0.2.2 today. curl -s -o /dev/null -w "%{http_code}\n" https://x402.klimalabs.com/.well-known/x402 # → 404 curl -s https://x402.klimalabs.com/.well-known/x402 # → {"error":"not_found"}

Sources: x402.klimalabs.com/api/health · x402.klimalabs.com/.well-known/x402 · github.com/KlimaDAO/…/plugins/klima-retire.md

5 · carbon.fyi: the discourse-fixer with no feed

Sharpest finding 5

No robots.txt. No llms.txt. No RSS. No JSON. Nothing.

carbon.fyi launched to fix "fractured discourse" in the voluntary carbon market. Every standard machine-readable path returns a TRUE 404, byte-identical (9,763–9,775 B, the range reflects the requested path being echoed into the Next.js error shell) to a nonsense-path control: /robots.txt, /llms.txt, /llms-full.txt, /ai.txt, /.well-known/agent-card.json, /.well-known/ai-plugin.json, /.well-known/security.txt, /.well-known/x402, /sitemap.xml, and every feed shape checked (/feed, /rss.xml, /api/articles, /api/feed). Not even robots.txt, the one static file almost every production site ships by default, exists. A news/aggregation product's entire value is "a machine should be able to read this without a browser." Today, nothing can.

for p in robots.txt llms.txt ai.txt sitemap.xml feed rss.xml api/articles api/feed this-nonsense-control-xyz123.txt; do curl -s -o /dev/null -w "%{http_code} " https://www.carbon.fyi/$p done # → 404 404 404 404 404 404 404 404 404 (every path, true 404, control-matched)

Sources: www.carbon.fyi/robots.txt · www.carbon.fyi/llms.txt · www.carbon.fyi/feed · www.carbon.fyi/rss.xml

6 · The worked example: we're already the agent this rail was built for

Credit 6

EcoWealth's EWP retires through this exact rail, in production, today

Carbonmark's own llms.txt says the goal is agents that "autonomously discover, quote, and retire verified carbon credits… every retirement resolves to a public, permanently verifiable Carbonmark certificate." EcoWealth's Ecological Work Protocol (EWP, live on Base mainnet at 0x76c17C51336BE7B39F5164802e08b9811477A14B, source-verified) settles real-world ecological labor and retires a share of it through this exact rail: the gasless relay (v0.x402.klimalabs.com/api, quote → prepare-auth → sign EIP-712 → actions/retire, hard $0.25 micro-cap) and the Retirement Aggregator directly (retireCreditViaKlima, 0xda0a793d…4f4). It runs on an twice-daily, gas-gated cron. This isn't a hypothetical integration for this brief: it's the production code that made us curious enough to run this audit in the first place.

Sources: internal working notes on our own retirement rail (public): basescan.org/address/0x76c17C51336BE7B39F5164802e08b9811477A14B

What this adds up to

Nothing here is a security problem or a broken product: Klima and Carbonmark are ahead of almost everyone else we've reviewed on agent documentation. The pattern across findings 2–5 is narrower and more fixable: the standard discovery paths (.well-known/*, robots.txt, a feed) don't reliably tell the truth about what exists, even though the actual capabilities behind them are real and, per finding 6, already working for at least one agent in production every day. Three small file changes (real 404s instead of soft-200s, a real manifest at the standard x402 path, one feed on carbon.fyi) would let any agent find what we already had to read source code to find.

→ See the retirement loop running end-to-end, in Klima's own palette

← Back to the hub
Provisioned by EcoWealth · Digital Provisioning Protocol · provenance‑sealed