<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cradicle Explorer</title>
    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
    <style>
      .form-control-dark::placeholder {
          color: #aaa;
          opacity: 1;
      }
    </style>
    <link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
    <link rel="icon" type="image/png" href="/favicon.png">


                <link href="/css/dashboard.css" rel="stylesheet">
                </head>
                <body>
                <header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
                  <a class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="/">Cradicle Explorer</a>
                  <button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                  </button>
                  <form method="get" action="/cgi-bin/main" style="width:100%;"><input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" name="q" placeholder="Search repos" aria-label="Search"></form>
                  <div class="navbar-nav flex-row">
                    <div class="nav-item text-nowrap">
                      <a class="nav-link px-3 active" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW">ai-ops-testing_echo</a>
                    </div>
                  </div>
                </header>
                <div class="container-fluid">
                  <div class="row">
                    <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-dark sidebar collapse">
                      <div class="position-sticky pt-3 sidebar-sticky">
                        <ul class="nav flex-column">
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW">
                              <i class="align-text-bottom fa-solid fa-info"></i>
                              Info
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&issue=list">
                              <i class="align-text-bottom fa-solid fa-layer-group"></i>
                              Issues
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&patch=list">
                              <i class="align-text-bottom fa-solid fa-vest-patches"></i>
                              Patches
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&wallet=list">
                              <i class="align-text-bottom fa-solid fa-wallet"></i>
                              Wallets
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link active" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=.">
                              <i class="align-text-bottom fa-solid fa-code"></i>
                              Source
                            </a>
                          </li>
                        <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
                          <span></span>
                        </h6>
                        <ul class="nav flex-column mb-2">
                        
    <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-1 mb-1 text-muted text-uppercase">
      <span>Source</span>
    </h6>
    <li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=.claude"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .claude</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> apps</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fceo"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> ceo</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fchro"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> chro</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fcto"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> cto</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fdelegator"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> delegator</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> echo_shared</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Fconfig"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> config</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Fdocs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Flib"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> lib</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Fpriv"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> priv</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Fscripts"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> scripts</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Ftest"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> test</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Ftest%2Fecho_shared"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> echo_shared</a></li><li><a class="nav-link py-0" style="padding-left:80px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Ftest%2Fecho_shared%2Fworkflow"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> workflow</a></li><li><a class="nav-link py-0 active" style="padding-left:96px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2Ftest%2Fecho_shared%2Fworkflow%2Fflow_test.exs"><i class="fa-solid fa-file" style="color:#888;"></i> flow_test.exs</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2Ftest%2Fdistributed_systems_test.exs"><i class="fa-solid fa-file" style="color:#888;"></i> distributed_systems_test.exs</a></li><li><a class="nav-link py-0" style="padding-left:64px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2Ftest%2Ftest_helper.exs"><i class="fa-solid fa-file" style="color:#888;"></i> test_helper.exs</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Fworkflows"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> workflows</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2FAGENT_INTEGRATION_TEMPLATE.ex"><i class="fa-solid fa-file" style="color:#888;"></i> AGENT_INTEGRATION_TEMPLATE.ex</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2FLLM_SESSION_INTEGRATION.md"><i class="fa-solid fa-file" style="color:#888;"></i> LLM_SESSION_INTEGRATION.md</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2FREADME.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2Fclaude.md"><i class="fa-solid fa-file" style="color:#888;"></i> claude.md</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2Fmix.exs"><i class="fa-solid fa-file" style="color:#888;"></i> mix.exs</a></li><li><a class="nav-link py-0" style="padding-left:48px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fecho_shared%2Frebuild.md"><i class="fa-solid fa-file" style="color:#888;"></i> rebuild.md</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Foperations_head"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> operations_head</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fproduct_manager"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> product_manager</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fsenior_architect"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> senior_architect</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fsenior_developer"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> senior_developer</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Ftest_lead"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> test_lead</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fuiux_engineer"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> uiux_engineer</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=apps%2Fclaude.md"><i class="fa-solid fa-file" style="color:#888;"></i> claude.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=config"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> config</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=docker"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docker</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=docs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=k8s"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> k8s</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=scripts"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> scripts</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=test"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> test</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=workflows"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> workflows</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=.envrc"><i class="fa-solid fa-file" style="color:#888;"></i> .envrc</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=.gitignore"><i class="fa-solid fa-file" style="color:#888;"></i> .gitignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=CLAUDE.md"><i class="fa-solid fa-file" style="color:#888;"></i> CLAUDE.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=LICENSE"><i class="fa-solid fa-file" style="color:#888;"></i> LICENSE</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=README.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=SESSION_PERSISTENCE_ANALYSIS.md"><i class="fa-solid fa-file" style="color:#888;"></i> SESSION_PERSISTENCE_ANALYSIS.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=add_session_tool_simple.py"><i class="fa-solid fa-file" style="color:#888;"></i> add_session_tool_simple.py</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=claude_desktop_config.template.json"><i class="fa-solid fa-file" style="color:#888;"></i> claude_desktop_config.template.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=claude_desktop_config_all_agents.json"><i class="fa-solid fa-file" style="color:#888;"></i> claude_desktop_config_all_agents.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=debug_session.exs"><i class="fa-solid fa-file" style="color:#888;"></i> debug_session.exs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=docker-compose.yml"><i class="fa-solid fa-file" style="color:#888;"></i> docker-compose.yml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=mix.exs"><i class="fa-solid fa-file" style="color:#888;"></i> mix.exs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=mix.lock"><i class="fa-solid fa-file" style="color:#888;"></i> mix.lock</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=shell.nix"><i class="fa-solid fa-file" style="color:#888;"></i> shell.nix</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=test_ceo_expansion_strategy.sh"><i class="fa-solid fa-file" style="color:#888;"></i> test_ceo_expansion_strategy.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=test_ceo_linkedin_budget.sh"><i class="fa-solid fa-file" style="color:#888;"></i> test_ceo_linkedin_budget.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=test_from_ceo.exs"><i class="fa-solid fa-file" style="color:#888;"></i> test_from_ceo.exs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&file=verify_ceo_multiturn.sh"><i class="fa-solid fa-file" style="color:#888;"></i> verify_ceo_multiturn.sh</a></li>
    
                        </ul>
                      </div>
                    </nav>
                <main class="col-md-9 ms-sm-auto col-lg-10">
                  <div class="container px-1 py-3">
        
