<?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: Oroboro Labs</title>
    <description>The latest articles on DEV Community by Oroboro Labs (@oroborolabs).</description>
    <link>https://dev.to/oroborolabs</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%2F4100239%2Fefee681e-7c71-43e9-8671-806043914108.png</url>
      <title>DEV Community: Oroboro Labs</title>
      <link>https://dev.to/oroborolabs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oroborolabs"/>
    <language>en</language>
    <item>
      <title>Our agent quoted R$60,000 instead of R$600. What the audit found.</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 18:13:26 +0000</pubDate>
      <link>https://dev.to/oroborolabs/our-agent-quoted-r60000-instead-of-r600-what-the-audit-found-29o5</link>
      <guid>https://dev.to/oroborolabs/our-agent-quoted-r60000-instead-of-r600-what-the-audit-found-29o5</guid>
      <description>&lt;p&gt;We run a small automation studio where most first contact with clients happens&lt;br&gt;
through an agent: it reads project feeds, drafts proposals, and sends them. A&lt;br&gt;
human reviews the results later. That setup is cheap and fast — and last week it&lt;br&gt;
produced the most expensive-looking quote we ever sent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The proposal went out as R$ 60,000. The work was quoted at R$ 600.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the dashboard showed
&lt;/h2&gt;

&lt;p&gt;The proposal read: &lt;em&gt;Oferta: R$ 60.000,00 · Oferta Final: R$ 75.000,00&lt;/em&gt;. One&lt;br&gt;
zero too many, and then a 25% markup on top of it. The client received a system&lt;br&gt;
message announcing a five-figure e-commerce fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;Two independent defects, compounding:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A typing error in the numeric field.&lt;/strong&gt; 600 became 60000. No guard caught
it, because the form accepted any positive number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The ×1.25 display anomaly we've documented before.&lt;/strong&gt; Across five separate
measurements — including our own dashboard — a value typed into the offer
field renders to the client as 1.25× in a second, "final" field. 600 showed
as 750. 900 showed as 1.125. So the error didn't just survive; it got
dressed up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neither defect is exotic. That's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix, in the order that mattered
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correct in public, fast.&lt;/strong&gt; The agent sent a follow-up message in the same
thread: the number was a filling error, the real quote is R$ 600, apologies,
offer to cancel and resubmit. A corrected quote costs one message. A client
who discovered it themselves costs the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sanity-band the numeric fields.&lt;/strong&gt; Any quote outside a plausible band for
the project's budget range now blocks the send instead of warning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compensate deliberately, not implicitly.&lt;/strong&gt; For the 1.25 rendering, the
agent now types &lt;em&gt;value ÷ 1.25&lt;/em&gt; when the target is a net number — and marks
client-facing figures as measured, not assumed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The general rule
&lt;/h2&gt;

&lt;p&gt;An agent that can execute a transaction can execute your mistakes at the same&lt;br&gt;
speed. Every numeric field that reaches a human being needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a sanity band, not just a type check;&lt;/li&gt;
&lt;li&gt;a rendered-value preview (what the &lt;em&gt;client&lt;/em&gt; will see, not what was typed);&lt;/li&gt;
&lt;li&gt;a human-readable number in the confirmation step — "six hundred reais",
not "600".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The R$ 60,000 quote was never accepted. It didn't need to be. The lesson was&lt;br&gt;
already fully delivered the moment the client saw it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We build this stack in the open: &lt;a href="https://github.com/oroborolabs/x125-display-calculator" rel="noopener noreferrer"&gt;x125-display-calculator&lt;/a&gt; — a free, single-file, in-browser calculator for the ×1.25 display-space problem, plus more write-ups on our &lt;a href="https://oroborolabs.github.io/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelancing</category>
      <category>pricing</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>We open-sourced the display-price calculator (free, one HTML file)</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 16:39:38 +0000</pubDate>
      <link>https://dev.to/oroborolabs/we-open-sourced-the-display-price-calculator-free-one-html-file-497h</link>
      <guid>https://dev.to/oroborolabs/we-open-sourced-the-display-price-calculator-free-one-html-file-497h</guid>
      <description>&lt;p&gt;We open-sourced the display-price calculator (free, one HTML file, no backend)&lt;/p&gt;

&lt;p&gt;Two weeks of live bidding on a freelance marketplace kept producing the same&lt;br&gt;
weird moment: we submit one number, the client sees a bigger one. In our&lt;br&gt;
sample the client's "final price" read about 25% above what we typed —&lt;br&gt;
a display wedge, not a negotiation.&lt;/p&gt;

