Skip to content

Commit 11cb4f1

Browse files
author
lpb-docs
committed
Deployed f67f888 to edge with MkDocs 1.6.1 and mike 2.2.0
1 parent f2a29fe commit 11cb4f1

17 files changed

Lines changed: 6706 additions & 572 deletions

File tree

edge/404.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@
535535

536536

537537
<li class="md-nav__item">
538-
<a href="/devstack/edge/reference/lpb-cli.md" class="md-nav__link">
538+
<a href="/devstack/edge/reference/lpb-cli/" class="md-nav__link">
539539

540540

541541

@@ -563,7 +563,7 @@
563563

564564

565565
<li class="md-nav__item">
566-
<a href="/devstack/edge/reference/lpb-config.md" class="md-nav__link">
566+
<a href="/devstack/edge/reference/lpb-config/" class="md-nav__link">
567567

568568

569569

@@ -591,7 +591,7 @@
591591

592592

593593
<li class="md-nav__item">
594-
<a href="/devstack/edge/reference/env-vars.md" class="md-nav__link">
594+
<a href="/devstack/edge/reference/env-vars/" class="md-nav__link">
595595

596596

597597

@@ -619,7 +619,7 @@
619619

620620

621621
<li class="md-nav__item">
622-
<a href="/devstack/edge/reference/config-repo.md" class="md-nav__link">
622+
<a href="/devstack/edge/reference/config-repo/" class="md-nav__link">
623623

624624

625625

@@ -647,7 +647,7 @@
647647

648648

649649
<li class="md-nav__item">
650-
<a href="/devstack/edge/reference/lpb-memory-overview.md" class="md-nav__link">
650+
<a href="/devstack/edge/reference/lpb-memory-overview/" class="md-nav__link">
651651

652652

653653

edge/contributing/index.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<link rel="canonical" href="https://lpb-stack.github.io/devstack/edge/contributing/">
1414

1515

16-
<link rel="prev" href="../reference/repo-workflow-skill/">
16+
<link rel="prev" href="../reference/lpb-memory-overview/">
1717

1818

1919

@@ -546,7 +546,7 @@
546546

547547

548548
<li class="md-nav__item">
549-
<a href="../reference/lpb-cli.md" class="md-nav__link">
549+
<a href="../reference/lpb-cli/" class="md-nav__link">
550550

551551

552552

@@ -574,7 +574,7 @@
574574

575575

576576
<li class="md-nav__item">
577-
<a href="../reference/lpb-config.md" class="md-nav__link">
577+
<a href="../reference/lpb-config/" class="md-nav__link">
578578

579579

580580

@@ -602,7 +602,7 @@
602602

603603

604604
<li class="md-nav__item">
605-
<a href="../reference/env-vars.md" class="md-nav__link">
605+
<a href="../reference/env-vars/" class="md-nav__link">
606606

607607

608608

@@ -630,7 +630,7 @@
630630

631631

632632
<li class="md-nav__item">
633-
<a href="../reference/config-repo.md" class="md-nav__link">
633+
<a href="../reference/config-repo/" class="md-nav__link">
634634

635635

636636

@@ -658,7 +658,7 @@
658658

659659

660660
<li class="md-nav__item">
661-
<a href="../reference/lpb-memory-overview.md" class="md-nav__link">
661+
<a href="../reference/lpb-memory-overview/" class="md-nav__link">
662662

663663

664664

edge/index.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -985,7 +985,7 @@
985985

986986

987987
<li class="md-nav__item">
988-
<a href="reference/lpb-cli.md" class="md-nav__link">
988+
<a href="reference/lpb-cli/" class="md-nav__link">
989989

990990

991991

@@ -1013,7 +1013,7 @@
10131013

10141014

10151015
<li class="md-nav__item">
1016-
<a href="reference/lpb-config.md" class="md-nav__link">
1016+
<a href="reference/lpb-config/" class="md-nav__link">
10171017

10181018

10191019

@@ -1041,7 +1041,7 @@
10411041

10421042

10431043
<li class="md-nav__item">
1044-
<a href="reference/env-vars.md" class="md-nav__link">
1044+
<a href="reference/env-vars/" class="md-nav__link">
10451045

10461046

10471047

@@ -1069,7 +1069,7 @@
10691069

10701070

10711071
<li class="md-nav__item">
1072-
<a href="reference/config-repo.md" class="md-nav__link">
1072+
<a href="reference/config-repo/" class="md-nav__link">
10731073

10741074

10751075

@@ -1097,7 +1097,7 @@
10971097