<div class="mb-2" style="font-size:1.1rem;"><a href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=.">/</a> <a href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps">apps</a> / <a href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared">echo_shared</a> / <a href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Ftest">test</a> / <a href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Ftest%2Fecho_shared">echo_shared</a> / <a href="/cgi-bin/repo?id=z4BzhsTFjkaZMaEcoJ1c8iFhZMeWW&source=apps%2Fecho_shared%2Ftest%2Fecho_shared%2Fworkflow">workflow</a> / flow_test.exs</div>
        <div class="list-group">
        <div class="list-group-item">
        <div class="mb-2" style="font-weight:bold;"><i class="fa-solid fa-file"></i> flow_test.exs</div>
        <pre style="margin:0; font-size:0.85rem; overflow-x:auto; color:#fafafa;"><span style="color:#666; user-select:none;"> 1</span>  defmodule EchoShared.Workflow.FlowTest do
<span style="color:#666; user-select:none;"> 2</span>    use ExUnit.Case, async: false
<span style="color:#666; user-select:none;"> 3</span>  
<span style="color:#666; user-select:none;"> 4</span>    defmodule TestFlow do
<span style="color:#666; user-select:none;"> 5</span>      use EchoShared.Workflow.Flow
<span style="color:#666; user-select:none;"> 6</span>  
<span style="color:#666; user-select:none;"> 7</span>      @start
<span style="color:#666; user-select:none;"> 8</span>      def start_step(state) do
<span style="color:#666; user-select:none;"> 9</span>        Map.put(state, :started, true)
<span style="color:#666; user-select:none;">10</span>      end
<span style="color:#666; user-select:none;">11</span>  
<span style="color:#666; user-select:none;">12</span>      @router :start_step
<span style="color:#666; user-select:none;">13</span>      def route_decision(state) do
<span style="color:#666; user-select:none;">14</span>        if Map.get(state, :go_left, false) do
<span style="color:#666; user-select:none;">15</span>          &quot;left&quot;
<span style="color:#666; user-select:none;">16</span>        else
<span style="color:#666; user-select:none;">17</span>          &quot;right&quot;
<span style="color:#666; user-select:none;">18</span>        end
<span style="color:#666; user-select:none;">19</span>      end
<span style="color:#666; user-select:none;">20</span>  
<span style="color:#666; user-select:none;">21</span>      @listen &quot;left&quot;
<span style="color:#666; user-select:none;">22</span>      def handle_left(state) do
<span style="color:#666; user-select:none;">23</span>        Map.put(state, :direction, :left)
<span style="color:#666; user-select:none;">24</span>      end
<span style="color:#666; user-select:none;">25</span>  
<span style="color:#666; user-select:none;">26</span>      @listen &quot;right&quot;
<span style="color:#666; user-select:none;">27</span>      def handle_right(state) do
<span style="color:#666; user-select:none;">28</span>        Map.put(state, :direction, :right)
<span style="color:#666; user-select:none;">29</span>      end
<span style="color:#666; user-select:none;">30</span>    end
<span style="color:#666; user-select:none;">31</span>  
<span style="color:#666; user-select:none;">32</span>    describe &quot;Flow DSL&quot; do
<span style="color:#666; user-select:none;">33</span>      test &quot;captures start functions&quot; do
<span style="color:#666; user-select:none;">34</span>        starts = TestFlow.get_starts()
<span style="color:#666; user-select:none;">35</span>        assert is_list(starts)
<span style="color:#666; user-select:none;">36</span>        assert length(starts) &gt; 0
<span style="color:#666; user-select:none;">37</span>      end
<span style="color:#666; user-select:none;">38</span>  
<span style="color:#666; user-select:none;">39</span>      test &quot;captures routers&quot; do
<span style="color:#666; user-select:none;">40</span>        metadata = TestFlow.__flow_metadata__()
<span style="color:#666; user-select:none;">41</span>        assert is_map(metadata)
<span style="color:#666; user-select:none;">42</span>        assert Map.has_key?(metadata, :routers)
<span style="color:#666; user-select:none;">43</span>      end
<span style="color:#666; user-select:none;">44</span>  
<span style="color:#666; user-select:none;">45</span>      test &quot;captures listeners&quot; do
<span style="color:#666; user-select:none;">46</span>        listeners = TestFlow.get_listeners(&quot;left&quot;)
<span style="color:#666; user-select:none;">47</span>        assert is_list(listeners)
<span style="color:#666; user-select:none;">48</span>      end
<span style="color:#666; user-select:none;">49</span>  
<span style="color:#666; user-select:none;">50</span>      test &quot;has_router? works&quot; do
<span style="color:#666; user-select:none;">51</span>        assert TestFlow.has_router?(:start_step)
<span style="color:#666; user-select:none;">52</span>        refute TestFlow.has_router?(:nonexistent)
<span style="color:#666; user-select:none;">53</span>      end
<span style="color:#666; user-select:none;">54</span>  
<span style="color:#666; user-select:none;">55</span>      test &quot;execute_step works&quot; do
<span style="color:#666; user-select:none;">56</span>        state = TestFlow.execute_step(:start_step, %{})
<span style="color:#666; user-select:none;">57</span>        assert state[:started] == true
<span style="color:#666; user-select:none;">58</span>      end
<span style="color:#666; user-select:none;">59</span>  
<span style="color:#666; user-select:none;">60</span>      test &quot;route_after works&quot; do
<span style="color:#666; user-select:none;">61</span>        label = TestFlow.route_after(:start_step, %{go_left: true})
<span style="color:#666; user-select:none;">62</span>        assert label == &quot;left&quot;
<span style="color:#666; user-select:none;">63</span>  
<span style="color:#666; user-select:none;">64</span>        label = TestFlow.route_after(:start_step, %{go_left: false})
<span style="color:#666; user-select:none;">65</span>        assert label == &quot;right&quot;
<span style="color:#666; user-select:none;">66</span>      end
<span style="color:#666; user-select:none;">67</span>    end
<span style="color:#666; user-select:none;">68</span>  end
</pre>
        </div>
        </div>

</div>
</main>
</div>
</div>


</body>
</html>