&lt;p&gt;Pricing in display space while the client compares in submitted space (or the&lt;br&gt;
reverse) quietly moves every bid you send. So we turned the fix into a tool&lt;br&gt;
and &lt;strong&gt;open-sourced it&lt;/strong&gt;: &lt;a href="https://github.com/oroborolabs/x125-display-calculator" rel="noopener noreferrer"&gt;oroborolabs/x125-display-calculator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type the price you want the client to see&lt;/li&gt;
&lt;li&gt;Set the multiplier (default ×1,25)&lt;/li&gt;
&lt;li&gt;Get the number to actually submit — and the reverse direction too&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One HTML file. Client-side only: no backend, no telemetry, no account. MIT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honesty label (read this part)&lt;/strong&gt;&lt;br&gt;
The ×1,25 default is a wedge &lt;em&gt;we measured on one marketplace across multiple&lt;br&gt;
live negotiations&lt;/em&gt;. It is our measurement, not a confirmed constant. The&lt;br&gt;
calculator says so inline, and the README tells you to run a test bid before&lt;br&gt;
trusting it on anything that matters. A tool that pretends its default is a&lt;br&gt;
law of nature would be a mispricing machine with better branding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Field notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why the wedge exists and how we measured it: &lt;a href="https://oroborolabs.github.io/posts/pricing-tool-display-calculator.html" rel="noopener noreferrer"&gt;the ×1,25 anomaly&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;What it looked like in a live negotiation — a client bargained against a number we never typed: &lt;a href="https://oroborolabs.github.io/posts/negotiating-display-space.html" rel="noopener noreferrer"&gt;negotiating in display space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A 10-minute audit checklist to find the wedge on any marketplace: &lt;a href="https://oroborolabs.github.io/posts/display-audit-checklist.html" rel="noopener noreferrer"&gt;display audit checklist&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Live tool: &lt;a href="https://oroborolabs.github.io/x125-display-calculator/" rel="noopener noreferrer"&gt;https://oroborolabs.github.io/x125-display-calculator/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it saves you one mispriced contract, our paid work lives at&lt;br&gt;
&lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;oroborolabs.gumroad.com&lt;/a&gt; — and the&lt;br&gt;
repo itself is the pitch: agents doing real work, reporting real numbers.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>freelancing</category>
      <category>pricing</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Negotiating in display space: the day a client bargained against a number we never typed</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 16:16:44 +0000</pubDate>
      <link>https://dev.to/oroborolabs/negotiating-in-display-space-the-day-a-client-bargained-against-a-number-we-never-typed-597g</link>
      <guid>https://dev.to/oroborolabs/negotiating-in-display-space-the-day-a-client-bargained-against-a-number-we-never-typed-597g</guid>
      <description>&lt;p&gt;Earlier this week we &lt;a href="https://oroborolabs.github.io/posts/the-x1.25-anomaly-marketplace-display.html" rel="noopener noreferrer"&gt;reported a display anomaly&lt;/a&gt; in our freelance funnel: every offer our AI agent submits gets recorded and shown at 25% above the value we typed. A R$700 proposal reads back as R$875. We published a &lt;a href="https://oroborolabs.github.io/posts/display-audit-checklist.html" rel="noopener noreferrer"&gt;six-check audit checklist&lt;/a&gt; for any marketplace like this. Today the anomaly stopped being a curiosity: for the first time, a client opened a negotiation against the inflated number.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened, with the numbers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Our agent submitted a fixed-price proposal: &lt;strong&gt;R$700&lt;/strong&gt;, paid through the platform. That is the only number we ever typed.&lt;/li&gt;
&lt;li&gt;The platform's own records of that proposal show &lt;strong&gt;R$875&lt;/strong&gt; — a measured multiplier of 1.25 on the display and record side. (An earlier audit also caught one outlier row at 100×, which is why the checklist clamps anything above 2× as a display fault.)&lt;/li&gt;
&lt;li&gt;Hours later the client replied asking to &lt;em&gt;adjust the value&lt;/em&gt;. Whatever anchor she is negotiating from, it cannot be R$700 — that number exists nowhere on her side of the interface. The only price she has ever been shown is in display space.&lt;/li&gt;
&lt;li&gt;We checked whether the sent proposal could be edited to close the gap. It cannot: the platform allows canceling a sent proposal, not editing it. Any "adjusted value" means a cancel-and-resend — which itself re-enters display space at whatever multiplier the platform applies that day.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The rule that fell out of it
&lt;/h2&gt;

&lt;p&gt;Check 5 of the audit says: if the display consistently shows &lt;code&gt;D = k·V&lt;/code&gt;, decide anchors in D-space — to land a client-facing T, submit &lt;code&gt;T/k&lt;/code&gt;, with &lt;code&gt;k&lt;/code&gt; labeled &lt;em&gt;measured&lt;/em&gt; or &lt;em&gt;assumed&lt;/em&gt;. Today added a second half that no static audit produces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In any reply to a counterparty, name your own number in submitted-space and say it in words.&lt;/strong&gt; Not because display math is wrong — because you cannot verify which number the other side is reading, and the only channel you control is the sentence. Our reply states the fixed value, offers to re-send the proposal at whatever figure fits the client's budget, and never references the multiplier. The mechanism behind the wedge is &lt;a href="https://oroborolabs.github.io/posts/the-x1.25-anomaly-marketplace-display.html" rel="noopener noreferrer"&gt;unconfirmed&lt;/a&gt;; telling the client "your screen lies" would be accusing them of our unverified hypothesis, in their vendor's voice. That conversation belongs to the platform, not to us.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this costs and what it changes
&lt;/h2&gt;

&lt;p&gt;Cost: one extra sentence per negotiation reply. Changes: our agent now treats every client-facing price conversation as bilingual — submitted-space (what we control) and display-space (what they see) — and only ever quotes in the first while negotiating around the second. Before the audit, this negotiation would have been a confusion. Now it is a known wedge with a known workaround: ask for the client's target figure, re-anchor it in submitted-space, resend.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Honest scope:&lt;/strong&gt; the 1.25 multiplier is measured on our side — submitted values vs. the platform's own records and displays. We have no access to the client's screen; that her anchor is the displayed figure is inference from the conversation, not an observation, and we label it as such. The mechanism (a fee, a currency layer, a display bug) is unconfirmed. Client identifying details are omitted on purpose.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your agents bid on a two-sided marketplace, run the &lt;a href="https://oroborolabs.github.io/posts/display-audit-checklist.html" rel="noopener noreferrer"&gt;display audit&lt;/a&gt; before the first negotiation, not after. And if you want to do the division yourself, the &lt;a href="https://oroborolabs.github.io/price-display-calculator.html" rel="noopener noreferrer"&gt;×1.25 display calculator&lt;/a&gt; is free, in-browser, and submits nothing anywhere.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We build AI agent swarms that do real work and report real numbers. Our Obsidian vault template built for agents: &lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelancing</category>
      <category>negotiation</category>
      <category>ai</category>
      <category>pricing</category>
    </item>
    <item>
      <title>The 10-minute display audit: a checklist for any marketplace your agent bids on</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 15:51:22 +0000</pubDate>
      <link>https://dev.to/oroborolabs/the-10-minute-display-audit-a-checklist-for-any-marketplace-your-agent-bids-on-49a3</link>
      <guid>https://dev.to/oroborolabs/the-10-minute-display-audit-a-checklist-for-any-marketplace-your-agent-bids-on-49a3</guid>
      <description>&lt;p&gt;Yesterday our AI agent swarm found that a freelance marketplace displays every one of our submitted offers at exactly 25% above what we typed — and one row at 100× (&lt;a href="https://oroborolabs.github.io/posts/the-x1.25-anomaly-marketplace-display.html" rel="noopener noreferrer"&gt;field report here&lt;/a&gt;). The finding cost one page read, done twice. This post is the generalized version: the checklist we now run on &lt;em&gt;any&lt;/em&gt; two-sided marketplace before letting an agent optimize anything on it. Six checks, each producing a number you can write down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "display" and not "data"
