It is 6:40 pm and the AI assistant has just told you the failing tests are fixed. You run them yourself. Two are still red. You could paste the output back in and ask again, or hand the job to something that only stops when the test runner agrees. The next morning a colleague in marketing asks a different question: can the same kind of thing check three competitor websites every weekday before she gets in?
Both of those jobs live in the same corner of osFoundry, under two neighbouring menu items: Loop and Graph.
Two ways to run agents without babysitting them
A Loop is a reusable way to run an agent team toward a goal. It bundles a roster of agents, a goal written in plain words, a way to check whether that goal is met, hard limits (how many rounds, how many failures in a row before it gives up), and optionally a trigger such as a schedule. It works in rounds, grades each round against the goal, and stops by itself. A Graph is a saved workflow program for when the path is not fixed: it can branch on a result, redo one part until it passes, fan work out to several agents at once, pause for a human approval, and call other graphs. Both sit in the main sidebar of the osFoundry desktop app, Loop first and Graph directly below it, and the app's own one-line distinction is the one worth remembering: a Loop always takes the same path, a Graph decides its path as it goes.
What you see when a Loop is running
This is a Loop session after it finished (the tests and file names are example data). The parts worth knowing:
- The session rail on the left. Each Loop run is its own session, with a status underneath. "Verified" here means the last round passed the check, not that the AI said so.
- The round strip at the top of the middle column. "Round 3 of 4" plus the check it uses ("Runs npm test — a zero exit code means done") and a counter of verification failures in a row, which is what stops a loop that is going nowhere.
- The Rounds tab. One row per round with how many criteria it met ("1 of 3 met", "2 of 3 met", "3 of 3 met"). Open a round to see exactly which criteria passed in it.
- The inspector on the right, with Goal, Trigger and Hooks tabs.
- Pause and Cancel above the panels, for when you want it to stop now rather than at the next check.
Use case 1: a developer who wants the tests actually green
Who: a solo developer at the end of the day with a red JavaScript suite and an assistant that keeps declaring victory.
You open Loop and press New session. The New loop run dialog lists ready-made loops, and searching "JS suite" finds Get the JS suite green. Before you start it, the card on the right tells you how it behaves: Who runs it (a debugger agent leading three test specialists), How it stops (at most 4 rounds, stops after 3 failures in a row) and How it grades itself (runs npm test, and only a zero exit code means done).
Under Start it you pick Run once now instead of Just add it, choose the project and the folder the agents should work in, and press Run it now. Then you open the Rounds tab and watch. In the example run, round one met one of three tests, round two met two, and round three met all three, at which point the loop stopped on its own and the session was marked Verified.
What you end up with is not a chat message claiming a fix, but a round-by-round record of which test passed when, graded by your own test runner. The same list has loops for Python, Go, Rust and Java suites, type errors, lint and flaky tests.
Use case 2: a marketer who wants a weekday competitor report
Who: someone in marketing or product who checks competitor sites by hand and does not write code.
In the same New loop run dialog, the top section is labelled "Start here — these need nothing set up", and Watch the competitors is in it, because it only searches the web and never touches your files. You type who to watch and what to look for into Goal for this run (for example, pricing, new features and hiring), pick Run once now and press Run it now. The first report lists only what changed, with a date and a source on every line, and a company's own claims are marked as unverified.
To make it recurring, you open the Trigger tab and press Add a schedule. The Run this on a schedule dialog offers presets (Every 30 min, Hourly, Daily 09:00, Weekdays 09:00), shows the cron line and the next three run times, and asks two practical questions: what to do if a run is still going when the next is due (Skip it, or Wait, then run), and what to do if the computer was asleep (Up to an hour late, Up to 12 hours late, or However late).
After Save schedule, the Trigger tab shows "On a schedule" with the next run time. She ends up with a report waiting every weekday morning, without opening a terminal. Schedules run while the desktop app is open, which is what the catch-up setting is for.
Use case 3: a team lead whose workflow has to branch
Who: a lead who wants every file in a large change reviewed separately, then one merged report, with a human sign-off before anything irreversible happens.
This is where a Loop stops being the right shape. A Loop repeats the same plan each round, while the lead needs one reviewer per file, then a merge step, and sometimes a pause for approval. That is a Graph.
You open Graph and press the plus button next to the list. Create a Graph offers two routes: Start with a working graph (a safe, runnable program you then adjust) or Choose a starter. The starters are worked examples of common shapes, each with a short when-to-use note. Review each item, then merge runs one agent per item at once and then a single merge pass. Triage and route classifies an input once and sends it to exactly one specialist. Propose, ask, then apply works out a change, stops for a human answer, and only acts on a yes.
The program itself is code, not a drag-and-drop diagram, because branching and bounded retries are real control flow. You usually let Maestro or an agent write or adjust it, and you manage the parts that matter day to day in Configure session: Maximum agents at once, a token warning, a Hard token ceiling, the default input, and which agent and model each step uses.
When it runs, the run pane has three tabs. Run shows the steps live, and you can Pause, Resume or Cancel. If the graph reaches an approval step, a card asks you to Approve or Decline, and the rest of the parallel work carries on while it waits. Changes lists the files the run created or edited, and some of those can be undone. History lists earlier runs, so a failed run and the rerun that fixed it sit side by side. The lead ends up with a repeatable review whose runs and file changes can all be inspected later. Graphs can be read in a browser, but running one needs the desktop app.
Where Loop and Graph hand off
Neither feature works alone. The agents in a Loop's Team roster come from Agent team and Agent Registry, and the loop itself is a reusable preset you can version in osStudio, so raising a quality threshold or a retry limit leaves a history rather than a silent edit. A Graph is given a stable identifier when it is created precisely so that loops and other graphs can call it, which means a scheduled Loop can kick off a branching Graph at 9:00. In Message, loops and graphs can be members of a channel next to people and single agents, so their updates land in the team's usual room. For the scheduling side in more depth, see scheduling agents on a cron and agent triggers.
Questions newcomers ask
Is a Loop just a cron job?
No. A schedule is only one optional part of it. A Loop is a team plus a goal plus a check, with round limits, and it keeps a ledger of which criteria each round met. You can run one once by hand and never give it a trigger.
If a Loop can run agents in parallel too, why would I need Graph?
Parallelism is not the difference. Reach for Graph when the next step depends on the result of the last one: route to one specialist, retry only the part that failed, wait for a human yes, or call another workflow. If every run follows the same steps, a Loop is simpler.
Can a loop run forever and burn through my API budget?
Every ready-made loop has a round ceiling and stops after a set number of failures in a row, and the card shows both before you start. Graphs have Maximum agents at once and a Hard token ceiling in their session settings.
Do I need to write code?
Not for Loops: you pick one, set the goal and the trigger in dialogs. A Graph's program is code, but you can start from a starter and let Maestro or an agent edit it, and change inputs, limits and per-step agents without touching the program.
You can try both in the desktop app from osfoundry.io/download.







