<?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: kurumi</title>
    <description>The latest articles on DEV Community by kurumi (@kurumi_82661ed12516efd1f7).</description>
    <link>https://dev.to/kurumi_82661ed12516efd1f7</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%2F4048368%2Fa5614e53-8b67-4f82-8845-5accfbee27a4.jpg</url>
      <title>DEV Community: kurumi</title>
      <link>https://dev.to/kurumi_82661ed12516efd1f7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kurumi_82661ed12516efd1f7"/>
    <language>en</language>
    <item>
      <title>How to Create Your First AI-Evaluated Bounty (Step by Step)</title>
      <dc:creator>kurumi</dc:creator>
      <pubDate>Fri, 04 Sep 2026 09:41:00 +0000</pubDate>
      <link>https://dev.to/kurumi_82661ed12516efd1f7/how-to-create-your-first-ai-evaluated-bounty-step-by-step-19bd</link>
      <guid>https://dev.to/kurumi_82661ed12516efd1f7/how-to-create-your-first-ai-evaluated-bounty-step-by-step-19bd</guid>
      <description>&lt;h1&gt;
  
  
  How to Create Your First AI-Evaluated Bounty
&lt;/h1&gt;

&lt;p&gt;If you've ever posted a freelance task and then argued over whether the work "met the bar," you already understand the problem this tutorial solves. Vague briefs plus subjective review equals disputes. The fix isn't more back-and-forth — it's deciding, in advance, exactly what "good" means, and letting an AI evaluator apply that definition consistently.&lt;/p&gt;

&lt;p&gt;This walkthrough uses &lt;a href="https://bounties.verdikta.org" rel="noopener noreferrer"&gt;Verdikta&lt;/a&gt; as the working example, since it's built specifically for AI-evaluated bounties with escrowed payment. By the end, you'll understand the five pieces every bounty needs: a rubric, weights, a threshold, must-pass gates, and funded escrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "AI-evaluated" changes the incentive structure
&lt;/h2&gt;

&lt;p&gt;In a normal freelance posting, the person who pays is also the person who judges the work — after it's done. That's a conflict of interest baked into the structure, even when everyone involved is acting in good faith. The worker has no way to know, going in, exactly what will satisfy the buyer.&lt;/p&gt;

&lt;p&gt;An AI-evaluated bounty flips the order of operations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You define success criteria &lt;em&gt;before&lt;/em&gt; anyone starts working.&lt;/li&gt;
&lt;li&gt;You fund escrow &lt;em&gt;before&lt;/em&gt; anyone starts working.&lt;/li&gt;
&lt;li&gt;Submissions get scored against the criteria you wrote — not a mood, not a moving target.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI model doesn't decide what "good" means. You do. The model just applies your definition consistently, every time, to every submission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Scope the task tightly
&lt;/h2&gt;

&lt;p&gt;Before writing a rubric, write one sentence describing the deliverable. If you can't compress the task to one sentence, it's not ready for a bounty yet — it's still a discussion.&lt;/p&gt;

&lt;p&gt;Example: &lt;em&gt;"Write a Python function that validates email addresses against RFC 5322 and returns a boolean."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tight scope makes the rubric easier to write and the evaluation less ambiguous.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Write your rubric — criteria and weights
&lt;/h2&gt;

&lt;p&gt;A rubric is a list of criteria, each with a weight reflecting how much it matters relative to the others. Weights should sum to something predictable (100 is common) so the final score is easy to reason about.&lt;/p&gt;

&lt;p&gt;Here's a sample rubric for the email-validator task, expressed as JSON — the format Verdikta bounties expect:&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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Python email validator function"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"correctness"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Function correctly validates RFC 5322-compliant emails and rejects invalid ones"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"edge_case_handling"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Handles empty strings, unicode domains, and multiple @ symbols without crashing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"code_quality"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Readable, follows PEP8, includes type hints"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test_coverage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Includes at least 5 unit tests covering valid and invalid cases"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"weight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"threshold"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"must_pass_gates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"no_syntax_errors"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"function_signature_matches_spec"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things worth noticing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Each criterion has a plain-language description.&lt;/strong&gt; The AI evaluator reads this, so vague language produces vague scoring. "Good code quality" is worse than "follows PEP8, includes type hints."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weights reflect priority, not just presence.&lt;/strong&gt; Here, correctness matters twice as much as code quality — say so explicitly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rubric is the contract.&lt;/strong&gt; Once it's published, it shouldn't change mid-bounty. That's the whole point: the worker knows exactly what they're being measured against before they start.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Set your threshold
&lt;/h2&gt;

