not->toBeFalse(); $loopSource = substr($agentSource, (int)$runOffset, 1800); $configureOffset = strpos($loopSource, '$this->configureBrokerClient();'); $pumpOffset = strpos($loopSource, '$this->pumpBrokerTransport();'); $flushOffset = strpos($loopSource, '$this->flushOutbox();'); expect($configureOffset)->not->toBeFalse() ->and($pumpOffset)->not->toBeFalse() ->and($flushOffset)->not->toBeFalse() ->and((int)$configureOffset)->toBeLessThan((int)$pumpOffset) ->and((int)$pumpOffset)->toBeLessThan((int)$flushOffset); }); it('bounds stale outbox replay so it cannot monopolize the gateway loop', function (): void { $agentSource = (string)file_get_contents(app_path('resources/edge-gateway-agent/agent.php')); expect($agentSource)->toContain('private const OUTBOX_REPLAY_BATCH_LIMIT = 3;') ->and($agentSource)->toContain('private const OUTBOX_REPLAY_TIMEOUT_SECONDS = 3;') ->and($agentSource)->toContain('private const OUTBOX_OPERATION_COMPLETE_REPLAY_TIMEOUT_SECONDS = 10;') ->and($agentSource)->toContain('private const OUTBOX_REPLAY_FAILURE_COOLDOWN_SECONDS = 15;') ->and($agentSource)->toContain('private int $lastOutboxFailureAt = 0;') ->and($agentSource)->toContain('$this->stateStore->queuedItems(self::OUTBOX_REPLAY_BATCH_LIMIT)') ->and($agentSource)->toContain('private function shouldSkipOutboxReplay(): bool') ->and($agentSource)->toContain('$this->lastOutboxFailureAt = time();') ->and($agentSource)->toContain('? self::OUTBOX_OPERATION_COMPLETE_REPLAY_TIMEOUT_SECONDS') ->and($agentSource)->toContain(': self::OUTBOX_REPLAY_TIMEOUT_SECONDS;'); }); it('uses a short control-plane timeout for self-serve machine signals before queueing', function (): void { $agentSource = (string)file_get_contents(app_path('resources/edge-gateway-agent/agent.php')); expect($agentSource)->toContain('private const MACHINE_SIGNAL_TIMEOUT_SECONDS = 3;') ->and($agentSource)->toContain('private function sendControlPlaneEvent(string $endpoint, array $payload, string $type, int $timeoutSeconds = 20): bool') ->and($agentSource)->toContain("'machine_signal',\n self::MACHINE_SIGNAL_TIMEOUT_SECONDS"); });