Feature: Reactive application coverage As a developer I want targeted Behave coverage for the reactive application So that uncovered logic paths are exercised Scenario: Initialize app applies logging and temperature override Given a temporary reactive config with a stream route When I initialize the reactive app with verbose "3" and temperature override "0.4" Then the reactive app should load the configuration And the root logger level should be INFO And the config should include the temperature override "0.4" And the stream route should be registered Scenario: Unsafe config requires unsafe flag Given a temporary reactive config that requires unsafe mode When I initialize the reactive app without the unsafe flag Then an unsafe configuration error should be raised Scenario: Logging levels cover verbosity branches Given a reactive app instance When I configure logging for all verbosity levels Then each verbosity should map to the expected logging level Scenario: Register agents and aliases from config Given a reactive app with stream operators and varied agent types When I register agents from the reactive config Then the stream router should include tool and llm agent aliases And the operator referenced actors should be registered And the tool actor should be registered as a SimpleToolAgent And the llm agent should be registered as a SimpleLLMAgent Scenario: Load configuration wraps parser errors Given a reactive app without configuration When I load configuration from a missing file Then a configuration load error should be raised Scenario: Stream routes reject bridge configs Given a reactive app with a stream route that has a bridge config When I validate the reactive routes Then route validation should fail for bridge config Scenario: Build routes creates streams and merges Given a reactive app with stream and graph routes and a merge When I build the reactive routes Then the stream route should be created And a route bridge should be initialized for graph routes And merge subscriptions should forward messages And rxpy stream presence should be detected And the first graph route should be returned Scenario: Workflow controller rules short-circuit Given a reactive app with a workflow controller graph route When I execute the workflow controller route with prompt "ROUTE_ASK_TOPIC:Hello" Then the workflow route should return the extracted message And the graph context should include default writing metadata Scenario: Chained graph route processes tool, callable, and process agents Given a reactive app with a chained graph route When I execute the chained graph route with prompt "TOOL:payload" Then the chained graph route should return "payload_tool_callable_process" Scenario: Graph route returns empty when router rules are missing Given a reactive app with a graph route without router rules When I execute the graph route with prompt "hello" Then the graph route should return an empty string Scenario: Graph route returns when agent is missing Given a reactive app with a graph route targeting a missing agent When I execute the missing agent route with prompt "MISSING input" Then the graph route should return the original prompt Scenario: Graph route ends on suffix match Given a reactive app with a suffix matching graph route When I execute the suffix route with prompt "done!" Then the suffix route should return the original prompt Scenario: Single shot rejects rxpy stream in run mode Given a reactive app with a stream route configured When I run a single shot without allowing rxpy Then the single shot should fail with a reactive stream error Scenario: Single shot cleans stream routing prefixes Given a reactive app with a stream route configured When I run a single shot allowing rxpy Then the stream output should have routing prefixes removed Scenario: Single shot cleans graph routing prefixes Given a reactive app with a graph route configured When I run a graph single shot with prompt "CMD:ignored" Then the graph output should have routing prefixes removed Scenario: Run with context records messages and global context Given a reactive app with a graph route configured And a context manager for run with context When I run the reactive app with context and prompt "hello" Then the context manager should have stored user and assistant messages And the context manager should persist the global context Scenario: No-config helpers short-circuit Given a reactive app without configuration When I call the reactive helper methods without configuration Then the reactive helper methods should return defaults Scenario: Register deferred route agents and operators Given a reactive app with deferred route and operator agents When I register deferred route agents from the reactive config Then deferred route agents and operator aliases should be registered Scenario: Build routes registers fallback agent and skips missing merge target Given a reactive app with a stream route referencing an unknown actor and a missing merge target When I build the reactive routes Then a fallback stream agent should be registered And the missing merge target should not be created Scenario: Graph route follows non-dict edge condition Given a reactive app with a graph route using a non-dict edge condition When I execute the graph route with prompt "GO" Then the graph route should return the prompt unchanged Scenario: Graph route matches empty suffix rule Given a reactive app with a graph route using an empty suffix rule When I execute the graph route with prompt "tail" Then the graph route should return the prompt unchanged Scenario: Graph route extracts without separator Given a reactive app with a graph route extracting without a separator When I execute the graph route with prompt "PREFIXDATA" Then the graph route should return the prompt unchanged Scenario: Graph route uses process agent branch Given a reactive app with a graph route using a process agent When I execute the graph route with prompt "PROC:work" Then the graph route should return "work_process" Scenario: Graph route uses non-callable agent fallback Given a reactive app with a graph route using a non-callable agent When I execute the graph route with prompt "RAW" Then the graph route should return the prompt unchanged Scenario: Graph route returns empty on empty agent output Given a reactive app with a graph route returning an empty response When I execute the graph route with prompt "EMPTY" Then the graph route should return an empty string Scenario: Chained graph route breaks to router after tool and non-callable nodes Given a reactive app with a chained graph route that breaks to the router When I execute the chained break route with prompt "START" Then the chained break route should return "DONE" Scenario: Chained graph route breaks on missing chained targets Given a reactive app with a chained graph route that has no chained targets When I execute the chained empty route with prompt "BEGIN" Then the chained empty route should return "DONE" Scenario: Graph route loops until max iterations without edges Given a reactive app with a graph route lacking edges When I execute the looping graph route with prompt "LOOP" Then the looping graph route should return "LOOP" Scenario: Graph route uses end-like sentinel target Given a reactive app with a graph route using an end-like sentinel target When I execute the sentinel graph route with prompt "SENTINEL" Then the sentinel graph route should return "value" Scenario: Run single shot updates global context and strips prefixes Given a reactive app with a graph route that emits a discovery prefix And a context manager with global context When I run a graph single shot with context and prompt "CMD:ignore" Then the graph output should be "Hello" And the reactive config should include the context global values Scenario: Run single shot raises on error stream message Given a reactive app with a stream route that emits an error When I run a single shot that triggers a stream error Then the single shot should raise a reactive stream error Scenario: Run single shot returns empty without routes Given a reactive app without configuration When I run a single shot with no routes Then the single shot should return an empty string