Composition Validation — airSpring

Validates agricultural science notebook composition, verifying FAO-56, ET₀, and soil hydrology implementations against published benchmarks with Rust parity checks.

Composition Validation — airSpring

airSpring is the ecological sciences validation spring in the ecoPrimals ecosystem. It validates precision agriculture, irrigation science, and environmental systems through 44 IPC capabilities across 87 experiments.

Data sources: composition_validation.json, test_suite_report.json

Reproduce: cargo run --release --bin validate_biome_graph (35/35 PASS)

For other springs: Replace capability categories and deploy graph names with your domain. The pattern of niche.rs as canonical source → all deploy surfaces derive from it eliminates drift.

import json
from pathlib import Path

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

RESULTS = Path('..') / 'experiments' / 'results'

def load(name):
    with open(RESULTS / name) as f:
        return json.load(f)

comp = load('composition_validation.json')
tests = load('test_suite_report.json')

caps = comp['primal_capabilities']
print(f"Capabilities: {caps['total']} total, {caps['routable']}/{caps['total']} routable")
print(f"Deploy graphs: {comp['deploy_graphs']['total']}")
print(f"Gaps: {comp['gaps']['open']} open / {comp['gaps']['resolved']} resolved")
print(f"guideStone level: {comp['guidestone']['current_level']} → {comp['guidestone']['target_level']}")
print(f"MCP tools: {comp['mcp_tools']['total']}")
print(f"Tests: {tests['summary']['total_rust_tests']} Rust + {tests['summary']['total_python_checks']} Python")

Capability Distribution

airSpring exposes 44 IPC capabilities organized by domain. The niche.rs module is the single source of truth — deploy TOMLs and cell graphs derive from it.

categories = comp['capability_categories']
cat_sizes = {k: len(v) for k, v in categories.items()}

fig, ax = plt.subplots(figsize=(10, 6))
bars = ax.barh(list(cat_sizes.keys()), list(cat_sizes.values()),
               color='#2ecc71', edgecolor='white')
ax.set_xlabel('Capabilities')
ax.set_title(f'airSpring: {caps["total"]} IPC Capabilities by Category')
for bar, val in zip(bars, cat_sizes.values()):
    ax.text(bar.get_width() + 0.1, bar.get_y() + bar.get_height()/2,
            str(val), va='center', fontsize=9)
plt.tight_layout()
plt.savefig('/tmp/airspring_01_capabilities.png', dpi=150)
plt.show()

Deploy Graph Topology

airSpring defines 4 biomeOS deploy graphs for different composition patterns.

graphs = comp['deploy_graphs']['graphs']
names = [g['name'] for g in graphs]
nodes = [g['nodes'] for g in graphs]

fig, ax = plt.subplots(figsize=(8, 4))
colors = ['#3498db'] * len(graphs)
ax.bar(names, nodes, color=colors, edgecolor='white')
ax.set_ylabel('Nodes')
ax.set_title(f'Deploy Graphs ({comp["deploy_graphs"]["total"]} total)')
plt.xticks(rotation=30, ha='right', fontsize=8)
plt.tight_layout()
plt.savefig('/tmp/airspring_01_graphs.png', dpi=150)
plt.show()

Primal Composition & Gap Status

airSpring’s NUCLEUS composition wires 5 primals via IPC directly; 7 remain graph-level only (handled by biomeOS deployment).

composition = comp['primal_composition']
ipc_wired = composition['ipc_wired']
graph_only = composition['graph_level_only']

fig, ax = plt.subplots(figsize=(8, 5))
all_primals = ipc_wired + graph_only
status_colors = ['#2ecc71' if p in ipc_wired else '#e74c3c' for p in all_primals]
ax.barh(all_primals, [1]*len(all_primals), color=status_colors, edgecolor='white')
ax.set_xlim(0, 1.5)
ax.set_xticks([])
for i, p in enumerate(all_primals):
    label = 'IPC wired' if p in ipc_wired else 'graph-level'
    ax.text(1.05, i, label, va='center', fontsize=9)
ax.set_title(f'Primal Composition: {len(ipc_wired)} IPC / {len(graph_only)} graph-level')
plt.tight_layout()
plt.savefig('/tmp/airspring_01_primals.png', dpi=150)
plt.show()

Summary

MetricValue
IPC Capabilities44/44 routable
Deploy Graphs4 validated offline
Primals IPC-wired5 (toadStool, barraCuda, biomeOS, NestGate, Squirrel)
Primals graph-level7 (petalTongue, coralReef, BearDog, Songbird, rhizoCrypt, loamSpine, sweetGrass)
MCP Tools10 (Squirrel-discoverable)
guideStone Level0 → 1 (blocked on primalSpring dependency)
Open Gaps9 (AG-001 through AG-011)

Provenance: airSpring v0.10.0 · AGPL-3.0-or-later · primals.eco