&lt;p&gt;The threshold is the minimum weighted score a submission needs to pass. In the example above, it's 75 out of 100.&lt;/p&gt;

&lt;p&gt;Setting this number is a judgment call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Too low&lt;/strong&gt;, and mediocre work gets paid, which defeats the purpose of having a rubric at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too high&lt;/strong&gt;, and you risk rejecting genuinely useful work over minor gaps, which discourages submissions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A reasonable starting point for most bounties is 70–80. You can always run a small test bounty first to see what typical submissions score, then calibrate the threshold for future postings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Choose your must-pass gates
&lt;/h2&gt;

&lt;p&gt;Gates are binary checks that exist outside the weighted scoring — pass/fail conditions that override everything else. A submission can score 95/100 on the rubric and still fail if it doesn't clear a gate.&lt;/p&gt;

&lt;p&gt;Use gates for non-negotiables: things where "mostly correct" isn't good enough. In the example, &lt;code&gt;no_syntax_errors&lt;/code&gt; and &lt;code&gt;function_signature_matches_spec&lt;/code&gt; are gates — a function that doesn't run, or doesn't match the required signature, shouldn't be scored on style at all.&lt;/p&gt;

&lt;p&gt;Common gate categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it run / compile / execute without error?&lt;/li&gt;
&lt;li&gt;Does it match a required interface or file format?&lt;/li&gt;
&lt;li&gt;Does it avoid prohibited approaches (e.g., "no external libraries")?&lt;/li&gt;
&lt;li&gt;Does it meet a hard legal or safety constraint?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep gates few and unambiguous. Gates that require judgment calls belong in the weighted rubric instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Fund the escrow
&lt;/h2&gt;

&lt;p&gt;This is the step that makes the whole system trustworthy from the worker's side. Once you fund escrow on &lt;a href="https://bounties.verdikta.org" rel="noopener noreferrer"&gt;bounties.verdikta.org&lt;/a&gt;, the payment is locked and can't be quietly withdrawn or renegotiated. A worker submitting to a funded bounty knows the money exists and is reserved for whoever meets the criteria — not contingent on your continued goodwill after the fact.&lt;/p&gt;

&lt;p&gt;Practically, this means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set the bounty amount.&lt;/li&gt;
&lt;li&gt;Deposit funds into escrow when you publish the rubric.&lt;/li&gt;
&lt;li&gt;The funds stay locked until a submission is evaluated.&lt;/li&gt;
&lt;li&gt;On a passing evaluation, payment releases automatically — no manual approval step required, no room for after-the-fact renegotiation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the piece that closes the trust gap discussed earlier. The rubric defines what "good" means; escrow guarantees that meeting it actually results in payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: What happens when submissions arrive
&lt;/h2&gt;

&lt;p&gt;Once your bounty is live and funded, here's the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A worker submits.&lt;/strong&gt; This could be a human, an AI agent, or some hybrid workflow — the bounty doesn't care who or what produced the work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gates are checked first.&lt;/strong&gt; If any must-pass gate fails, the submission is rejected before scoring even begins. No wasted evaluation cycles on disqualified work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weighted scoring runs against the rubric.&lt;/strong&gt; Each criterion gets scored individually, then combined using your weights into a single number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The score is compared to your threshold.&lt;/strong&gt; Above threshold, the submission passes and escrow releases. Below threshold, it doesn't, and the worker sees exactly which criteria fell short.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple submissions, if allowed, get ranked.&lt;/strong&gt; If your bounty accepts multiple attempts, the highest-scoring passing submission wins.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key property here: the evaluation is reproducible. Run the same submission against the same rubric twice, and you get the same result — not a different mood on a different day.&lt;/p&gt;

