<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Underground</title>
    <description>The latest articles on DEV Community by Underground (@wahyu779).</description>
    <link>https://dev.to/wahyu779</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4245320%2Fa9a5c89d-e203-4fc0-b065-9fbcbf7f90d2.jpg</url>
      <title>DEV Community: Underground</title>
      <link>https://dev.to/wahyu779</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wahyu779"/>
    <language>en</language>
    <item>
      <title>The Gatekeeper With No Address: Trying to Build a zkVerify Proof Gatekeeper on a VM the Public Internet Can't Reach</title>
      <dc:creator>Underground</dc:creator>
      <pubDate>Sun, 15 Nov 2026 03:51:58 +0000</pubDate>
      <link>https://dev.to/wahyu779/the-gatekeeper-with-no-address-trying-to-build-a-zkverify-proof-gatekeeper-on-a-vm-the-public-2543</link>
      <guid>https://dev.to/wahyu779/the-gatekeeper-with-no-address-trying-to-build-a-zkverify-proof-gatekeeper-on-a-vm-the-public-2543</guid>
      <description>&lt;h1&gt;
  
  
  The Gatekeeper With No Address: Trying to Build a zkVerify Proof Gatekeeper on a VM the Public Internet Can't Reach
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;STATUS NOTE — read this before posting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What has been verified (facts):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every claim about the rules, task format, scoring, and circuit comes from the official Agent Games pages I read directly on 15 Nov 2026 (~10:00 WIB): &lt;code&gt;/build&lt;/code&gt;, &lt;code&gt;/events/proof-gatekeeper&lt;/code&gt;, &lt;code&gt;/events/creator-track&lt;/code&gt;, &lt;code&gt;/rules&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every network number in section 4 is my own test result from the same VM, 15 Nov 2026 ~10:07–10:08 WIB (03:07–03:08 UTC): local address, egress IP, and curl results for each tunnel service.&lt;/li&gt;
&lt;li&gt;The leaderboard numbers (section 5) were read from the official leaderboard page on 15 Nov 2026 ~09:30 WIB — those numbers move, so treat them as a snapshot of that hour, not fixed figures.&lt;/li&gt;
&lt;li&gt;Numbers from the comparison articles (section 5) are quoted from those articles, with sources named.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I have NOT done — do not claim otherwise:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I did NOT run snarkjs, did NOT generate a Groth16 proof, did NOT register an account, did NOT run a live endpoint, and did NOT play a single round. This article documents the design I learned from the field guide + the wall I measured myself. If any sentence sounds like a proof already ran, that is a misread — fix it before posting.&lt;/li&gt;
&lt;li&gt;This article is published on dev.to as a Creator Track entry (not on X — the author's X account is not verified, and X is not a required route). The entry is submitted to the Agent Games dashboard after publication, with this article's link.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This entry is for the Agent Games Season 01 Creator Track (21 Oct–21 Nov 2026; judging 22–30 Nov 2026). Eligibility requirement: include &lt;code&gt;#AgentGames&lt;/code&gt; in every entry; if posting on X, also tag &lt;code&gt;@ZKVProtocol&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. The short version
&lt;/h2&gt;

&lt;p&gt;I wanted to join Proof Gatekeeper, the zkVerify Agent Games track where an agent acts as a payment guard: receive a task, decide APPROVE or REJECT within 60 seconds, and prove the decision with a zero-knowledge proof. I read the field guide cover to cover, I understood the endpoint contract, and then the build stalled at the very first requirement — not the cryptography, but the address.&lt;/p&gt;

&lt;p&gt;An agent has to live at a public HTTPS endpoint. My VM has no public IP, and its egress proxy blocks every free no-account tunnel: trycloudflare 403, the localtunnel server unreachable, bore.pub unreachable. The only remaining routes need an account: Tailscale Funnel or serverless hosting.&lt;/p&gt;

&lt;p&gt;So this is not a success story. It is an honest work log: what the gatekeeper design looks like according to the field guide, what wall I measured, and why that wall is the most interesting part of this tournament.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What Proof Gatekeeper asks for
&lt;/h2&gt;

&lt;p&gt;The rules are simple and strict. The platform sends a JSON POST to the agent's endpoint. The agent checks the HMAC signature in the &lt;code&gt;x-agent-games-signature&lt;/code&gt; header against the raw body — before parsing anything. Then the agent decides and answers within 60 seconds. Being late is the same as a timeout, and a timeout is −2 points.&lt;/p&gt;

&lt;p&gt;An example task payload (from the official event page):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"agent-games.proof-gatekeeper.v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"task_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"gk_24_9d1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"competition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;"registered_vk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0x7d3a...f291"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"proof_vk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0xa4c1...b8ff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"minimum"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"public_balance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1460"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"expiry_block"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19842201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"current_block"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19832000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"recipient"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0xDe42...9f01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"condition_recipient"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0xDe42...9f01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"500"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"max_transfer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"1000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;"proof_tx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"0xa4c1...8ff1"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expected answer is only two things: &lt;code&gt;decision&lt;/code&gt; (APPROVE or REJECT) and &lt;code&gt;reason_code&lt;/code&gt;. But the answer has to come with evidence: a Groth16 proof that the platform re-verifies against its own verification key.&lt;/p&gt;

&lt;p&gt;The scoring: a correct answer (APPROVE or REJECT) is +12. A wrong APPROVE is −6 — heavier than a wrong REJECT (−3), because approving a trap costs more than being too cautious. Timeout −2, missing or invalid proof −2, plus a reliability bonus of +0 to +5 based on how many of your proofs verified. Eight daily rounds, 13–20 November 2026, eight tasks per agent per round, cumulative score. Each round's window is 16:00–02:00 IST, which is 17:30–03:30 WIB.&lt;/p&gt;

&lt;p&gt;What makes this track interesting: every trap is documented up front. No guessing — the test is whether your agent checks every field. There are seven types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trap&lt;/th&gt;
&lt;th&gt;Correct decision&lt;/th&gt;
&lt;th&gt;Approx. share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;VALID_CONDITION&lt;/td&gt;
&lt;td&gt;APPROVE&lt;/td&gt;
&lt;td&gt;~50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VK_SUBSTITUTION — the proof is valid, but its verification key is not the condition's registered key&lt;/td&gt;
&lt;td&gt;REJECT&lt;/td&gt;
&lt;td&gt;~13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PROOF_REUSED — the same proof was already used in an earlier task&lt;/td&gt;
&lt;td&gt;REJECT&lt;/td&gt;
&lt;td&gt;~11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;THRESHOLD_MISMATCH — the proof is valid, but the public balance is below the minimum&lt;/td&gt;
&lt;td&gt;REJECT&lt;/td&gt;
&lt;td&gt;~8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXPIRED_CONDITION — the condition has passed its expiry block&lt;/td&gt;
&lt;td&gt;REJECT&lt;/td&gt;
&lt;td&gt;~6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RECIPIENT_MISMATCH — the recipient in the proof does not match the condition&lt;/td&gt;
&lt;td&gt;REJECT&lt;/td&gt;
&lt;td&gt;~6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMOUNT_OVERFLOW — the amount exceeds the per-transfer cap&lt;/td&gt;
&lt;td&gt;REJECT&lt;/td&gt;
&lt;td&gt;~6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice the pattern in the first three traps: the proof is valid. VK_SUBSTITUTION, THRESHOLD_MISMATCH, and PROOF_REUSED all have proofs that genuinely pass verification — but the decision is still REJECT. That is the core lesson of the field guide, written explicitly in its security section: "A proof can verify perfectly and still authorize the wrong action." Verification is necessary, not sufficient. An agent has to check what is being proven, not just whether the proving succeeded: whether the key matches the registered one, whether the circuit matches, whether the public inputs prove the threshold, the recipient, and the action, whether the proof reference has been used before, and whether verification is final before approval.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The endpoint design (per the field guide)
&lt;/h2&gt;

&lt;p&gt;Tidied into a pipeline, a gatekeeper agent does five things, in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify the HMAC first.&lt;/strong&gt; The &lt;code&gt;x-agent-games-signature&lt;/code&gt; header is checked against the raw body, before parsing. The secret is a random 32 bytes generated by the platform at registration and shown only once. If the signature does not match, reject — do not do any work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the task fields.&lt;/strong&gt; Task ID (also used as the idempotency key — the platform can retry if the network fails), registered VK, proof VK, minimum, public balance, expiry block, current block, recipient, condition recipient, amount, max transfer, proof reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the seven checks.&lt;/strong&gt; Does the proof VK equal the registered VK? Is the public balance ≥ the minimum? Does the recipient match? Is the current block still before expiry? Is the amount ≤ the cap? Is the proof reference absent from the local seen-set? A single failure means REJECT with the right reason code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate the proof.&lt;/strong&gt; The circuit is Groth16/BN128, compiled with Circom 2.x. The proving key (&lt;code&gt;.zkey&lt;/code&gt;) and WASM files are downloaded from &lt;code&gt;agentgames.zkverify.io/circuits&lt;/code&gt;, the proof is generated locally with snarkjs, and included in the response. The verification key hash is registered on zkVerify mainnet and also served as JSON at &lt;code&gt;/api/circuit-info&lt;/code&gt;. There are two routes for submitting proofs to the chain: Kurier (REST, needs a mainnet API key, register the VK once, then poll until the status is Finalized) or zkVerifyJS (TypeScript, a Volta session with a funded account).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer with a signed JSON.&lt;/strong&gt; Every response is signed with &lt;code&gt;x-agent-games-signature&lt;/code&gt; over the raw response body. When in doubt or out of time, fail closed: REJECT.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is no language model anywhere near the decision. The same input must always produce the same output, because the platform scores decisions independently — a valid proof for a wrong decision still loses.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The wall: a public endpoint
&lt;/h2&gt;

&lt;p&gt;Everything above can be learned from the docs. What cannot be learned from the docs is whether your environment can meet the first requirement in rules 1.2: the agent must be reachable at a public HTTPS endpoint — no localhost, no private IP range, no custom port. And if the agent is offline when a task arrives, that task is lost. That is published policy, not an accident.&lt;/p&gt;

&lt;p&gt;My VM: its local address is &lt;code&gt;198.19.0.2&lt;/code&gt; — inside the 198.18.0.0/15 range, not an address routable from the internet. All outbound traffic goes through an egress proxy (the &lt;code&gt;http_proxy&lt;/code&gt;/&lt;code&gt;https_proxy&lt;/code&gt;/&lt;code&gt;ALL_PROXY&lt;/code&gt; variables are set), and the IP the internet sees is a shared egress proxy IP — one that changes per connection from a Cloudflare pool (measured as &lt;code&gt;104.29.197.209&lt;/code&gt; during the test at ~10:07 WIB, &lt;code&gt;104.29.194.187&lt;/code&gt; on re-check at 10:09 WIB) — not my machine's IP. Inbound connections to that IP will never reach my VM. So the only way is an outbound tunnel: my machine opens a connection to a tunnel service, and that service gives it a public URL.&lt;/p&gt;

&lt;p&gt;I tested every free no-account route, 15 November 2026 ~10:07 WIB, from the same VM:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Route&lt;/th&gt;
&lt;th&gt;Test result&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;trycloudflare.com (Cloudflare quick tunnel)&lt;/td&gt;
&lt;td&gt;HTTP 403&lt;/td&gt;
&lt;td&gt;The API is blocked by the proxy — no tunnel can be created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;server.localtunnel.me (the server the localtunnel client must reach)&lt;/td&gt;
&lt;td&gt;curl failed completely (code 000)&lt;/td&gt;
&lt;td&gt;The tunnel server is unreachable entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;localtunnel.me (just the website)&lt;/td&gt;
&lt;td&gt;HTTP 302&lt;/td&gt;
&lt;td&gt;The site is alive — but that is the website, not the tunnel server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bore.pub&lt;/td&gt;
&lt;td&gt;curl failed completely (code 000)&lt;/td&gt;
&lt;td&gt;Unreachable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tunnel.ngrok.com&lt;/td&gt;
&lt;td&gt;TCP port 443 connects, but HTTPS fails (code 000)&lt;/td&gt;
&lt;td&gt;No tunnel can be created; ngrok also needs an account + authtoken, so it was never a no-account route anyway&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two more pieces of evidence. First, the localtunnel client has been running on this machine since 09:33 WIB — when I checked again at 10:07 WIB, the process was still alive (33 minutes 40 seconds) with an empty log: it never printed a public URL. That is not "not yet", it is a client waiting on a server that never answers. Second, ordinary downloads still work (&lt;code&gt;github.com&lt;/code&gt; 200), so the internet is not down — what is blocked is specifically the tunnel services.&lt;/p&gt;

&lt;p&gt;The honest conclusion: from this environment, a public endpoint cannot be created through any free no-account route. What remains needs an account: Tailscale Funnel (needs a tailnet login — the &lt;code&gt;tailscale&lt;/code&gt; binary is on this machine but its status is "Not connected") or serverless hosting. The second one is proven to work: one participant runs their gatekeeper live on Vercel (see section 5). That is the next step I have not taken — not because I don't know how, but because it needs an account and a decision, and I won't pretend I already got past it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Why this matters: a field that is weak on plumbing
&lt;/h2&gt;

&lt;p&gt;When I read the leaderboard (15 Nov ~09:30 WIB), what stood out was not who was winning — it was how many agents never answered at all. In Proof Gatekeeper, round 1: 112 tasks issued, 65 answered, only 3 verified. Round 2: 272 issued, 129 answered, 0 verified. The top of the board: #1 at 87.9, then 20 agents tied at 80.0. In Steal the VFY, round 2 had only 9 agents paired; #1 tied at 31 points.&lt;/p&gt;

&lt;p&gt;In other words: most participants lose not on decision logic, but on plumbing — the endpoint doesn't answer, or the proof doesn't verify. An agent that actually runs, answers on time, and has valid proofs has a lot of room. That is good news for anyone serious about the deployment part.&lt;/p&gt;

&lt;p&gt;The field's standard for Creator Track articles themselves can be seen in three other participants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aman Selalu (arsap.ai)&lt;/strong&gt; wrote up building a ~300-line Node.js endpoint, a Groth16 proof of 804 bytes generated in about 3 seconds with snarkjs 0.7.6, and a valid scenario (balance 1460 vs minimum 1000, amount 500 vs cap 1000) that passed &lt;code&gt;snarkjs groth16 verify&lt;/code&gt;. He was also honest about his own wall — and his wall looks like mine: trycloudflare 403, SSH reset. The difference is he also got stuck on login: his wallet can only sign EIP-712, while the platform's SIWE login needs EIP-191.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dicky Can (@djarot)&lt;/strong&gt; found the 13 input signal names of his own circuit by probing the WASM file (registeredVkHash, proofVkHash, minimum, publicBalance, expiryBlock, currentBlock, recipient, conditionRecipient, amount, maxTransfer, decision, taskId, and one private salt), then produced an 804-byte proof that passed verification. He also wrote honestly that he did not build the live endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Andruu21 (BAOK-GK)&lt;/strong&gt; is the highest bar: a live endpoint on Vercel, 83 automated tests passing, platform preflight "Healthy, 579 ms", practice 4 out of 4 correct, and one finalized proof on zkVerify mainnet with a published transaction hash.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those three articles show the spectrum being judged: from honestly documenting a failure to fully live. This article stands in the middle — the design is correct per the field guide, and the wall is measured, not felt.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What I haven't done (so nobody gets the wrong idea)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I did not run snarkjs or generate any proof. The 804-byte and ~3-second figures above are other participants' results, quoted with sources.&lt;/li&gt;
&lt;li&gt;I did not register an Agent Games account or run a practice task.&lt;/li&gt;
&lt;li&gt;I did not build the endpoint to completion — what I built is an understanding of the contract and a measurement of the deployment wall.&lt;/li&gt;
&lt;li&gt;If the Tailscale Funnel or serverless hosting route works later, that is a follow-up article, not part of this entry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tournament's total prize pool is 400,000 VFY — 100,000 per track, 50,000 / 30,000 / 20,000 for the top three of each track. The Creator Track is judged manually: technical substance, clarity, zkVerify relevance, and originality. I don't know whether a measured failure log can win — but I know it is the only honest thing I could write today, and the wall I measured is almost certainly the same wall others are quietly giving up on without writing anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Builder Field Guide — &lt;a href="https://agentgames.zkverify.io/build" rel="noopener noreferrer"&gt;https://agentgames.zkverify.io/build&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Proof Gatekeeper (tasks, traps, scoring, round schedule) — &lt;a href="https://agentgames.zkverify.io/events/proof-gatekeeper" rel="noopener noreferrer"&gt;https://agentgames.zkverify.io/events/proof-gatekeeper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Creator Track (format, judging criteria, eligibility) — &lt;a href="https://agentgames.zkverify.io/events/creator-track" rel="noopener noreferrer"&gt;https://agentgames.zkverify.io/events/creator-track&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Rules (public endpoint, HMAC secret, uptime, practice mode) — &lt;a href="https://agentgames.zkverify.io/rules" rel="noopener noreferrer"&gt;https://agentgames.zkverify.io/rules&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Aman Selalu, "Don't Trust the Agent. Verify It." — &lt;a href="https://medium.com/@amanselalu1991/dont-trust-the-agent-verify-it-building-a-proof-gatekeeper-for-zkverify-agent-games-4faabfe3a9d9" rel="noopener noreferrer"&gt;https://medium.com/@amanselalu1991/dont-trust-the-agent-verify-it-building-a-proof-gatekeeper-for-zkverify-agent-games-4faabfe3a9d9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Willdinata, "If an AI Agent Says It Did the Job, How Would You Know?" — &lt;a href="https://willdinata.medium.com/if-an-ai-agent-says-it-did-the-job-how-would-you-know-7226ca9f1f9e" rel="noopener noreferrer"&gt;https://willdinata.medium.com/if-an-ai-agent-says-it-did-the-job-how-would-you-know-7226ca9f1f9e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dicky Can, "Don't Trust the Agent. Verify It." — &lt;a href="https://medium.com/@dickycan42/dont-trust-the-agent-verify-it-1636c3a826bc" rel="noopener noreferrer"&gt;https://medium.com/@dickycan42/dont-trust-the-agent-verify-it-1636c3a826bc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Andruu21, "My AI Agent Approves Payments. Here's How Anyone Can Check Its Work." — &lt;a href="https://dev.to/andruu21/my-ai-agent-approves-payments-heres-how-anyone-can-check-its-work-fp8"&gt;https://dev.to/andruu21/my-ai-agent-approves-payments-heres-how-anyone-can-check-its-work-fp8&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Written for Creator Track #AgentGames, Season 01. All network numbers in section 4 were measured by the author from the author's own VM, 15 Nov 2026 ~10:07 WIB.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>zkverify</category>
      <category>agentgames</category>
      <category>zeroknowledge</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
