Half your sessions get Niro.
The other half don’t

A controlled experiment on your own repositories: same agent, same work, one arm with Niro’s tools removed. Your numbers decide, not ours.

Get the CLI
50/50
deterministic split
1–90
day window
2
arms, one without Niro
NIRO ON · 35 TOOLS NIRO OFF · 1 TOOL sha256(sessionId) · first byte parity
Fig. 1 - sixty sessions, split by hash. One arm has every tool, the other has one.

Half your sessions run without Niro

A comparison only means something if one arm genuinely runs without Niro. In the off arm the tool list is filtered down to one, so the agent works exactly as it did before Niro existed.

35 tools, or one

On: the full surface. Off: mark_task_complete alone, kept so the session still reports how it went. Everything else disappears from tools/list.

The gate cannot be walked around

A second check rejects any other tool call while the session is in the off arm, so a session that began before the window cannot leak past its assignment.

Every session reports, with or without Niro

Both arms record whether the task succeeded, partially succeeded or failed. That is the signal the two arms are compared on.

How each session is assigned to a group

A session id is hashed with SHA-256 and the parity of the first byte picks the arm. The same id always lands in the same arm, so a reconnect cannot quietly move a session mid-measurement. This runs the real calculation.

Try one

What the report shows

The figures below are illustrative. Yours come from your own sessions.

Sessions
142
Niro on
138
Niro off
the split lands near even on its own
Median session duration
4m 12s
Niro on
11m 38s
Niro off
wall clock, start to task complete
Median tool calls per session
9
Niro on
41
Niro off
fewer calls, same work
What this is not

The report computes raw deltas. It does not test statistical significance, and a fortnight of one team’s sessions is a signal rather than a proof. It is your signal though, from your repos and your work, which is worth more than a number from ours.

How a run works

Nothing to instrument. The sessions your team already runs are the experiment.

01
Open a window

One to ninety days, named. One active run per account, long enough to catch a normal week rather than a good afternoon.

02
Sessions split themselves

Every MCP session is assigned an arm once at initialize and stamped for its lifetime. Nothing re-rolls mid-session.

03
Check it deliberately

Force-enable puts your next session in the on arm for five minutes, so you can watch the difference rather than wait for the hash to pick it.

04
End it, keep it

Ending a run marks it ended. Nothing is deleted, so every past run stays queryable and comparable.

FAQ

Does the group without Niro slow my team down?

It works exactly as it did before Niro existed. In the off arm the tool list is filtered down to mark_task_complete alone, kept so the session still reports how it went. That is the cost of a real control. If someone needs the tools right now, force-enable puts their next session in the on arm for five minutes.

Are the results statistically significant?

No, and the report does not pretend otherwise. It computes raw deltas on three figures: sessions, median session duration and median tool calls per session. A fortnight of one team's sessions is a signal rather than a proof. But it is your signal, from your repos and your work.

Can a session switch groups?

No. A session id is hashed with SHA-256 and the parity of the first byte fixes the arm at initialize, for that session's lifetime. A second gate rejects any other tool call while a session sits in the off arm, so a reconnect cannot quietly move a session mid-measurement.

What happens to a run when it ends?

Ending a run marks it ended and nothing is deleted, so every past run stays queryable and comparable against the next one. One active run per account, over a window of one to ninety days.

Measure Niro on your own repos

Index the repos your team actually works in, open a window, and read your own numbers in a fortnight.

Get the CLI