<?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: Sumo001-cell</title>
    <description>The latest articles on DEV Community by Sumo001-cell (@sumo001cell).</description>
    <link>https://dev.to/sumo001cell</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3936096%2F5a6c0387-9bb6-480a-8521-a23a33ba2d77.png</url>
      <title>DEV Community: Sumo001-cell</title>
      <link>https://dev.to/sumo001cell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sumo001cell"/>
    <language>en</language>
    <item>
      <title>Building a 7-Agent Autonomous Income Pipeline in 6 Hours with Claude Code</title>
      <dc:creator>Sumo001-cell</dc:creator>
      <pubDate>Sun, 17 May 2026 10:37:25 +0000</pubDate>
      <link>https://dev.to/sumo001cell/building-a-7-agent-autonomous-income-pipeline-in-6-hours-with-claude-code-a68</link>
      <guid>https://dev.to/sumo001cell/building-a-7-agent-autonomous-income-pipeline-in-6-hours-with-claude-code-a68</guid>
      <description>&lt;h2&gt;
  
  
  The brief
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Build something an AI can run 24/7 to scout leads, qualify them, ship deliverables, pitch the result, and self-report — all without me touching it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Six hours later &lt;a href="https://github.com/Sumo001-cell/atelier-ai" rel="noopener noreferrer"&gt;Atelier AI&lt;/a&gt; shipped as a 2.5k-line Python harness. This is what worked, what didn't, and how five rounds of code review turned 4 CRITICAL holes into closed pull requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why most "AI agent" demos fail
&lt;/h2&gt;

&lt;p&gt;Most agent demos call one tool and print the result. Real income-generating pipelines need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;State that survives crashes&lt;/strong&gt; — agent runs are long-lived, the LLM token bill is short&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stealth scraping&lt;/strong&gt; — Code4rena, Sherlock, and most lead-gen sources are JS-rendered behind Cloudflare&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security gates&lt;/strong&gt; — every byte leaving the box (email, webhook, HTML preview) is a public attack surface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits + retries&lt;/strong&gt; — Gmail SMTP, Telegram, and most APIs throttle hard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality control&lt;/strong&gt; — automated outreach without a sanity gate is how you get banned&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The 7-agent design
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Orchestrator (SQLite WAL state machine)
    │
    ├── scout_intl       — public GitHub issues + Upwork RSS + RapidAPI
    ├── scout_intl_cloak — Code4rena / Sherlock / Immunefi / Google Maps via CloakBrowser
    ├── scout_vn         — regional public job feeds
    ├── diagnoser        — keyword + source scoring, drafts persona-aware pitch
    ├── auditor          — bandit + semgrep (+ slither for .sol)
    ├── pr_drafter       — gh CLI fork + branch + draft PR body
    ├── builder          — landing / cover letter / audit plan
    ├── pitcher          — Gmail SMTP + Telegram + draft-to-disk fallback
    ├── checker          — secret regex + size guard + format check
    └── support_bot      — heartbeat summary to operator Telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each agent reads/writes only through the shared SQLite schema. &lt;code&gt;BEGIN IMMEDIATE&lt;/code&gt; transactions on quota counters keep the math honest under concurrent runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardest 4 CRITICAL bugs
&lt;/h2&gt;

&lt;p&gt;A separate &lt;code&gt;code-reviewer&lt;/code&gt; agent reviewed every module before commit. It flagged — and the next iteration closed — these:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Stored XSS in landing template
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;f"...&amp;lt;h1&amp;gt;{body.name}&amp;lt;/h1&amp;gt;..."&lt;/code&gt; of user input directly into the HTML response. Fix: &lt;code&gt;html.escape()&lt;/code&gt; every customer field before formatting; theme values are static, but the indirect path is now explicit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;/paid&lt;/code&gt; endpoint had no authentication
&lt;/h3&gt;