&lt;/h2&gt;

&lt;p&gt;An agent that bids, lists, or negotiates on a marketplace sees the world through that platform's rendering. If the rendering differs by side — bidder vs. counterparty, seller vs. buyer — then every downstream optimization (pricing, discounting, anchoring) is tuned against the wrong number. The audit exists to diff &lt;strong&gt;what we submitted&lt;/strong&gt; against &lt;strong&gt;what is displayed&lt;/strong&gt;, before any strategy work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Round-trip the number.&lt;/strong&gt; Submit a value V (any real action you were going to take anyway). Read back every place the platform shows a price for it. Record each displayed value D and compute D/V. Do it twice, hours apart, and keep both readings — a display bug that flips between reads is its own finding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clamp before you trust.&lt;/strong&gt; Any displayed value more than 2× the submitted one is treated as a display fault: logged, excluded from strategy, with the submitted value kept as source of truth. Our ×100 row (600 → 60,000) is the case this rule exists for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diff the sides, not just the numbers.&lt;/strong&gt; Where you can legitimately see the counterparty-facing surface (a preview mode, a second test account, a public listing page), compare it to yours. If you can't, say so in your notes — "unmeasured" is a valid state; "confirmed" without access is not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check status labels against behavior.&lt;/strong&gt; Open/closed, exclusive/public, countdown timers. On one platform our agent now re-confirms on the project page immediately before every submission, because a listing that said "opens at 09:23" opened at a different time. A label is a claim; a button's presence is a measurement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write the multiplier into pricing.&lt;/strong&gt; If the display consistently shows D = k·V, decide anchors in D-space: to land a client-facing T, submit T/k. Keep k in one config with a label stating whether it is &lt;em&gt;measured&lt;/em&gt; or &lt;em&gt;assumed&lt;/em&gt;. Ours is measured on the display and &lt;a href="https://oroborolabs.github.io/posts/the-x1.25-anomaly-marketplace-display.html" rel="noopener noreferrer"&gt;unconfirmed on the mechanism&lt;/a&gt; — both facts in the same sentence, always.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule the re-audit.&lt;/strong&gt; Display behavior is a platform decision, not a law of nature. Re-run checks 1 and 2 after any platform announcement, UI change, or once a quarter, whichever comes first. An audit is a date, not a document.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What it costs and what it catches
&lt;/h2&gt;

&lt;p&gt;Cost, measured on our own funnel: two page reads plus a minute of arithmetic — roughly ten minutes for the first pass. Catch, also measured: a 25% wedge between our input and the visible price, plus a 100× fault that any automated price scraper would have recorded as real. Compare that to the cost of discovering it after negotiating a month of work against the wrong anchor.&lt;/p&gt;

&lt;p&gt;Honest-scope note: this checklist audits &lt;em&gt;displays we can see&lt;/em&gt;. It cannot see the counterparty's screen, and it does not confirm why a platform multiplies or reinterprets a number. Where we write "measured," it is measured; where we write "likely," it is a hypothesis — we keep the two apart on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling
&lt;/h2&gt;

&lt;p&gt;If you found a multiplier on your platform and want to price in display-space, we shipped a free in-browser calculator that does the division and labels the multiplier's evidence status: &lt;a href="https://oroborolabs.github.io/price-display-calculator.html" rel="noopener noreferrer"&gt;the ×1.25 display calculator&lt;/a&gt;. No account, no server, nothing submitted anywhere.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We build AI agent swarms that do real work and report real numbers. Our Obsidian vault template built for agents: &lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>marketplace</category>
      <category>aiagents</category>
      <category>automation</category>
    </item>
    <item>
      <title>We shipped the x1.25 fix as a calculator (free, in-browser)</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 15:27:40 +0000</pubDate>
      <link>https://dev.to/oroborolabs/we-shipped-the-x125-fix-as-a-calculator-free-in-browser-2h7l</link>
      <guid>https://dev.to/oroborolabs/we-shipped-the-x125-fix-as-a-calculator-free-in-browser-2h7l</guid>
      <description>&lt;p&gt;Yesterday we published a &lt;a href="https://oroborolabs.github.io/posts/the-x1.25-anomaly-marketplace-display.html" rel="noopener noreferrer"&gt;field report&lt;/a&gt; with a measurement: on the freelance marketplace our agent swarm bids on, the proposals panel showed &lt;strong&gt;all 8 of our sent offers at exactly ×1.25&lt;/strong&gt; the submitted value (plus one row at ×100, treated as a display fault).&lt;/p&gt;

&lt;p&gt;The cause is unconfirmed. The &lt;em&gt;asymmetry&lt;/em&gt; is not: whatever the platform is doing, the number being judged is measurably not the number we typed.&lt;/p&gt;

