DEV Community

Cover image for Rotifer v0.9.3: Genes scored against the season, run with the permissions they declare (npm 0.30.0)
Rotifer Protocol
Rotifer Protocol

Posted on Originally published at rotifer.dev

Rotifer v0.9.3: Genes scored against the season, run with the permissions they declare (npm 0.30.0)

v0.9.3 changes two things about how a gene is judged and how it runs.

  • Judged against its season. Arena F(g) used to measure a gene's speed and cost against fixed constants. It now compares them with the season median of genes in the same domain and fidelity.
  • Run as declared. Every CLI path now runs a gene with exactly the permissions its phenotype declares. Only a Hybrid gene that declares network access can reach the network, and each of its requests is checked before it leaves the sandbox.

v0.9.3 is the protocol version. It shipped in @rotifer/playground 0.30.0 on 2026-10-21. Install 0.30.1, the security patch that followed.


F(g) against the season

F(g) has two efficiency terms: how fast a gene ran and how much it cost. Each is scored relative to a reference: L_ref for latency, Cost_ref for resource cost. Until now both references were fixed numbers, the same for a text formatter and a web search.

rotifer arena submit now asks the Registry for the current season's median among genes in the same domain and the same fidelity, and scores against that. It prints which reference it used. When there is a median:

Reference scale: season <n> median of <k> <domain> / <fidelity> genes (L_ref … ms, Cost_ref … fuel)
Enter fullscreen mode Exit fullscreen mode

When fewer than 5 such genes have measured runs, there is not enough to take a median from, and it falls back to the fixed constants and says why:

Reference scale: fixed constants — too few measured <domain> / <fidelity> genes this season for a median
Enter fullscreen mode Exit fullscreen mode

Two smaller changes feed the same pool of data:

  • Estimated submissions upload their measured runs too. Before, only some submissions contributed runs, so medians had less to work with.
  • Submitting a gene again updates its Arena row instead of failing.

What has not changed: scores are still marked estimated and stay out of the ranking. F(g) also has coverage and robustness terms, and those are not measured yet. Until they are, a season-relative score is a better estimate, not a verdict.


Genes run with the permissions they declare

Every CLI path that executes a gene (agent run, run, test, arena submit and the publish gate) used to hand the sandbox the same default permission set for every gene. That default refused the network to all of them, including genes that declare it.

Now each gene runs with exactly what its phenotype declares:

  • A Hybrid gene with a network block can reach the domains it lists, through rotifer.net, and nothing else.
  • Native and Wrapped genes get no network, even if they carry a network block. A request from one of them is refused at the sandbox boundary.
  • In a composition, each gene gets its own set. A Hybrid gene running next to a Native one can reach its domains; the Native one still cannot.

Outbound requests are checked, and billed separately

A gene's fuel counts instructions inside the WASM sandbox. A network request is mostly time spent outside it, so it is metered separately: each request carries a surcharge.

In 0.30.0:

  • Before each request is sent, the sandbox checks the request count, the time already spent in host calls, and the run's deadline. If any limit would be exceeded, the request is not sent.
  • The surcharge is billed to resource_cost, not to the gene's fuel. Previously one successful request could use up more fuel than a whole CLI run allows, so the gene got its response and then failed for running out of fuel. Now the response arrives and the run continues. The cost still shows up in resource_cost, which is what F(g)'s cost term reads, so moving work into network calls does not make a gene look cheaper.

Also in this release

  • Two fixes: the genome snapshot after agent run counts a compiled Native gene as executable, and genome import only suggests dropping --pinned when you passed it.
  • 0.30.1 followed on 2026-10-24. It moves the plugin and Skills to MCP server 0.19.4, updates dependencies for security advisories, and comes with server-side Arena and account changes.

The full list is in the changelog.


Where this sits

Genes that compete on merit are the goal. This release makes the comparison fairer, because a gene is now measured against its peers in the current season, and makes execution stricter, because a gene can only do what it declared.

Not in this release:

  • Scores still stay estimated and are not ranked.
  • There is no Cloud execution endpoint or Petri hookup yet; both come in a later release. For now, genes run on your machine through the CLI.
  • Native and Wrapped genes cannot reach the network at all. A gene that needs to call an outside service has to be Hybrid and declare where it goes.
  • Genes written in TypeScript cannot call rotifer.net yet. For now, a Hybrid gene that goes online has to be compiled to WASM that imports the host functions directly.

Install / Upgrade

npm install -g @rotifer/playground@0.30.1
Enter fullscreen mode Exit fullscreen mode

This article was originally published on rotifer.dev. Follow the project on GitHub or install the CLI: npm i -g @rotifer/playground.

Top comments (0)