Add multi-provider ensemble demo and generate PNG/SVG for all demo workflows

New demo 11-ensemble.dot fans out to Opus (Anthropic), Gemini (Google),
Codex (OpenAI), and Mercury (Inception) in parallel, then synthesizes
results. Also generates PNG and SVG renderings for all existing demo
dot files.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Bryan Helmkamp 2026-03-04 09:47:54 -05:00
parent 13ad7d948a
commit 45165c1fa3
25 changed files with 988 additions and 0 deletions

BIN
demo/01-hello.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

51
demo/01-hello.svg Normal file
View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: Hello Pages: 1 -->
<svg width="291pt" height="47pt"
viewBox="0.00 0.00 291.00 47.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 42.5)">
<title>Hello</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-42.5 287.07,-42.5 287.07,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-37.25 0,-19.25 40.05,-1.25 80.1,-19.25 40.05,-37.25"/>
<polyline fill="none" stroke="black" points="10.95,-24.17 10.95,-14.33"/>
<polyline fill="none" stroke="black" points="29.11,-6.17 51,-6.17"/>
<polyline fill="none" stroke="black" points="69.16,-14.33 69.16,-24.17"/>
<polyline fill="none" stroke="black" points="51,-32.33 29.11,-32.33"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-14.2" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- compose -->
<g id="node3" class="node">
<title>compose</title>
<ellipse fill="none" stroke="black" cx="162.33" cy="-19.25" rx="46.23" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="162.33" y="-14.2" font-family="Times,serif" font-size="14.00">Compose</text>
</g>
<!-- start&#45;&gt;compose -->
<g id="edge1" class="edge">
<title>start&#45;&gt;compose</title>
<path fill="none" stroke="black" d="M81.1,-19.25C88.54,-19.25 96.44,-19.25 104.28,-19.25"/>
<polygon fill="black" stroke="black" points="104.12,-22.75 114.12,-19.25 104.12,-15.75 104.12,-22.75"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="283.07,-38.5 244.57,-38.5 244.57,0 283.07,0 283.07,-38.5"/>
<polyline fill="none" stroke="black" points="256.57,-38.5 244.57,-26.5"/>
<polyline fill="none" stroke="black" points="244.57,-12 256.57,0"/>
<polyline fill="none" stroke="black" points="271.07,0 283.07,-12"/>
<polyline fill="none" stroke="black" points="283.07,-26.5 271.07,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="263.82" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- compose&#45;&gt;exit -->
<g id="edge2" class="edge">
<title>compose&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M209,-19.25C217.08,-19.25 225.31,-19.25 232.82,-19.25"/>
<polygon fill="black" stroke="black" points="232.75,-22.75 242.75,-19.25 232.75,-15.75 232.75,-22.75"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
demo/02-tool-use.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

51
demo/02-tool-use.svg Normal file
View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: ToolUse Pages: 1 -->
<svg width="279pt" height="47pt"
viewBox="0.00 0.00 279.00 47.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 42.5)">
<title>ToolUse</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-42.5 274.78,-42.5 274.78,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-37.25 0,-19.25 40.05,-1.25 80.1,-19.25 40.05,-37.25"/>
<polyline fill="none" stroke="black" points="10.95,-24.17 10.95,-14.33"/>
<polyline fill="none" stroke="black" points="29.11,-6.17 51,-6.17"/>
<polyline fill="none" stroke="black" points="69.16,-14.33 69.16,-24.17"/>
<polyline fill="none" stroke="black" points="51,-32.33 29.11,-32.33"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-14.2" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- explore -->
<g id="node3" class="node">
<title>explore</title>
<ellipse fill="none" stroke="black" cx="156.19" cy="-19.25" rx="40.09" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="156.19" y="-14.2" font-family="Times,serif" font-size="14.00">Explore</text>
</g>
<!-- start&#45;&gt;explore -->
<g id="edge1" class="edge">
<title>start&#45;&gt;explore</title>
<path fill="none" stroke="black" d="M81.29,-19.25C88.71,-19.25 96.54,-19.25 104.23,-19.25"/>
<polygon fill="black" stroke="black" points="104.18,-22.75 114.18,-19.25 104.18,-15.75 104.18,-22.75"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="270.78,-38.5 232.28,-38.5 232.28,0 270.78,0 270.78,-38.5"/>
<polyline fill="none" stroke="black" points="244.28,-38.5 232.28,-26.5"/>
<polyline fill="none" stroke="black" points="232.28,-12 244.28,0"/>
<polyline fill="none" stroke="black" points="258.78,0 270.78,-12"/>
<polyline fill="none" stroke="black" points="270.78,-26.5 258.78,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="251.53" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- explore&#45;&gt;exit -->
<g id="edge2" class="edge">
<title>explore&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M196.78,-19.25C204.86,-19.25 213.24,-19.25 220.91,-19.25"/>
<polygon fill="black" stroke="black" points="220.71,-22.75 230.71,-19.25 220.71,-15.75 220.71,-22.75"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
demo/03-subagent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

51
demo/03-subagent.svg Normal file
View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: SubAgent Pages: 1 -->
<svg width="288pt" height="47pt"
viewBox="0.00 0.00 288.00 47.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 42.5)">
<title>SubAgent</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-42.5 284,-42.5 284,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-37.25 0,-19.25 40.05,-1.25 80.1,-19.25 40.05,-37.25"/>
<polyline fill="none" stroke="black" points="10.95,-24.17 10.95,-14.33"/>
<polyline fill="none" stroke="black" points="29.11,-6.17 51,-6.17"/>
<polyline fill="none" stroke="black" points="69.16,-14.33 69.16,-24.17"/>
<polyline fill="none" stroke="black" points="51,-32.33 29.11,-32.33"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-14.2" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- research -->
<g id="node3" class="node">
<title>research</title>
<ellipse fill="none" stroke="black" cx="160.8" cy="-19.25" rx="44.7" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="160.8" y="-14.2" font-family="Times,serif" font-size="14.00">Research</text>
</g>
<!-- start&#45;&gt;research -->
<g id="edge1" class="edge">
<title>start&#45;&gt;research</title>
<path fill="none" stroke="black" d="M81.25,-19.25C88.76,-19.25 96.72,-19.25 104.58,-19.25"/>
<polygon fill="black" stroke="black" points="104.46,-22.75 114.46,-19.25 104.46,-15.75 104.46,-22.75"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="280,-38.5 241.5,-38.5 241.5,0 280,0 280,-38.5"/>
<polyline fill="none" stroke="black" points="253.5,-38.5 241.5,-26.5"/>
<polyline fill="none" stroke="black" points="241.5,-12 253.5,0"/>
<polyline fill="none" stroke="black" points="268,0 280,-12"/>
<polyline fill="none" stroke="black" points="280,-26.5 268,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="260.75" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- research&#45;&gt;exit -->
<g id="edge2" class="edge">
<title>research&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M205.9,-19.25C213.94,-19.25 222.15,-19.25 229.66,-19.25"/>
<polygon fill="black" stroke="black" points="229.6,-22.75 239.6,-19.25 229.6,-15.75 229.6,-22.75"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
demo/04-pipeline.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

