Trade caravans crossing Petriarch's dead zone

What shipped

Petriarch’s first authored social layer: two societies now trade complementary goods across a barren, foodless gap. Agents climb a long-range supply-scent toward the nutrient they lack, a provisioning gate lets only the well-fed attempt the crossing, and a carry/return state machine hauls cargo home so goods move both ways without the populations emigrating. Carriers then harden a visible caravan road across the dead zone, and a slow-decaying amity field cools the frontier into a pacified market. This was the first Tier A/GPU change since the WebGPU port — the scent and gate terms ship in steer.wgsl, re-verified on the 3090.

Decisions

The keystone was long-range reach. A deposited demand field was the intuitive choice but failed (below), so we anchored a static, monotonic supply-scent cone to each nutrient’s region and had deficit-weighted agents climb it. Weight 0.6 was the cap — at 1.0 region A empties (migration, not trade).

Provisioning became a single energy-reserve gate on the scent pull rather than the three planned levers; the gate subsumed two of them and lures only agents with the reserve to survive.

The round trip was non-negotiable: without a return leg the two societies blur into one, so cargo is carried, not consumed, and “home” reuses the existing claim-field gradient.

What broke

The deficit-broadcast demand field failed outright. With both regions eaten to scarcity, agents are hungry on both nutrients, so demand tracked population density and peaked inside each region — climbing it herded agents toward their own centre and gap traffic went down. A spatial probe proved it before the scent-cone rewrite. Diffusing the capacity field was tried first and also rejected — it decays the far signal to noise, never monotonic across the 20-cell gap. This failure was the most valuable thing in the phase. The intuitive design — broadcast demand and let agents answer it — is what a design doc approves and a simulation vetoes. You only find that out by running it.

On amity, cranking suppress to 0.5 and per-trade volume to 5 did almost nothing — peak amity capped near 4, under 1% of fights suppressed — because at fast decay each deposit faded before the next sparse frontier trade. Slow decay (0.998) was the unlock.

The provisioning gate’s nonlinearity nudged the CPU-f64/GPU-f32 steer divergence up for a few borderline agents; a seed-sweep (0–3 of ~3900 agents) showed it non-systematic, so we recalibrated verify tolerances rather than chase a phantom logic bug.

Numbers

Amity numbers come from amitycheck.ts (16k x 4 seeds): the winning config pushed pacified cells 13 -> 245 and cut global fights/k 16% versus trade-only (26% versus a no-trade world) while TRADE selection edged 0.45 -> 0.49. The crossing numbers come from crossing.ts (3 seeds x 8k). A later conflict-recession study (seed 11, 20k ticks) confirmed the thesis globally: per-capita fights fell 70% (1.25 -> 0.38/k/agent) as commerce took over.

Next

Territory — the second social layer — where societies fight harder on home ground and hold coherent borders.

Decisions
DecisionWhyAlternatives rejected
Geography-anchored supply-scent cone, not a deposited demand fieldA deficit field tracked population density and herded agents to their own centreDeficit-broadcast demand field, Diffused capacity field (decays to noise across the gap)
Provisioning as an energy-reserve gate on the scent termOnly well-fed agents cross; cleaner and subsumes the hoard/discount/gene leversEmergent hoard-then-cross, In-transit metabolic discount, A provisioning gene
Round-trip carry/return state machine, home = claim-field gradientCarriers must return or the two societies merge (colonization, the opposite of trade)One-way crossing/settlement, Kin-centroid home, Stored birth-cell origin
Slow amity decay (0.998)Amity bites on persistence, not magnitude; fast decay faded before the next frontier tradeFast decay with cranked suppress/volume (<1% of fights suppressed)
Benchmarks
MetricValueTarget
pacified frontier cells (amity study, 16k x 4 seeds)13 -> 245a broad trading district, not one hot pixel
global fights/k with amity vs trade-only5176 -> 4357 (-16%; -26% vs no-trade)conflict recedes globally, not just relocates
cross-gap trade under supply-scent (3 seeds x 8k, weight 0.6)+31% (874 -> 1145/k), traffic 1.2% -> 1.9%sustained cross-gap flux, was ~0; weight 1.0 = migration not trade
provisioning gate recovery (provisionFloor 0.45)+700 pop (8128 -> 8828), +5.6pts breed, survival tax halved -12% -> -5%the gap becomes a filter, not a wall