Open logbook · AI agents · B2B sales

From 5 Hours to 13 Seconds: What We Learned Giving Our Prospecting Agent an Autonomous Worker, and Why That Demands Respect

For years, prospecting one account took me an afternoon. On October 12, 2026, I watched a process run the full preparation cycle in thirteen seconds, spend two and a half cents, and stop on its own before the only step that matters: sending. This is what we measured, what we built so that speed would be tolerable, and what I think after seeing it.

Short answer. Transgenia connected its prospecting agent, Aitana, to a local worker that runs on Claude's Messages API and a scoped MCP connector to the ERP. In two real cycles the worker read the database, decided, created an empty mass-mailing draft, read it back and settled its spend: 13 and 15 seconds per cycle, USD 0.045 in total, zero emails sent. The month before, the same sales channel had gone 48 days without a single send because every step depended on a person. Speed is not the news. The news is that it was tolerable only because sending is out of the agent's reach, the budget is reserved before thinking and every claim has a read-back. We call that respect for artificial intelligence.
Diagram 1. The manual prospecting process in seven steps, from choosing the account to planning the next touches, with an estimate of minutes per step that adds up to three to five hours.
View Mermaid source
flowchart LR
    A["1. Choose the account
20 to 30 min"] --> B["2. Find emails
and the decision maker
30 to 60 min"] B --> C["3. Preliminary call
15 to 30 min"] C --> D["4. Draft the email
30 to 45 min"] D --> E["5. Curate and clean
20 to 30 min"] E --> F["6. Send and log
10 min"] F --> G["7. Plan the
next touches
20 to 30 min"] G --> T(["Estimated total:
3 to 5 hours per prospect"])
Diagram 1. The prospecting afternoon as the author lived it before the pilot. The minutes are a personal estimate, not telemetry; the three to five hour total per prospect is the baseline figure in this article.

The five-hour afternoon: how a person prospected

I carry most of Transgenia's sales. Before the pilot, prospecting a new account was a full afternoon. Choose the company and understand what it does. Find the emails and the decision maker, who is almost never published. Make a preliminary call to confirm the person exists and the topic concerns them. Draft the email. Curate it: cut adjectives, verify every figure, add the right signature and the two attachments our policy requires. Send it and log it. And plan the next touches, because an email without follow-up is an email thrown away.

As a rough guess, three to five hours per prospect. I use that phrase deliberately: it is a personal estimate, not telemetry, and that is how the rest of this text treats it. Nobody timed those afternoons with a stopwatch. What we did measure, in detail, was what came next.

The problem with that process was not its quality. It was that it only happened when I had a free afternoon.

What our telemetry said in September

We have had a prospecting agent since mid-2026. It is called Valentina in the code and Aitana in the commercial signature. We already told on this blog how we designed its demo motion and its hard rules. What we had not told is what happened when operations depended on a person starting every step.

Our weekly review log, which a management agent writes every Saturday from the system's records, marked the sales channel red in weeks 35 and 36. The data is ours and we quote it as it was written:

Diagram 2. Timeline of the sales channel from July to September 2026: last wave on July 21, a sweep of 92 leads on August 14 left inactive, weekly reviews in red on August 29 and September 7, and the Saturday digest not run for ten weeks.
View Mermaid source
timeline
    title Sales channel, July to September 2026
    July 21 : Last wave of emails sent
    August 14 : Curated sweep of 92 leads : left inactive
    August 29 : Weekly review in red : 38 days without sends
    September 7 : Weekly review in red : 48 days without sends : Saturday digest missing for 10 weeks
    September 11 : H2 goal scoreboard : 0 % progress
Diagram 2. What our own weekly log said before the pilot. The agent existed and the templates were ready; what was missing was someone to start every step. Outbound silence reached 48 days.

That was the state of the art of our own operation. The templates existed. The sender with suppression and a daily cap existed. The lists existed. The agent existed. What did not exist was a process that would start, do its work and stop without someone accompanying it from beginning to end. And since that someone was me, and I was selling, the channel stood still.

It should be said plainly: an agent that needs a person for every step is not an agent. It is a well-written form.

Why "switching on" the agent was not enough

The natural reaction to that diagnosis is to give the agent permission to act alone. We refused, and the reason lies in the runtime's technical history.

Valentina went through seven versions before touching a real mailbox. The first decision was about platform: our own implementation on the Messages API, because in the validation at the time managed agents were not available for our organization. Then came a runner that only produced drafts from synthetic data. Then a ledger with idempotency by message identifier and a global limit of five attempts per person. Then handling of the email provider's deferrals and terminal reconciliation. Then fail-closed: any ambiguous code is treated as failure and never retried. Then a durable SQLite ledger that survives restarts and two concurrent processes. And finally, the health read of an IMAP mailbox, first tested offline with 219 automated tests and then executed once, live.

Diagram 3. Evolution map of the Valentina runtime: platform decision, drafts-only mode, ledger and attempts, deferrals, fail-closed, durable ledger, mailbox health prepared offline and real health verified on October 12.
View Mermaid source
flowchart LR
    V0["v0.0
Platform decision"] --> V1["v1.0
Drafts only,
synthetic data"] V1 --> V11["v1.1 and v1.2
Ledger and attempts
maximum five"] V11 --> V13["v1.3
Deferrals and
reconciliation"] V13 --> V14["v1.4
Fail-closed"] V14 --> V2["v2.0
Durable local ledger"] V2 --> V3["v3.0-preflight
Mailbox health
tested offline"] V3 -->|"Sign-off and real read
October 12, 2026"| N["v3.0-health
Real health verified"] N -.->|"operational evolution,
not a release"| P["Operating pilot
with a local worker"]
Diagram 3. Seven versions before a single email. Each step closed with tests that never touched the network; the only real mailbox read was done read-only and recorded with its hash.

That single live read, on October 12 at 00:13 Mexico City time, ran over TLS 1.3 with a verified certificate, opened the folder with the EXAMINE command, which in the IMAP protocol means read-only mode, and logged out. Four commands recorded, zero mutations, evidence stored with its hash. It did not read a single message.

I tell all of this because it explains the standard we later demanded of the worker. If looking at a mailbox without touching it required 219 tests and an authorization with an exact phrase, writing to the ERP was not going to require less.

The platform decision: a local, finite process

On October 10 we revalidated the architecture against Anthropic's current documentation. The conclusion was less ideological than it sounds.

Claude's managed agents, the ones that run in the cloud with persistent sessions, connect their tools through MCP servers with a remote URL and per-session authentication through a credential vault. That is the right design for published infrastructure. Our tools are not published: the connector to the ERP runs in a container inside a desktop computer, with no exposed ports. A remote connection to localhost does not exist. Until we have a remote gate that is persistent and authenticated, that route was not a path.

Desktop extensions, for their part, are a good surface for a person to work with the agent, but they are not a synchronization bridge, and we were not going to hand them sending credentials.

Diagram 4. Comparison of two routes: managed agents in the cloud, which require MCP connections with a remote URL and per-session authentication and therefore cannot reach local services, versus a local worker that uses the Messages API and the MCP server on the same machine.
View Mermaid source
flowchart TB
    subgraph MA["Route A: managed agent in the cloud"]
        A1["MCP connections
with a remote URL"] --> A2["Per-session
authentication"] A2 --> A3["Our MCP lives
on a PC: localhost"] A3 --> A4(["No connection path
until a remote gate exists"]) end subgraph LW["Route B: local, finite worker"] B1["Node process
on the same PC"] --> B2["Messages API
fixed model"] B2 --> B3["Local MCP server
in a container"] B3 --> B4(["Report on disk
and process exit"]) end D{"Where do the
tools live?"} -->|"in the cloud"| MA D -->|"on the PC"| LW
Diagram 4. Why we chose a local, finite process instead of a managed agent. It was not an objection to the product: our services live on a desktop computer, and a remote connection to localhost does not exist.

We chose the boring option: a local Node process, with no new dependencies, that starts when a person clicks, calls the Messages API with a fixed model, uses the local MCP connector and exits. It is not a permanent service. It is not installed as a scheduled task. It opens no ports. If the computer is off, nothing happens, and that too is documented as a limit.

A cycle that ends on its own

The cycle's contract was written before the code, and we drew it before implementing it. A person starts. The worker verifies the ERP's identity, the authorized credential source and the budget. It reviews scoring, touch history, unsubscribes and replies. If evidence is missing or there is no eligible audience, it ends in HOLD with a report, and HOLD never retries on its own. If there is an audience, it freezes an immutable batch and waits for a human sign-off, with no waiting loop: the process simply exits and leaves the batch ready. The send, when it happens, goes out exclusively through the ERP's mass-mailing module, never through an SMTP of the agent's own.

Diagram 5. The agent's operating cycle: preflight, eligibility review, HOLD with a report if evidence is missing, immutable batch, waiting for sign-off without a loop, revalidation and dispatch exclusively through the ERP's email channel, with trace reconciliation at the end.
View Mermaid source
flowchart TD
    START["PAUSED
no active cycle"] --> RUN["A person starts the cycle"] RUN --> PREF["Preflight: ERP identity,
authorized source and budget"] PREF --> CHECK["Review scoring, touch history,
unsubscribes and replies"] CHECK --> OK{"Complete evidence
and eligible audience?"} OK -- No --> HOLD["HOLD with report
never retries on its own"] HOLD -->|"only with a new instruction"| RUN OK -- Yes --> LOT["Immutable batch
IDs, copy, signature and window"] LOT --> WAIT["WAITING FOR SIGN-OFF
no waiting loop"] WAIT --> AP["Explicit sign-off
for that batch and that revision"] AP --> RECHECK["Revalidate suppressions,
quota and idempotency"] RECHECK -->|"uncertain data"| HOLD RECHECK -->|"all controls complete"| MAIL["Dispatch only through
the ERP's mass mailing"] MAIL --> REPORT["Reconcile traces and report
queued is not delivered"] REPORT --> START
Diagram 5. The cycle's contract. The only transition that leads to a send goes through an explicit human sign-off and a later revalidation. Everything else ends in HOLD with a report, and HOLD never retries on its own.

On October 12 we ran two real cycles and a third, empty one.

The first was read-only: two inferences, two count calls to the ERP, a report on disk and process exit. Fifteen seconds passed between the budget reservation and its settlement. Calculated spend: USD 0.018.

The second is the one that matters. With explicit authorization for a single write, the worker created a mass-mailing template with no recipients, with a subject line that says in capital letters that it must not be sent, read it back, counted the associated emails and traces, and found zero and zero. Two inferences, one write, 13 seconds between reservation and settlement. Calculated spend: USD 0.026.

Diagram 6. Sequence of the worker's second real cycle: budget reservation, first inference, call to the tool that creates the draft, second inference, independent read-back of the draft and settlement of the spend, with thirteen seconds between reservation and settlement.
View Mermaid source
sequenceDiagram
    autonumber
    participant W as Local worker
    participant L as Budget ledger
    participant API as Messages API
    participant MCP as ERP MCP
    W->>L: reserve USD 5 (t = 0 s)
    W->>API: inference 1 (3,763 input tokens)
    API-->>W: decision: create a template with no recipients
    W->>MCP: create own draft (one operation, no retries)
    MCP-->>W: draft in draft state, 0 recipients
    W->>API: inference 2 (4,403 input tokens)
    API-->>W: report written
    W->>MCP: read draft back, count emails and traces
    MCP-->>W: 0 emails, 0 traces
    W->>L: settle USD 0.026 (t = 13 s)
    W->>W: write report and exit
Diagram 6. The thirteen seconds, reconstructed from the budget ledger and the per-request usage log. Two inferences, one write, zero recipients and a calculated spend of USD 0.026.

The third launch was the one that reassured me most. We ran it as a daily cycle: the worker looked for new candidates after applying suppressions, the five-touch history and the previous batch's exclusions, found none, and exited without a single inference, without creating templates and at zero cost. A second click the same day returned the previous result with the replay flag set and the ledger hash intact.

Total for the two cycles with inference: USD 0.045 out of an authorized USD 20 pilot.

The guardrails that make the speed tolerable

The part I care about sharing is not the speed. It is the list of things we decided before switching the process on, because those are what make thirteen seconds not thirteen seconds of risk.

The budget is reserved before thinking. Each cycle writes a USD 5 reservation to a durable ledger before the first inference. If the reservation does not fit within the pilot cap, the process does not start. On exit it settles at the consumption calculated from the token usage reported by the API and the model's public rates. If the outcome is uncertain, it keeps the full reservation and blocks the next cycle until a person reconciles. The internal limits are explicit: at most eight model turns, twenty connector calls, 2,048 output tokens, a 120-second timeout and no automatic retries. The model is pinned and there is no silent fallback: if the price or the model changes, someone has to change it by hand.

Diagram 7. The worker's budget model: a five dollar reservation before each cycle, a check against the twenty dollar pilot cap, settlement at the calculated consumption using public rates, and retention of the full reservation if the outcome is uncertain.
View Mermaid source
flowchart LR
    S["Cycle start"] --> R{"Does a USD 5 reservation
fit in the USD 20 pilot?"} R -- No --> STOP["Does not start
no inference"] R -- Yes --> RES["Reservation written
to the durable ledger"] RES --> RUN["Cycle: at most 8 turns,
20 MCP calls,
no retries"] RUN --> U{"Token usage
verifiable?"} U -- Yes --> SET["Settle at the cost calculated
with public rates"] U -- No --> KEEP["Keep the full reservation
and block until reconciled"] SET --> END["Report and exit"] KEEP --> END
Diagram 7. Money is reserved before thinking, not after. If the worker cannot prove how much it spent, the ledger assumes it spent the whole reservation and blocks the next cycle until a person reconciles.

One cycle per day and one process at a time. A local lock prevents two simultaneous cycles. The local date decides whether a cycle already happened; a second launch returns the previous result without spending. A day with no new candidates ends without inference and without empty drafts, because an empty draft created out of routine is also noise in the ERP.

Diagram 8. Repetition guardrails: a local lock prevents two simultaneous cycles; one cycle per local date; a second launch on the same day returns the previous result without spending; and a day with no new candidates ends without inference or drafts.
View Mermaid source
flowchart TD
    C["Click on the launcher"] --> LOCK{"Is there a lock
from another process?"} LOCK -- Yes --> X1["Exit: a cycle is
already running"] LOCK -- No --> DAY{"Was there already a cycle
on this local date?"} DAY -- Yes --> X2["Return the previous result
replayed = true, spend 0"] DAY -- No --> CAND{"Any new candidates
after suppressions and history?"} CAND -- No --> X3["Exit without inference
or draft: spend 0"] CAND -- Yes --> RUN["Cycle with reserved budget
at most ten drafts"] RUN --> REL["Release the lock
and write the report"]
Diagram 8. What happened on October 12 with the third launch: no new candidates, no inference, no spend and no empty templates. A second click that same day returned the previous result, with the ledger hash intact.

The connector has no send button. The dedicated MCP server exposes six read tools and two draft tools: create and edit only the drafts the cycle itself created, with a cap of ten recipients. There is no tool to send, schedule, delete or modify contacts. It is not a policy written in a document the agent could ignore: it is an absence in the code. Sending is done by a person, from the ERP, after reviewing the batch.

Diagram 9. The connector's two layers of tools: six read tools, plus creating and editing the cycle's own drafts with a recipient cap; and the list of what the connector cannot do: send, schedule, delete or modify contacts.
View Mermaid source
flowchart LR
    subgraph READ["Layer 1: six read tools"]
        R1["Status and version"]
        R2["Model fields"]
        R3["Search and read"]
        R4["Count"]
    end
    subgraph DRAFT["Layer 2: own drafts"]
        D1["Create draft
at most ten recipients"] D2["Edit only what
this cycle created"] end subgraph NO["Outside the connector, by design"] N1["Send"] N2["Schedule"] N3["Delete"] N4["Modify contacts"] end W["Worker"] --> READ W --> DRAFT DRAFT -.->|"only a person,
from the ERP"| N1 W x--x NO
Diagram 9. The connector has no send button. It is not a policy written in a document: it is an absence in the code. The worker's speed becomes tolerable because the irreversible step is out of its reach.

Every claim has a read-back. The worker does not report "I created the draft". It reads the record back, verifies it is in draft state, counts the associated emails and traces and writes those zeros in the report. We repeat those reads with independent queries before accepting the cycle. An agent's report is a hypothesis until someone checks it.

Commercial rules are code too. At most five touches per person, counted across campaigns and channels. One logical batch per day. Short copy with evidence, no fabricated figures. A lead that is already an opportunity or a customer does not enter cold prospecting. These rules existed in our skills as text; some of them now live in the guard that runs before every write, which fails closed if it cannot verify the history.

What the pilot proved and what it did not

We forced ourselves to make this distinction before writing the article, because it is very easy to confuse technical capability with commercial results.

Diagram 10. Two columns: what the pilot proved, as the technical ability to read, decide, write a draft and stop under budget, versus what it did not prove, such as a new commercial audience, a real send or operation without the computer on.
View Mermaid source
flowchart LR
    subgraph SI["What the pilot proved"]
        S1["Read the ERP and count
with scoped tools"] S2["Decide and write
its own draft"] S3["Read its own write back
and verify 0 emails, 0 traces"] S4["Reserve, spend and settle
under a cap"] S5["Stop on its own, at no cost,
when there are no candidates"] end subgraph NO["What the pilot did not prove"] N1["A new audience
eligible and approved"] N2["A real send
to a prospect"] N3["Operating with the PC off
or on a remote server"] N4["Receiving and classifying
replies"] N5["That the model key
has a global limit"] end SI ~~~ NO
Diagram 10. The distinction we forced ourselves to make before writing this text. An empty draft created by a machine is proof of technical capability, not an eligible commercial batch.

It proved that an autonomous process can read the ERP with scoped tools, decide, write its own draft, read its write back, reserve and settle budget, and stop on its own when there is no work. All of it with evidence: manifests, ledger, read-backs and automated tests, 219 for the runtime and 13 for the worker.

It did not prove a new, approved commercial audience: the database offered no eligible candidates that day without relaxing the criteria, and we did not relax them. It did not prove a real send to a prospect; there was none. It did not prove operating with the computer off or on a remote server. It did not prove receiving or classifying replies; the mailbox health read is not ingestion. And it did not prove that the model key has a global spending limit: the ledger limits this worker, not other programs using the same key.

An empty draft created by a machine is proof of technical capability. It is not an eligible batch, and we do not present it as one.

The honest comparison: hours against seconds

I want to be careful with the figure in the title, because it is the one that will be repeated most.

The three to five hours are a personal estimate per prospect, end to end, including the call and the planning of the next touches. The 13 and 15 seconds are telemetry per cycle, reconstructed from the budget ledger and the per-request usage log. A cycle does not include the preliminary call or the decision to send, and in these tests it did not include a real audience either. We are not comparing like with like, and we would rather say so than have an attentive reader discover it.

Diagram 11. Honest comparison: human work per touch, three to five hours, versus the machine cycle, thirteen to fifteen seconds; in between, the human decision to send, deliberately kept as the only bottleneck.
View Mermaid source
flowchart LR
    subgraph H["Human work per touch"]
        H1["Research, call, draft,
curate, send and plan"] H2(["3 to 5 hours
personal estimate"]) H1 --> H2 end subgraph M["Machine cycle"] M1["Reserve, infer, write draft,
read back, settle"] M2(["13 to 15 seconds
ledger telemetry"]) M1 --> M2 end H2 -.->|"what changes"| M2 M2 --> V{{"Human decision to send
bottleneck kept on purpose"}} H2 --> V
Diagram 11. We are not comparing like with like, and we say so. The hours are a personal estimate per prospect; the seconds are telemetry per cycle. What sits between them, the decision to send, is the bottleneck we want to keep.

What does change, and changes for real, is where the bottleneck sits. Before, the bottleneck was my afternoon. Now the bottleneck is a decision: review a frozen batch and give a sign-off. That decision takes minutes, not hours, and it is the only one we want to keep, because it is the only irreversible one.

When I saw the report of the second cycle I felt something I did not expect to feel in front of a text file. I felt fear. Not because the process had done something wrong, but because it did something right faster than I could observe it. That feeling is what gives rise to the last section.

Where Transgenia stands

This article is not neutral and it is worth saying so. Our position, so you can contrast it with any other provider's:

Diagram 12. Model of operational respect for artificial intelligence in five steps: from the initial fright to limits written before switching on, evidence for every claim, delegation with human sign-off and earned trust that allows permissions to grow on evidence.
View Mermaid source
flowchart LR
    F["Initial fright
it works and it is fast"] --> G["Limits written
before switching on"] G --> E["Evidence for every claim
tests, ledger, read-backs"] E --> D["Delegation with sign-off
a person decides the irreversible"] D --> C["Earned trust"] C -->|"widen permissions
only on evidence"| G C -.->|"never on enthusiasm"| F
Diagram 12. Our thesis in one drawing. Respecting artificial intelligence is neither fearing it nor worshipping it: it is treating it like any system that acts faster than we can supervise, with prior limits, evidence and a person at the irreversible step.

Sources

Technical facts about products and protocols rest on public sources. The pilot and sales-channel figures are Transgenia's: they come from our internal audit log of October 10 to 12, 2026, and from our weekly reviews of August and September, and are marked as such.

Frequently asked questions

Does the agent send emails on its own?

No. The connector the worker uses has no tool to send, schedule or delete. It can read the ERP and create or edit its own drafts with a cap of ten recipients. Sending is done by a person from the ERP's mass-mailing module, after reviewing the batch and giving an explicit sign-off.

What exactly does "13 seconds" mean?

It is the time between the budget reservation and its settlement in the worker's second real cycle, reconstructed from the ledger and the per-request usage log. It includes two inferences, one draft write and the verification reads. It does not include the preliminary call, the human review or the decision to send.

Where do the three to five hours come from?

It is the author's personal estimate of the full manual prospecting process for one account: research, finding emails, calling, drafting, curating, sending and planning the next touches. It is not telemetry and the article says so every time it uses it.

How much did the pilot cost?

The two cycles with inference added up to USD 0.045, calculated from the token usage reported by the API and Sonnet 5.5's public rates, out of an authorized USD 20 pilot with a USD 5 cap per cycle. The third cycle, with no new candidates, cost zero. It is not an invoice nor a verification of the account balance.

Why not use a managed agent in the cloud?

Because managed agents connect their tools through MCP servers with a remote URL and per-session authentication, and our connector to the ERP runs in a local container with no exposed ports. Without a persistent, authenticated remote gate, that route does not exist. We chose a local, finite process that starts with a click and ends on its own.

What happens if the worker fails in the middle of a cycle?

The design is fail-closed. If the outcome is uncertain, the ledger keeps the full budget reservation and blocks the next cycle until a person reconciles. There are no automatic retries and no model fallback. A lock abandoned by a crash requires confirming that no process is active before recovering it by hand.

Does this already work with the computer off?

No. The worker needs the computer, Node and the connector's container running. It is not installed as a service or a scheduled task, and there is no remote deployment. It is a known, documented limitation; moving it to a remote executor first requires an authenticated gate and a capacity measurement.

What do you mean by "respect for artificial intelligence"?

Operational respect, not fear and not worship: treating a system that acts faster than we can supervise with limits written before switching it on, evidence for every claim and a person who decides the only irreversible step. It is the same discipline demanded of any automation with access to production.

About the author and Transgenia

Efraín Carreón Ortiz is Managing Director of Centrum Transgenia, a Mexican technology boutique, and carries most of the company's sales. He holds the official Claude Code badge (Claude Partner Badge) issued by Anthropic, verifiable on Credly.

Transgenia is an OpenAI Select Partner within the OpenAI Partner Network and a registered partner in Anthropic's Claude Partner Network. Team: Víctor Estrada Bello, Chief PMO; Danild Johan Zambrana López, Chief Technology Officer; Jaime Lozano Castañeda, Chief Marketing Officer; Efraín Carreón Ortiz, Managing Director (Chief Executive Officer).

Let's talk: contacto@transgenia.org, WhatsApp +52 55 8034 0405, 15-minute call or the contact page.

Keep reading

← Back to Blog
Transgenia, Verified IT agency on Vai.me