75
demo/04-pipeline.svg Normal file
View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: Pipeline Pages: 1 -->
<svg width="579pt" height="47pt"
viewBox="0.00 0.00 579.00 47.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 42.5)">
<title>Pipeline</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-42.5 574.62,-42.5 574.62,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-37.25 0,-19.25 40.05,-1.25 80.1,-19.25 40.05,-37.25"/>
<polyline fill="none" stroke="black" points="10.95,-24.17 10.95,-14.33"/>
<polyline fill="none" stroke="black" points="29.11,-6.17 51,-6.17"/>
<polyline fill="none" stroke="black" points="69.16,-14.33 69.16,-24.17"/>
<polyline fill="none" stroke="black" points="51,-32.33 29.11,-32.33"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-14.2" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- scan -->
<g id="node3" class="node">
<title>scan</title>
<polygon fill="none" stroke="black" points="260.68,-37.25 145.68,-37.25 116.1,-1.25 231.1,-1.25 260.68,-37.25"/>
<text xml:space="preserve" text-anchor="middle" x="188.39" y="-14.2" font-family="Times,serif" font-size="14.00">Scan Files</text>
</g>
<!-- start&#45;&gt;scan -->
<g id="edge1" class="edge">
<title>start&#45;&gt;scan</title>
<path fill="none" stroke="black" d="M81.04,-19.25C92.82,-19.25 106.06,-19.25 119.09,-19.25"/>
<polygon fill="black" stroke="black" points="118.93,-22.75 128.93,-19.25 118.93,-15.75 118.93,-22.75"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="570.62,-38.5 532.12,-38.5 532.12,0 570.62,0 570.62,-38.5"/>
<polyline fill="none" stroke="black" points="544.12,-38.5 532.12,-26.5"/>
<polyline fill="none" stroke="black" points="532.12,-12 544.12,0"/>
<polyline fill="none" stroke="black" points="558.62,0 570.62,-12"/>
<polyline fill="none" stroke="black" points="570.62,-26.5 558.62,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="551.37" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- analyze -->
<g id="node4" class="node">
<title>analyze</title>
<ellipse fill="none" stroke="black" cx="338.31" cy="-19.25" rx="41.63" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="338.31" y="-14.2" font-family="Times,serif" font-size="14.00">Analyze</text>
</g>
<!-- scan&#45;&gt;analyze -->
<g id="edge2" class="edge">
<title>scan&#45;&gt;analyze</title>
<path fill="none" stroke="black" d="M246.16,-19.25C259.01,-19.25 272.59,-19.25 285.23,-19.25"/>
<polygon fill="black" stroke="black" points="285.02,-22.75 295.02,-19.25 285.02,-15.75 285.02,-22.75"/>
</g>
<!-- suggest -->
<g id="node5" class="node">
<title>suggest</title>
<ellipse fill="none" stroke="black" cx="456.03" cy="-19.25" rx="40.09" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="456.03" y="-14.2" font-family="Times,serif" font-size="14.00">Suggest</text>
</g>
<!-- analyze&#45;&gt;suggest -->
<g id="edge3" class="edge">
<title>analyze&#45;&gt;suggest</title>
<path fill="none" stroke="black" d="M380.43,-19.25C388.11,-19.25 396.23,-19.25 404.16,-19.25"/>
<polygon fill="black" stroke="black" points="404.07,-22.75 414.07,-19.25 404.07,-15.75 404.07,-22.75"/>
</g>
<!-- suggest&#45;&gt;exit -->
<g id="edge4" class="edge">
<title>suggest&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M496.61,-19.25C504.7,-19.25 513.07,-19.25 520.74,-19.25"/>
<polygon fill="black" stroke="black" points="520.54,-22.75 530.54,-19.25 520.54,-15.75 520.54,-22.75"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
demo/05-branch-loop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

