# **Enterprise Architecture for an AI-Driven Planetary Simulation Atlas**

## **Introduction and System Topology**

The construction of an "Integrated Artificial Reality Planetary Atlas" represents a sophisticated synthesis of deterministic state management, high-fidelity 3D rendering, and non-deterministic artificial intelligence. The objective is to map the high-stakes, real-world research domains of the U.S. Intelligence Advanced Research Projects Activity (IARPA) onto a planetary simulation environment reminiscent of classic god-game mechanics. In this environment, the deployment of high-risk, high-payoff technologies—spanning quantum computing, biologically-derived materials, and advanced geo-localization—triggers systemic, planetary-scale consequences.  
To engineer an enterprise-grade platform capable of executing these mechanics, the architecture must rigidly enforce a separation of concerns. The computational heavy lifting is distributed across three distinct operational domains:

> 1. The Viewport (Frontend): A React application leveraging React Three Fiber (Three.js) to render a highly interactive, immersive 3D globe. This layer also manages a minimal Heads-Up Display (HUD) for player interactions.  
> 2. The Simulation Engine (Backend): A robust PHP API built on the Laravel 11 framework, utilizing a PostgreSQL database to maintain the authoritative planetary state across four key dimensions (Atmosphere, Biosphere, Technosphere, and Geosphere). It utilizes scheduled cron jobs to advance deterministic time ticks.  
> 3. The Chaos Engine (Artificial Intelligence): An integration with OpenAI's large language models (LLMs) that processes the complex socioeconomic, biological, and geopolitical consequences of player actions, returning rigidly typed data structures that dynamically mutate the deterministic state.

This report comprehensively details the architectural blueprints, the mathematical and algorithmic foundations of the simulation, the construction of custom WebGL shaders for data visualization, and the integration of strict LLM reasoning structures required to build this system.

## **Codebase Directory Structure and Separation of Concerns**

A modern enterprise application requires a strict architectural boundary between the client rendering engine and the authoritative server state. The repository is structured as a monorepo, housing a Vite-powered React frontend and a Laravel 11 backend, interacting exclusively via REST APIs and WebSocket channels.  
iarpa-atlas/ ├── client/ \# JAVASCRIPT FRONTEND (React \+ Vite) │ ├── src/ │ │ ├── components/ │ │ │ ├── Globe/ \# Three.js 3D rendering (Shaders, Meshes, Textures) │ │ │ └── HUD/ \# React UI overlays (Data feeds, Research Panels) │ │ ├── hooks/ \# WebSockets (Socket.io) for real-time planet updates │ │ └── store/ \# Zustand or Redux for frontend state management │ └── package.json │ └── server/ \# PHP BACKEND (Laravel 11\) ├── app/ │ ├── Console/Commands/ \# The Game Loop (e.g., php artisan sim:tick) │ ├── Models/ \# Eloquent Models (Planet, Civilization, ResearchEvent) │ ├── Services/ │ │ ├── Engine/ \# Algorithmic physics & math (Heat, Population) │ │ └── AI/ \# OpenAI API integration (The Chaos Engine) │ └── Http/Controllers/ \# API endpoints for the frontend HUD ├── database/ \# Migrations for saving planetary states └── composer.json  
This structural blueprint dictates that the client directory assumes zero responsibility for game logic or state calculation. Its sole mandate is to consume state data and translate it into a visual and interactive format. The store directory within the frontend (utilizing Zustand or Redux) acts as a local cache, hydrating the UI components while waiting for the next authoritative push from the backend.  
Conversely, the server directory isolates all mathematical calculations, database transactions, and LLM inferences. The Console/Commands directory houses the core game loop, abstracting the passage of time from the HTTP request lifecycle. The Services directory enforces the single-responsibility principle by dividing tasks between the deterministic Engine (which handles predictable mathematical decay and growth) and the AI layer (which manages external API requests to OpenAI).

## **Domain Mapping: IARPA Programs as Simulation Vectors**

To accurately model the deployment of IARPA technologies within the simulation, the planetary state is divided into four interdependent domains. Each active research program influences these domains through both deterministic mathematical rates and non-deterministic, LLM-generated events. The integration of these programs allows the Chaos Engine to synthesize highly complex, interconnected scenarios.

### **Quantum Computing, Microelectronics, and Architecture**

IARPA's quantum research aims to fundamentally alter the computational landscape. The Entangled Logical Qubits (ELQ) program seeks to achieve universal fault-tolerant quantum computing by demonstrating high-fidelity entanglement between error-corrected logical qubits using a modular architecture1. Similarly, the Multi-Qubit Coherent Operations (MQCO) program resolves technical challenges in fabricating multiple qubits in close proximity3.  
When a player deploys these technologies in the simulation, it drastically accelerates the Technosphere tier. However, the systemic consequence modeled by the Chaos Engine is the massive energy expenditure required to maintain quantum coherence and power these architectures. Furthermore, the deployment of advanced microelectronics, such as those developed in the ARCADE program (which accelerates electrical circuit design), creates massive downstream supply chain dependencies within the Geosphere1.

### **Biologically-Derived Materials and Sensing**

The deployment of biological capabilities maps directly to the Biosphere and Technosphere. Advanced sensing capabilities are represented by programs such as B-SAURUS (Biomaterial Structural Analyses for Use Recognition and Understanding Synthesis) and SILMARILS (which detects trace quantities of target chemicals on a wide range of wild substrates with real-world clutter)1.  
Additionally, the TEI-REX program seeks methods for evaluating organisms exposed to low doses of ionizing radiation using minimally invasive biomarkers4. In the simulation context, deploying these ubiquitous biological sensors enhances global data fidelity and disease tracking, but risks triggering severe biological disruptions or global privacy fallout, which the Chaos Engine translates into geopolitical tension.

### **Geo-Localization and Space Systems**

