Feature: SAFE_BUILTINS, ConfigurationError Propagation, CLI Execution, and Message Routing As a developer I want SAFE_BUILTINS to contain only safe builtins, ConfigurationError to propagate correctly, CLI commands to execute, and message routers to work with regex and exact match rules So that sandbox safety is enforced, config errors are not swallowed, and routing utilities function correctly Scenario: SAFE_BUILTINS should contain all required builtins and exclude dangerous ones Given I have a clean gap coverage test environment Given the sandbox module is importable Then SAFE_BUILTINS should contain all whitelisted builtins And SAFE_BUILTINS should not contain dangerous builtins Scenario: ConfigurationError re-raise path during validation Given I have a clean gap coverage test environment Given I create a ConfigurationManager instance Given I load a config that triggers a schema ConfigurationError Then the ConfigurationError should propagate without wrapping during validation Scenario: CLI hello command executes without error Given I have a clean gap coverage test environment When I invoke the cli hello command Then the cli should execute without error Scenario: CLI main function executes without error Given I have a clean gap coverage test environment When I invoke the cli main function Then the cli should execute without error Scenario: EnhancedTemplateRegistry raises ValueError for unknown template type Given I have a clean gap coverage test environment Given I have an EnhancedTemplateRegistry instance When I register a simple template with an invalid template type Then a ValueError should be raised for the unknown template type Scenario: CompositeAgent raises ExecutionError for nonexistent graph Given I have a clean gap coverage test environment When I access the composite agent graph loading with a nonexistent graph name Then an ExecutionError should be raised for the missing graph Scenario: GraphState truncates messages in merge mode when exceeding 50 Given I have a clean gap coverage test environment Given I create a GraphState with merge update mode When I push more than 50 messages into the graph state Then the graph state messages should be truncated to 50 Scenario: GraphState truncates messages in append mode when exceeding 50 Given I have a clean gap coverage test environment Given I create a GraphState with append update mode When I push more than 50 messages into the graph state Then the graph state messages should be truncated to 50 Scenario: ProgressBarManager renders progress without error Given I have a clean gap coverage test environment Given I create a ProgressBarManager When I call update with valid progress data And I call update with context-derived data And I call update multiple times to simulate progression Then the progress bar should render without error Scenario: MessageRouter routes messages with regex rules Given I have a clean gap coverage test environment Given I import the MessageRouter class When I create a MessageRouter with custom regex rules And I route a matching regex message Then the regex rule should match and return the target Scenario: MessageRouter routes messages with exact match rules Given I have a clean gap coverage test environment Given I import the MessageRouter class When I create a MessageRouter with exact match rules And I route a matching exact message And I route a non-matching message Then the exact rule should match And the non-matching message should fall through Scenario: RoutingAdapter parses routing commands Given I have a clean gap coverage test environment Given I import the RoutingAdapter class When I create a RoutingAdapter And I parse a valid routing command from message content And I parse an invalid routing command Then the routing adapter should extract routing information And the invalid command should be handled gracefully Scenario: DynamicRouter resolves routes based on conditions Given I have a clean gap coverage test environment Given I import the DynamicRouter class When I create a DynamicRouter And I add routes with conditions to the DynamicRouter And I resolve a message through the DynamicRouter And I resolve a non-matching message through the DynamicRouter Then the DynamicRouter should route to the correct target And the DynamicRouter should return unchanged for non-matching content