95
demo/05-branch-loop.svg Normal file
View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: BranchLoop Pages: 1 -->
<svg width="796pt" height="86pt"
viewBox="0.00 0.00 796.00 86.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 82.25)">
<title>BranchLoop</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-82.25 792.37,-82.25 792.37,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-37.25 0,-19.25 40.05,-1.25 80.1,-19.25 40.05,-37.25"/>
<polyline fill="none" stroke="black" points="10.95,-24.17 10.95,-14.33"/>
<polyline fill="none" stroke="black" points="29.11,-6.17 51,-6.17"/>
<polyline fill="none" stroke="black" points="69.16,-14.33 69.16,-24.17"/>
<polyline fill="none" stroke="black" points="51,-32.33 29.11,-32.33"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-14.2" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- plan -->
<g id="node3" class="node">
<title>plan</title>
<ellipse fill="none" stroke="black" cx="144.4" cy="-19.25" rx="27.3" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="144.4" y="-14.2" font-family="Times,serif" font-size="14.00">Plan</text>
</g>
<!-- start&#45;&gt;plan -->
<g id="edge1" class="edge">
<title>start&#45;&gt;plan</title>
<path fill="none" stroke="black" d="M81.21,-19.25C89.26,-19.25 97.69,-19.25 105.66,-19.25"/>
<polygon fill="black" stroke="black" points="105.38,-22.75 115.38,-19.25 105.38,-15.75 105.38,-22.75"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="788.37,-38.5 749.87,-38.5 749.87,0 788.37,0 788.37,-38.5"/>
<polyline fill="none" stroke="black" points="761.87,-38.5 749.87,-26.5"/>
<polyline fill="none" stroke="black" points="749.87,-12 761.87,0"/>
<polyline fill="none" stroke="black" points="776.37,0 788.37,-12"/>
<polyline fill="none" stroke="black" points="788.37,-26.5 776.37,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="769.12" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- implement -->
<g id="node4" class="node">
<title>implement</title>
<ellipse fill="none" stroke="black" cx="260.56" cy="-19.25" rx="51.86" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="260.56" y="-14.2" font-family="Times,serif" font-size="14.00">Implement</text>
</g>
<!-- plan&#45;&gt;implement -->
<g id="edge2" class="edge">
<title>plan&#45;&gt;implement</title>
<path fill="none" stroke="black" d="M172.16,-19.25C179.68,-19.25 188.18,-19.25 196.86,-19.25"/>
<polygon fill="black" stroke="black" points="196.78,-22.75 206.78,-19.25 196.78,-15.75 196.78,-22.75"/>
</g>
<!-- validate -->
<g id="node5" class="node">
<title>validate</title>
<polygon fill="none" stroke="black" points="469.99,-78.25 374.09,-78.25 349.42,-42.25 445.32,-42.25 469.99,-78.25"/>
<text xml:space="preserve" text-anchor="middle" x="409.7" y="-55.2" font-family="Times,serif" font-size="14.00">Validate</text>
</g>
<!-- implement&#45;&gt;validate -->
<g id="edge3" class="edge">
<title>implement&#45;&gt;validate</title>
<path fill="none" stroke="black" d="M301.77,-30.45C313.4,-33.69 326.45,-37.33 339.32,-40.92"/>
<polygon fill="black" stroke="black" points="338.03,-44.19 348.6,-43.5 339.91,-37.45 338.03,-44.19"/>
</g>
<!-- gate -->
<g id="node6" class="node">
<title>gate</title>
<polygon fill="none" stroke="black" points="598.43,-37.25 506.99,-19.25 598.43,-1.25 689.87,-19.25 598.43,-37.25"/>
<text xml:space="preserve" text-anchor="middle" x="598.43" y="-14.2" font-family="Times,serif" font-size="14.00">Tests passing?</text>
</g>
<!-- validate&#45;&gt;gate -->
<g id="edge4" class="edge">
<title>validate&#45;&gt;gate</title>
<path fill="none" stroke="black" d="M451.68,-51.25C478.31,-45.4 513.35,-37.71 542.4,-31.33"/>
<polygon fill="black" stroke="black" points="543.12,-34.76 552.14,-29.19 541.62,-27.92 543.12,-34.76"/>
</g>
<!-- gate&#45;&gt;exit -->
<g id="edge5" class="edge">
<title>gate&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M692.16,-19.25C708.93,-19.25 725.24,-19.25 738.43,-19.25"/>
<polygon fill="black" stroke="black" points="738.07,-22.75 748.07,-19.25 738.07,-15.75 738.07,-22.75"/>
<text xml:space="preserve" text-anchor="middle" x="719.87" y="-22.45" font-family="Times,serif" font-size="14.00">Pass</text>
</g>
<!-- gate&#45;&gt;implement -->
<g id="edge6" class="edge">
<title>gate&#45;&gt;implement</title>
<path fill="none" stroke="black" d="M514.14,-17.38C499.43,-17.12 484.26,-16.89 469.99,-16.75 416.4,-16.22 403,-15.99 349.42,-16.75 341.24,-16.87 332.63,-17.04 324.13,-17.25"/>
<polygon fill="black" stroke="black" points="324.08,-13.75 314.17,-17.51 324.26,-20.75 324.08,-13.75"/>
<text xml:space="preserve" text-anchor="middle" x="409.7" y="-19.95" font-family="Times,serif" font-size="14.00">Fix</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5 KiB

BIN
demo/06-parallel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

127
demo/06-parallel.svg Normal file
View file

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: Parallel Pages: 1 -->
<svg width="857pt" height="152pt"
viewBox="0.00 0.00 857.00 152.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 148)">
<title>Parallel</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-148 852.88,-148 852.88,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-90 0,-72 40.05,-54 80.1,-72 40.05,-90"/>
<polyline fill="none" stroke="black" points="10.95,-76.92 10.95,-67.08"/>
<polyline fill="none" stroke="black" points="29.11,-58.92 51,-58.92"/>
<polyline fill="none" stroke="black" points="69.16,-67.08 69.16,-76.92"/>
<polyline fill="none" stroke="black" points="51,-85.08 29.11,-85.08"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-66.95" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- fork -->
<g id="node3" class="node">
<title>fork</title>
<polygon fill="none" stroke="black" points="207.85,-90 116.1,-90 116.1,-86 112.1,-86 112.1,-82 116.1,-82 116.1,-62 112.1,-62 112.1,-58 116.1,-58 116.1,-54 207.85,-54 207.85,-90"/>
<polyline fill="none" stroke="black" points="116.1,-86 120.1,-86 120.1,-82 116.1,-82"/>
<polyline fill="none" stroke="black" points="116.1,-62 120.1,-62 120.1,-58 116.1,-58"/>
<text xml:space="preserve" text-anchor="middle" x="161.98" y="-66.95" font-family="Times,serif" font-size="14.00">Fork Analysis</text>
</g>
<!-- start&#45;&gt;fork -->
<g id="edge1" class="edge">
<title>start&#45;&gt;fork</title>
<path fill="none" stroke="black" d="M81.32,-72C88.72,-72 96.58,-72 104.36,-72"/>
<polygon fill="black" stroke="black" points="104.14,-75.5 114.14,-72 104.14,-68.5 104.14,-75.5"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="848.88,-91.25 810.38,-91.25 810.38,-52.75 848.88,-52.75 848.88,-91.25"/>
<polyline fill="none" stroke="black" points="822.38,-91.25 810.38,-79.25"/>
<polyline fill="none" stroke="black" points="810.38,-64.75 822.38,-52.75"/>
<polyline fill="none" stroke="black" points="836.88,-52.75 848.88,-64.75"/>
<polyline fill="none" stroke="black" points="848.88,-79.25 836.88,-91.25"/>
<text xml:space="preserve" text-anchor="middle" x="829.63" y="-66.95" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- security -->
<g id="node4" class="node">
<title>security</title>
<ellipse fill="none" stroke="black" cx="331.54" cy="-126" rx="64.66" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="331.54" y="-120.95" font-family="Times,serif" font-size="14.00">Security Audit</text>
</g>
<!-- fork&#45;&gt;security -->
<g id="edge2" class="edge">
<title>fork&#45;&gt;security</title>
<path fill="none" stroke="black" d="M208.26,-87.3C219.85,-91.16 232.3,-95.27 243.85,-99 254.21,-102.34 265.28,-105.84 275.93,-109.18"/>
<polygon fill="black" stroke="black" points="274.8,-112.49 285.38,-112.12 276.88,-105.81 274.8,-112.49"/>
</g>
<!-- architecture -->
<g id="node5" class="node">
<title>architecture</title>
<ellipse fill="none" stroke="black" cx="331.54" cy="-72" rx="87.69" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="331.54" y="-66.95" font-family="Times,serif" font-size="14.00">Architecture Review</text>
</g>
<!-- fork&#45;&gt;architecture -->
<g id="edge3" class="edge">
<title>fork&#45;&gt;architecture</title>
<path fill="none" stroke="black" d="M208.32,-72C215.85,-72 223.91,-72 232.16,-72"/>
<polygon fill="black" stroke="black" points="231.99,-75.5 241.99,-72 231.99,-68.5 231.99,-75.5"/>
</g>
<!-- quality -->
<g id="node6" class="node">
<title>quality</title>
<ellipse fill="none" stroke="black" cx="331.54" cy="-18" rx="60.56" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="331.54" y="-12.95" font-family="Times,serif" font-size="14.00">Code Quality</text>
</g>
<!-- fork&#45;&gt;quality -->
<g id="edge4" class="edge">
<title>fork&#45;&gt;quality</title>
<path fill="none" stroke="black" d="M208.26,-56.7C219.85,-52.84 232.3,-48.73 243.85,-45 254.65,-41.52 266.24,-37.85 277.31,-34.39"/>
<polygon fill="black" stroke="black" points="278.21,-37.78 286.71,-31.46 276.12,-31.1 278.21,-37.78"/>
</g>
<!-- merge -->
<g id="node7" class="node">
<title>merge</title>
<polygon fill="none" stroke="black" points="615.39,-64.54 615.39,-79.46 570.82,-90 507.8,-90 463.23,-79.46 463.23,-64.54 507.8,-54 570.82,-54 615.39,-64.54"/>
<polygon fill="none" stroke="black" points="619.39,-61.38 619.39,-82.62 571.29,-94 507.33,-94 459.23,-82.62 459.23,-61.38 507.33,-50 571.29,-50 619.39,-61.38"/>
<polygon fill="none" stroke="black" points="623.39,-58.22 623.39,-85.78 571.76,-98 506.86,-98 455.23,-85.78 455.23,-58.22 506.86,-46 571.76,-46 623.39,-58.22"/>
<text xml:space="preserve" text-anchor="middle" x="539.31" y="-66.95" font-family="Times,serif" font-size="14.00">Merge Findings</text>
</g>
<!-- security&#45;&gt;merge -->
<g id="edge5" class="edge">
<title>security&#45;&gt;merge</title>
<path fill="none" stroke="black" d="M379.75,-113.61C403.42,-107.4 432.72,-99.71 459.67,-92.64"/>
<polygon fill="black" stroke="black" points="460.4,-96.06 469.19,-90.14 458.63,-89.29 460.4,-96.06"/>
</g>
<!-- architecture&#45;&gt;merge -->
<g id="edge6" class="edge">
<title>architecture&#45;&gt;merge</title>
<path fill="none" stroke="black" d="M419.51,-72C427.48,-72 435.59,-72 443.63,-72"/>
<polygon fill="black" stroke="black" points="443.42,-75.5 453.42,-72 443.42,-68.5 443.42,-75.5"/>
</g>
<!-- quality&#45;&gt;merge -->
<g id="edge7" class="edge">
<title>quality&#45;&gt;merge</title>
<path fill="none" stroke="black" d="M377.95,-29.92C401.88,-36.2 431.91,-44.08 459.5,-51.32"/>
<polygon fill="black" stroke="black" points="458.31,-54.62 468.87,-53.78 460.09,-47.85 458.31,-54.62"/>
</g>
<!-- report -->
<g id="node8" class="node">
<title>report</title>
<ellipse fill="none" stroke="black" cx="716.88" cy="-72" rx="57.49" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="716.88" y="-66.95" font-family="Times,serif" font-size="14.00">Final Report</text>
</g>
<!-- merge&#45;&gt;report -->
<g id="edge8" class="edge">
<title>merge&#45;&gt;report</title>
<path fill="none" stroke="black" d="M623.73,-72C631.75,-72 639.83,-72 647.68,-72"/>
<polygon fill="black" stroke="black" points="647.48,-75.5 657.48,-72 647.48,-68.5 647.48,-75.5"/>
</g>
<!-- report&#45;&gt;exit -->
<g id="edge9" class="edge">
<title>report&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M774.55,-72C782.97,-72 791.35,-72 798.91,-72"/>
<polygon fill="black" stroke="black" points="798.85,-75.5 808.85,-72 798.85,-68.5 798.85,-75.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.7 KiB