Programs dedicated to geolocation and spatial intelligence provide critical variables for the simulation's event generation. The COSMIC program leverages commercial remote sensing and agentic artificial intelligence to generate pseudo-persistent data (PPD), integrating temporally relevant geospatial models1. The HFGeo (High Frequency Geolocation) and LocUS programs improve signal geolocation accuracy in complex, dense interference environments1.  
Space resilience is addressed by the SINTRA program, which investigates the interaction of orbital debris with the surrounding space environment1. Deploying these systems drastically increases the player's visibility into planetary metrics, but introduces the risk of localized grid collapses, orbital cascade failures (Kessler syndrome), or retaliatory countermeasures generated by the OpenAI integration.

### **Human and Social Dynamics**

The simulation must also account for human behavior and cognitive biases. The Sirius program creates serious games to measure proficiency in recognizing cognitive biases, while the HAYSTAC program establishes models of normal human movement across locations and populations1. The HIATUS program develops systems for attributing authorship and protecting privacy in text1. Deploying these programs allows the player to manipulate the cognitive and social stability of the simulated populations, directly impacting the Geosphere (representing global stability and tension).

| IARPA Program | Primary Simulation Domain | Deterministic Effect | Non-Deterministic Chaos Vector |
| :---- | :---- | :---- | :---- |
| **ELQ** (Quantum) | Technosphere | Exponential increase in computational processing metrics. | Extreme energy consumption; localized power grid collapses; cryptanalysis panics. |
| **COSMIC** (Geo-Spatial) | Geosphere | Unlocks high-fidelity planetary scanning and persistent data mapping. | Agentic AI hallucination loops; escalation of military tensions due to surveillance. |
| **B-SAURUS** (Biological) | Biosphere | Increases disease detection and biological hazard mitigation. | Severe privacy backlash; unintended biological mutations detected in wild substrates. |
| **SMART ePANTS** | Technosphere | Drastically improves localized data gathering via integrated sensor clothing. | Civilian unrest regarding mass surveillance; supply chain shortages for active smart textiles. |
| **SOLSTICE** | Atmosphere | Reduces reliance on hydrocarbon fuels; lowers greenhouse gas emissions. | Geographic land-use conflicts for solar arrays; weather modification disputes. |
| **SINTRA** | Geosphere (Orbital) | Improves tracking of orbital debris and space asset security. | Kessler syndrome cascades destroying satellite networks; geopolitical blame for debris collisions. |

## **The Viewport (Frontend): High-Fidelity 3D WebGL Rendering**

The frontend application serves as the user's primary interface, rendering a dynamic representation of the planet that reacts in real-time to backend state mutations. Achieving an enterprise-level visualization requires bypassing standard DOM manipulations and leveraging WebGL. React Three Fiber (R3F) bridges the declarative nature of React with the imperative WebGL API of Three.js, allowing the encapsulation of complex 3D scenes into manageable components6.

### **Spherical Geometry and UV Mapping Mechanics**

To render the globe, a SphereGeometry is utilized. In 3D rendering, wrapping a 2D image around a 3D sphere relies on UV mapping. The UV coordinates range from \[0, 1\] across both the X and Y axes, corresponding to the longitude and latitude of the sphere7.  
Because the mapping is essentially an equirectangular or Mercator projection, the poles experience heavy geometric distortion9. Points on the lowest covered latitude possess a v component of 0.0, while points on the highest latitude possess a v component of 1.010. When mapping deterministic backend data to the globe, the system must account for this by projecting the 2D coordinate space mathematically onto the spherical coordinates. This allows the backend to send a flat array of geographic data that the GPU seamlessly wraps around the mesh without tearing at the seams.

### **Custom GLSL Shaders and Data Textures**

Standard Three.js materials, such as MeshStandardMaterial or MeshBasicMaterial, are insufficient for representing multi-layered, dynamically calculated planetary data6. Instead, the architecture utilizes custom GLSL (OpenGL Shading Language) programs running directly on the GPU. A ShaderMaterial allows the frontend to ingest raw numeric arrays from the Laravel backend—representing heat, pollution, and population density—and paint the globe dynamically6.  
A custom shader requires two components: a Vertex Shader to position the geometry, and a Fragment Shader to colorize the pixels11. The data bridge between the JavaScript runtime and the GLSL shader is constructed using Uniforms6. Uniform variables remain constant across all fragments during a single frame, representing parameters such as time, light positions, or custom data textures11.  
Instead of loading static images (e.g., a .png of Earth), the simulation generates a DataTexture from the backend's continuous state array.

### **HUD Interactivity and Raycasting**

The player does not merely observe the planet; they must interact with it to deploy programs. Clicking a region on the globe opens the HUD panel. This interaction requires Raycasting—projecting a mathematical ray from the camera through the 2D screen coordinates into the 3D space to intersect with the SphereGeometry12.  
Upon intersection, the system retrieves the UV coordinates of the face that was clicked. If advanced performance is required and standard raycasters are too slow, the system can calculate the intersection using the Cartesian coordinates of the vertices, converting them to Barycentric coordinates, and interpolating the exact UV value12. These coordinates are then transmitted to the Laravel backend via a REST API to retrieve the localized data (e.g., local temperature, local tension) and populate the React HUD components. From this HUD, the player can initiate an IARPA-style research program.

### **Implementation of the Simulation Shader**

The following code demonstrates the implementation of the dynamic planet shader using React Three Fiber, integrating the DataTexture and custom GLSL code:

JavaScript  
import { useRef, useMemo, useEffect } from 'react';  
import { useFrame } from '@react-three/fiber';  
import \* as THREE from 'three';

