← Back to Blog

Compete in the Arena: Optimizing Fitness

Advanced tutorial: submit your gene to the Arena, analyze F(g) and V(g) scores, iteratively improve performance, and climb the rankings.

The Arena is where genes prove their worth. Every gene submitted to the Arena receives a fitness score (F(g)) and a safety score (V(g)) — two metrics that determine its rank, survival, and your developer reputation.

In this tutorial, you’ll submit a gene, understand its scores, iteratively improve it, and watch it climb the rankings.

Prerequisites

Step 1: Submit to the Arena

Let’s submit a gene. If you don’t have one, create a quick JSON formatter:

Terminal window
mkdir -p genes/json-fmt && cat > genes/json-fmt/index.ts << 'EOF'
export async function express(input: { code: string; indent?: number }) {
const indent = input.indent ?? 2;
try {
const parsed = JSON.parse(input.code);
return { formatted: JSON.stringify(parsed, null, indent), valid: true };
} catch {
return { formatted: input.code, valid: false };
}
}
EOF
rotifer wrap json-fmt --domain code.format
rotifer compile json-fmt

Now submit:

Terminal window
rotifer arena submit json-fmt
Testing 'json-fmt' before submission...
✓ All tests passed
Submitting to Arena...
✓ Gene 'json-fmt' submitted
Rank: #2 in code.format
F(g): 0.7834
V(g): 0.9100
Fidelity: Native

Step 2: Understand the Scores

F(g) — Fitness Score

The fitness function combines multiple factors into a single 0.0–1.0 score:

FactorWeightWhat It Measures
Correctness0.30Does the output match the expected schema?
Performance0.25Execution time and resource efficiency
Reliability0.20Consistency across multiple runs
Fidelity bonus0.15Native > Hybrid > Wrapped
Diversity0.10Frequency-dependent selection (rare domains get a bonus)

V(g) — Safety Score

The safety validation is a hard gate with a separate 0.0–1.0 score:

CheckDescription
L0 constraintsNo filesystem, no network (unless Hybrid), no eval
Schema complianceInput/output match declared phenotype
Resource limitsFuel metering within bounds
IR integrityWASM custom sections intact

Admission Gate

Both scores must clear thresholds to enter the Arena:

If either fails, the gene is rejected with diagnostic feedback.

Step 3: Diagnose a Low Score

Your gene got F(g) = 0.7834. Let’s see why it didn’t score higher. Check the detailed breakdown:

Terminal window
rotifer arena submit json-fmt --verbose
Fitness Breakdown:
Correctness: 0.92 ✓ All schema validations passed
Performance: 0.58 ⚠ Avg execution: 12ms (target: <5ms)
Reliability: 0.95 ✓ 19/20 runs consistent
Fidelity: 0.70 Native WASM
Diversity: 0.45 code.format has 3 competitors
F(g) = 0.7834
V(g) = 0.9100

The bottleneck is Performance (0.58). The gene takes 12ms on average — the Arena wants under 5ms.

Step 4: Optimize for Performance

The JSON formatter uses JSON.parse + JSON.stringify which is fine, but we can optimize the hot path:

export async function express(input: { code: string; indent?: number }) {
const indent = input.indent ?? 2;
const code = input.code.trim();
// Fast path: already formatted or empty
if (!code || code === '{}' || code === '[]') {
return { formatted: code, valid: code.length > 0 };
}
try {
const parsed = JSON.parse(code);
return { formatted: JSON.stringify(parsed, null, indent), valid: true };
} catch {
return { formatted: code, valid: false };
}
}

Recompile and resubmit:

Terminal window
rotifer compile json-fmt
rotifer arena submit json-fmt
Fitness Breakdown:
Correctness: 0.92
Performance: 0.75 ↑ Avg execution: 6ms
Reliability: 0.95
Fidelity: 0.70
Diversity: 0.45
F(g) = 0.8234 ↑ (+0.04)

Better — performance improved from 0.58 to 0.75.

Step 5: Improve Correctness

The correctness score is 0.92 — not perfect. This usually means edge cases aren’t handled. Let’s add robustness:

export async function express(input: { code: string; indent?: number }) {
const indent = input.indent ?? 2;
const code = (input.code ?? '').trim();
if (!code) {
return { formatted: '', valid: false };
}
try {
const parsed = JSON.parse(code);
return { formatted: JSON.stringify(parsed, null, indent), valid: true };
} catch {
// Try to salvage: strip trailing commas (common error)
try {
const cleaned = code.replace(/,\s*([\]}])/g, '$1');
const parsed = JSON.parse(cleaned);
return { formatted: JSON.stringify(parsed, null, indent), valid: true };
} catch {
return { formatted: code, valid: false };
}
}
}
Terminal window
rotifer compile json-fmt
rotifer arena submit json-fmt
Correctness: 0.98 ↑ Edge cases handled
Performance: 0.74
Reliability: 0.97 ↑
F(g) = 0.8567 ↑ (+0.033)

Step 6: Watch the Rankings

Monitor your gene’s position in real-time:

Terminal window
rotifer arena watch code.format
Watching code.format rankings...
[14:32:01] json-fmt ↑ #2 → #1 (F: 0.82 → 0.86)
[14:32:04] No changes
[14:32:07] No changes
Press Ctrl+C to stop

Step 7: Go Global with Cloud Arena

Local Arena is great for testing. To compete globally:

Terminal window
rotifer login
rotifer arena submit json-fmt --cloud
✓ Submitted to Cloud Arena
Rank: #8 globally in code.format

View global rankings:

Terminal window
rotifer arena list --cloud -d code.format

Step 8: Check Your Reputation

Every Arena submission affects your developer reputation:

Terminal window
rotifer reputation --mine
Developer Reputation:
Arena Score: 0.82 (based on gene rankings)
Usage Score: 0.45 (based on install counts)
Stability: 0.91 (based on gene consistency)
Overall: 0.73

Reputation is a composite of your genes’ Arena performance, how often others use them, and their reliability over time.

The Optimization Loop

The key takeaway is the iterative improvement cycle:

  1. Submit → get F(g) breakdown
  2. Diagnose → find the weakest factor
  3. Improve → targeted code changes
  4. Resubmit → verify improvement
  5. Watch → monitor competitive position

This is biological evolution in action — the Arena creates selection pressure, and your gene adapts.

Tips for High Fitness


Deep Dive: See the Gene Standard specification for the complete fitness model, and the Arena CLI Reference for all command options.