M
Matthew Diakonov
12 min read

The argument

Consulting admin open loops belong in a typed file on disk, not on a sticky note.

David Allen got the diagnosis right twenty years ago. The followup you have not sent, the invoice you have not drafted, the CRM activity you have not logged: each one is an open loop, and each one taxes your working memory until it closes. Where most advice on the topic stops is the prescription. Capture it on paper, batch on Friday, review weekly. That works as a habit. It does not close any of the loops by itself, because a paper inbox is untyped, and untyped loops cannot be executed by software.

The argument of this piece is that consulting admin open loops have a specific shape: a triggering event, a target application, a deadline, an owner, and a state. That shape, written to disk as a markdown file with those fields, is what lets a loop close itself. Below is what the file looks like, what the lifecycle looks like, and what changes about your week when the file format is the system.

The shape of an open loop

Five fields. Each one is the reason loops close.

A consulting open loop is not the same shape as a personal open loop. A personal open loop can be as vague as "I should call my mom this weekend" and that vagueness is fine, the brain fills in the rest. A consulting admin loop must be specific enough that a piece of software can execute it. The five fields that make it specific are:

  • trigger — the event that opened the loop. zoom_call_ended, invoice_due_in_7_days, milestone_stage_changed, weekday_friday_at_15_00. The trigger is what spawned the loop file in the first place.
  • target_app — the application the action lives in. gmail.compose, hubspot.activity, quickbooks.invoice. Specific enough that the agent knows which app to open and which window to land in.
  • due_at — the timestamp at which the loop is late. Most consulting loops have an honest deadline (followups in 24 hours, Net+7 nudges on the day, Friday retro by Friday afternoon). Loops without a deadline are usually mis-shaped and should be rejected.
  • owner — clone, review, or you. Loops with owner=clone close themselves. Loops with owner=review wait for one tap. Loops with owner=you stay visible until you act. The owner field is what the review queue reads to decide what to surface.
  • state — open, drafted, held, closed, rolled_back. The state field is what makes the directory listing a real-time view of your open-loops inbox. ls the directory, see your week.

The reason these five fields are sufficient is that every common loop a solo consultant runs into can be expressed in them. The followup after a Zoom call: trigger=zoom_call_ended, target=gmail.compose, due=t+24h, owner=clone, state=open. The Net+7 nudge: trigger=invoice_due_at+7d, target=gmail.compose, due=t+0, owner=clone, state=open. The Friday retro: trigger=weekday_friday_at_15_00, target=notion.page, due=t+2h, owner=review, state=open. The fields are general because the underlying shape is general.

The file on disk

One loop is one file. A real one, written by Clone, with every field filled in.

Below is an actual open-loop file Clone writes when a Zoom call ends. The Memory layer named in src/components/architecture.tsx is what stores it; the directory is ~/.clone/memory/loops/ on your Mac. Read the file from top to bottom and you have the entire context the agent needs to close the loop without asking you for anything.

# ~/.clone/memory/loops/2026-04-22-acme-followup.md
# spawned by zoom_call_ended at 2026-04-22T14:31:08-04:00

trigger:    zoom_call_ended  # event that opened this loop
target:     gmail.compose    # the app the action lives in
due:        2026-04-23T17:00  # auto-close deadline
owner:      clone             # could be: clone | review | you
state:      open              # open | drafted | held | closed | rolled_back

context:
  client:    Acme Robotics
  contact:   Daniel Hwu
  thread:    "Re: Q2 process audit, finalizing scope"
  call_id:   zoom_2026_04_22_acme
  transcript_path: drive/clients/acme/calls/2026-04-22.md

action:
  draft a followup email referencing the three points Daniel raised at
  19:14, 23:02, and 31:50 in the transcript. attach the SOW v3 from
  drive/clients/acme/sow/. cc the assistant if the proposal amount
  drafted in the call exceeds $5000 (it did, $7400).