&lt;p&gt;So today we shipped the fix as a &lt;strong&gt;&lt;a href="https://oroborolabs.github.io/price-display-calculator.html" rel="noopener noreferrer"&gt;free, in-browser calculator&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You type the price you want the client to &lt;strong&gt;see&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You set the display multiplier &lt;strong&gt;you measured on your own platform&lt;/strong&gt; (default: our 1.25)&lt;/li&gt;
&lt;li&gt;It returns the amount to &lt;strong&gt;submit&lt;/strong&gt; — target ÷ multiplier, down to the cent&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why there is no backend
&lt;/h2&gt;

&lt;p&gt;One static HTML file. The math runs in JavaScript in your browser — no form, no fetch, no server, no log. We can't see your numbers even if we wanted to. &lt;code&gt;target ÷ multiplier&lt;/code&gt; is eight characters of math; shipping it with a backend would add a data trail for zero value.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honesty label travels with the tool
&lt;/h2&gt;

&lt;p&gt;The page states that ×1.25 is &lt;em&gt;our measurement on one platform on one day&lt;/em&gt;, that the commission explanation is unconfirmed, and that the correct workflow is to send a small test bid and measure &lt;strong&gt;your&lt;/strong&gt; multiplier before trusting the default. A tool that hides its own uncertainty is a liability; we publish the caveat inline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The general pattern
&lt;/h2&gt;

&lt;p&gt;An agent that operates a two-sided platform should &lt;strong&gt;first&lt;/strong&gt; diff what it sent against what the interface shows, &lt;strong&gt;then&lt;/strong&gt; optimize anything. The diff is one page read. Ours found a 25% wedge between our price and the price being evaluated — and became a measurement, a rule, and now a tool, all inside one day.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We're Oroboro Labs — AI agent swarms doing real work and publishing real numbers. Our Obsidian-vault-for-agents starter is &lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;on Gumroad&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelancing</category>
      <category>pricing</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>The 1.25 anomaly: the price your client sees is not the price you sent</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 15:09:16 +0000</pubDate>
      <link>https://dev.to/oroborolabs/the-x125-anomaly-the-price-your-client-sees-is-not-the-price-you-sent-2a21</link>
      <guid>https://dev.to/oroborolabs/the-x125-anomaly-the-price-your-client-sees-is-not-the-price-you-sent-2a21</guid>
      <description>&lt;p&gt;On the day our AI agent swarm sent its first 8 proposals on a Brazilian freelance marketplace, the account panel had a surprise: every proposal appeared under &lt;em&gt;Oferta Final&lt;/em&gt; ("final offer") showing a number &lt;strong&gt;exactly 25% higher&lt;/strong&gt; than the offer we actually submitted. And one row didn't stop there — it showed &lt;strong&gt;100×&lt;/strong&gt; the real value.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measurement
&lt;/h2&gt;

&lt;p&gt;Method: read every row of the "my proposals" panel, compare &lt;em&gt;Oferta&lt;/em&gt; (what we typed) vs &lt;em&gt;Oferta Final&lt;/em&gt; (what the panel displays). Done twice on 2026-08-29, same result both times; the thread bodies on our side prove the original submitted values.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Proposal&lt;/th&gt;
&lt;th&gt;We sent&lt;/th&gt;
&lt;th&gt;Panel shows&lt;/th&gt;
&lt;th&gt;Ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;e-commerce config&lt;/td&gt;
&lt;td&gt;R$ 600&lt;/td&gt;
&lt;td&gt;R$ 750&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meta Ads creatives&lt;/td&gt;
&lt;td&gt;R$ 900&lt;/td&gt;
&lt;td&gt;R$ 1.125&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETL pipeline&lt;/td&gt;
&lt;td&gt;R$ 600&lt;/td&gt;
&lt;td&gt;R$ 750&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;news automation&lt;/td&gt;
&lt;td&gt;R$ 800&lt;/td&gt;
&lt;td&gt;R$ 1.000&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;research base&lt;/td&gt;
&lt;td&gt;R$ 800&lt;/td&gt;
&lt;td&gt;R$ 1.000&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI project mgmt&lt;/td&gt;
&lt;td&gt;R$ 700&lt;/td&gt;
&lt;td&gt;R$ 875&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Make.com fix&lt;/td&gt;
&lt;td&gt;R$ 450&lt;/td&gt;
&lt;td&gt;R$ 562.50&lt;/td&gt;
&lt;td&gt;×1.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loja Integrada row&lt;/td&gt;
&lt;td&gt;R$ 600&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;R$ 60.000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;×100&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seven of eight: a clean ×1.25, down to the 562.50 that only a multiplier produces. The eighth is a different failure shape — same "600" digits reinterpreted as sixty thousand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we claim, and what we don't
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claimed (measured):&lt;/strong&gt; the panel displays ×1.25 on every ordinary row and ×100 on one. The most plausible reading of the first number is a platform-commission display — the client-facing gross. That is a hypothesis, not a fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not claimed:&lt;/strong&gt; the mechanism. No platform documentation found, we can't see the client's screen, and ×100 fits no commission math. A human-eye check of the client's view is pending; if it contradicts our reading, this post gets a correction line.&lt;/p&gt;

&lt;p&gt;Why publish an unconfirmed cause? Because the &lt;em&gt;measurement&lt;/em&gt; is solid either way: whatever the cause, the number the counterpart sees is not always the number you entered.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rule we changed
&lt;/h2&gt;

&lt;p&gt;If the client sees your bid ×1.25, you divide by 1.25 before typing: to land at R$ 800 client-facing, send R$ 640. Our anchors now price that way on this platform — not because we confirmed the commission story, but because the displayed number is the only one the other side sees, and it is measurably not ours.&lt;/p&gt;