BIN
demo/07-human-gate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

95
demo/07-human-gate.svg Normal file
View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: HumanGate Pages: 1 -->
<svg width="798pt" height="98pt"
viewBox="0.00 0.00 798.00 98.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 94)">
<title>HumanGate</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-94 793.75,-94 793.75,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-63 0,-45 40.05,-27 80.1,-45 40.05,-63"/>
<polyline fill="none" stroke="black" points="10.95,-49.92 10.95,-40.08"/>
<polyline fill="none" stroke="black" points="29.11,-31.92 51,-31.92"/>
<polyline fill="none" stroke="black" points="69.16,-40.08 69.16,-49.92"/>
<polyline fill="none" stroke="black" points="51,-58.08 29.11,-58.08"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-39.95" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- draft -->
<g id="node3" class="node">
<title>draft</title>
<ellipse fill="none" stroke="black" cx="182.27" cy="-45" rx="65.17" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="182.27" y="-39.95" font-family="Times,serif" font-size="14.00">Draft Proposal</text>
</g>
<!-- start&#45;&gt;draft -->
<g id="edge1" class="edge">
<title>start&#45;&gt;draft</title>
<path fill="none" stroke="black" d="M81.23,-45C88.85,-45 97.06,-45 105.37,-45"/>
<polygon fill="black" stroke="black" points="105.22,-48.5 115.22,-45 105.22,-41.5 105.22,-48.5"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="789.75,-63.25 751.25,-63.25 751.25,-24.75 789.75,-24.75 789.75,-63.25"/>
<polyline fill="none" stroke="black" points="763.25,-63.25 751.25,-51.25"/>
<polyline fill="none" stroke="black" points="751.25,-36.75 763.25,-24.75"/>
<polyline fill="none" stroke="black" points="777.75,-24.75 789.75,-36.75"/>
<polyline fill="none" stroke="black" points="789.75,-51.25 777.75,-63.25"/>
<text xml:space="preserve" text-anchor="middle" x="770.5" y="-38.95" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- approve -->
<g id="node4" class="node">
<title>approve</title>
<polygon fill="none" stroke="black" points="472.77,-45 425.69,-63 331.52,-63 284.44,-45 331.52,-27 425.69,-27 472.77,-45"/>
<text xml:space="preserve" text-anchor="middle" x="378.61" y="-39.95" font-family="Times,serif" font-size="14.00">Approve Changes?</text>
</g>
<!-- draft&#45;&gt;approve -->
<g id="edge2" class="edge">
<title>draft&#45;&gt;approve</title>
<path fill="none" stroke="black" d="M247.71,-45C255.54,-45 263.68,-45 271.91,-45"/>
<polygon fill="black" stroke="black" points="271.64,-48.5 281.64,-45 271.64,-41.5 271.64,-48.5"/>
</g>
<!-- apply -->
<g id="node5" class="node">
<title>apply</title>
<ellipse fill="none" stroke="black" cx="646.01" cy="-72" rx="68.24" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="646.01" y="-66.95" font-family="Times,serif" font-size="14.00">Apply Changes</text>
</g>
<!-- approve&#45;&gt;apply -->
<g id="edge3" class="edge">
<title>approve&#45;&gt;apply</title>
<path fill="none" stroke="black" d="M454.24,-52.59C490.65,-56.3 534.31,-60.74 570.68,-64.44"/>
<polygon fill="black" stroke="black" points="569.9,-67.88 580.2,-65.41 570.61,-60.91 569.9,-67.88"/>
<text xml:space="preserve" text-anchor="middle" x="525.27" y="-66.47" font-family="Times,serif" font-size="14.00">[A] Approve</text>
</g>
<!-- skip -->
<g id="node6" class="node">
<title>skip</title>
<ellipse fill="none" stroke="black" cx="646.01" cy="-18" rx="27.81" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="646.01" y="-12.95" font-family="Times,serif" font-size="14.00">Skip</text>
</g>
<!-- approve&#45;&gt;skip -->
<g id="edge4" class="edge">
<title>approve&#45;&gt;skip</title>
<path fill="none" stroke="black" d="M454.24,-37.41C503.95,-32.35 567.2,-25.92 606.91,-21.88"/>
<polygon fill="black" stroke="black" points="607.09,-25.38 616.69,-20.88 606.39,-18.41 607.09,-25.38"/>
<text xml:space="preserve" text-anchor="middle" x="525.27" y="-36.32" font-family="Times,serif" font-size="14.00">[S] Skip</text>
</g>
<!-- apply&#45;&gt;exit -->
<g id="edge5" class="edge">
<title>apply&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M698.6,-60.21C712.67,-56.99 727.44,-53.61 739.84,-50.78"/>
<polygon fill="black" stroke="black" points="740.45,-54.23 749.42,-48.59 738.89,-47.41 740.45,-54.23"/>
</g>
<!-- skip&#45;&gt;exit -->
<g id="edge6" class="edge">
<title>skip&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M672.99,-23.51C692.59,-27.68 719.52,-33.39 739.95,-37.73"/>
<polygon fill="black" stroke="black" points="739.13,-41.13 749.64,-39.78 740.59,-34.28 739.13,-41.13"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
demo/08-multi-model.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

