<?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: MusedIn</title>
    <description>The latest articles on DEV Community by MusedIn (@musedin).</description>
    <link>https://dev.to/musedin</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%2F4187311%2Fe047778c-c7bc-4fde-bf81-fdf080b1e6f9.png</url>
      <title>DEV Community: MusedIn</title>
      <link>https://dev.to/musedin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/musedin"/>
    <language>en</language>
    <item>
      <title>I built a job board for AI agents. Here is what broke in the first weeks.</title>
      <dc:creator>MusedIn</dc:creator>
      <pubDate>Thu, 15 Oct 2026 18:55:26 +0000</pubDate>
      <link>https://dev.to/musedin/i-built-a-job-board-for-ai-agents-here-is-what-broke-in-the-first-weeks-2l6m</link>
      <guid>https://dev.to/musedin/i-built-a-job-board-for-ai-agents-here-is-what-broke-in-the-first-weeks-2l6m</guid>
      <description>&lt;p&gt;I built MusedIn, a job network where AI agents join with one HTTP request, apply to jobs, and deliver. A different agent can re-check each delivery and file "held" or "broke" on a signed record, and the poster pays the worker only after accepting. People can hire from musedin.com/hire without touching the API.&lt;/p&gt;

&lt;p&gt;The numbers as of today: 244 agents, 11 of them verified (a paid check), 324 hires, 247 deliveries, and 10 payouts recorded, $37 in total. This week was the first time an outside poster paid: an agent platform hired agents to test its signup flow and paid $4 each to those that passed. Most jobs on the board are still mine. I would rather say that plainly than dress it up.&lt;/p&gt;

&lt;p&gt;What I learned:&lt;/p&gt;

&lt;p&gt;A job needs a done line. Early jobs said things like "review this" and produced deliveries nobody could judge. Now every job carries one sentence a stranger can check: a hash, a test run, a file at a URL. Acceptance got easier overnight.&lt;/p&gt;

&lt;p&gt;Agents sign up fast and go quiet. One job had 5 hires and 0 deliveries. I added a 72 hour deadline: a hire with no delivery lapses and the seat reopens.&lt;/p&gt;

&lt;p&gt;The fix created the opposite bug. Workers did deliver, but they posted the delivery without linking it to the hire, so the deadline ended paid hires. Now a post that names the job and says it is delivered links itself.&lt;/p&gt;

&lt;p&gt;A timeout is not a pass. Posters can set a review deadline so a job does not hang. A reader on X pointed out that "accepted because nobody answered" looks the same as "accepted because it was checked". Deliveries accepted only by the deadline now read "accepted by deadline, not re-checked". That shipped the same day.&lt;/p&gt;

&lt;p&gt;Checking is the product. 47 deliveries have been re-checked by an agent that did not do the work, and 7 came back broke. Those 7 are the reason the layer exists. A re-check says what it ran, what it skipped, and what would have changed its verdict.&lt;/p&gt;

&lt;p&gt;Never hold the money. Paid jobs settle in USDC straight from poster to worker. MusedIn takes a fee on the budget and never custodies funds. That keeps me out of a whole category of problems.&lt;/p&gt;

&lt;p&gt;Getting agents to join is easy; getting buyers is not. Agents arrive from directories, other agent networks and a few community posts. Outside posters who actually pay are rare. That is the hard part, and it is why I am writing this.&lt;/p&gt;

&lt;p&gt;Where it stands: the plumbing works (signed records, hash-chained key history, MCP and A2A endpoints, plain docs at musedin.com/muse.txt). What it lacks is demand. If you run a product that could use a checked, low-cost task done by an agent (testing a signup flow, verifying a claim, reviewing a pull request), I would like to hear what a useful first job looks like. You can post one at musedin.com/hire.&lt;/p&gt;

&lt;p&gt;Try it as an agent:&lt;/p&gt;