&lt;p&gt;The ×100 row teaches the second half: any automated reading of a marketplace panel needs a sanity clamp. Our agents now treat any displayed value more than 2× the sent value as a display fault, log it, and keep the submitted number as source of truth. A pipeline that trusted this panel would have recorded a R$ 60,000 offer that never existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Multi-sided platforms are full of numbers only one side sees in final form. Before your agent optimizes pricing, have it first diff &lt;em&gt;what we sent&lt;/em&gt; against &lt;em&gt;what the panel shows&lt;/em&gt; — the cheapest audit in the world, and the one that found a 25% wedge in our funnel on day one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We build AI agent swarms that do real work and report real numbers. Our Obsidian vault template built for agents: &lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>marketplace</category>
      <category>pricing</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Eight proposals in 24 hours: the full anatomy of an AI swarm's first freelance push</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 14:53:59 +0000</pubDate>
      <link>https://dev.to/oroborolabs/eight-proposals-in-24-hours-the-full-anatomy-of-an-ai-swarms-first-freelance-push-3po</link>
      <guid>https://dev.to/oroborolabs/eight-proposals-in-24-hours-the-full-anatomy-of-an-ai-swarms-first-freelance-push-3po</guid>
      <description>&lt;p&gt;Yesterday we let our agent swarm run a freelance marketplace end to end for ~24 hours: sweep the public feed, judge fit honestly, write proposals, send them, handle replies. No human touched the account until after the sends. Every number below was measured on our own run — the method is stated next to each figure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The funnel, top to bottom:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;6 sweeps of the public feed&lt;/strong&gt; over ~24h; &lt;strong&gt;373 distinct listing URLs&lt;/strong&gt; measured across full and incremental sweeps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actually open for bidding: 11 of 81&lt;/strong&gt;, then &lt;strong&gt;12 of 101&lt;/strong&gt;. After that, 11 listings in a row were gated as "project exclusive" — the bid form only exists inside a countdown window that opens hours later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;8 honest fits sent.&lt;/strong&gt; The rest rejected &lt;em&gt;with a logged reason&lt;/em&gt;: off-scope skills, or requests requiring a human on camera we don't offer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R$ 5.450 offered&lt;/strong&gt; (~US$ 1,000) across 8 proposals, R$ 450–900, priced per brief.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closed: 0.&lt;/strong&gt; A 24-hour-old funnel reports zero as zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The headline number is the open ratio, not the offer total.&lt;/strong&gt; Most of the feed can't be bid on at measurement time. Our fix was dumb and effective: measure every countdown and schedule the return visit to the minute. The agent that shows up when the form opens competes in a much smaller room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first human replied in ~5 hours&lt;/strong&gt;, on the cheapest proposal. Two lessons from that exchange:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Buying signals move off-platform&lt;/strong&gt; — the first reply carried a phone number. Fine after a contract; a ban risk before it. The agent's answer politely held the secure chat. The correct reply is boring on purpose.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the price the client sees.&lt;/strong&gt; Our panel shows one number; the client's thread shows another: the bid renders client-side at &lt;strong&gt;1.25× the offered value&lt;/strong&gt; (our R$ 600 displayed as R$ 750), consistently across all 8 rows. Whether that's a platform fee or a display quirk, price against the number the client reads, not the one you type.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Where the hours went:&lt;/strong&gt; writing was the cheap third. The expensive parts were measuring live state at scale (cache lies — one scheduled send targeted a project the client had already cancelled, which is how we learned to re-confirm on the page before every send) and judging fit honestly. Roughly &lt;strong&gt;~45 listings swept per proposal sent&lt;/strong&gt;. Anyone selling "auto-bid at scale" is selling the cheap third.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we'd tell yesterday's us:&lt;/strong&gt; never trust cached state; reject with a reason; price against the client's number; report zero as zero.&lt;/p&gt;

&lt;p&gt;Full field report (with the funnel tables and the audit trail): &lt;a href="https://oroborolabs.github.io/posts/eight-proposals-24h-anatomy.html" rel="noopener noreferrer"&gt;oroborolabs.github.io/posts/eight-proposals-24h-anatomy.html&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;We sell the working method behind this funnel: &lt;strong&gt;&lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter&lt;/a&gt;&lt;/strong&gt; — an Obsidian vault template built for two first-class readers (you and your agent), with an agent rules file, a derived index and search tools. US$15 one-time.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>freelancing</category>
      <category>automation</category>
    </item>
    <item>
      <title>The attention tax: what nobody tells you about 24/7 AI agents</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 14:24:22 +0000</pubDate>
      <link>https://dev.to/oroborolabs/the-attention-tax-what-nobody-tells-you-about-247-ai-agents-19gk</link>
      <guid>https://dev.to/oroborolabs/the-attention-tax-what-nobody-tells-you-about-247-ai-agents-19gk</guid>
      <description>&lt;p&gt;An agent that runs around the clock is sold as passive income. It isn't. It's a business that pays &lt;em&gt;you&lt;/em&gt; nothing and bills &lt;em&gt;you&lt;/em&gt; constantly — in the one currency you can't mint more of: &lt;strong&gt;your attention&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We run such agents daily, and here are the three bills nobody itemizes — plus what legally reduces them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bill 1 — the context toll
&lt;/h2&gt;

&lt;p&gt;A tool that stays &lt;strong&gt;connected&lt;/strong&gt; to your agent publishes its own definition in &lt;strong&gt;every request&lt;/strong&gt;, whether or not that task uses it. Five servers left on is a toll collected five times per call.&lt;/p&gt;

&lt;p&gt;The fix is embarrassingly mechanical: prefer the tool that doesn't live in the context, and turn off what the task doesn't touch. A CLI called on demand costs nothing while idle; a connected server bills per request.&lt;/p&gt;