87
demo/08-multi-model.svg Normal file
View file

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: MultiModel Pages: 1 -->
<svg width="744pt" height="47pt"
viewBox="0.00 0.00 744.00 47.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 42.5)">
<title>MultiModel</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-42.5 740.03,-42.5 740.03,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-37.25 0,-19.25 40.05,-1.25 80.1,-19.25 40.05,-37.25"/>
<polyline fill="none" stroke="black" points="10.95,-24.17 10.95,-14.33"/>
<polyline fill="none" stroke="black" points="29.11,-6.17 51,-6.17"/>
<polyline fill="none" stroke="black" points="69.16,-14.33 69.16,-24.17"/>
<polyline fill="none" stroke="black" points="51,-32.33 29.11,-32.33"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-14.2" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- spec -->
<g id="node3" class="node">
<title>spec</title>
<ellipse fill="none" stroke="black" cx="168.48" cy="-19.25" rx="52.38" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="168.48" y="-14.2" font-family="Times,serif" font-size="14.00">Write Spec</text>
</g>
<!-- start&#45;&gt;spec -->
<g id="edge1" class="edge">
<title>start&#45;&gt;spec</title>
<path fill="none" stroke="black" d="M81.05,-19.25C88.44,-19.25 96.32,-19.25 104.2,-19.25"/>
<polygon fill="black" stroke="black" points="104.18,-22.75 114.18,-19.25 104.18,-15.75 104.18,-22.75"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="736.03,-38.5 697.53,-38.5 697.53,0 736.03,0 736.03,-38.5"/>
<polyline fill="none" stroke="black" points="709.53,-38.5 697.53,-26.5"/>
<polyline fill="none" stroke="black" points="697.53,-12 709.53,0"/>
<polyline fill="none" stroke="black" points="724.03,0 736.03,-12"/>
<polyline fill="none" stroke="black" points="736.03,-26.5 724.03,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="716.78" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- implement -->
<g id="node4" class="node coding">
<title>implement</title>
<ellipse fill="none" stroke="black" cx="308.71" cy="-19.25" rx="51.86" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="308.71" y="-14.2" font-family="Times,serif" font-size="14.00">Implement</text>
</g>
<!-- spec&#45;&gt;implement -->
<g id="edge2" class="edge">
<title>spec&#45;&gt;implement</title>
<path fill="none" stroke="black" d="M221.34,-19.25C229.07,-19.25 237.09,-19.25 245.01,-19.25"/>
<polygon fill="black" stroke="black" points="244.96,-22.75 254.96,-19.25 244.96,-15.75 244.96,-22.75"/>
</g>
<!-- test -->
<g id="node5" class="node coding">
<title>test</title>
<ellipse fill="none" stroke="black" cx="449.98" cy="-19.25" rx="53.4" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="449.98" y="-14.2" font-family="Times,serif" font-size="14.00">Write Tests</text>
</g>
<!-- implement&#45;&gt;test -->
<g id="edge3" class="edge">
<title>implement&#45;&gt;test</title>
<path fill="none" stroke="black" d="M360.78,-19.25C368.69,-19.25 376.95,-19.25 385.11,-19.25"/>
<polygon fill="black" stroke="black" points="385,-22.75 395,-19.25 385,-15.75 385,-22.75"/>
</g>
<!-- review -->
<g id="node6" class="node">
<title>review</title>
<ellipse fill="none" stroke="black" cx="600.45" cy="-19.25" rx="61.08" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="600.45" y="-14.2" font-family="Times,serif" font-size="14.00">Code Review</text>
</g>
<!-- test&#45;&gt;review -->
<g id="edge4" class="edge">
<title>test&#45;&gt;review</title>
<path fill="none" stroke="black" d="M503.74,-19.25C511.5,-19.25 519.61,-19.25 527.67,-19.25"/>
<polygon fill="black" stroke="black" points="527.5,-22.75 537.5,-19.25 527.5,-15.75 527.5,-22.75"/>
</g>
<!-- review&#45;&gt;exit -->
<g id="edge5" class="edge">
<title>review&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M661.96,-19.25C670.3,-19.25 678.54,-19.25 685.97,-19.25"/>
<polygon fill="black" stroke="black" points="685.72,-22.75 695.72,-19.25 685.72,-15.75 685.72,-22.75"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

11
demo/09-simplify.dot Normal file
View file

@ -0,0 +1,11 @@
digraph Simplify {
graph [goal="Review and simplify recent code changes"]
rankdir=LR
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
simplify [label="Simplify", prompt="@docs-internal/prompts/simplify.md"]
start -> simplify -> exit
}