// The Vertex Shader positions the geometry and passes the UVs to the fragment  
const vertexShader \= \`  
  varying vec2 vUv;  
  void main() {  
    vUv \= uv;  
    gl\_Position \= projectionMatrix \* modelViewMatrix \* vec4(position, 1.0);  
  }  
\`;

// The Fragment Shader samples the data texture and applies simulation logic visually  
const fragmentShader \= \`  
  precision highp float;  
  uniform sampler2D uDataTexture;  
  uniform float uTime;  
  varying vec2 vUv;

  void main() {  
    // Sample the simulation data texture using the sphere's UV coordinates  
    vec4 simData \= texture2D(uDataTexture, vUv);  
      
    // Extract variables: R \= Heat, G \= Biosphere Health, B \= Technosphere  
    float heat \= simData.r;  
    float bio \= simData.g;  
    float tech \= simData.b;  
      
    // Base ocean color  
    vec3 color \= vec3(0.05, 0.1, 0.2);   
      
    // Apply landmass and planetary states  
    vec3 heatColor \= vec3(1.0, 0.2, 0.0) \* heat;  
    vec3 bioColor \= vec3(0.1, 0.8, 0.3) \* bio;  
    vec3 techColor \= vec3(0.0, 0.5, 1.0) \* tech;  
      
    // Mix colors based on the data values from the Laravel backend  
    color \= mix(color, bioColor, bio);  
    color \= mix(color, heatColor, heat \* 0.5); // Heat overrides bio  
    color \+= techColor \* 0.2; // Tech glows additively  
      
    // Add atmospheric pulsing based on the continuous uTime uniform  
    float atmospherePulse \= sin(uTime \* 2.0) \* 0.05;  
    color \+= vec3(atmospherePulse);

    gl\_FragColor \= vec4(color, 1.0);  
  }  
\`;

export function InteractiveGlobe({ simulationStateArray, onRegionClick }) {  
  const materialRef \= useRef();

  // Convert the raw numerical simulation data into a DataTexture  
  const dataTexture \= useMemo(() \=\> {  
    const size \= 256;   
    const data \= new Uint8Array(3 \* size \* size);  
      
    // Populate the texture with backend data array  
    for (let i \= 0; i \< size \* size \* 3; i++) {  
        data\[i\] \= simulationStateArray\[i\] || 0;  
    }  
      
    const texture \= new THREE.DataTexture(data, size, size, THREE.RGBFormat);  
    // Apply linear filtering to smooth the data transitions across fragments  
    texture.minFilter \= THREE.LinearFilter;  
    texture.magFilter \= THREE.LinearFilter;  
    texture.needsUpdate \= true;  
    return texture;  
  }, \[simulationStateArray\]);

  const uniforms \= useMemo(() \=\> ({  
    uDataTexture: { value: dataTexture },  
    uTime: { value: 0.0 }  
  }), \[dataTexture\]);

  // Update the time uniform continuously without causing React re-renders  
  useFrame(({ clock }) \=\> {  
    if (materialRef.current) {  
      materialRef.current.uniforms.uTime.value \= clock.getElapsedTime();  
    }  
  });

  // Handle raycasting interactions to open the HUD  
  const handlePointerDown \= (event) \=\> {  
      if (event.uv) {  
          // Pass the precise UV coordinate to the parent React component to fetch backend data  
          onRegionClick(event.uv);  
      }  
  };

  return (  
    \<mesh onPointerDown\={handlePointerDown}\>  
      \<sphereGeometry args\={\[5, 64, 64\]} /\>  
      \<shaderMaterial   
        ref\={materialRef}  
        vertexShader\={vertexShader}  
        fragmentShader\={fragmentShader}  
        uniforms\={uniforms}  
      /\>  
    \</mesh\>  
  );  
}

In this architecture, modifying a uniform object directly via materialRef.current.uniforms.uTime.value ensures that the React application does not trigger a full component re-render on every single frame. Doing so would severely degrade performance, causing massive frame drops in an enterprise application13. The texture filtering parameters (minFilter and magFilter) are set to LinearFilter to ensure that when the texel covers more or less than one pixel on the screen, the GPU smoothly interpolates the simulation data, preventing a blocky, pixelated appearance9.

## **The Simulation Engine (Backend): Deterministic State Management**

The backend, built on Laravel 11, serves as the authoritative source of truth. A planetary simulation requires a game loop—a mechanism that advances time, processes mathematics, and applies logic. In a traditional compiled game engine written in C++, this is a continuous while(true) loop running at 60 frames per second. In a distributed web architecture, maintaining an infinite loop in a PHP runtime is an anti-pattern that leads to memory leaks, connection timeouts, and instability. Therefore, the engine utilizes the Laravel Task Scheduler to orchestrate discrete "ticks" of time14.

### **Orchestrating the Game Loop via the Laravel Kernel**

The Laravel Scheduler operates by evaluating registered events every minute via the server's cron daemon \* \* \* \* \* php artisan schedule:run \>\> /dev/null 2\>&114. The command definition acts as the entry point for the simulation's progression. When the cron daemon triggers, Laravel boots the console application, loads the schedule definitions located in app/Console/Kernel.php, and evaluates which events are due for execution14.  
When deploying scheduled work in a distributed, enterprise environment, race conditions and overlapping executions become a critical threat. If a previous simulation tick requires heavy database writes or lengthy LLM inferences that exceed sixty seconds, the subsequent cron trigger could spawn a parallel process. This would cause two overlapping ticks to modify the exact same planetary data simultaneously, irreparably corrupting the deterministic state15.  
To prevent this, the architecture employs atomic locks via the withoutOverlapping() modifier. This method instructs Laravel to acquire a mutex lock for the scheduled task, physically preventing another instance from starting until the lock expires or is released14. Furthermore, in a production environment spanning multiple load-balanced web servers, every server will receive the cron tick simultaneously. The onOneServer() directive leverages a shared cache (like Redis) to ensure that only a single instance of the scheduler initiates the planetary update across the entire cluster14.

PHP  
// app/Console/Kernel.php or routes/console.php in Laravel 11  
use Illuminate\\Support\\Facades\\Schedule;  
use App\\Console\\Commands\\SimulationTickCommand;  
use Illuminate\\Support\\Facades\\Log;

Schedule::command(SimulationTickCommand::class)  
    \-\>everyMinute()  
    \-\>withoutOverlapping(5) // Protects the lifetime of the running event for 5 minutes  
    \-\>onOneServer()  
    \-\>runInBackground()  
    \-\>onFailure(function () {  
        Log::critical('Simulation Tick failed to execute, halting planetary progression.');  
    });

By appending \-\>runInBackground(), the scheduler does not wait for the command to finish. It immediately returns, while the actual execution is pushed to a background process. This keeps the schedule quick and predictable, allowing queue workers to handle the heavy computational workload independently14. The onFailure() task hook provides immediate observability if the tick crashes due to an external API failure16.

### **Deterministic State Progression and System Dynamics**

During a tick, the engine applies standard algorithmic modifications. These physics are modeled using system dynamics, specifically stock and flow formulas. The natural progression without active technological interference can be modeled as a system of ordinary differential equations (ODEs), executed digitally as discrete time steps.  
Let ![][image1] represent the planetary population, and ![][image2] represent resource availability. The equation evaluates the delta for the current tick:  
![][image3]  
Where ![][image4] is the birth rate modifier, ![][image5] is the death rate modifier, and ![][image6] represents the current temperature stress on the biosphere. The Laravel service layer processes these mathematical updates deterministically before consulting the non-deterministic AI.

PHP  
// app/Services/Engine/PlanetarySimulation.php  
namespace App\\Services\\Engine;

use App\\Models\\Planet;  
use App\\Events\\PlanetUpdated;  
use App\\Services\\AI\\OpenAIChaosEngine;

class PlanetarySimulation   
{  
    public function \_\_construct(private OpenAIChaosEngine $chaosEngine) {}

    public function tick(Planet $planet): void   
    {  
        // 1\. Deterministic Calculation Phase  
        $planet\-\>temperature \+= $this\-\>calculateGreenhouseEffect($planet);  
        $planet\-\>population \-= $this\-\>calculateResourceStarvation($planet);  
          
        // 2\. Check for Active Research / Player Input from the HUD  
        $activePrograms \= $planet\-\>activePrograms()-\>get();  
          
        // 3\. Trigger OpenAI for complex interactions and systemic fallout  
        if ($activePrograms\-\>isNotEmpty()) {  
           $chaosEvent \= $this\-\>chaosEngine-\>evaluateConsequences($planet, $activePrograms);  
             
           if ($chaosEvent \!== null) {  
               $this\-\>applyChaosEvent($planet, $chaosEvent);  
           }  
        }  
          
        $planet\-\>save();  
          
        // 4\. Broadcast new state to the JS frontend via WebSockets  
        broadcast(new PlanetUpdated($planet));  
    }

    private function calculateGreenhouseEffect(Planet $planet): float   
    {  
        // Deterministic logic based on atmosphere composition and technosphere output  
        return ($planet\-\>technosphere\_output \* 0.05) \- ($planet\-\>biosphere\_health \* 0.02);  
    }  
      
    private function calculateResourceStarvation(Planet $planet): float   
    {  
        return ($planet\-\>population \* 0.01) \* max(0, ($planet\-\>temperature \- 20));  
    }

    private function applyChaosEvent(Planet $planet, array $chaosEvent): void   
    {  
        $planet\-\>geosphere \+= $chaosEvent\['geosphere\_adjustment'\];  
        $planet\-\>biosphere \+= $chaosEvent\['biosphere\_adjustment'\];  
        $planet\-\>technosphere \+= $chaosEvent\['technosphere\_adjustment'\];  
          
        // Log the generated headline for the frontend HUD  
        $planet\-\>news\_feed()-\>create(\[  
            'headline' \=\> $chaosEvent\['news\_headline'\]  
        \]);  
    }  
}

This decoupled architecture ensures that the deterministic physics engine is executed strictly before any stochastic external API calls are made, establishing a baseline reality before introducing artificial unpredictability.

## **The Chaos Engine: Systemic Reasoning via Large Language Models**

To introduce genuine unpredictability and model the complex socioeconomic and biological consequences of IARPA technologies, the simulation leverages OpenAI's API. A traditional game relies on branching logic trees and manually authored matrices. The Chaos Engine instead uses LLMs to synthesize systemic consequences based on the highly specific convergence of active technologies and current planetary metrics.

### **Transitioning to Strict Structured Outputs**

When building agentic workflows where downstream application logic (such as database updates) depends entirely on AI-generated data, reliability is paramount. Historically, developers utilized OpenAI's JSON mode (response\_format: { type: "json\_object" }). However, this creates severe architectural vulnerabilities in a production application. JSON mode merely guarantees that the output will parse as valid, syntactically correct JSON, but it offers zero guarantees regarding schema adherence19. The model may silently omit required keys, hallucinate new properties, or return string types instead of numerical integers, causing fatal exceptions when the PHP script attempts to process the payload20.  
To solve this, the architecture mandates the use of OpenAI's Structured Outputs with Strict Mode enabled. When strict mode is activated (json\_schema with strict: true), OpenAI employs constrained decoding—a Context-Free Grammar engine compiled directly into the generation process itself20. This physically masks invalid tokens, meaning the LLM literally cannot produce a non-conforming response20.  
However, strict mode requires precise, rigid schema construction. The additionalProperties flag must be set to false for every object in the schema, and all fields listed in properties must be explicitly listed in the required array20. If a property is genuinely optional in the simulation's logic, it cannot simply be omitted from the required array; it must be declared as a union type containing null (e.g., \['type' \=\> \['string', 'null'\]\])20.

### **Constructing the Agentic Request**

The integration is executed using Laravel's robust HTTP facade, targeting the gpt-4o-2024-08-06 model snapshot (or newer), which natively supports Strict Structured Outputs19. The request packages the current planetary state into the context window and enforces the contract.

PHP  
// app/Services/AI/OpenAIChaosEngine.php  
namespace App\\Services\\AI;

use Illuminate\\Support\\Facades\\Http;  
use Illuminate\\Support\\Facades\\Log;  
use App\\Models\\Planet;  
use Illuminate\\Database\\Eloquent\\Collection;

class OpenAIChaosEngine   
{  
    public function evaluateConsequences(Planet $planet, Collection $activePrograms): ?array   
    {  
        $programsList \= $activePrograms\-\>pluck('name')-\>implode(', ');  
          
        $prompt \= "The planet currently has a temperature of {$planet-\>temperature}°C, " .  
                  "high geopolitical tension, and a struggling biosphere. " .  
                  "The player just deployed the following IARPA programs: {$programsList}. " .  
                  "Based on realistic systemic interactions, what are the next-order consequences?";

        $schema \= \[  
            'type' \=\> 'object',  
            'properties' \=\> \[  
                'geosphere\_adjustment' \=\> \['type' \=\> 'number'\],  
                'biosphere\_adjustment' \=\> \['type' \=\> 'number'\],  
                'technosphere\_adjustment' \=\> \['type' \=\> 'number'\],  
                'news\_headline' \=\> \['type' \=\> 'string'\],  
            \],  
            'required' \=\> \[  
                'geosphere\_adjustment',   
                'biosphere\_adjustment',   
                'technosphere\_adjustment',   
                'news\_headline'  
            \],  
            'additionalProperties' \=\> false,  
        \];

        // Execute the strict schema request  
        $response \= Http::withToken(config('services.openai.key'))  
            \-\>post('https://api.openai.com/v1/chat/completions', \[  
                'model' \=\> 'gpt-4o-2024-08-06',  
                'messages' \=\> \[  
                    \['role' \=\> 'system', 'content' \=\> 'You are an advanced simulation engine.'\],  
                    \['role' \=\> 'user', 'content' \=\> $prompt\]  
                \],  
                'response\_format' \=\> \[  
                    'type' \=\> 'json\_schema',  
                    'json\_schema' \=\> \[  
                        'name' \=\> 'chaos\_event',  
                        'strict' \=\> true,  
                        'schema' \=\> $schema  
                    \],  
                \],  
            \]);

        // Check for safety refusals  
        if (isset($response\-\>json('choices.0.message.refusal'))) {  
            $reason \= $response\-\>json('choices.0.message.refusal');  
            Log::warning("Model refused the simulation request: {$reason}");  
            return null; // Bypass the update gracefully  
        }

        // Constrained decoding ensures this string is always valid against the schema  
        $jsonString \= $response\-\>json('choices.0.message.content');  
          
        // Map directly into application state without defensive isset() chains  
        return json\_decode($jsonString, true);  
    }  
}

By enforcing a strict schema, the application can bypass defensive programming routines (like heavy nested isset() checks or fallback parsing logic) and immediately map the resulting arrays into domain objects or database updates20.

### **Handling Model Refusals**

One critical failure mode introduced by constrained decoding is safety refusals. Even with a strict schema, the model remains bound by OpenAI's existing safety rules and policies20. If the combination of IARPA technologies and geopolitical prompts triggers a violation filter (for example, simulating extreme biowarfare scenarios with the B-SAURUS program, or generating catastrophic terrorist events based on the BENGAL program's large language model threat models), the model will refuse to generate the schema1.  
Instead of returning a JSON object, the API returns a refusal string value on the response object20. The service layer must explicitly trap this condition. In the code above, if a refusal is detected, the method returns null, routing the failure to an internal exception handler that bypasses the simulation update for that tick. This ensures the database is not corrupted by null or empty data, preserving the integrity of the planet20. Alternatively, a dedicated ModelRefusalException could be thrown and caught by Laravel's global exception handler20.

## **Real-Time Data Synchronization: WebSocket Infrastructure**

Once the PHP backend calculates the deterministic changes and receives the stochastic consequences from the Chaos Engine, the mutated state must be instantly reflected on the React Three Fiber globe and the player's HUD. In standard REST architectures, the client would aggressively poll the backend for updates. In an interactive simulation where ticks happen constantly and events can trigger instantaneously, polling induces severe latency and taxes the server. Instead, a persistent bi-directional communication layer is established using WebSockets.

### **Laravel Reverb Configuration**

Historically, Laravel relied on external PaaS providers (like Pusher) or third-party Node.js packages to manage WebSockets23. With the introduction of Laravel 11, the framework provides Reverb, a native, first-party WebSocket server built entirely in PHP23. Reverb eliminates external dependencies, providing tighter integration with Laravel's broadcasting system while keeping infrastructure local23.  
Reverb integrates seamlessly into Laravel's event broadcasting system. Installation via the php artisan install:broadcasting command automatically configures the environment variables and generates the necessary configuration files, including the config/reverb.php file26. Because Reverb manages stateful, long-running processes, it holds each WebSocket connection in memory until either the client or server terminates the connection26. This requires careful tuning of the server's open file limits in production environments to ensure it can handle the optimal number of connections26.  
To securely bind the system, environmental variables dictate the network interfaces. In production, proxying secure WebSocket traffic (both HTTP upgrade requests and WSS protocols) through a web server like Nginx requires explicit reverse proxy configurations pointing to Reverb's internal port (typically 8080\)26. Reverb also includes native integration with Laravel Pulse, allowing administrators to monitor the real-time sample rate of connections and messages being handled by the server26.

### **Broadcasting the State**

In the Simulation Engine, the tick() method concludes by broadcasting the PlanetUpdated event. This event implements the ShouldBroadcast interface, signaling Laravel's event dispatcher to push the payload to the Reverb server rather than resolving it synchronously in the request lifecycle23.

PHP  
// app/Events/PlanetUpdated.php  
namespace App\\Events;

use App\\Models\\Planet;  
use Illuminate\\Broadcasting\\Channel;  
use Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast;

class PlanetUpdated implements ShouldBroadcast   
{  
    public function \_\_construct(public Planet $planet) {}

    public function broadcastOn(): Channel   
    {  
        // For a global simulation, a public channel suffices.   
        // For instance-based private games, a PrivateChannel authenticated by   
        // the /broadcasting/auth endpoint is required.  
        return new Channel('simulation.globe');   
    }  
}

If the simulation were broken down into private instances for multiple players, the event would return a PrivateChannel instead, requiring the frontend to authenticate against Laravel's /broadcasting/auth route to verify the user's access27.

### **React and Laravel Echo Integration**

On the frontend, the Viewport subscribes to the Reverb channel using Laravel Echo. Echo acts as a wrapper around the pusher-js or socket.io-client library, normalizing the WebSocket consumption and managing the connection state23.

JavaScript  
// client/src/hooks/useSimulationStream.js  
import Echo from 'laravel-echo';  
import Pusher from 'pusher-js';  
import { useEffect } from 'react';  
import useSimulationStore from '../store/simulationStore';

window.Pusher \= Pusher;

export const useSimulationStream \= () \=\> {  
    const updateSimulationState \= useSimulationStore(state \=\> state.updateState);

    useEffect(() \=\> {  
        const echo \= new Echo({  
            broadcaster: 'reverb',  
            key: import.meta.env.VITE\_REVERB\_APP\_KEY,  
            wsHost: import.meta.env.VITE\_REVERB\_HOST,  
            wsPort: import.meta.env.VITE\_REVERB\_PORT,  
            wssPort: import.meta.env.VITE\_REVERB\_PORT,  
            forceTLS: (import.meta.env.VITE\_REVERB\_SCHEME \=== 'https'),  
            enabledTransports: \['ws', 'wss'\],  
        });

        const channel \= echo.channel('simulation.globe');  
          
        channel.listen('PlanetUpdated', (event) \=\> {  
            // Update the Zustand store with event.planet data  
            updateSimulationState(event.planet);  
        });

        return () \=\> {  
            channel.stopListening('PlanetUpdated');  
            echo.disconnect();  
        };  
    }, \[updateSimulationState\]);  
};

When the state store updates, the numeric arrays are recalculated and passed back into the DataTexture of the Three.js canvas. The custom GLSL shader instantly samples this updated texture, shifting the color of the planetary sphere and rendering the ultimate conclusion of the player's choices visually. Simultaneously, the HUD updates with the latest news headline generated by the OpenAI Chaos Engine.

## **Conclusion and Systemic Outlook**

The marriage of IARPA's bleeding-edge research domains with a deterministic physics engine and a generative AI reasoning core produces an extraordinarily complex operational environment. By deploying programs like HAYSTAC (human movement modeling) alongside SMART ePANTS (integrated sensor clothing), the player injects massive surveillance variables into the system1. The resulting systemic fallout—whether it is a leap forward in global stability or a catastrophic geopolitical collapse—must be handled with absolute computational precision.  
The enterprise architecture detailed in this report elegantly absorbs that complexity through a rigorous separation of concerns. By confining WebGL rendering entirely to the client's GPU via custom GLSL shaders and DataTexture manipulations, the frontend remains highly performant despite the density of the geospatial data being represented6.  
By delegating time-step progression to the robust Laravel Scheduler executing background queued jobs, the backend preserves database integrity and completely mitigates race conditions via atomic locks14. Crucially, by forcing the AI to communicate through OpenAI's Constrained Decoding engine via strict JSON schema compliance, the non-deterministic output becomes fully reliable, safe, and easily mapped into the application state20.  
Finally, the implementation of Laravel Reverb ensures that the passage of time and the consequences of player actions are broadcast seamlessly across the network with zero polling overhead23. This architecture ensures that the Integrated Artificial Reality Planetary Atlas is not merely a visual toy, but a highly scalable, enterprise-grade modeling engine capable of simulating the cascading consequences of mankind's most advanced technological deployments.

#### **Works cited**

> 1. Research Programs \- IARPA, [https://www.iarpa.gov/research-programs](https://www.iarpa.gov/research-programs)  
> 2. ELQ \- IARPA, [https://www.iarpa.gov/research-programs/elq](https://www.iarpa.gov/research-programs/elq)  
> 3. Our Programs \- IARPA, [https://www.iarpa.gov/who-we-are/history/our-programs](https://www.iarpa.gov/who-we-are/history/our-programs)  
> 4. Search \- IARPA, [https://www.iarpa.gov/search?q=be%20taking%20to%20complement%20the%20allen\&start=180](https://www.iarpa.gov/search?q=be+taking+to+complement+the+allen&start=180)  
> 5. COSMIC \- IARPA, [https://www.iarpa.gov/research-programs/cosmic](https://www.iarpa.gov/research-programs/cosmic)  
> 6. The Study of Shaders with React Three Fiber \- Maxime Heckel Blog, [https://blog.maximeheckel.com/posts/the-study-of-shaders-with-react-three-fiber/](https://blog.maximeheckel.com/posts/the-study-of-shaders-with-react-three-fiber/)  
> 7. A Brief Introduction to Texture Mapping | Discover three.js, [https://discoverthreejs.com/book/first-steps/textures-intro/](https://discoverthreejs.com/book/first-steps/textures-intro/)  
> 8. Three.JS UV Mapping for partial spheres \- javascript \- Stack Overflow, [https://stackoverflow.com/questions/50005018/three-js-uv-mapping-for-partial-spheres](https://stackoverflow.com/questions/50005018/three-js-uv-mapping-for-partial-spheres)  
> 9. Texture – three.js docs, [https://threejs.org/docs/pages/Texture.html](https://threejs.org/docs/pages/Texture.html)  
> 10. Texture a sphere from a mercator projected image \- Questions \- three.js forum, [https://discourse.threejs.org/t/texture-a-sphere-from-a-mercator-projected-image/38600](https://discourse.threejs.org/t/texture-a-sphere-from-a-mercator-projected-image/38600)  
> 11. Introduction to Shaders \- Wawa Sensei, [https://wawasensei.dev/courses/react-three-fiber/lessons/shaders-introduction](https://wawasensei.dev/courses/react-three-fiber/lessons/shaders-introduction)  
> 12. Get UVs from mesh at a give Vector3 without using a raycaster \- Questions \- three.js forum, [https://discourse.threejs.org/t/get-uvs-from-mesh-at-a-give-vector3-without-using-a-raycaster/41568](https://discourse.threejs.org/t/get-uvs-from-mesh-at-a-give-vector3-without-using-a-raycaster/41568)  
> 13. React-Three-Fiber sending uniforms to custom shader with TypeScript \- Stack Overflow, [https://stackoverflow.com/questions/71070802/react-three-fiber-sending-uniforms-to-custom-shader-with-typescript](https://stackoverflow.com/questions/71070802/react-three-fiber-sending-uniforms-to-custom-shader-with-typescript)  
> 14. The Laravel Scheduler Under the Hood \- Wendell Adriel, [https://wendelladriel.com/blog/the-laravel-scheduler-under-the-hood](https://wendelladriel.com/blog/the-laravel-scheduler-under-the-hood)  
> 15. Laravel Scheduler in Production: Why I Use It (and How I Make It Reliable) \- DEV Community, [https://dev.to/blamsa0mine/laravel-scheduler-in-production-why-i-use-it-and-how-i-make-it-reliable-43df](https://dev.to/blamsa0mine/laravel-scheduler-in-production-why-i-use-it-and-how-i-make-it-reliable-43df)  
> 16. How to Use the Laravel Scheduler for Task Management \- Last9, [https://last9.io/blog/how-to-use-the-laravel-scheduler/](https://last9.io/blog/how-to-use-the-laravel-scheduler/)  
> 17. Task Scheduling | Laravel 13.x \- The clean stack for Artisans and agents, [https://laravel.com/docs/13.x/scheduling](https://laravel.com/docs/13.x/scheduling)  
> 18. Mastering Laravel Task Scheduler: Building Smart, Reliable, and Fully Automated Applications | by MasteryOfLaravel, [https://masteryoflaravel.medium.com/mastering-laravel-task-scheduler-building-smart-reliable-and-fully-automated-applications-bf705a076849](https://masteryoflaravel.medium.com/mastering-laravel-task-scheduler-building-smart-reliable-and-fully-automated-applications-bf705a076849)  
> 19. Structured model outputs | OpenAI API, [https://developers.openai.com/api/docs/guides/structured-outputs](https://developers.openai.com/api/docs/guides/structured-outputs)  
> 20. OpenAI Structured Outputs in Laravel: Enforcing JSON Schema for Production AI Pipelines, [https://origin-main.com/laravel-architecture/laravel-openai-structured-outputs-json-schema/](https://origin-main.com/laravel-architecture/laravel-openai-structured-outputs-json-schema/)  
> 21. OpenAI Structured JSON Output With Adherence \- Kore.ai, [https://www.kore.ai/blog/openai-structured-json-output-with-adherence](https://www.kore.ai/blog/openai-structured-json-output-with-adherence)  
> 22. Streaming AI in Laravel: Token Budgets & Structured Output | Mohamed Said, [https://msaied.com/articles/streaming-ai-responses-in-laravel-token-budgets-structured-output-and-production-contracts](https://msaied.com/articles/streaming-ai-responses-in-laravel-token-budgets-structured-output-and-production-contracts)  
> 23. Real-time with Laravel \+ Reverb: how to make your app interactive in real-time, [https://dev.to/aleson-franca/real-time-with-laravel-reverb-how-to-make-your-app-interactive-in-real-time-4ih3](https://dev.to/aleson-franca/real-time-with-laravel-reverb-how-to-make-your-app-interactive-in-real-time-4ih3)  
> 24. Using Reverb in Laravel 11: Real-Time Broadcasting Simplified | Mishri Lal Sahu, [https://mishrilalsahu.in.net/Blogs/using-reverb-in-laravel-11-real-time-broadcasting-simplified](https://mishrilalsahu.in.net/Blogs/using-reverb-in-laravel-11-real-time-broadcasting-simplified)  
> 25. Laravel Reverb: First-party WebSocket server \- Reddit, [https://www.reddit.com/r/laravel/comments/1ajmd0m/laravel\_reverb\_firstparty\_websocket\_server/](https://www.reddit.com/r/laravel/comments/1ajmd0m/laravel_reverb_firstparty_websocket_server/)  
> 26. Laravel Reverb | Laravel 13.x \- The clean stack for Artisans and agents, [https://laravel.com/docs/13.x/reverb](https://laravel.com/docs/13.x/reverb)  
> 27. How to Integrate Laravel Reverb with React: From Setup to Real-Time Success \- Medium, [https://medium.com/@raheja.saachi04114/how-to-integrate-laravel-reverb-with-react-from-setup-to-real-time-success-293db64a3822](https://medium.com/@raheja.saachi04114/how-to-integrate-laravel-reverb-with-react-from-setup-to-real-time-success-293db64a3822)  
> 28. Laravel Reverb \+ React integration \- Stack Overflow, [https://stackoverflow.com/questions/79644260/laravel-reverb-react-integration](https://stackoverflow.com/questions/79644260/laravel-reverb-react-integration)

[image1]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAaCAYAAADFTB7LAAACb0lEQVR4Xu2WP0hXURTHT2igZIkYhlQE0SJJUtkg2CA0CGJBLUltDs3pEDT9IByNsEGJIAxCAheHCEpMaCho0UFwCarBoCghRIhA/X497/C7v+N97/1+oOHw+8AHf5x73/O8e8/9I1Jl/9EID/qgowY2wQO+Ya/pg6OSnyATG4Z3k99l0wO/w83A3/BH8nsNPoJH7IGA8/AdbPENKfAjnsMbvqEcnsJ/sNvFL4gm+wY2BPF6OANvBrGQNvgJXnbxdvgBnnTxTA7D9/AzPObamNQ83IBXgngvXJSd/Y078JdooiG1cAoWXDwTvoQvmxZ9QQgLmyMRji5r6Bkcs04Otr8QfY7Pe25JeluUq6L1NuQbQBf8Cz+KrlZyFC7B69YpgTXGET0Ll0U/olVKS4N0wK/wkounwpGI1R8TmoU/YWcQvwi/JX9DzsEJ0XrlB/PvE9EBCGHSTNB/YBSrMY4Sp4UvpJNwRXQUTljnhH7RlX/axY20+jPsf95z8ShWf2/hKdGvM+uCfiFMkCPAPp68+iOW4IiLR7H6u+8bMshK0OozbQERS5BbWy58kd9C8shKkIW/LrpS0yh7im3/+wKPlzZlwsXE+uRq9LD+/kixbQBeKzZvY1tXbNcogbv6Knwl6fUWg3XLBGOjzhmx+mNNj0txezK46HgoxJ7fhscPp8ifv4NhpwxsijhaHo4uV/hL0Y3f7wCEfVinlcxaxRQkfvIQzgYvELxixSiIHnexZ3eNM3BBtEwqoRnOyc5LxJ7A+91Dqex+d1v0tMm7P+4K/CePpfz7HUf9teji+W8cgg8k/dgzuKXx5IgtmipV9hVbc71zKBDAOO4AAAAASUVORK5CYII=>

[image2]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAaCAYAAAA0R0VGAAACfUlEQVR4Xu2WT6hNURTGP3lECNGTKJGJmImRV15R3oABE4WRIjMRkgkDAxNJrwwof0pKJq9eBjK4pURMpchAiSIpxYDE91lnse86e597DO7L4P7q17vvrHPvXmfttfc+wID/g+l0IZ0WA4EZdH682E804Fm6MwYy6N4LaHfvH0bpO/oz8T39Rn/Qx3QXrEKRo/Q8elfNWUTv0o0x0Isr9DvdlFxTQgdgSR5HdxJr6RO6Mrnm6D5V9Bqd1R3CNnqPzg3Xi8yjD+gruiTEltLXIabBxytzVVtMn9GLMQDru4d0dwyUWEM/0jt0KMQ20K+wwTSoWEZf0C1+U8C/sycGKlTV3FhZdsB67WAMkNOwmPrLUVKq5PLkmlgAq/Qx+plupsOo9+sYbDbi97Oo/LHftLr2wyqqwfS/c4J20N03M+kRepV+qNTnc7CFkLKevoFVuBEN0IGtTvWCPj+HVesS6j8srqM8LU395ngfb4+BSK7f1OQnYat0a3UtRcnJHL36TXhyTff8xvtNU5Ki0n+BbTGRpuTUt3pYPXQJTy6OWSPXb0JPpaS1siKl5FTxm7D9T0daiVbT2rS/KWklp+aPKOH7dE647v3m1Va/6gSJG+4q+ha2aouso59Qb259vo3u5E7h776mqUv3Pcf7V1VXFQ8jf5aqL1WQ7NSPwMoaz1P1n6PzVAtCSe6jl+nsKqZ+fIn6jyt+gz6FPfAh5E8QJd9BvaL/hKZafaEV64kJHUGPkF9tSkbTWRpYs3ILtrn3jb2wN4w06Tashj2Y/vYNVWYS+X2whKp6BvU3nL6wgk5Uf9ugXlcvTtkbsRaFqqGztQm9yWgLmrLEBgxowy+mwX+HdwkeDAAAAABJRU5ErkJggg==>

[image3]: <data:image/png;base64,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>

[image4]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAaCAYAAABl03YlAAAA00lEQVR4Xu3RvQtBURjH8SOUwUAGySAGZbaymSX+CcnMZJLsdoPJYrXb2UkpLCajgfLyfa5zcu6ZbBa/+nTvPc/TfZ7uVepnCSCBmFsw6eGGJwZOzZcK7qi6BTtdnJBzCyYRzLFA1F/6JI09hsijhpTdIJF9Hjigjya2qNtNso8s3bDOJsoaH8LMPtCRJnmzN9bsM7Ia4lhih6QcFHFR/vkFnDFV70le01FfTdq4omwOstigpJ8zWKOj3v/Ti9y0sMJYN8ibgqbBjnx1WTLsFv75Li9k8SOwWiXhbwAAAABJRU5ErkJggg==>

[image5]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAZCAYAAADnstS2AAAA3UlEQVR4Xu3SsQtBURTH8StMlEUsSkZlMymLshgo/gKTyWKSzDJZ7GaLf0AM/gTKZLYaDRj4Hvfduu+6s1J+9Yl3z33XOc9T6meSRAZRt2Cnhhue2CIRLn8mhzMmbsGXqtKnt9yCL0NcUHQLEhlCCk1kscJO6SFDkU17TNELvt8xtzdJ8jhhhEiw1lX6SYT6jWGp9NQFa93br1zIovQnN0rk09uvDCM/17DW5JE90EEFA1MoKX2y6S2l9D92RRlj1IPae6A+DlhggzaOWGOGuNls4r4wsiFtXf/zpbwAH9wkzOofuXsAAAAASUVORK5CYII=>

[image6]: <data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAaCAYAAADbhS54AAACVklEQVR4Xu2WT4iNURjGn4kpQkNEQqYhpdSkyY6ULNRkQ0pRyoKtPwtldTXNRpnFsJCUIolsLGQxws5CiYVsyJ8ms5uFWKDwPN5zPue+3/ede28zw+b+6te99z33++57zvue812gy/+lj/b6oGMeXUZ7/MBcMUwvoHViSug0PRneZ9lF39KPbbrbLivYSh/TlS5eh5K/Tvf7gRRlfYnepv3hs7hKf9I94bNKsJO+p9tCTCyk9+jBJJZylE7Q5S6+hT6l61y8YBW9g+bZqgeewZJYk8QX0xt0bRJT4i9h9/EsoPeDep8yn96iDRcvUFlU75RB+pnehd0gooTH6ZLwWat7LcSq0AQm6agfCByCLYDuW+IA3eRiuuAXPePiKscx/C33CvqK7iu+YWhlV8Pu/QNWZq2o3xhagA9obo0s6i/dcLsfcAzBNoNeU47QK/Qd/UZvwlZ1Q/olWPJKzE+skrr+qmIvnaIDfgD5/opoZZ+gXJlKNPuvKPdXFUpMM9bMPa36S8TEct8pqOuvKnKJaVN9D691xMTUOlniLmunv0QusbOoL3Ok7VJ20l9CyX+C7a6U2F8P6SLYbjyP5vNPxN875eIlOukvsRmWmC9XPEZi72jXnUD52ahE9Sj01/9BZ9hzOg3rregX+hrloyAlluK4iyuBc/QN7FGn9/4ME1pxTaCd6nRMA/UrvDRYRwP2WKq6dsZspC9gD+VO0FPkEd3hB2YT/b8aQ7mHchyml1Fd4llDN7+IFv+vErTKD+h6PzAX6FgYQf7cEvpnot3qj44uXf4pvwEatG703mhNCwAAAABJRU5ErkJggg==>