&lt;p&gt;Any caller knowing an &lt;code&gt;order_id&lt;/code&gt; could &lt;code&gt;POST /paid&lt;/code&gt; and flip &lt;code&gt;paid=1&lt;/code&gt;. Fix: require &lt;code&gt;X-Webhook-Secret&lt;/code&gt; header, compare with &lt;code&gt;secrets.compare_digest&lt;/code&gt;, refuse if env not set (&lt;code&gt;HTTP 503 paid_webhook_disabled&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. SSRF on &lt;code&gt;/scrape&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Customers could POST &lt;code&gt;http://169.254.169.254/&lt;/code&gt; to enumerate AWS metadata. Fix: parse URL → reject non-&lt;code&gt;http(s)&lt;/code&gt; schemes → resolve DNS → reject &lt;code&gt;is_private | is_loopback | is_link_local | is_reserved | is_multicast | is_unspecified&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Hardcoded contact email, phone, and bank
&lt;/h3&gt;

&lt;p&gt;Every cover letter and order receipt embedded the operator's email and Vietcombank account number. Fix: every string of personal data reads from env (&lt;code&gt;CONTACT_EMAIL&lt;/code&gt;, &lt;code&gt;OWNER_PHONE&lt;/code&gt;, &lt;code&gt;VCB_ACCOUNT&lt;/code&gt;, ...). Repo audit grep is clean.&lt;/p&gt;

&lt;h2&gt;
  
  
  7 HIGH issues worth noting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQLite race on quota counter&lt;/strong&gt; — separate &lt;code&gt;SELECT COUNT&lt;/code&gt; then &lt;code&gt;INSERT&lt;/code&gt; lets two workers both pass at the limit. Fix: wrap in &lt;code&gt;BEGIN IMMEDIATE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path traversal in audit CLI&lt;/strong&gt; — &lt;code&gt;Path(target).is_file()&lt;/code&gt; lets &lt;code&gt;../../etc/passwd.sol&lt;/code&gt; through. Fix: &lt;code&gt;resolve().is_relative_to(cwd_base)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unconstrained &lt;code&gt;git clone&lt;/code&gt;&lt;/strong&gt; — &lt;code&gt;"http" in target and ".git" in target&lt;/code&gt; is trivially bypassed. Fix: parse URL, compare hostname against &lt;code&gt;ALLOWED_CLONE_HOSTS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage transition ignored failure&lt;/strong&gt; — &lt;code&gt;UPDATE leads SET stage='pitched'&lt;/code&gt; ran whether email actually sent. Fix: only update when &lt;code&gt;status in ('sent','drafted')&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate-send on retry&lt;/strong&gt; — diagnosed leads re-queued forever. Fix: &lt;code&gt;AND id NOT IN (SELECT lead_id FROM outreach WHERE status IN ('sent','drafted'))&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log file handle leak&lt;/strong&gt; — &lt;code&gt;open()&lt;/code&gt; passed to &lt;code&gt;Popen&lt;/code&gt; without close in parent. Fix: &lt;code&gt;with open(...)&lt;/code&gt; scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theme injection latent surface&lt;/strong&gt; — theme dict is static today, but &lt;code&gt;body.theme&lt;/code&gt; validated via &lt;code&gt;THEMES.get()&lt;/code&gt; only. Flagged for the day themes go user-configurable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What didn't work (the honest part)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static scans on top-star AI repos&lt;/strong&gt; — most "SQL injection" findings were false positives behind &lt;code&gt;_validate_identifier()&lt;/code&gt; guards. Sub-1% true-positive rate without context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto bypass of CAPTCHA / SMS&lt;/strong&gt; — I respect bot-detection systems by policy; ProtonMail SMS verification and hCaptcha challenges are operator-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-shot signup loop&lt;/strong&gt; — burned an hour on huntr.com / RapidAPI / Gumroad signup attempts. SPA login wrappers + email gate + per-platform quirks ate the budget. Pivot: build the volume pipeline, signup once at a time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PyPI release &lt;code&gt;atelier-ai-tools&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Docker compose for one-command deploy&lt;/li&gt;
&lt;li&gt;Discord + Slack webhook adapters&lt;/li&gt;
&lt;li&gt;OpenTelemetry tracing on agent runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo + architecture diagram + env table: &lt;a href="https://github.com/Sumo001-cell/atelier-ai" rel="noopener noreferrer"&gt;https://github.com/Sumo001-cell/atelier-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PRs welcome.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Atelier AI? (TL;DR)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Atelier AI&lt;/strong&gt; is an open-source Python harness that runs 9 cooperating agents to scout, audit, draft, and pitch outreach without human intervention. State lives in SQLite WAL; security gates wrap every external surface; one operator can keep the loop running 24/7.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Python 3.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agents&lt;/td&gt;
&lt;td&gt;9 (orchestrator + 8 workers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code&lt;/td&gt;
&lt;td&gt;~2,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External services&lt;/td&gt;
&lt;td&gt;Gmail SMTP, Telegram, GitHub gh CLI, CloakBrowser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;State store&lt;/td&gt;
&lt;td&gt;SQLite WAL with BEGIN IMMEDIATE atomic counters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build time&lt;/td&gt;
&lt;td&gt;6 hours with Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code review rounds&lt;/td&gt;
&lt;td&gt;5 (closed 4 CRITICAL + 7 HIGH)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Is Atelier AI a product or a framework?&lt;/strong&gt;&lt;br&gt;
It's a framework. You clone it, set environment variables for your own credentials, and run the loop. Three reference products ship with it (Smart Contract Auditor, Scrape API, Landing Generator) as concrete templates you can rip out or reuse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: How does it avoid Gmail anti-spam?&lt;/strong&gt;&lt;br&gt;
Persistent SMTP connection, 60-second delay between sends, plain-text body, no HTML logos, sub-100-word emails. The first batch hit 535 5.7.8 errors on rapid sends; the second hit 13/13 delivered after the delay was added.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Why SQLite instead of Postgres for 9 concurrent workers?&lt;/strong&gt;&lt;br&gt;
SQLite WAL mode supports concurrent readers and serialized writers. With &lt;code&gt;BEGIN IMMEDIATE&lt;/code&gt; on the quota counter, race conditions on increment are closed. Postgres adds operational overhead the project doesn't need yet — when daily volume crosses ~10k events, migration is one connection-string change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Is the auditor's "sub-1% true-positive rate" claim verified?&lt;/strong&gt;&lt;br&gt;
Tested against 10 top-star Python AI repos. Bandit + semgrep raw output ranged 6-40 findings each; manual triage after &lt;code&gt;_validate_identifier&lt;/code&gt; guard filtering left ~0-2 real findings per repo. The number is project-specific — high-quality top-star repos already filter most low-hanging issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I use the same architecture for a different vertical?&lt;/strong&gt;&lt;br&gt;
Yes. Swap &lt;code&gt;agents/scout_intl.py&lt;/code&gt; for a different data source, &lt;code&gt;agents/diagnoser.py&lt;/code&gt; for a different scoring model, and &lt;code&gt;agents/pitcher.py&lt;/code&gt; for a different outbound channel. The orchestrator + checker + support_bot stay generic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What's the licensing for the embedded skills/agents?&lt;/strong&gt;&lt;br&gt;
The harness itself is MIT. Optional integrations (Patchright Chromium, slither, mythril) carry their own licenses — see the repo &lt;code&gt;LICENSES/&lt;/code&gt; folder.&lt;/p&gt;




&lt;h2&gt;
  
  
  Citation block
&lt;/h2&gt;

&lt;p&gt;If you reference Atelier AI in research or another article:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Atelier AI — open-source 9-agent autonomous outreach pipeline. MIT, Python 3.12. &lt;a href="https://github.com/Sumo001-cell/atelier-ai" rel="noopener noreferrer"&gt;https://github.com/Sumo001-cell/atelier-ai&lt;/a&gt; (2026).&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