BIN
demo/09-simplify.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

51
demo/09-simplify.svg Normal file
View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: Simplify Pages: 1 -->
<svg width="286pt" height="47pt"
viewBox="0.00 0.00 286.00 47.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 42.5)">
<title>Simplify</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-42.5 281.95,-42.5 281.95,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-37.25 0,-19.25 40.05,-1.25 80.1,-19.25 40.05,-37.25"/>
<polyline fill="none" stroke="black" points="10.95,-24.17 10.95,-14.33"/>
<polyline fill="none" stroke="black" points="29.11,-6.17 51,-6.17"/>
<polyline fill="none" stroke="black" points="69.16,-14.33 69.16,-24.17"/>
<polyline fill="none" stroke="black" points="51,-32.33 29.11,-32.33"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-14.2" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- simplify -->
<g id="node3" class="node">
<title>simplify</title>
<ellipse fill="none" stroke="black" cx="159.78" cy="-19.25" rx="43.67" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="159.78" y="-14.2" font-family="Times,serif" font-size="14.00">Simplify</text>
</g>
<!-- start&#45;&gt;simplify -->
<g id="edge1" class="edge">
<title>start&#45;&gt;simplify</title>
<path fill="none" stroke="black" d="M81.24,-19.25C88.75,-19.25 96.73,-19.25 104.59,-19.25"/>
<polygon fill="black" stroke="black" points="104.44,-22.75 114.44,-19.25 104.44,-15.75 104.44,-22.75"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="277.95,-38.5 239.45,-38.5 239.45,0 277.95,0 277.95,-38.5"/>
<polyline fill="none" stroke="black" points="251.45,-38.5 239.45,-26.5"/>
<polyline fill="none" stroke="black" points="239.45,-12 251.45,0"/>
<polyline fill="none" stroke="black" points="265.95,0 277.95,-12"/>
<polyline fill="none" stroke="black" points="277.95,-26.5 265.95,-38.5"/>
<text xml:space="preserve" text-anchor="middle" x="258.7" y="-14.2" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- simplify&#45;&gt;exit -->
<g id="edge2" class="edge">
<title>simplify&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M203.85,-19.25C211.85,-19.25 220.05,-19.25 227.56,-19.25"/>
<polygon fill="black" stroke="black" points="227.51,-22.75 237.51,-19.25 227.51,-15.75 227.51,-22.75"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View file

@ -0,0 +1,17 @@
digraph PlanImplement {
graph [goal="Plan, approve, implement, and simplify a change"]
rankdir=LR
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
plan [label="Plan", prompt="Analyze the goal and codebase. Write a clear, step-by-step implementation plan to a Markdown file called plan.md. Include what files will change and why.", reasoning_effort="high"]
approve [shape=hexagon, label="Approve Plan"]
implement [label="Implement", prompt="Read plan.md and implement every step. Make all the code changes described in the plan."]
simplify [label="Simplify", prompt="@docs-internal/prompts/simplify.md"]
start -> plan -> approve
approve -> implement [label="[A] Approve"]
approve -> plan [label="[R] Revise"]
implement -> simplify -> exit
}

BIN
demo/10-plan-implement.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: PlanImplement Pages: 1 -->
<svg width="826pt" height="49pt"
viewBox="0.00 0.00 826.00 49.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 45.07)">
<title>PlanImplement</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-45.07 822.18,-45.07 822.18,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-39.82 0,-21.82 40.05,-3.82 80.1,-21.82 40.05,-39.82"/>
<polyline fill="none" stroke="black" points="10.95,-26.74 10.95,-16.9"/>
<polyline fill="none" stroke="black" points="29.11,-8.74 51,-8.74"/>
<polyline fill="none" stroke="black" points="69.16,-16.9 69.16,-26.74"/>
<polyline fill="none" stroke="black" points="51,-34.9 29.11,-34.9"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-16.77" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- plan -->
<g id="node3" class="node">
<title>plan</title>
<ellipse fill="none" stroke="black" cx="144.4" cy="-21.82" rx="27.3" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="144.4" y="-16.77" font-family="Times,serif" font-size="14.00">Plan</text>
</g>
<!-- start&#45;&gt;plan -->
<g id="edge1" class="edge">
<title>start&#45;&gt;plan</title>
<path fill="none" stroke="black" d="M81.21,-21.82C89.26,-21.82 97.69,-21.82 105.66,-21.82"/>
<polygon fill="black" stroke="black" points="105.38,-25.32 115.38,-21.82 105.38,-18.32 105.38,-25.32"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="818.18,-41.07 779.68,-41.07 779.68,-2.57 818.18,-2.57 818.18,-41.07"/>
<polyline fill="none" stroke="black" points="791.68,-41.07 779.68,-29.07"/>
<polyline fill="none" stroke="black" points="779.68,-14.57 791.68,-2.57"/>
<polyline fill="none" stroke="black" points="806.18,-2.57 818.18,-14.57"/>
<polyline fill="none" stroke="black" points="818.18,-29.07 806.18,-41.07"/>
<text xml:space="preserve" text-anchor="middle" x="798.93" y="-16.77" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- approve -->
<g id="node4" class="node">
<title>approve</title>
<polygon fill="none" stroke="black" points="409.61,-21.82 373.75,-39.82 302.05,-39.82 266.19,-21.82 302.05,-3.82 373.75,-3.82 409.61,-21.82"/>
<text xml:space="preserve" text-anchor="middle" x="337.9" y="-16.77" font-family="Times,serif" font-size="14.00">Approve Plan</text>
</g>
<!-- plan&#45;&gt;approve -->
<g id="edge2" class="edge">
<title>plan&#45;&gt;approve</title>
<path fill="none" stroke="black" d="M172.09,-23.22C177.89,-23.47 184,-23.69 189.69,-23.82 211.78,-24.32 235.73,-24.25 257.77,-23.95"/>
<polygon fill="black" stroke="black" points="257.65,-27.45 267.59,-23.79 257.54,-20.45 257.65,-27.45"/>
</g>
<!-- approve&#45;&gt;plan -->
<g id="edge4" class="edge">
<title>approve&#45;&gt;plan</title>
<path fill="none" stroke="black" d="M291.53,-8.6C262.28,-1.92 223.54,3.46 189.69,-3.32 185.53,-4.16 181.26,-5.39 177.1,-6.84"/>
<polygon fill="black" stroke="black" points="175.92,-3.54 167.89,-10.46 178.48,-10.06 175.92,-3.54"/>
<text xml:space="preserve" text-anchor="middle" x="218.94" y="-6.52" font-family="Times,serif" font-size="14.00">[R] Revise</text>
</g>
<!-- implement -->
<g id="node5" class="node">
<title>implement</title>
<ellipse fill="none" stroke="black" cx="566.47" cy="-21.82" rx="51.86" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="566.47" y="-16.77" font-family="Times,serif" font-size="14.00">Implement</text>
</g>
<!-- approve&#45;&gt;implement -->
<g id="edge3" class="edge">
<title>approve&#45;&gt;implement</title>
<path fill="none" stroke="black" d="M410.59,-21.82C440.21,-21.82 474.25,-21.82 502.85,-21.82"/>
<polygon fill="black" stroke="black" points="502.83,-25.32 512.83,-21.82 502.83,-18.32 502.83,-25.32"/>
<text xml:space="preserve" text-anchor="middle" x="462.11" y="-25.02" font-family="Times,serif" font-size="14.00">[A] Approve</text>
</g>
<!-- simplify -->
<g id="node6" class="node">
<title>simplify</title>
<ellipse fill="none" stroke="black" cx="699.01" cy="-21.82" rx="43.67" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="699.01" y="-16.77" font-family="Times,serif" font-size="14.00">Simplify</text>
</g>
<!-- implement&#45;&gt;simplify -->
<g id="edge5" class="edge">
<title>implement&#45;&gt;simplify</title>
<path fill="none" stroke="black" d="M618.69,-21.82C626.84,-21.82 635.31,-21.82 643.53,-21.82"/>
<polygon fill="black" stroke="black" points="643.44,-25.32 653.44,-21.82 643.44,-18.32 643.44,-25.32"/>
</g>
<!-- simplify&#45;&gt;exit -->
<g id="edge6" class="edge">
<title>simplify&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M742.96,-21.82C751.42,-21.82 760.13,-21.82 768.05,-21.82"/>
<polygon fill="black" stroke="black" points="767.81,-25.32 777.81,-21.82 767.81,-18.32 767.81,-25.32"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5 KiB