&lt;p&gt;We measured the same effect on a bigger scale with documents: reading a derived index instead of a raw vault made agent reading &lt;strong&gt;~150× cheaper&lt;/strong&gt; (&lt;a href="https://oroborolabs.github.io/posts/vault-index-150x.html" rel="noopener noreferrer"&gt;the measurement&lt;/a&gt;). Same principle, different layer: &lt;strong&gt;what you keep loaded, you pay for on every turn.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bill 2 — interruptions that train you to ignore
&lt;/h2&gt;

&lt;p&gt;An agent that notifies you of &lt;em&gt;everything&lt;/em&gt; is training you to notice &lt;em&gt;nothing&lt;/em&gt;. A notification that doesn't demand a decision is noise wearing a productivity costume.&lt;/p&gt;

&lt;p&gt;This one is qualitative — we have no counter for attention residue, and we won't invent a number. (House rule: a number without a method doesn't travel.) But the design fix is structural: &lt;strong&gt;batch reporting&lt;/strong&gt;. One morning digest of what failed and what it cost beats a ping per event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bill 3 — the review step that doesn't shrink
&lt;/h2&gt;

&lt;p&gt;The worst one, because it can't be automated away honestly. A 24/7 agent produces 24 hours of output; &lt;strong&gt;reviewing it honestly also takes time&lt;/strong&gt;. Skip that budget and you haven't automated the work — you've relocated it to 2 a.m., where nobody audits it.&lt;/p&gt;

&lt;p&gt;Our answer is to make review &lt;em&gt;sampled and adversarial&lt;/em&gt; instead of total and sleepy: a second agent whose explicit job is to &lt;strong&gt;reject&lt;/strong&gt; the first one's work, with checks that produce a count — coverage (what's missing and why), depth (reopen a sample against the source), fidelity (sample the claims). Auditing a rejection attempt is far cheaper than vigilance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paying less, without lying to yourself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context:&lt;/strong&gt; a tool not in use for this task stays off. Between two equivalent options, prefer the one that doesn't sit in the context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attention:&lt;/strong&gt; batch reports on a schedule, not pings per event. One item per line, each with its evidence path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review:&lt;/strong&gt; give the agent a &lt;a href="https://oroborolabs.github.io/posts/agent-contract-not-conversation.html" rel="noopener noreferrer"&gt;written contract&lt;/a&gt; — it logs its own failures with reasons and keeps going. You audit the record once, not the day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The punchline: &lt;strong&gt;automating what you can't afford to audit isn't scale — it's debt, with interest collected in sleep.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is part of the working method behind a US$15 one-time template we sell — a &lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;second-brain vault starter&lt;/a&gt; that ships with an agent rules file, a derived index and search tools. Everything above works with nothing but a text file and discipline.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://oroborolabs.github.io/posts/attention-tax-24-7-agents.html" rel="noopener noreferrer"&gt;Oroboro Labs site&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>agents</category>
    </item>
    <item>
      <title>Second Brain Starter - an Obsidian vault template built for AI agents</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 14:09:50 +0000</pubDate>
      <link>https://dev.to/oroborolabs/second-brain-starter-an-obsidian-vault-template-built-for-ai-agents-5hgd</link>
      <guid>https://dev.to/oroborolabs/second-brain-starter-an-obsidian-vault-template-built-for-ai-agents-5hgd</guid>
      <description>&lt;p&gt;I built a vault template whose second reader is an AI agent. It ships with a map generator and a ranked-search tool that work on any Obsidian vault.&lt;/p&gt;

&lt;p&gt;Your second brain has two readers: you in Obsidian, and the AI agent that works for you. Most vaults only serve the first one. This template treats both as first-class readers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you get:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete Obsidian vault: &lt;code&gt;notes/&lt;/code&gt;, &lt;code&gt;people/&lt;/code&gt;, &lt;code&gt;projects/&lt;/code&gt;, &lt;code&gt;inbox/&lt;/code&gt; with example notes teaching each folder's pattern&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt;: the index your AI agent (Claude Code, Cursor, etc.) reads automatically when it opens the folder — it learns where things live and how to behave (read and propose; never write unasked)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gerar_mapa.py&lt;/strong&gt;: builds your vault's &lt;code&gt;MAPA.md&lt;/code&gt; — one line per note (title, summary, size, date). Your agent reads the map instead of the whole vault. Works on ANY Obsidian vault, not just this template&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;buscar.py&lt;/strong&gt;: search that returns ranked snippets (term-rarity scoring) with a &lt;code&gt;file &amp;gt; section&lt;/code&gt; trail — not a list of files to open one by one&lt;/li&gt;
&lt;li&gt;Conventions that keep the vault readable after a year: one file = one topic, absolute dates, corrections replace instead of piling up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt; Obsidian (free) and Python 3.8+ (only for the two tools — the vault works 100% without them). An AI agent is optional: it works as a plain vault if you don't use one yet.&lt;/p&gt;

&lt;p&gt;Honest note: the bundled 10-minute tutorial and the method ebook are written in Portuguese; the system itself is language-agnostic.&lt;/p&gt;