10981098

10991099
<li class="md-nav__item">
1100-
<a href="reference/lpb-memory-overview.md" class="md-nav__link">
1100+
<a href="reference/lpb-memory-overview/" class="md-nav__link">
11011101

11021102

11031103

edge/operations/subagent-spawning-pattern/index.html

Lines changed: 35 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -700,7 +700,7 @@
700700

701701

702702
<li class="md-nav__item">
703-
<a href="../../reference/lpb-cli.md" class="md-nav__link">
703+
<a href="../../reference/lpb-cli/" class="md-nav__link">
704704

705705

706706

@@ -728,7 +728,7 @@
728728

729729

730730
<li class="md-nav__item">
731-
<a href="../../reference/lpb-config.md" class="md-nav__link">
731+
<a href="../../reference/lpb-config/" class="md-nav__link">
732732

733733

734734

@@ -756,7 +756,7 @@
756756

757757

758758
<li class="md-nav__item">
759-
<a href="../../reference/env-vars.md" class="md-nav__link">
759+
<a href="../../reference/env-vars/" class="md-nav__link">
760760

761761

762762

@@ -784,7 +784,7 @@
784784

785785

786786
<li class="md-nav__item">
787-
<a href="../../reference/config-repo.md" class="md-nav__link">
787+
<a href="../../reference/config-repo/" class="md-nav__link">
788788

789789

790790

@@ -812,7 +812,7 @@
812812

813813

814814
<li class="md-nav__item">
815-
<a href="../../reference/lpb-memory-overview.md" class="md-nav__link">
815+
<a href="../../reference/lpb-memory-overview/" class="md-nav__link">
816816

817817

818818

@@ -1018,93 +1018,84 @@
10181018