37
demo/11-ensemble.dot Normal file
View file

@ -0,0 +1,37 @@
digraph Ensemble {
graph [
goal="Get independent opinions from multiple providers, then synthesize",
model_stylesheet="
#opus { llm_model: claude-opus-4-6; llm_provider: anthropic; }
#gemini { llm_model: gemini-3.1-pro-preview; llm_provider: gemini; }
#codex { llm_model: gpt-5.3-codex; llm_provider: openai; }
#mercury { llm_model: mercury-2; llm_provider: inception; }
#synth { llm_model: claude-opus-4-6; llm_provider: anthropic; reasoning_effort: high; }
"
]
rankdir=LR
start [shape=Mdiamond, label="Start"]
exit [shape=Msquare, label="Exit"]
fork [label="Fan Out", shape=component, join_policy="wait_all", error_policy="continue"]
opus [label="Opus", prompt="Analyze the goal. Provide your independent assessment, recommendations, and any code or prose needed. Be thorough.", codergen_mode="one_shot"]
gemini [label="Gemini", prompt="Analyze the goal. Provide your independent assessment, recommendations, and any code or prose needed. Be thorough.", codergen_mode="one_shot"]
codex [label="Codex", prompt="Analyze the goal. Provide your independent assessment, recommendations, and any code or prose needed. Be thorough.", codergen_mode="one_shot"]
mercury [label="Mercury", prompt="Analyze the goal. Provide your independent assessment, recommendations, and any code or prose needed. Be thorough.", codergen_mode="one_shot"]
merge [label="Merge", shape=tripleoctagon]
synth [label="Synthesize", prompt="You have received independent analyses from four different models (Opus, Gemini, Codex, Mercury). Compare their perspectives: identify consensus, highlight disagreements, and synthesize the strongest ideas into a single coherent recommendation. Note where models agreed and where they diverged.", codergen_mode="one_shot"]
start -> fork
fork -> opus
fork -> gemini
fork -> codex
fork -> mercury
opus -> merge
gemini -> merge
codex -> merge
mercury -> merge
merge -> synth -> exit
}

BIN
demo/11-ensemble.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