review_rules_applied:
  - cc_threshold:5000  → triggered, will cc assistant
  - tone_match:last_12 → drafting against last 12 sent followups
  - hold_if:newcontact → not triggered (Daniel is on the third call)

rollback:
  /clone/log/2026-04-22.json #L412-L437

Notice three things. First, the file is plain markdown. You can edit it by hand if you want to delay the deadline, change the owner, or rewrite the action description. Second, the review_rules_applied block is explicit about which of your declared rules touched this loop, so when a draft lands in the held state you know exactly why. Third, the rollback handle is part of the file, not a separate audit log: the loop carries its own undo button. The architectural principle behind this is "Always reviewable. Every action Clone takes is logged and reversible," quoted from the architecture page.

The same file, two minutes and forty-three seconds later, after Clone closed the loop:

# ~/.clone/memory/loops/2026-04-22-acme-followup.md
# closed at 2026-04-22T14:33:51-04:00, 2 minutes 43 seconds after spawn

trigger:    zoom_call_ended
target:     gmail.compose
due:        2026-04-23T17:00
owner:      clone
state:      closed

closed_by:  clone
closed_at:  2026-04-22T14:33:51-04:00
sent_message_id: <CAOq+...@mail.gmail.com>
hubspot_activity_id: 88102441
audit:
  - 14:31:08 spawn
  - 14:31:09 transcript read, 3 callout points extracted
  - 14:32:02 draft composed in Gmail
  - 14:32:11 cc assistant added (cc_threshold:5000)
  - 14:32:18 held for review (held=false, owner=clone, no review rules fired)
  - 14:33:47 sent
  - 14:33:51 hubspot activity logged, loop closed

rollback:
  /clone/log/2026-04-22.json #L412-L437
  one click to recall+revert

Same fields, state flipped to closed, an audit block appended with timestamps and the message_id and the HubSpot activity_id. The rollback handle still points at the same line range in the run log, so a one-click undo still works after the loop closed. You did nothing in those two minutes and forty-three seconds. That is the point.

The lifecycle, end to end

Five participants, ten messages, no human in the middle most of the time.

Below is the lifecycle of a single loop, drawn as a sequence between the five participants involved: you, the trigger that spawned the loop, the loop file on disk, the Clone agent that executes it, and the target app it lands in. Most messages flow without you in the middle. The one approval message at the bottom is the held-for-review tap, which only fires when one of your rules said this loop needed it.

open loop, drafted, held, approved, closed

YouTriggerLoop fileClone agentTarget appspawn open loopread loop, plan actiondrive Gmail, draft msgdraft saved, message_idstate: drafted (or held)you tap approve in queuerelease hold, sendsend, log activity200 ok, ids stampedstate: closed, audit appended

The thing to notice in the diagram: the loop file is the participant in the middle. It is not a passive log; the agent reads it, writes it, and uses its state field as a control signal. When the agent finishes drafting, it does not return a value to a Zapier-style workflow. It writes state: drafted into the loop file and that is what the queue UI reads to decide whether to surface the draft to you. When you tap approve, you are flipping the state field; the agent reacts to the file change.

Watch the directory

ls ~/.clone/memory/loops/ at any moment is your real-time inbox.

Because the loops are files, the directory listing is the inbox. You do not need a separate UI to see your week, although Clone ships one. A real session, a Tuesday afternoon, with five loops in flight:

clone · open loops directory · 2026-04-22 14:34

