The code shows every path, not the one taken
Which branch ran, which function returned early, how many times a loop went around: none of it is in the source.
Runtime context for Python
Ormaos records and shows it. The runtime context for your agent and for you. Built for your coding agent to query from the terminal. Plain enough for you to read too.
Python 3.12+ · Open source, Apache 2.0 · Self-hostable · CLI only, no dashboard (yet)
The code shows what could happen. The test output shows how it ended. What happened in between was never written down, unless you logged that exact thing.
Which branch ran, which function returned early, how many times a loop went around: none of it is in the source.
When an exception is caught and ignored, there’s no traceback and no error message. All that’s left is whatever the code did next.
Without a recording, checking something new means adding a print or a breakpoint and running again. With one, you ask the recording before you run again.
Ormaos records what ran, so your agent can read it instead of inferring it.
A test fails because a function returns an empty list. No exception, no error message, and the code looks fine.
$ ormaos run -l 2 -- pytest tests/test_pipeline.py::test_import
FAILED tests/test_pipeline.py::test_import - assert 0 == 1
ormaos: recorded r_7f3a2 · level 2 · exit code 1 · next: ormaos show
$ ormaos exceptions --swallowed
e1 ValueError: time data '2025-12-31' does not match format '%d/%m/%Y'
raised dates.py:22 in parse_date (c41)
swallowed pipeline.py:56 in normalize (c40) except ValueError
1 swallowed · recording r_7f3a2 · level 2 · whole process
next: ormaos tree --at c40
or record deeper: ormaos run -l 3 -s normalize -- <same command>$ ormaos run -l 3 -s normalize -- pytest tests/test_pipeline.py::test_import
FAILED tests/test_pipeline.py::test_import - assert 0 == 1
ormaos: recorded r_9c1e4 · level 3 · scope: normalize · exit code 1
$ ormaos path --function normalize --not-run
normalize · pipeline.py · call c40 · recording r_9c1e4
51 ▸ records = []
52 ▸ for row in rows: 1 iteration
53 ▸ date = None
54 ▸ try:
55 ▸ date = parse_date(row) raised ValueError (e1)
56 ▸ except ValueError:
57 ▸ pass
58 ▸ if date is None: True
59 ▸ return [] returned list (empty)
60 records.append(date) never ran
61 return records never ran
level 3 · scope: normalize · next: ormaos tree --at c40The exception was swallowed, the function took the early return, and the list came back empty. Your agent reads what happened instead of inferring it.
Start wide and cheap. Go deep only where it matters. Level 3 always needs a scope: one or more functions, or a module.
ormaos showThe summary of the run, on one screen: outcome, where the time went, exceptions and swallowed ones, what wasn’t collected, and the next command to run.
ormaos show --fullEverything that was recorded, with nothing cut. It warns you about the size first. For when navigating isn’t enough.
Level 2 finds where. Level 3 explains why, only there. Each level includes everything below it, but recording every line of a whole process would be slow and huge, so level 3 makes you pick the spot.
Overhead per level is measured and published before release. It never changes your program’s state, but it does change timing, noticeably at level 3. Timing-sensitive bugs can behave differently while recorded.
Built on sys.monitoring (PEP 669).
It doesn’t replace anything you use. You keep both.
Your observability · Always on
An error, a slow span, an alert. Across every request, all the time.
Sentry, Datadog, Logfire.
Ormaos · On when you need it
For one execution: the calls, the swallowed exceptions, the path through the code you scope. As deep as you ask.
Everything Ormaos does can be done with a command: recording, reading, checking status, running the server. If you can type it, your agent can run it. No dashboard (yet).
ormaos run -- <cmd> Record any Python command, including pytest and Django management commands.
with ormaos.record(): Record a block from inside your code.
list · show · tree · exceptions · path · status Your agent reads --json. You read the same answer as text. Every answer ends with the next question to ask.
ormaos guide Short instructions written for your agent: when to record, which level, what to ask first.
ormaos local start Works on your machine with no account. The same server is self-hostable for your team.
Threads, asyncio and child processes. Database and HTTP calls from the Django ORM, requests and httpx. Python 3.12+. Linux first; macOS planned.
Later, not in the first release: recorded values (redacted by default) and where each came from · diff between a passing and a failing run · arming a recording in production · integrations with the tools you already use.
Ormaos is open source software that records what happened inside a Python execution, so your coding agent can read it from the terminal. It starts from one problem: your agent can read the code, but not what happened when it ran. You choose how deep to record, from every call and every exception, including the swallowed ones, down to each line that ran in the functions you scope. It doesn’t replace the tools you already use: they tell you something went wrong, and Ormaos shows what happened inside. The recorder, the CLI, the server and the recording format are Apache 2.0. A hosted server, in beta by request, is how Ormaos plans to make money. The first release ships in November 2026.
Where it’s going. Two directions. Deeper, as far as the interpreter allows. And lighter, until it’s cheap enough to leave on. Even then, it records; it doesn’t alert. After that, more languages than Python, and an open format for execution recordings that any tool can write and read.
The recorder, the CLI, the server and the recording format are all open source under Apache 2.0. Read it, run it, self-host it, build on it.
ormaos-pythonThe recorder. Standard library only, no third-party dependencies.
ormaos-cliThe terminal interface. Standard library only.
ormaos-serverAnalysis and storage. Runs locally, on your server, or hosted (beta, by request).
ormaos-formatThe recording format, as a written spec.
The repositories open on release day at github.com/ormaos
Something new to add to your stack. Not something to swap out.
ormaos run -- <cmd> or a with ormaos.record(): block. Nothing is recorded until you ask.--json, and every answer points to the next question. You read the same output as text.sys.monitoring lives. Linux first, macOS planned, no Windows yet.As designed for the first release
Open source · Apache 2.0 · Built in public
Any feedback helps: whether the problem is real for you, what’s unclear on the page, any questions, or why you think it wouldn’t work. And if something like this already exists for Python, please tell me.