145
demo/11-ensemble.svg Normal file
View file

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (20260124.0452)
-->
<!-- Title: Ensemble Pages: 1 -->
<svg width="648pt" height="206pt"
viewBox="0.00 0.00 648.00 206.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 202)">
<title>Ensemble</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-202 643.67,-202 643.67,4 -4,4"/>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<polygon fill="none" stroke="black" points="40.05,-117 0,-99 40.05,-81 80.1,-99 40.05,-117"/>
<polyline fill="none" stroke="black" points="10.95,-103.92 10.95,-94.08"/>
<polyline fill="none" stroke="black" points="29.11,-85.92 51,-85.92"/>
<polyline fill="none" stroke="black" points="69.16,-94.08 69.16,-103.92"/>
<polyline fill="none" stroke="black" points="51,-112.08 29.11,-112.08"/>
<text xml:space="preserve" text-anchor="middle" x="40.05" y="-93.95" font-family="Times,serif" font-size="14.00">Start</text>
</g>
<!-- fork -->
<g id="node3" class="node">
<title>fork</title>
<polygon fill="none" stroke="black" points="176.35,-117 116.1,-117 116.1,-113 112.1,-113 112.1,-109 116.1,-109 116.1,-89 112.1,-89 112.1,-85 116.1,-85 116.1,-81 176.35,-81 176.35,-117"/>
<polyline fill="none" stroke="black" points="116.1,-113 120.1,-113 120.1,-109 116.1,-109"/>
<polyline fill="none" stroke="black" points="116.1,-89 120.1,-89 120.1,-85 116.1,-85"/>
<text xml:space="preserve" text-anchor="middle" x="146.23" y="-93.95" font-family="Times,serif" font-size="14.00">Fan Out</text>
</g>
<!-- start&#45;&gt;fork -->
<g id="edge1" class="edge">
<title>start&#45;&gt;fork</title>
<path fill="none" stroke="black" d="M81.03,-99C88.73,-99 96.8,-99 104.52,-99"/>
<polygon fill="black" stroke="black" points="104.36,-102.5 114.36,-99 104.36,-95.5 104.36,-102.5"/>
</g>
<!-- exit -->
<g id="node2" class="node">
<title>exit</title>
<polygon fill="none" stroke="black" points="639.67,-118.25 601.17,-118.25 601.17,-79.75 639.67,-79.75 639.67,-118.25"/>
<polyline fill="none" stroke="black" points="613.17,-118.25 601.17,-106.25"/>
<polyline fill="none" stroke="black" points="601.17,-91.75 613.17,-79.75"/>
<polyline fill="none" stroke="black" points="627.67,-79.75 639.67,-91.75"/>
<polyline fill="none" stroke="black" points="639.67,-106.25 627.67,-118.25"/>
<text xml:space="preserve" text-anchor="middle" x="620.42" y="-93.95" font-family="Times,serif" font-size="14.00">Exit</text>
</g>
<!-- opus -->
<g id="node4" class="node">
<title>opus</title>
<ellipse fill="none" stroke="black" cx="255.51" cy="-180" rx="30.37" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="255.51" y="-174.95" font-family="Times,serif" font-size="14.00">Opus</text>
</g>
<!-- fork&#45;&gt;opus -->
<g id="edge2" class="edge">
<title>fork&#45;&gt;opus</title>
<path fill="none" stroke="black" d="M168.11,-117.43C180.63,-128.2 197.05,-141.82 212.35,-153 216.14,-155.77 220.21,-158.57 224.27,-161.27"/>
<polygon fill="black" stroke="black" points="222.02,-163.99 232.32,-166.49 225.83,-158.11 222.02,-163.99"/>
</g>
<!-- gemini -->
<g id="node5" class="node">
<title>gemini</title>
<ellipse fill="none" stroke="black" cx="255.51" cy="-126" rx="39.07" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="255.51" y="-120.95" font-family="Times,serif" font-size="14.00">Gemini</text>
</g>
<!-- fork&#45;&gt;gemini -->
<g id="edge3" class="edge">
<title>fork&#45;&gt;gemini</title>
<path fill="none" stroke="black" d="M176.83,-106.45C186.97,-109 198.55,-111.92 209.63,-114.7"/>
<polygon fill="black" stroke="black" points="208.44,-118.01 218.99,-117.06 210.15,-111.23 208.44,-118.01"/>
</g>
<!-- codex -->
<g id="node6" class="node">
<title>codex</title>
<ellipse fill="none" stroke="black" cx="255.51" cy="-72" rx="34.97" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="255.51" y="-66.95" font-family="Times,serif" font-size="14.00">Codex</text>
</g>
<!-- fork&#45;&gt;codex -->
<g id="edge4" class="edge">
<title>fork&#45;&gt;codex</title>
<path fill="none" stroke="black" d="M176.83,-91.55C187.83,-88.78 200.52,-85.59 212.43,-82.59"/>
<polygon fill="black" stroke="black" points="213.2,-86.01 222.04,-80.17 211.49,-79.22 213.2,-86.01"/>
</g>
<!-- mercury -->
<g id="node7" class="node">
<title>mercury</title>
<ellipse fill="none" stroke="black" cx="255.51" cy="-18" rx="43.16" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="255.51" y="-12.95" font-family="Times,serif" font-size="14.00">Mercury</text>
</g>
<!-- fork&#45;&gt;mercury -->
<g id="edge5" class="edge">
<title>fork&#45;&gt;mercury</title>
<path fill="none" stroke="black" d="M168.11,-80.57C180.63,-69.8 197.05,-56.18 212.35,-45 214.98,-43.08 217.75,-41.14 220.55,-39.23"/>
<polygon fill="black" stroke="black" points="222.42,-42.19 228.83,-33.76 218.56,-36.35 222.42,-42.19"/>
</g>
<!-- merge -->
<g id="node8" class="node">
<title>merge</title>
<polygon fill="none" stroke="black" points="419.49,-91.54 419.49,-106.46 396.99,-117 365.18,-117 342.68,-106.46 342.68,-91.54 365.18,-81 396.99,-81 419.49,-91.54"/>
<polygon fill="none" stroke="black" points="423.49,-89 423.49,-109 397.89,-121 364.28,-121 338.68,-109 338.68,-89 364.28,-77 397.89,-77 423.49,-89"/>
<polygon fill="none" stroke="black" points="427.49,-86.46 427.49,-111.54 398.78,-125 363.39,-125 334.68,-111.54 334.68,-86.46 363.39,-73 398.78,-73 427.49,-86.46"/>
<text xml:space="preserve" text-anchor="middle" x="381.09" y="-93.95" font-family="Times,serif" font-size="14.00">Merge</text>
</g>
<!-- opus&#45;&gt;merge -->
<g id="edge6" class="edge">
<title>opus&#45;&gt;merge</title>
<path fill="none" stroke="black" d="M277.14,-166.88C284.01,-162.49 291.69,-157.56 298.68,-153 312.4,-144.06 327.35,-134.18 340.65,-125.34"/>
<polygon fill="black" stroke="black" points="342.36,-128.41 348.75,-119.96 338.48,-122.58 342.36,-128.41"/>
</g>
<!-- gemini&#45;&gt;merge -->
<g id="edge7" class="edge">
<title>gemini&#45;&gt;merge</title>
<path fill="none" stroke="black" d="M291.26,-118.41C301.22,-116.23 312.35,-113.8 323.27,-111.41"/>
<polygon fill="black" stroke="black" points="324.02,-114.83 333.04,-109.28 322.52,-107.99 324.02,-114.83"/>
</g>
<!-- codex&#45;&gt;merge -->
<g id="edge8" class="edge">
<title>codex&#45;&gt;merge</title>
<path fill="none" stroke="black" d="M288.34,-78.95C299.07,-81.3 311.39,-83.99 323.45,-86.63"/>
<polygon fill="black" stroke="black" points="322.4,-89.98 332.92,-88.69 323.89,-83.14 322.4,-89.98"/>
</g>
<!-- mercury&#45;&gt;merge -->
<g id="edge9" class="edge">
<title>mercury&#45;&gt;merge</title>
<path fill="none" stroke="black" d="M280.19,-33.07C286.23,-36.94 292.7,-41.11 298.68,-45 312.4,-53.94 327.35,-63.82 340.65,-72.66"/>
<polygon fill="black" stroke="black" points="338.48,-75.42 348.75,-78.04 342.36,-69.59 338.48,-75.42"/>
</g>
<!-- synth -->
<g id="node9" class="node">
<title>synth</title>
<ellipse fill="none" stroke="black" cx="514.33" cy="-99" rx="50.84" ry="18"/>
<text xml:space="preserve" text-anchor="middle" x="514.33" y="-93.95" font-family="Times,serif" font-size="14.00">Synthesize</text>
</g>
<!-- merge&#45;&gt;synth -->
<g id="edge10" class="edge">
<title>merge&#45;&gt;synth</title>
<path fill="none" stroke="black" d="M427.99,-99C435.73,-99 443.87,-99 451.92,-99"/>
<polygon fill="black" stroke="black" points="451.69,-102.5 461.69,-99 451.69,-95.5 451.69,-102.5"/>
</g>
<!-- synth&#45;&gt;exit -->
<g id="edge11" class="edge">
<title>synth&#45;&gt;exit</title>
<path fill="none" stroke="black" d="M565.55,-99C573.77,-99 582.06,-99 589.59,-99"/>
<polygon fill="black" stroke="black" points="589.51,-102.5 599.51,-99 589.51,-95.5 589.51,-102.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB