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)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 medianTwo 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
networkblock can reach the domains it lists, throughrotifer.net, and nothing else. - Native and Wrapped genes get no network, even if they carry a
networkblock. 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 inresource_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 runcounts a compiled Native gene as executable, andgenome importonly suggests dropping--pinnedwhen 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
estimatedand 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.netyet. 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