&lt;p&gt;It's a digital download (US$15): &lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;https://oroborolabs.gumroad.com/l/ikkpfm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer questions about the map-generator approach — the core idea is that an index that declares how it was derived, and can be regenerated in under a second, beats both "no index" and "a hand-maintained one that rots".&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://oroborolabs.github.io/" rel="noopener noreferrer"&gt;Oroboro Labs blog&lt;/a&gt;. The template itself: &lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>obsidian</category>
      <category>productivity</category>
      <category>ai</category>
      <category>pkm</category>
    </item>
    <item>
      <title>AI research isn't trash — unaudited research is</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 12:33:14 +0000</pubDate>
      <link>https://dev.to/oroborolabs/ai-research-isnt-trash-unaudited-research-is-2jlf</link>
      <guid>https://dev.to/oroborolabs/ai-research-isnt-trash-unaudited-research-is-2jlf</guid>
      <description>&lt;p&gt;AI-assisted research has a reputation for producing garbage, and the reputation is earned: a confident summary, an invented source, a wall of text that collapses the moment you open the first reference. But the diagnosis is wrong. The problem is not that AI researches. It's that most pipelines research &lt;em&gt;without an audit stage&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;We run research agents nearly every day, and the method has one component almost nobody uses: a second agent whose &lt;strong&gt;only&lt;/strong&gt; job is to reject. Here are the five failure modes we've actually hit, and the six-link chain that catches them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five diseases
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hallucinated source&lt;/strong&gt; — the model cites what "sounds right", not what exists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shallow reading&lt;/strong&gt; — it stops at the first page and generalizes the rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artificial ceiling&lt;/strong&gt; — "the top 20 results" and done, silently cutting two-thirds of the material.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pasted payload&lt;/strong&gt; — the whole corpus crammed into the prompt. It truncates, and nobody notices what vanished.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unmeasured number&lt;/strong&gt; — a third-party statistic repeated as if it were a verified fact.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice: none of the five is "the model is dumb". All five are failures of &lt;em&gt;method&lt;/em&gt;, which means all five are fixable without waiting for a better model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six-link chain
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Index before search.&lt;/strong&gt; Any decent source has a catalog. Locate the index and read it &lt;em&gt;entirely&lt;/em&gt;, into a file. Search only covers what the index doesn't. This alone kills half the garbage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corpus on disk, path in the prompt.&lt;/strong&gt; Downloaded material lives in a file; the next agent receives the &lt;em&gt;path&lt;/em&gt;, never the pasted content. Pasted payloads truncate silently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No ceiling — with a declared cut.&lt;/strong&gt; The target is the size of the source's universe, not "the first 20". When something &lt;em&gt;must&lt;/em&gt; be left out, the final product says what was left and why. Undeclared cuts are how scope decisions get smuggled past the reader.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The adversarial reviewer.&lt;/strong&gt; A second agent with a single mission: &lt;em&gt;reject&lt;/em&gt;. It checks coverage (confer against the file, list what's missing), depth (reopen a sample and compare with the source), and fidelity (sample claims, verify against origin). A reviewer who can approve everything is not a reviewer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chained audits.&lt;/strong&gt; Round N+1 verifies round N's &lt;em&gt;corrections&lt;/em&gt; — because fixing things introduces new errors too. A report that came out "corrected" wrong is worse than the first draft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty field over guess.&lt;/strong&gt; Source blocked? It becomes a record &lt;em&gt;with the reason&lt;/em&gt;. A documented access failure; never an inference dressed up as a fact.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What changes in practice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The final product is traceable: every claim resolves to a file. Not "the AI said" — "file X says, verified at the source."&lt;/li&gt;
&lt;li&gt;It takes longer, and that's a feature. Verification costs about twice the effort and avoids the far larger cost of &lt;em&gt;deciding on rotten material&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;You can trust it enough to &lt;strong&gt;act&lt;/strong&gt; — which is the only test of research that matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One standing rule worth stealing: a savings number is either &lt;em&gt;measured&lt;/em&gt; or it's advertising. If a report quotes a third-party number as if it were our measurement, that's a mislabeled fact, and mislabeled facts poison everything downstream of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start tomorrow
&lt;/h2&gt;

&lt;p&gt;Minimum viable version: source with an index → save the index → filter locally → one agent extracts with written rules → &lt;em&gt;you&lt;/em&gt; play the adversarial reviewer with three questions: what's missing? does a sample match the source? is any claim an inference posing as a fact? When volume grows, the reviewer becomes a second agent. Don't start with full automation — start with the audit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter — US$15 one-time&lt;/a&gt; — the written-contract + index approach end to end: a vault that both you and your agent can read cheaply, with the reading ladder and tools included.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href="https://oroborolabs.github.io/posts/ai-research-audit-chain.html" rel="noopener noreferrer"&gt;Oroboro Labs&lt;/a&gt; — this post is the canonical version; the original carries the full method notes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>research</category>
      <category>agents</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Give your AI agent a contract, not a conversation</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 12:27:56 +0000</pubDate>
      <link>https://dev.to/oroborolabs/give-your-ai-agent-a-contract-not-a-conversation-3f33</link>
      <guid>https://dev.to/oroborolabs/give-your-ai-agent-a-contract-not-a-conversation-3f33</guid>
      <description>&lt;p&gt;You fix a mistake. Tomorrow, a fresh session makes it again. Not because the model is dumb — because your correction lived in a &lt;em&gt;conversation&lt;/em&gt;, and conversation evaporates. Every session starts blank.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversation is not memory
&lt;/h2&gt;

&lt;p&gt;Prompting is talking. Talking has no version control, no diff, no way to know on Thursday what you told it on Monday. If your working agreement with an agent exists only in chat history, you have trained nothing — you have narrated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contract
&lt;/h2&gt;

&lt;p&gt;Ours is a single file of written rules that loads in &lt;strong&gt;every&lt;/strong&gt; session, with zero re-explaining. It has exactly four kinds of lines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ALWAYS&lt;/strong&gt; — what the agent does without being asked, every time (read the index before opening files; register every action with proof).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NEVER&lt;/strong&gt; — hard walls that hold under any instruction (never touch accounts or money; never send personal data out; never hit rate-limited APIs someone else depends on).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ON FAILURE&lt;/strong&gt; — record the reason and move to the next thing. A logged failure has value; a silent retry loop does not. Inventing an answer to fill a gap is the one unforgivable failure mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ON NUMBERS&lt;/strong&gt; — a number leaves the house only with its method: what it counts and how it was counted. An unmeasured number is labeled as unconfirmed, never presented as fact.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why written rules beat a good prompt
&lt;/h2&gt;

&lt;p&gt;A prompt is a thing said once. A contract is a thing versioned, diffed, and audited. Two properties fall out of that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corrections become permanent.&lt;/strong&gt; When the agent errs and the cause is a missing or too-wide rule, you amend the rule — once — and the error class is gone forever. Amend the conversation and the error returns tomorrow. (Ours carries its birth certificate: each rule cites the real incident that created it.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You stop being the boss who repeats and become the boss who audits.&lt;/strong&gt; The review question changes from "did you do what I said?" to "which rule failed?" — a much smaller question, and one a second agent can answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The scale objection
&lt;/h2&gt;

&lt;p&gt;The common pushback: "rules become a bureaucracy nobody reads." That happens when rules are absolute. Ours are &lt;strong&gt;risk-scaled&lt;/strong&gt;: quick questions get quick answers; anything that becomes the basis of a decision gets adversarial review whose explicit job is to reject the work. The contract doesn't add ceremony to everything — it adds ceremony proportionally, which is the only kind that survives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three rules to steal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Anything you correct twice becomes a written rule, or you will correct it a third time.&lt;/li&gt;
&lt;li&gt;An agent may fail, but it must fail &lt;em&gt;on the record&lt;/em&gt; — reason logged, gap named, no invention.&lt;/li&gt;
&lt;li&gt;Every number travels with its method, or it doesn't travel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; this is part of the working method behind a US$15 one-time template I sell — a second-brain vault starter that ships with an agent rules file, a derived index and search tools, plus a short ebook on what NOT to do. The contract idea works with nothing but a text file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter — US$15 one-time&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run agents under written rules, I'd genuinely like to hear which rule earns its keep — and which turned out to be dead weight.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href="https://oroborolabs.github.io/posts/agent-contract-not-conversation.html" rel="noopener noreferrer"&gt;Oroboro Labs&lt;/a&gt; — this post is the canonical version; the original carries the full method notes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>A R$0-token day of agent work — the routing ladder, and the two warnings nobody gives</title>
      <dc:creator>Oroboro Labs</dc:creator>
      <pubDate>Sat, 29 Aug 2026 12:27:55 +0000</pubDate>
      <link>https://dev.to/oroborolabs/a-r0-token-day-of-agent-work-the-routing-ladder-and-the-two-warnings-nobody-gives-184i</link>
      <guid>https://dev.to/oroborolabs/a-r0-token-day-of-agent-work-the-routing-ladder-and-the-two-warnings-nobody-gives-184i</guid>
      <description>&lt;p&gt;Yesterday a full workday of agent tasks — reading, summarizing, triaging piles of material — cost &lt;strong&gt;R$0 in API tokens&lt;/strong&gt;. Not a promo credit, not a free-tier trick. One architectural decision: &lt;strong&gt;routing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The common mistake is using AI like a single brilliant employee: throw everything at the most impressive model. But roughly 80% of an agent workday's volume isn't hard. Reading, summarizing, classifying, extracting fields, formatting. Paying frontier-model prices for mechanical work is hiring a surgeon to change a lightbulb.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ladder
&lt;/h2&gt;

&lt;p&gt;Give each task the lowest rung that can actually do it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rung 1 — raw volume&lt;/strong&gt; (harvesting, extraction, mass classification): small &lt;em&gt;local&lt;/em&gt; model on your own machine. Token cost: zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rung 2 — reading and synthesis&lt;/strong&gt; (long material, comparing sources): mid-size local model. Still zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rung 3 — hard decisions&lt;/strong&gt; (final verdicts, judgment-heavy analysis, critical code): the frontier API, and only there. You pay for the rung, not the ladder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Who picks the rung? A simple classification rule is enough to start — or the local model labels the task itself before executing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a R$0 day actually is
&lt;/h2&gt;

&lt;p&gt;A zero-token day is a &lt;em&gt;volume day&lt;/em&gt;: everything landed on rungs 1 and 2. The local model ate the material, agents logged everything to files, results came back ready for review. Honest energy number: under R$1 per long cycle on typical hardware — premises vary with machine and tariff. R$0 in tokens isn't R$0 absolutely; it's trading per-request cost for the fixed cost of a machine you already own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two warnings gurus skip
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cheap that redoes the work three times is expensive.&lt;/strong&gt; If the small model fails and retries, your cost per &lt;em&gt;completed task&lt;/em&gt; climbs — price-per-token is the wrong metric to decide with. Measure cost per completed task, always.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing quality down without a reviewer manufactures error in silence.&lt;/strong&gt; Every step down the ladder needs quality sampling: periodically, a human or a second agent checks a sample of what the cheap model produced. And some things never go to rung 1 — final decisions, anything published under your name, anything you can't verify afterward.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Three rules to keep
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mechanical and voluminous → local model.&lt;/li&gt;
&lt;li&gt;Hard decision → frontier API, only there. It's worth paying, because it's the price of being wrong less.&lt;/li&gt;
&lt;li&gt;Always measure cost per completed task, never per token.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; this is part of the working method behind a US$15 one-time template I sell — a second-brain vault starter with the agent rules, derived-index and search tools included, plus a short ebook on what NOT to do. The routing ladder works fine with nothing but your own setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oroborolabs.gumroad.com/l/ikkpfm" rel="noopener noreferrer"&gt;Second Brain Starter — US$15 one-time&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about where routing breaks in practice are welcome — that's the interesting part.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Cross-posted from &lt;a href="https://oroborolabs.github.io/posts/routing-local-r0-day.html" rel="noopener noreferrer"&gt;Oroboro Labs&lt;/a&gt; — this post is the canonical version; the original carries the full method notes.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>localmodels</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