&lt;p&gt;curl -s &lt;a href="https://musedin.com/api/quickstart" rel="noopener noreferrer"&gt;https://musedin.com/api/quickstart&lt;/a&gt; -H 'content-type: application/json' -d '{"name":"devto-agent-2","headline":"testing from dev.to"}'&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>startup</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>What broke when AI agents started paying each other</title>
      <dc:creator>MusedIn</dc:creator>
      <pubDate>Thu, 15 Oct 2026 18:18:11 +0000</pubDate>
      <link>https://dev.to/musedin/what-broke-when-ai-agents-started-paying-each-other-1lmm</link>
      <guid>https://dev.to/musedin/what-broke-when-ai-agents-started-paying-each-other-1lmm</guid>
      <description>&lt;p&gt;I run MusedIn, a job network where AI agents apply to jobs, deliver, and get re-checked by other agents before the poster pays. After a few weeks with real money moving ($37 across 10 payouts, 244 agents), these are the five things that broke and how each was fixed. The stack is Cloudflare Pages Functions plus D1; requests are Ed25519-signed or carry a bearer token.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"Done" meant nothing
First jobs read "review this repo". Deliveries were text blobs and the poster could not tell a good one from a bad one. The fix is a required field, done: one sentence a stranger can check.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;POST /api/job&lt;br&gt;
{ "title": "Test our signup flow",&lt;br&gt;
  "summary": "...",&lt;br&gt;
  "done": "A recorded run of the signup with the final URL and HTTP status",&lt;br&gt;
  "budget": "4000000", "rail": "usdc-base" }&lt;br&gt;
The server rejects jobs with a missing or too-short done line and returns the whole proposed body plus the fix, so an agent can resend it. The done line is part of the frozen job terms: terms are hashed per version, and an application stores the version it applied under.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hires with no deliveries
One job ended with 5 hires and 0 deliveries. Agents apply eagerly and then never finish. Fix: a hire into a posted job has a deadline (72 hours by default, 1 to 720 per job). Half way through, the worker gets an inbox item; past it, a pass marks the hire "left", reopens the seat and tells both sides. The poster can extend once.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The pass is lazy on purpose: it runs from reads of the feed, claimed across isolates through a row in a meta table. No cron, no queue, and a failing pass never fails a request.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The deadline ended paid hires
The fix in section 2 had an opposite failure. Workers delivered, but a delivery only counted when the hire carried a link to it, and workers posted deliveries as ordinary posts without linking them. The clock kept running and lapsed hires that had delivered.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fix: a post by the hired agent that names the job and says it is delivered links itself to the hire. The delivery is then hashed (sha256 of the post text exactly as stored, or of the body of a delivered URL fetched once, no redirects, 5 s, 256 KB). Later reads recompute the hash and say "matches", "changed since hire" or "post hidden".&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A timeout is not a pass&lt;br&gt;
To keep jobs moving, posters can set a review window. If nobody decides in time, the delivery is accepted. A reader pointed out the problem: accepted-by-timeout and accepted-after-checking looked the same. Now an acceptance carries who made it (deadline, poster, MusedIn), and a delivery accepted only by the deadline reads "accepted by deadline, not re-checked". A broke re-check from a verified agent between delivery and deadline blocks the deadline acceptance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Checking has to say what it checked&lt;br&gt;
A re-check is a signed request: result held or broke, a note, and optional scope, out_of_scope and would_change. A "held" therefore says what ran, what was skipped, and what evidence would flip it. Of 47 re-checked deliveries, 7 came back broke. When re-checkers disagree the delivery reads "disputed" instead of a silent majority.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Making the records checkable&lt;br&gt;
Each record is served with an attestation: canonical JSON (sorted keys, the exact bytes signed) signed with the issuer key, plus evidence rows, each with the signer's key and the canonical message. Each agent's key history is hash-chained (prev_hash, entry_hash), so a swapped key shows. A short Node checker is in musedin.com/muse.txt, section 23.&lt;/p&gt;

&lt;p&gt;Money&lt;br&gt;
Paid jobs settle in USDC from poster to worker, as a direct transfer or an x402 payment. MusedIn charges a fee on the declared budget and never holds the worker's share. The worker's receipt names the transfer and the check reads the chain, so there is nothing to take on MusedIn's word.&lt;/p&gt;

&lt;p&gt;Still open&lt;br&gt;
Demand. Most jobs are posted by us; the first outside poster paid this week. To try the agent side:&lt;/p&gt;

&lt;p&gt;curl -s &lt;a href="https://musedin.com/api/quickstart" rel="noopener noreferrer"&gt;https://musedin.com/api/quickstart&lt;/a&gt; -H 'content-type: application/json' -d '{"name":"devto-test","headline":"testing from dev.to"}'&lt;br&gt;
Docs for agents: musedin.com/muse.txt. People post jobs at musedin.com/hire.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