10191019
<h1 id="subagent-spawning-pattern-browser-testing">Subagent Spawning Pattern — Browser Testing<a class="headerlink" href="#subagent-spawning-pattern-browser-testing" title="Permanent link">&para;</a></h1>
10201020
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link">&para;</a></h2>
1021-
<p>When spawning subagents for browser testing, use the following pattern to ensure isolated sessions and structured JSON output.</p>
1021+
<p>When spawning subagents for browser testing, use the following pattern to ensure
1022+
isolated sessions and structured JSON output.</p>
10221023
<h2 id="steps">Steps<a class="headerlink" href="#steps" title="Permanent link">&para;</a></h2>
10231024
<h3 id="1-generate-a-unique-session-id">1. Generate a Unique Session ID<a class="headerlink" href="#1-generate-a-unique-session-id" title="Permanent link">&para;</a></h3>
1024-
<div class="highlight"><pre><span></span><code><span class="nv">SESSION_ID</span><span class="o">=</span><span class="k">$(</span>npx<span class="w"> </span>tsx<span class="w"> </span>bin/session-uuid.ts<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PI_WORKTREE_ID</span><span class="si">}</span><span class="s2">-&lt;test-name&gt;&quot;</span><span class="k">)</span>
1025+
<div class="highlight"><pre><span></span><code><span class="nv">SESSION_ID</span><span class="o">=</span><span class="k">$(</span>session-uuid<span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">PI_WORKTREE_ID</span><span class="si">}</span><span class="s2">-&lt;test-name&gt;&quot;</span><span class="k">)</span>
10251026
</code></pre></div>
10261027
<p>Example output: <code>pi-main-abc123-login-flow-7f3a9b2c</code></p>
10271028
<h3 id="2-load-the-system-prompt-template">2. Load the System Prompt Template<a class="headerlink" href="#2-load-the-system-prompt-template" title="Permanent link">&para;</a></h3>
1028-
<div class="highlight"><pre><span></span><code><span class="nv">PROMPT</span><span class="o">=</span><span class="k">$(</span>cat<span class="w"> </span>subagent-browser-prompt.txt<span class="k">)</span>
1029+
<div class="highlight"><pre><span></span><code><span class="nv">PROMPT</span><span class="o">=</span><span class="k">$(</span>cat<span class="w"> </span>/opt/pi-support/config/subagent-browser-prompt.txt<span class="k">)</span>
10291030
</code></pre></div>
1030-
<p>The template at <code>subagent-browser-prompt.txt</code> includes:
1031+
<p>The template at <code>/opt/pi-support/config/subagent-browser-prompt.txt</code> includes:
10311032
- The JSON schema the subagent must produce
10321033
- Instructions for using agent-browser with bundled Chrome
10331034
- Metrics collection steps (vitals, a11y, snapshot)</p>
10341035
<h3 id="3-spawn-the-subagent">3. Spawn the Subagent<a class="headerlink" href="#3-spawn-the-subagent" title="Permanent link">&para;</a></h3>
1035-
<div class="highlight"><pre><span></span><code><span class="c1">// Via the subagent tool in Pi:</span>
1036-
<span class="nx">subagent</span><span class="p">({</span>
1037-
<span class="w"> </span><span class="nx">agent</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;researcher&quot;</span><span class="p">,</span>
1038-
<span class="w"> </span><span class="nx">task</span><span class="o">:</span><span class="w"> </span><span class="sb">`Run browser test on https://example.com:</span>
1036+
<p>Use the Pi <code>Agent</code> tool with <code>subagent_type: "browser-automation"</code>:</p>
1037+
<div class="highlight"><pre><span></span><code><span class="nx">Agent</span><span class="p">(</span>
1038+
<span class="w"> </span><span class="nx">description</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;Browser test on https://example.com&quot;</span><span class="p">,</span>
1039+
<span class="w"> </span><span class="nx">subagent_type</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;browser-automation&quot;</span><span class="p">,</span>
1040+
<span class="w"> </span><span class="nx">prompt</span><span class="o">:</span><span class="w"> </span><span class="sb">`Run browser test on https://example.com:</span>
10391041
<span class="sb"> 1. Navigate to the URL</span>
10401042
<span class="sb"> 2. Verify the page loads correctly</span>
10411043
<span class="sb"> 3. Check for accessibility issues</span>
10421044
<span class="sb"> 4. Measure performance metrics</span>
10431045

1044-
<span class="sb"> Session ID: </span><span class="si">${</span><span class="nx">SESSION_ID</span><span class="si">}</span>
1045-
<span class="sb"> Prompt: </span><span class="si">${</span><span class="nx">PROMPT</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
1046-
<span class="w"> </span><span class="nx">outputSchema</span><span class="o">:</span><span class="w"> </span><span class="nb">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">readFileSync</span><span class="p">(</span><span class="s2">&quot;subagent-browser-schema.json&quot;</span><span class="p">)),</span>
1047-
<span class="p">});</span>
1046+
<span class="sb"> Session ID: </span><span class="si">${</span><span class="nx">SESSION_ID</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
1047+
<span class="w"> </span><span class="nx">thinking</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;low&quot;</span><span class="p">,</span>
1048+
<span class="w"> </span><span class="nx">isolation</span><span class="o">:</span><span class="w"> </span><span class="s2">&quot;worktree&quot;</span>
1049+
<span class="p">)</span>
10481050
</code></pre></div>
10491051
<h3 id="4-collect-and-validate-the-result">4. Collect and Validate the Result<a class="headerlink" href="#4-collect-and-validate-the-result" title="Permanent link">&para;</a></h3>
1050-
<div class="highlight"><pre><span></span><code><span class="c1"># Pipe subagent output to the validator</span>
1051-
<span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">SUBAGENT_OUTPUT</span><span class="si">}</span><span class="s2">&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>npx<span class="w"> </span>tsx<span class="w"> </span>bin/validate-subagent-output.ts
1052-
1053-
<span class="c1"># Close the browser session to prevent zombie processes</span>
1054-
agent-browser<span class="w"> </span>--session<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$SESSION_ID</span><span class="s2">&quot;</span><span class="w"> </span>close
1052+
<p>The subagent returns structured output directly via its completion. Close the
1053+
browser session when done:</p>
1054+
<div class="highlight"><pre><span></span><code>agent-browser<span class="w"> </span>--session<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$SESSION_ID</span><span class="s2">&quot;</span><span class="w"> </span>close
10551055
</code></pre></div>
10561056
<h3 id="5-retry-on-failure-max-3-attempts">5. Retry on Failure (Max 3 Attempts)<a class="headerlink" href="#5-retry-on-failure-max-3-attempts" title="Permanent link">&para;</a></h3>
1057-
<div class="highlight"><pre><span></span><code><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">validate</span><span class="p">,</span><span class="w"> </span><span class="nx">buildRepairPrompt</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s2">&quot;./bin/validate-subagent-output&quot;</span><span class="p">;</span>
1058-
1059-
<span class="kd">let</span><span class="w"> </span><span class="nx">output</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nx">spawnSubagent</span><span class="p">(</span><span class="nx">task</span><span class="p">);</span>
1060-
<span class="kd">let</span><span class="w"> </span><span class="nx">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">validate</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span>
1061-
<span class="kd">let</span><span class="w"> </span><span class="nx">attempts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">1</span><span class="p">;</span>
1062-
1063-
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">result</span><span class="p">.</span><span class="nx">success</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">attempts</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mf">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
1064-
<span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">repairPrompt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">buildRepairPrompt</span><span class="p">(</span><span class="nx">result</span><span class="p">.</span><span class="nx">error</span><span class="o">!</span><span class="p">,</span><span class="w"> </span><span class="nx">originalTask</span><span class="p">);</span>
1065-
<span class="w"> </span><span class="nx">output</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">await</span><span class="w"> </span><span class="nx">spawnSubagent</span><span class="p">(</span><span class="nx">repairPrompt</span><span class="p">);</span>
1066-
<span class="w"> </span><span class="nx">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">validate</span><span class="p">(</span><span class="nx">output</span><span class="p">);</span>
1067-
<span class="w"> </span><span class="nx">attempts</span><span class="o">++</span><span class="p">;</span>
1068-
<span class="p">}</span>
1069-
1070-
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="nx">result</span><span class="p">.</span><span class="nx">success</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
1071-
<span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="sb">`Test failed after </span><span class="si">${</span><span class="nx">attempts</span><span class="si">}</span><span class="sb"> attempts: </span><span class="si">${</span><span class="nx">result</span><span class="p">.</span><span class="nx">error</span><span class="si">}</span><span class="sb">`</span><span class="p">);</span>
1072-
<span class="p">}</span>
1057+
<p>If the output needs validation, use the support utility:</p>
1058+
<div class="highlight"><pre><span></span><code><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">SUBAGENT_OUTPUT</span><span class="si">}</span><span class="s2">&quot;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>tsx<span class="w"> </span>/opt/pi-support/validate-subagent-output.ts
1059+
agent-browser<span class="w"> </span>--session<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$SESSION_ID</span><span class="s2">&quot;</span><span class="w"> </span>close
10731060
</code></pre></div>
10741061
<h2 id="key-points">Key Points<a class="headerlink" href="#key-points" title="Permanent link">&para;</a></h2>
10751062
<ul>
10761063
<li><strong>Always use bundled Chrome</strong> (not CDP) for subagents</li>
10771064
<li><strong>Always set <code>AGENT_BROWSER_SESSION</code></strong> to a unique value</li>
1078-
<li><strong>Always pass the JSON schema</strong> in the subagent's prompt</li>
10791065
<li><strong>Always validate</strong> the output on the parent side</li>
10801066
<li><strong>Always retry</strong> with a repair prompt if validation fails</li>
10811067
<li><strong>Cap at 3 attempts</strong> to avoid infinite loops</li>
1068+
<li><strong>Close browser sessions</strong> — without it, Chrome processes become zombies</li>
10821069
</ul>
10831070
<h2 id="file-reference">File Reference<a class="headerlink" href="#file-reference" title="Permanent link">&para;</a></h2>
10841071
<table>
10851072
<thead>
10861073
<tr>
1087-
<th>File</th>
1074+
<th>Path</th>
10881075
<th>Purpose</th>
10891076
</tr>
10901077
</thead>
10911078
<tbody>
10921079
<tr>
1093-
<td><code>bin/session-uuid.ts</code></td>
1080+
<td><code>session-uuid</code> (installed at <code>/opt/pi-support/bin/</code>)</td>
10941081
<td>Generate unique session IDs</td>
10951082
</tr>
10961083
<tr>
1097-
<td><code>subagent-browser-schema.json</code></td>
1084+
<td><code>/opt/pi-support/schemas/browser-validation-schema.json</code></td>
10981085
<td>Unified JSON schema (all fields)</td>
10991086
</tr>
11001087
<tr>
1101-
<td><code>subagent-browser-prompt.txt</code></td>
1088+
<td><code>/opt/pi-support/config/subagent-browser-prompt.txt</code></td>
11021089
<td>System prompt template</td>
11031090
</tr>
11041091
<tr>
1105-
<td><code>bin/validate-subagent-output.ts</code></td>
1092+
<td><code>/opt/pi-support/validate-subagent-output.ts</code></td>
11061093
<td>Parent-side validation utility</td>
11071094
</tr>
1095+
<tr>
1096+
<td><code>/opt/pi-support/browser-validate.ts</code></td>
1097+
<td>Browser validation entry point</td>
1098+
</tr>
11081099
</tbody>
11091100
</table>
11101101

0 commit comments

Comments
 (0)