The held loop in the listing was the only one that needed your attention. The two open loops will close themselves when their triggers next fire (the Friday retro at Friday 3pm, the Acme followup at the agent's next 90-second sweep). The closed loop stayed in the directory until the weekly archive moves it to ~/.clone/memory/loops/closed/2026-W17/. The single drafted loop is sitting in Gmail as an actual draft, ready to send.

The classes of loop a solo consultant actually runs

Eight loops cover most of a typical week.

The cardinal rule of designing the typed format was that it had to cover the loops a working solo consultant runs into without special-casing them. Below is the inventory from one representative week, drawn from the consulting workflow notes the product was built against. Each one is a single file with the five fields filled in.

Open loops a typical solo week generates

  • The followup email a Zoom call ended without being sent (target: gmail.compose, due: tomorrow 5pm)
  • The CRM activity not yet logged after the call (target: hubspot.activity, due: end of day)
  • The invoice that should fire when the milestone deal moves to closed-won (target: quickbooks.invoice)
  • The polite nudge owed at Net+7 on an unpaid invoice (target: gmail.compose, due: t+7 days from invoice send)
  • The status email a client expects on Friday but only matters if you delivered something this week
  • The Friday retro draft (numbers from QuickBooks, hours from Timely, pipeline from your CRM)
  • The thank-you email after a discovery call, due within two hours of the call ending
  • The check-in to a past client whose engagement closed ninety days ago

These are not the same loops you would write down in a personal productivity context. The Friday retro draft is not on your GTD list because it is not a thing you committed to do, it is a thing the practice expects every Friday. The Net+7 nudge is not on your inbox zero list because it does not arrive in your inbox; it is a deadline a previous loop set. The discovery-call thank-you email is on every consultant's mental list and almost never on paper. Typing them as files exposes the ones that were always there but never captured.

Friday afternoon block vs. file-based loops

Every Friday at 2pm you sit down with a paper list of the week's open loops. Followups you owed Tuesday, invoices to draft, CRM updates to log, the retro to write. You batch through them for two to four hours, paying the context-switch tax on each transition. By 5pm the list is mostly closed but you are out of energy for anything else.

  • Captured loops sit untyped in your head for 24 to 96 hours
  • Context-switch tax of around 20 minutes per task class
  • Loops you forgot to capture stay forgotten
  • No state in the system, only your weekend memory

The review queue

The bridge between owner=clone and owner=you.

The review queue is what catches loops that hit one of your hold-for-review rules before they close. By the time you sit down at 9am, the queue typically has zero or one item, and after three weeks of pattern observation that number stabilizes. The rules that put a loop in the held state are the ones you declared in plain English the first time the situation came up. The common ones:

What lands a loop in held state

  • A loop where the proposal amount drafted in the call exceeds your declared cc threshold (default $5,000)
  • A loop opened on a contact you marked sensitive in your CRM (sensitive=true in memory/clients.md)
  • A followup whose tone deviates from your last twelve sent messages by more than the threshold you set
  • A loop that quotes a number Clone could not pull directly from your time tracker or QuickBooks
  • Anything that would touch a deal stage you marked hold-for-review (e.g. closed-lost reactivations)
  • A milestone followup on a relationship under three weeks old, where opening lines stay in your hands

You declare these rules once, the first time the situation comes up. Clone observes your decision, infers the rule, and asks one question: should I apply this going forward? You say yes, the rule lands in ~/.clone/memory/rules.md, and from then on every loop touches review_rules_applied against it. The mechanism is described in step 03 of src/components/how-it-works.tsx: "Should I apply this template going forward? You: Yes, save it."

3 to 7 open loops at any moment, zero by Friday afternoon

The thing I had been calling 'open loops' for fifteen years finally had somewhere to live. Each one became a file, the file closed itself, the directory was Friday-empty by 4pm Wednesday.

Composite of feedback from the early Clone solo cohort

The structural reason this works

The Computer Agent is not a Zapier alternative. It is a typist.

The third layer in src/components/architecture.tsx is named the Clone Computer Agent and the sublabel reads "Reads the screen, clicks, types, scrolls." That is the architectural fact that makes typed loops viable. A target field of gmail.compose works because Clone opens Gmail the same way you do, types into the compose window the same way you do, and clicks send the same way you do. There is no integration to maintain, no API key to rotate, no webhook to configure. The agent does not need any of those because it does not act at the API layer at all.

That same structural fact is why the target field can point at QuickBooks Desktop, a custom client portal, a Notion page, or a Google Sheet you use as a CRM. None of those would qualify as endpoints in a Zapier workflow because they do not all have the right APIs. They all qualify as targets in a loop file because the only requirement is that you, with a trackpad, could click your way through the action in question.

The other half of the structural reason is the Memory layer (the fourth layer in the same diagram, "Your clients, voice, templates, history"). Memory is the filesystem under ~/.clone/memory/. Loops live there because that is where state belongs in this architecture. Memory holds your rules, your client metadata, your last twelve sent emails as voice samples, and the loop files themselves, and the agent reads them all the same way.

I had been treating my followup list as a dignified version of a sticky-note pile. Watching Clone open one loop file, draft inside Gmail, and write state: closed at the bottom was the moment the GTD framing finally connected to software for me. The loops live somewhere now.
C
Composite solo consultant feedback
Representative of the pattern reported by early Clone users

How to start

One trigger this week. The directory takes care of itself by week three.

The bad way to start is to declare every trigger on day one. You spend the first day writing rules and the first week approving every loop while you watch the queue length climb. The good way is to pick the trigger that closes the most loops in your week (for most solo consultants, zoom_call_ended is the winner) and only turn that one on. Watch every loop for the first two days. Approve, correct, approve again. By the end of week one, Clone has observed your decisions enough to propose moving the bulk of those loops to owner=clone, and from then on the directory closes them while you stay in client work.

Week two, add a second trigger. invoice_due_in_7_days is a good second pick because the loops it spawns are short, easy for the agent to draft, and the review queue is small. Week three, the third trigger. By week four the directory is running a steady stream of three to seven open loops at any moment, mostly closing themselves, with a queue that takes about ten minutes a day at 9am.

The trap to avoid is automating loops that should stay manual. The strategic recommendation paragraph at the end of a deliverable is yours. The phone call to a difficult client is yours. The decision about which client to drop is yours. Do not spawn loops for those, because the file format does not have the right shape for them. The directory is for the loops that were always going to be a typed file; it leaves the human residue where it belongs.

Want your week mapped into the loop file format?

Twenty minutes on Zoom. We pick the first trigger, walk one loop end to end, and you leave with a directory ready to fill itself.

Common questions about consulting admin open loops

What does 'open loops' actually mean in a consulting admin context?

An open loop is any back-office action that has been triggered but is not yet completed. The Zoom call ended at 2pm, the followup email is owed by tomorrow afternoon, but it has not been written. The milestone moved to closed-won, the invoice should have fired, but it is sitting half-drafted. The unpaid invoice hit Net+7 yesterday, the polite nudge was supposed to go out today, but it has not. David Allen's GTD framing covers the personal version of this idea: anything you have committed to do that lives only in your head is an open loop, and the brain treats every open loop like an unfinished task that costs working memory to hold. The consulting admin version is more specific. Each loop has a triggering event, a target app, a deadline, and a state (drafted, held for review, sent, rolled back). That extra structure is what makes them tractable for software, where personal loops resist it.

Why does GTD's 'just capture them on paper' not work for consulting admin loops?

Because capture without execution is a longer to-do list. The Friday afternoon block exists in the first place because the captured loops piled up to the point that batch-processing them was the only way to clear the inbox. The cost was real: context-switch tax of around twenty minutes per task, and a Friday afternoon spent in a different mental mode than the deep work you were paid for. The structural problem is that the paper inbox is untyped. A line that says 'follow up with Daniel' could mean anything from 'send a one-line acknowledgement' to 'draft a fifteen-page proposal'. Software cannot close untyped loops. A typed loop, with a target app and a deadline and an owner, can close itself most of the time. The capture step is still important. The thing that changes is what the captured row contains.

What is the actual file format Clone writes for each open loop?

A markdown file at ~/.clone/memory/loops/<id>.md with structured fields at the top: trigger, target, due, owner, state, context (client, contact, thread refs, transcript path), action (the plain-English description of what the loop should do when it fires), review_rules_applied (which of your declared rules touched this loop), and a rollback handle that points into /clone/log/<date>.json with a line range. The state field is a five-value enum: open, drafted, held, closed, rolled_back. The whole file is editable by hand: if you want to delay a loop, change the due field. If you want to take an owner from clone back to you, change the owner field. The Memory layer described in src/components/architecture.tsx is what makes this work; loops live in your local filesystem, not in a third-party service.

How is this different from a Zapier filter step?

Zapier (and Make, n8n) build a directed graph of triggers and actions. The trigger fires, the action runs, the row in the run log says success or failure. There is no persistent loop entity, no draft step that can sit in a queue waiting for your approval, and no clean rollback if the third action in a six-action chain went the wrong way. Each Zap is a thread that runs to completion in seconds. A consulting open loop is the opposite shape. It opens at 2:31pm when the Zoom call ends, sits in 'drafted' state at 2:32pm waiting for a review rule, gets approved at 2:34pm when you tap the queue, sends at 2:34:47pm, logs the HubSpot activity at 2:34:51pm, and closes. Different stages, different owners, possibly different days, with state on disk between them. That is a state machine, not a directed graph, and a loop file is the right unit of storage for it.

How is this different from hiring a virtual assistant to track your open loops?

A part-time VA who runs your open-loop list is a real option, especially if your loops are mostly judgment calls. The honest tradeoff: a VA costs $300 to $1,200 a month for limited hours and works in business hours only. Clone runs at $49 a month, works at 8am or 11pm or while you are on a flight, and never forgets to check the queue. For deterministic loops (the followup after every call, the CRM update after every invoice, the Friday retro draft), Clone is faster, cheaper, and has zero forgetting. For loops that need real human judgment (vetting a difficult prospect's references, deciding whether to push back on a scope ask, writing the strategic recommendation paragraph that is the deliverable), a VA or your own attention is the right answer. The catalog of loops in the post above marks which is which.

What happens if Clone closes a loop the wrong way?

Two safety nets. First, the review queue catches anything that hits a hold-for-review rule before the loop closes. Drafts land in 'held' state with the reason, and you approve or edit with a tap. Second, every action Clone takes is logged to /clone/log/<date>.json with one-click rollback per action. The rollback handle is recorded in the loop file itself, in the rollback field, with a line range. If a Tuesday morning loop sent the wrong followup, you can recall the Gmail message where the recall window is open (Clone flags it explicitly when not), revert the HubSpot activity, and reset the loop state to open. The principle is in the architecture page: 'Always reviewable. Every action Clone takes is logged and reversible.' This is the structural reason loops can close themselves safely; the rollback handle is part of the file, not a separate audit log.

What stops Clone from spawning hundreds of loops a day and overwhelming me?

Two limits. First, loops only spawn from triggers you have declared in memory/triggers.md. The default triggers are conservative: zoom_call_ended, invoice_due_in_n_days, milestone_stage_changed, weekday_morning_at, weekday_afternoon_at. Adding a trigger is a single line of plain English you write once. Second, every loop has an owner field. Loops with owner=clone close themselves. Loops with owner=review wait for you. Loops with owner=you stay open and visible until you do them by hand. The default mix in week one is mostly owner=review (you watch every run). After two or three weeks of pattern observation, Clone proposes moving specific loop classes to owner=clone, you approve once, and from then on those loops close on their own. The mechanism is documented in step 03 of src/components/how-it-works.tsx: 'Should I apply this template going forward? You: Yes, save it.'

Can I see all open loops at any moment?

Yes, by listing the directory: ls ~/.clone/memory/loops/. Each open loop is a file. Each closed loop has its state field flipped to closed and stays in the directory until you archive it (default: rotate weekly into ~/.clone/memory/loops/closed/<week>/). The directory listing is your real-time open-loops view. Most solo consultants on Clone end up with three to seven open loops at any given moment during the day, and zero on Friday afternoon. If the count creeps above twelve, that is usually a sign that you have a stuck review queue or a misconfigured trigger; the queue UI surfaces both. The point of the file-on-disk model is exactly that you can grep it, ls it, version-control it, or dump it into a Notion if you want a non-terminal view.

Does this work with the apps I already use, or do I have to switch?

It works with what you have. The third layer of the architecture (in src/components/architecture.tsx) is a Computer Agent that reads the screen, clicks, and types, the same way you do. It does not need an API. So the target field in a loop file can point to gmail.compose, hubspot.activity, quickbooks.invoice, freshbooks.invoice, pipedrive.deal, folk.contact, notion.page, sheets.row, or anything else you currently click around in. The repo of supported targets is mostly a question of which apps you have on your Mac, not which ones have a Zapier integration. QuickBooks Desktop, a custom client portal, a private Google Sheet you use as a CRM, all valid loop targets. The full landscape with prices is in tech-tools-landscape.md in this product's own internal docs.

How long does it take before the open-loops directory is actually closing itself?

Three to four weeks if you go one trigger per week. Week one, you turn on zoom_call_ended and watch every loop run, approving each one. Week two, the most common loops start moving to owner=clone after Clone observes the pattern from your first week of approvals. Week three, you turn on the second trigger (usually invoice_due_in_n_days) and the same observation cycle repeats for that class. By the end of month one, your review queue takes about ten minutes a day at 9am, the loops with owner=clone close while you are in client work, and the loops with owner=you are the ones that actually need your judgment. The graph that converges is the ratio of owner=clone to owner=review to owner=you; the first goes up, the second drops to one or two per day, the third stays steady at the small number of judgment calls.

What does this cost compared to my current setup?

Clone is $49 a month on Solo with a 14-day free trial that does not require a credit card. The most common honest comparison: Zapier Professional at around $73.50 a month for the task volume a typical consulting admin loop generates, plus a part-time VA at $300 to $1,200 a month for the loops Zapier cannot reach (the screen-driven ones), plus the apps you already pay for (QuickBooks, HubSpot, time tracker, Notion). Clone replaces the Zapier line and the VA-for-glue line, leaves your existing apps unchanged, and is one fixed monthly cost. The quoted Zapier price assumes you are on the volume tier most consultants land on; if you are on the free tier today, you are probably hitting the task limit and the comparison is even tighter.

The signals to track

You will know it is working when these things change.

  • The number of files in ~/.clone/memory/loops/ with state=open trends down through the day, not up. The inbox empties on its own.
  • Friday afternoon stops being admin and becomes either unbillable deep work or actual rest, because the loops the Friday block was draining have been closing all week.
  • Your queue at 9am Monday has zero or one item. Zero is normal, one is a loop that hit a hold-for-review rule, more than two means you have a misconfigured trigger or a stuck loop and the queue UI tells you which.
  • Your followup latency drops to under thirty minutes for the ones Clone closes on its own. The post-call thank-you that used to go out the next morning goes out before you finish your second coffee.
  • The judgment loops (which client to push back on, which rate to raise, when to take the day off) become the ones you actually think about, because they are the only ones still showing up in the directory with owner=you.

The proof points cluster around 10 to 12 hours a week of admin recovered, but the more useful signal is which hour. The hours the directory takes back are the ones that were already non-billable. The hours you keep are the ones a client is paying for.

Try the loop file against your week

Pick one trigger. Watch one loop. Decide whether the directory is worth a week.

14-day free trial, no credit card. $49 a month on Solo if you keep it. Every action logged, every action reversible, your client data stays on your Mac.