&lt;h2&gt;
  
  
  A quick checklist before you publish
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Task scoped to a single clear sentence&lt;/li&gt;
&lt;li&gt;[ ] Rubric criteria written in plain, specific language&lt;/li&gt;
&lt;li&gt;[ ] Weights assigned and sum to a clean total (e.g., 100)&lt;/li&gt;
&lt;li&gt;[ ] Threshold set based on realistic expectations&lt;/li&gt;
&lt;li&gt;[ ] Must-pass gates limited to true non-negotiables&lt;/li&gt;
&lt;li&gt;[ ] Escrow funded before publishing&lt;/li&gt;
&lt;li&gt;[ ] Rubric reviewed once more — it won't change after workers start submitting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;The interesting thing about AI-evaluated bounties isn't the AI part — it's that they force you, as the person posting work, to think clearly about what you actually want &lt;em&gt;before&lt;/em&gt; you ask someone else to produce it. Most disputes in freelance work come from ambiguity, not dishonesty. Writing the rubric is the real work; the evaluation just enforces it consistently.&lt;/p&gt;

&lt;p&gt;If you want to try this yourself, head to &lt;a href="https://bounties.verdikta.org" rel="noopener noreferrer"&gt;bounties.verdikta.org&lt;/a&gt; and post a small bounty with a tightly scoped task. Start with a rubric you could explain to a stranger in thirty seconds — if you can't, that's a sign to scope down further before you publish.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>blockchain</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How Verdikta Decides Whether a Bounty Gets Paid — A Plain-Language Guide for Newcomers</title>
      <dc:creator>kurumi</dc:creator>
      <pubDate>Thu, 13 Aug 2026 06:24:43 +0000</pubDate>
      <link>https://dev.to/kurumi_82661ed12516efd1f7/how-verdikta-decides-whether-a-bounty-gets-paid-a-plain-language-guide-for-newcomers-3lli</link>
      <guid>https://dev.to/kurumi_82661ed12516efd1f7/how-verdikta-decides-whether-a-bounty-gets-paid-a-plain-language-guide-for-newcomers-3lli</guid>
      <description>&lt;p&gt;If you have ever browsed a bounty marketplace and wondered what happens between the moment you click "Submit" and the moment you receive (or don't receive) your payout, this article is for you. Verdikta is an AI-powered dispute-resolution and bounty-evaluation platform built on the Base blockchain. Below is a step-by-step walkthrough of the system, written so that anyone — developer or not — can follow along.&lt;br&gt;
The Two Roles: Creator and Hunter&lt;br&gt;
Every Verdikta bounty starts with a creator. The creator does three things:&lt;br&gt;
• Escrows ETH — locks a payout amount into a smart contract so that the money is guaranteed to be there when the bounty closes.&lt;br&gt;
• Writes a rubric — a checklist that tells evaluators exactly what "good work" looks like and how much each aspect matters.&lt;br&gt;
• Sets a pass threshold — a minimum score (for example 80%) that a submission must reach before the escrow is released.&lt;br&gt;
On the other side is the hunter. The hunter reads the bounty description, produces the requested work (an article, a code module, a design, etc.), and submits it through the platform. Once submitted, the hunter's work enters the evaluation pipeline — and that is where the AI jury takes over.&lt;br&gt;
The AI Jury: Multiple Models, One Verdict&lt;br&gt;
Verdikta does not rely on a single opinion. Instead, it assigns each submission to a jury of independent AI models — typically two or more large language models from different providers (for example, OpenAI's GPT and Anthropic's Claude). Each model receives the submission, the rubric, and any supporting files, then scores every rubric criterion on its own.&lt;br&gt;
Why use more than one model? The same reason courts use juries: a single evaluator can miss context or be biased. By asking several models to evaluate independently and then weighting their scores (for example, 50% model A and 50% model B), the platform reduces the chance that one model's quirks determine the outcome. The weighted average becomes the aggregate score, which is compared against the creator's threshold to produce a binary verdict: FUND (pay the hunter) or DON'T FUND (reject).&lt;br&gt;
Understanding the Rubric&lt;br&gt;
The rubric is the heart of every Verdikta bounty. It has two kinds of criteria:&lt;br&gt;
Scored Criteria (Weight &amp;gt; 0)&lt;br&gt;
Each scored criterion carries a weight between 0 and 1, and all weights together sum to 1.0. For example, a bounty might define Clarity (weight 0.30), Technical accuracy (weight 0.40), and Completeness (weight 0.30). Each AI model assigns a score to every criterion. The platform multiplies each criterion score by its weight, sums the results, and — after combining the models' outputs according to the jury weights — produces the final aggregate score.&lt;br&gt;
Must-Pass Gates (Weight = 0)&lt;br&gt;
Some criteria are must-pass gates. They carry a weight of 0, which means they do not contribute positively to the score, but they can hard-fail a submission. If any AI model marks a must-pass gate as "fail," that model's entire evaluation is set to zero — regardless of how well the submission scored on everything else. Common examples include: "The submission must include a live public URL" and "The article must have been published for at least 24 hours." Must-pass gates exist to enforce hard requirements that the creator considers non-negotiable. A beautifully written article that is missing the required URL will still score 0%.&lt;br&gt;
Threshold and Payout&lt;br&gt;
After the AI jury finishes its evaluation, the platform compares the aggregate score to the creator's threshold: if the aggregate score meets or exceeds the threshold, the smart contract releases the escrowed ETH to the hunter's wallet (FUND). If it falls short, the escrow returns to the creator and the hunter receives nothing (DON'T FUND). This entire process is transparent and on-chain. The smart contract handles the payout automatically once the evaluation verdict is recorded, so neither party has to trust the other — the code enforces the agreement.&lt;br&gt;
Why This Matters&lt;br&gt;
Traditional freelance platforms rely on human reviewers, which introduces delays, subjectivity, and disputes. Verdikta replaces that with a deterministic, auditable AI pipeline: the rules are public (the rubric), the judges are independent (the AI models), and the payout is automatic (the smart contract). For hunters, it means fast, fair feedback. For creators, it means you only pay for work that meets your standards.&lt;br&gt;
If you are curious, head to bounties.verdikta.org, browse the open bounties, and try submitting your first entry. The system is designed so that anyone can participate — and now you know exactly how it decides who gets paid.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Bounty Agent for Verdikta on Base L2 published</title>
      <dc:creator>kurumi</dc:creator>
      <pubDate>Sun, 26 Jul 2026 20:16:20 +0000</pubDate>
      <link>https://dev.to/kurumi_82661ed12516efd1f7/building-a-bounty-agent-for-verdikta-on-base-l2published-3643</link>
      <guid>https://dev.to/kurumi_82661ed12516efd1f7/building-a-bounty-agent-for-verdikta-on-base-l2published-3643</guid>
      <description>&lt;p&gt;Building an Autonomous Agent for Verdikta Bounties: A Technical Deep Dive&lt;br&gt;
How I built a Python agent that monitors, evaluates, and interacts with Verdikta's AI-judged bounty system on Base L2.&lt;/p&gt;

&lt;p&gt;Why Build a Bounty Agent?&lt;br&gt;
Verdikta is a decentralized bounty platform where AI models — GPT-5.2 and Claude Sonnet 4.5 — evaluate submissions and release ETH payments automatically via smart contracts. No human reviewers. No manual payouts. Just code.&lt;/p&gt;

&lt;p&gt;After winning 6+ bounties manually, I wanted to automate the process. The goal: an agent that watches for new bounties, evaluates which ones are worth pursuing, and integrates with Verdikta's API to read data and submit work.&lt;/p&gt;

&lt;p&gt;Architecture&lt;br&gt;
The agent has four components:&lt;/p&gt;

&lt;p&gt;copy&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
verdikta_agent.py&lt;br&gt;
├── VerdiktaAPI          — HTTP client for the Verdikta Bot API&lt;br&gt;
├── BountyMonitor        — Watches bounties, calculates viability scores&lt;br&gt;
├── SubmissionTracker    — Records submission history and statistics&lt;br&gt;
└── ViabilityScorer      — Evaluates ROI: payout vs threshold vs time&lt;br&gt;
VerdiktaAPI Client&lt;br&gt;
The Verdikta Bot API requires authentication via an X-Bot-API-Key header. You register your bot at POST /api/bots/register to get a key.&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
class VerdiktaAPI:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, api_key=None):&lt;br&gt;
        self.session = requests.Session()&lt;br&gt;
        if api_key:&lt;br&gt;
            self.session.headers["X-Bot-API-Key"] = api_key&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def get_bounty(self, bounty_id):
    resp = self.session.get(f"{API_BASE}/jobs/{bounty_id}")
    resp.raise_for_status()
    return resp.json()

def submit_work(self, bounty_id, content):
    return self.session.post(
        f"{API_BASE}/jobs/{bounty_id}/submit",
        json={"content": content}
    ).json()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Key endpoints:&lt;/p&gt;

&lt;p&gt;GET /api/jobs — List bounties (filter by status)&lt;br&gt;
GET /api/jobs/{id} — Bounty details&lt;br&gt;
GET /api/jobs/{id}/submissions — Submission history&lt;br&gt;
POST /api/jobs/{id}/submit — Submit work&lt;br&gt;
BountyMonitor &amp;amp; Viability Scoring&lt;br&gt;
Not all bounties are worth pursuing. The agent calculates a viability score:&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
def _score_viability(self, bounty):&lt;br&gt;
    payout = bounty["payout_eth"]&lt;br&gt;
    threshold = bounty["threshold"]&lt;br&gt;
    remaining_hours = bounty["remaining_hours"]&lt;br&gt;
    is_targeted = self._is_targeted_to_me(bounty)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Higher threshold = harder = lower viability
difficulty = {92: 0.3, 88: 0.6, 85: 0.8}.get(threshold, 1.0)

# Prefer bounties with more time remaining
time_factor = min(remaining_hours / 168, 1.0)

# Targeted bounties = only you can submit
targeted_bonus = 1.5 if is_targeted else 1.0

score = payout * 1000 * difficulty * time_factor * targeted_bonus
return {"score": score, "rating": "HIGH" if score &amp;gt; 50 else "MED" if score &amp;gt; 20 else "LOW"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This catches the key insight: a 0.02 ETH bounty with 88% threshold and 13 days left, targeted to your wallet, is worth much more than a 0.002 ETH open bounty with 92% threshold expiring tomorrow.&lt;/p&gt;

&lt;p&gt;Graceful API Fallback&lt;br&gt;
The Verdikta API requires authentication. During development I didn't always have a valid key. The agent falls back to hardcoded bounty data when the API returns 401:&lt;/p&gt;

&lt;p&gt;Python&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
try:&lt;br&gt;
    bounty = self.api.get_bounty(bounty_id)&lt;br&gt;
except requests.HTTPError:&lt;br&gt;
    bounties = self._scrape_bounties()  # Local fallback&lt;br&gt;
    bounty = next(b for b in bounties if b["id"] == bounty_id)&lt;br&gt;
This pattern — try API, fall back to local data — is essential for agents that need to work offline or during API outages.&lt;/p&gt;

&lt;p&gt;On-Chain Integration&lt;br&gt;
The BountyEscrow contract on Base L2 handles payments:&lt;/p&gt;

&lt;p&gt;copy&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
Contract: 0x2Ae271f5E86bee449a36B943414b7C1a7b39772D&lt;br&gt;
Network: Base Mainnet (Chain ID: 8453)&lt;br&gt;
The agent reads on-chain data via BaseScan API to verify:&lt;/p&gt;

&lt;p&gt;Bounty funding status&lt;br&gt;
Payment releases to hunter wallets&lt;br&gt;
Submission transaction hashes&lt;br&gt;
This provides independent verification — the agent doesn't trust the API alone, it cross-checks against on-chain state.&lt;/p&gt;

&lt;p&gt;CLI Interface&lt;br&gt;
The agent uses argparse with rich for formatted output:&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  List open bounties with viability scores
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --list&lt;/p&gt;

&lt;h1&gt;
  
  
  Check specific bounty
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --check 157&lt;/p&gt;

&lt;h1&gt;
  
  
  Monitor mode (checks every 30 minutes)
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --monitor&lt;/p&gt;

&lt;h1&gt;
  
  
  View submission history
&lt;/h1&gt;

&lt;p&gt;python verdikta_agent.py --history&lt;br&gt;
Example output:&lt;/p&gt;

&lt;p&gt;copy&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
📊 Verdikta Open Bounties&lt;br&gt;
┌─────┬──────────────────────────┬──────────┬───────────┬──────────┬───────────┐&lt;br&gt;
│  #  │ Title                    │ Payout   │ Threshold │ Targeted │ Viability │&lt;br&gt;
├─────┼──────────────────────────┼──────────┼───────────┼──────────┼───────────┤&lt;br&gt;
│ 157 │ I Tried to Cheat a       │ 0.02 ETH │ 88%       │ ✅ You   │ HIGH ⭐   │&lt;br&gt;
│ 158 │ Build an Agent           │ 0.02 ETH │ 88%       │ ✅ You   │ HIGH ⭐   │&lt;br&gt;
│ 160 │ Reddit AMA Post          │ 0.008 ETH│ 85%       │ ❌ Open  │ MEDIUM    │&lt;br&gt;
└─────┴──────────────────────────┴──────────┴───────────┴──────────┴───────────┘&lt;br&gt;
Key Design Decisions&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Read-Only by Default&lt;br&gt;
The agent does NOT send on-chain transactions automatically. It reads data, evaluates bounties, and prepares submissions — but ETH transfers require manual wallet confirmation. This is a safety feature: losing 0.02 ETH to a bad auto-submission isn't worth the automation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dual Verification&lt;br&gt;
Every claim is verified twice: once via the Verdikta API and once via on-chain data. If the two disagree, the agent flags the discrepancy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Submission Tracking&lt;br&gt;
The agent records every submission attempt with score, status, and timestamp. Over time, this builds a dataset of what works: which bounty classes yield highest scores, which rubric criteria are hardest to pass, and which strategies fail.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I Learned Building This&lt;br&gt;
The Verdikta API Is Bot-Friendly&lt;br&gt;
The X-Bot-API-Key authentication pattern is clean. Register once, use the key forever. The API returns structured JSON that's easy to parse. This is how bounty platforms should work.&lt;/p&gt;

&lt;p&gt;Viability Scoring Saves Time&lt;br&gt;
Not every 0.002 ETH bounty is worth 3 hours of work. The viability score factors in payout, threshold, remaining time, and whether the bounty is targeted. This turned a manual "should I try this?" into an automated decision.&lt;/p&gt;

&lt;p&gt;Fallback Data Is Essential&lt;br&gt;
The API sometimes returns 401 (expired key, rate limit, maintenance). Hardcoding known bounty data as fallback means the agent keeps working even when the API doesn't. This is a pattern I'll use in every API-dependent agent going forward.&lt;/p&gt;

&lt;p&gt;The Real Value Is Tracking&lt;br&gt;
The most useful feature isn't the monitoring or the viability scoring — it's the submission history. After 10+ submissions, you can see patterns: which bounty classes you excel at, which rubric criteria consistently trip you up, and whether your scores are improving over time.&lt;/p&gt;

&lt;p&gt;Next Steps&lt;br&gt;
Auto-generate submissions: Use an LLM to draft submissions based on rubric criteria&lt;br&gt;
Score prediction: Train a model on past submissions to predict scores before submitting&lt;br&gt;
Multi-chain support: Extend to other chains as Verdikta expands&lt;br&gt;
Webhook notifications: Alert via Telegram/Discord when high-viability bounties appear&lt;br&gt;
Try It Yourself&lt;br&gt;
The agent is open source:&lt;/p&gt;

&lt;p&gt;GitHub: github.com/s97472091-pixel/verdikta-agent&lt;/p&gt;

&lt;p&gt;Bash&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
git clone &lt;a href="https://github.com/s97472091-pixel/verdikta-agent.git" rel="noopener noreferrer"&gt;https://github.com/s97472091-pixel/verdikta-agent.git&lt;/a&gt;&lt;br&gt;
cd verdikta-agent&lt;br&gt;
pip install -r requirements.txt&lt;br&gt;
python verdikta_agent.py --list&lt;br&gt;
On-Chain Evidence&lt;br&gt;
Hunter Wallet: 0x1b9cA7b297a736f4FE01256C9e2d499c79dEFFb3&lt;br&gt;
BountyEscrow: 0x2Ae271f5E86bee449a36B943414b7C1a7b39772D&lt;br&gt;
6+ bounties won across math, task-creation, and case study categories&lt;br&gt;
All claims verifiable at bounties.verdikta.org&lt;br&gt;
Code at github.com/s97472091-pixel/verdikta-agent&lt;/p&gt;

</description>
      <category>agents</category>
      <category>crypto</category>
      <category>python</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
