pwn 0.5.682 → 0.5.684

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -10
  3. data/documentation/Agent-Tool-Registry.md +13 -9
  4. data/documentation/CLI-Drivers.md +27 -28
  5. data/documentation/Configuration.md +7 -5
  6. data/documentation/Contributing.md +2 -2
  7. data/documentation/Cron.md +11 -7
  8. data/documentation/Diagrams.md +2 -2
  9. data/documentation/General-PWN-Usage.md +1 -1
  10. data/documentation/Home.md +7 -6
  11. data/documentation/How-PWN-Works.md +9 -9
  12. data/documentation/Installation.md +1 -1
  13. data/documentation/Persistence.md +2 -1
  14. data/documentation/Plugins.md +3 -3
  15. data/documentation/Reinforcement-Learning.md +103 -101
  16. data/documentation/SAST.md +1 -1
  17. data/documentation/Session-Workflow.md +152 -0
  18. data/documentation/Sessions.md +2 -1
  19. data/documentation/Troubleshooting.md +2 -2
  20. data/documentation/What-is-PWN.md +3 -3
  21. data/documentation/diagrams/agent-tool-registry.svg +152 -152
  22. data/documentation/diagrams/cron-scheduling.svg +141 -121
  23. data/documentation/diagrams/dot/agent-tool-registry.dot +4 -4
  24. data/documentation/diagrams/dot/cron-scheduling.dot +10 -7
  25. data/documentation/diagrams/dot/driver-framework.dot +1 -1
  26. data/documentation/diagrams/dot/overall-pwn-architecture.dot +4 -4
  27. data/documentation/diagrams/dot/persistence-filesystem.dot +1 -1
  28. data/documentation/diagrams/dot/plugin-ecosystem.dot +2 -2
  29. data/documentation/diagrams/dot/task-summarizer.dot +18 -16
  30. data/documentation/diagrams/driver-framework.svg +1 -1
  31. data/documentation/diagrams/overall-pwn-architecture.svg +93 -93
  32. data/documentation/diagrams/persistence-filesystem.svg +4 -4
  33. data/documentation/diagrams/plugin-ecosystem.svg +101 -100
  34. data/documentation/diagrams/task-summarizer.svg +166 -156
  35. data/documentation/pwn-ai-Agent.md +9 -4
  36. data/lib/pwn/ai/agent/dispatch.rb +52 -1
  37. data/lib/pwn/ai/agent/loop.rb +198 -159
  38. data/lib/pwn/ai/agent/open_goal.rb +83 -0
  39. data/lib/pwn/ai/agent/policy.rb +2 -3
  40. data/lib/pwn/ai/agent/prompt_builder.rb +16 -13
  41. data/lib/pwn/ai/agent/registry.rb +6 -9
  42. data/lib/pwn/ai/agent/tools/sessions.rb +32 -0
  43. data/lib/pwn/ai/agent/tools/skills.rb +56 -0
  44. data/lib/pwn/ai/agent.rb +1 -0
  45. data/lib/pwn/ai/anthropic.rb +0 -1
  46. data/lib/pwn/ai/gemini.rb +0 -1
  47. data/lib/pwn/ai/grok.rb +0 -1
  48. data/lib/pwn/ai/ollama.rb +0 -1
  49. data/lib/pwn/ai/open_ai.rb +0 -1
  50. data/lib/pwn/ai/open_web_ui.rb +0 -1
  51. data/lib/pwn/config.rb +2 -2
  52. data/lib/pwn/cron.rb +18 -5
  53. data/lib/pwn/plugins/repl.rb +43 -1
  54. data/lib/pwn/plugins/tty_spinner.rb +109 -13
  55. data/lib/pwn/sessions.rb +82 -0
  56. data/lib/pwn/version.rb +1 -1
  57. data/spec/integration/persistence_roundtrip_spec.rb +2 -1
  58. data/spec/integration/prompt_builder_spec.rb +3 -3
  59. data/spec/integration/reinforced_feedback_loop_spec.rb +6 -11
  60. data/spec/lib/pwn/ai/agent/dispatch_spec.rb +38 -82
  61. data/spec/lib/pwn/ai/agent/loop_spec.rb +284 -11
  62. data/spec/lib/pwn/ai/agent/open_goal_spec.rb +37 -0
  63. data/spec/lib/pwn/ai/agent/prompt_builder_spec.rb +7 -3
  64. data/spec/lib/pwn/ai/agent/registry_spec.rb +16 -9
  65. data/spec/lib/pwn/ai/agent/tools/sessions_spec.rb +5 -0
  66. data/spec/lib/pwn/ai/agent/tools/skills_spec.rb +16 -0
  67. data/spec/lib/pwn/ai/red_team/test_case_engine_spec.rb +20 -0
  68. data/spec/lib/pwn/cron_spec.rb +13 -3
  69. data/spec/lib/pwn/plugins/repl_spec.rb +26 -0
  70. data/spec/lib/pwn/plugins/tty_spinner_spec.rb +44 -0
  71. data/spec/lib/pwn/sessions_spec.rb +29 -0
  72. data/spec/spec_helper.rb +6 -0
  73. data/third_party/pwn_rdoc.jsonl +28 -1
  74. metadata +4 -1
@@ -4,279 +4,289 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_TaskSummarizer Pages: 1 -->
7
- <svg width="1788pt" height="778pt"
8
- viewBox="0.00 0.00 1788.00 778.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
- <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 734.7)">
7
+ <svg width="1807pt" height="754pt"
8
+ viewBox="0.00 0.00 1807.00 754.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
+ <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 710.7)">
10
10
  <title>PWN_TaskSummarizer</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-734.7 1745.2,-734.7 1745.2,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="533" y="-669.5" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::TaskSummarizer &#45; Request kind + executive briefs</text>
13
- <text xml:space="preserve" text-anchor="start" x="613.62" y="-658.05" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">request_kind → (statement|question: no plan) · (autonomous_goal: emit_plan! → about_to → tools)</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-710.7 1764.2,-710.7 1764.2,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="616" y="-645.5" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::TaskSummarizer &#45; executive briefs</text>
13
+ <text xml:space="preserve" text-anchor="start" x="677.12" y="-634.05" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">every request is a goal: emit_plan! then about_to then tools (no request type)</text>
14
14
  <g id="clust2" class="cluster">
15
- <title>cluster_nogoal</title>
16
- <path fill="#4c0519" stroke="#be123c" stroke-width="2" d="M944,-404.5C944,-404.5 1328,-404.5 1328,-404.5 1334,-404.5 1340,-410.5 1340,-416.5 1340,-416.5 1340,-519.5 1340,-519.5 1340,-525.5 1334,-531.5 1328,-531.5 1328,-531.5 944,-531.5 944,-531.5 938,-531.5 932,-525.5 932,-519.5 932,-519.5 932,-416.5 932,-416.5 932,-410.5 938,-404.5 944,-404.5"/>
17
- <text xml:space="preserve" text-anchor="middle" x="1136" y="-508.5" font-family="sans-Serif" font-size="20.00" fill="#fda4af">No multi&#45;step breakdown</text>
15
+ <title>cluster_short</title>
16
+ <path fill="#4c0519" stroke="#be123c" stroke-width="2" d="M932,-397.25C932,-397.25 1323,-397.25 1323,-397.25 1329,-397.25 1335,-403.25 1335,-409.25 1335,-409.25 1335,-499.75 1335,-499.75 1335,-505.75 1329,-511.75 1323,-511.75 1323,-511.75 932,-511.75 932,-511.75 926,-511.75 920,-505.75 920,-499.75 920,-499.75 920,-409.25 920,-409.25 920,-403.25 926,-397.25 932,-397.25"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="1127.5" y="-488.75" font-family="sans-Serif" font-size="20.00" fill="#fda4af">Cheap short&#45;circuits (no tools, no plan)</text>
18
18
  </g>
19
19
  <g id="clust4" class="cluster">
20
20
  <title>cluster_plan</title>
21
- <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M1332,-242.5C1332,-242.5 1682,-242.5 1682,-242.5 1688,-242.5 1694,-248.5 1694,-254.5 1694,-254.5 1694,-384.5 1694,-384.5 1694,-390.5 1688,-396.5 1682,-396.5 1682,-396.5 1332,-396.5 1332,-396.5 1326,-396.5 1320,-390.5 1320,-384.5 1320,-384.5 1320,-254.5 1320,-254.5 1320,-248.5 1326,-242.5 1332,-242.5"/>
22
- <text xml:space="preserve" text-anchor="middle" x="1507" y="-373.5" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Autonomous goal plan (once per turn)</text>
21
+ <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M1351,-242.5C1351,-242.5 1701,-242.5 1701,-242.5 1707,-242.5 1713,-248.5 1713,-254.5 1713,-254.5 1713,-371 1713,-371 1713,-377 1707,-383 1701,-383 1701,-383 1351,-383 1351,-383 1345,-383 1339,-377 1339,-371 1339,-371 1339,-254.5 1339,-254.5 1339,-248.5 1345,-242.5 1351,-242.5"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="1526" y="-360" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Goal plan (once per turn)</text>
23
23
  </g>
24
24
  <g id="clust6" class="cluster">
25
25
  <title>cluster_batch</title>
26
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M20,-404.5C20,-404.5 896,-404.5 896,-404.5 902,-404.5 908,-410.5 908,-416.5 908,-416.5 908,-519.5 908,-519.5 908,-525.5 902,-531.5 896,-531.5 896,-531.5 20,-531.5 20,-531.5 14,-531.5 8,-525.5 8,-519.5 8,-519.5 8,-416.5 8,-416.5 8,-410.5 14,-404.5 20,-404.5"/>
27
- <text xml:space="preserve" text-anchor="middle" x="458" y="-508.5" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Batch layer (each tool collection)</text>
26
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M20,-391C20,-391 884,-391 884,-391 890,-391 896,-397 896,-403 896,-403 896,-506 896,-506 896,-512 890,-518 884,-518 884,-518 20,-518 20,-518 14,-518 8,-512 8,-506 8,-506 8,-403 8,-403 8,-397 14,-391 20,-391"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="452" y="-495" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Batch layer (each tool collection)</text>
28
28
  </g>
29
29
  <g id="clust8" class="cluster">
30
30
  <title>cluster_exec</title>
31
- <path fill="#422006" stroke="#a16207" stroke-width="2" d="M637,-107.5C637,-107.5 1139,-107.5 1139,-107.5 1145,-107.5 1151,-113.5 1151,-119.5 1151,-119.5 1151,-222.5 1151,-222.5 1151,-228.5 1145,-234.5 1139,-234.5 1139,-234.5 637,-234.5 637,-234.5 631,-234.5 625,-228.5 625,-222.5 625,-222.5 625,-119.5 625,-119.5 625,-113.5 631,-107.5 637,-107.5"/>
32
- <text xml:space="preserve" text-anchor="middle" x="888" y="-211.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Execution (not on task row)</text>
31
+ <path fill="#422006" stroke="#a16207" stroke-width="2" d="M590,-107.5C590,-107.5 1158,-107.5 1158,-107.5 1164,-107.5 1170,-113.5 1170,-119.5 1170,-119.5 1170,-222.5 1170,-222.5 1170,-228.5 1164,-234.5 1158,-234.5 1158,-234.5 590,-234.5 590,-234.5 584,-234.5 578,-228.5 578,-222.5 578,-222.5 578,-119.5 578,-119.5 578,-113.5 584,-107.5 590,-107.5"/>
32
+ <text xml:space="preserve" text-anchor="middle" x="874" y="-211.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Execution (not on task row)</text>
33
33
  </g>
34
34
  <!-- User -->
35
35
  <g id="node1" class="node">
36
36
  <title>User</title>
37
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M274.12,-646.25C274.12,-646.25 219.88,-646.25 219.88,-646.25 213.88,-646.25 207.88,-640.25 207.88,-634.25 207.88,-634.25 207.88,-622.25 207.88,-622.25 207.88,-616.25 213.88,-610.25 219.88,-610.25 219.88,-610.25 274.12,-610.25 274.12,-610.25 280.12,-610.25 286.12,-616.25 286.12,-622.25 286.12,-622.25 286.12,-634.25 286.12,-634.25 286.12,-640.25 280.12,-646.25 274.12,-646.25"/>
38
- <text xml:space="preserve" text-anchor="middle" x="247" y="-624.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">User request</text>
37
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M454.12,-622.25C454.12,-622.25 399.88,-622.25 399.88,-622.25 393.88,-622.25 387.88,-616.25 387.88,-610.25 387.88,-610.25 387.88,-598.25 387.88,-598.25 387.88,-592.25 393.88,-586.25 399.88,-586.25 399.88,-586.25 454.12,-586.25 454.12,-586.25 460.12,-586.25 466.12,-592.25 466.12,-598.25 466.12,-598.25 466.12,-610.25 466.12,-610.25 466.12,-616.25 460.12,-622.25 454.12,-622.25"/>
38
+ <text xml:space="preserve" text-anchor="middle" x="427" y="-600.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">User request</text>
39
39
  </g>
40
40
  <!-- Loop -->
41
41
  <g id="node2" class="node">
42
42
  <title>Loop</title>
43
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M526.38,-652.5C526.38,-652.5 377.62,-652.5 377.62,-652.5 371.62,-652.5 365.62,-646.5 365.62,-640.5 365.62,-640.5 365.62,-616 365.62,-616 365.62,-610 371.62,-604 377.62,-604 377.62,-604 526.38,-604 526.38,-604 532.38,-604 538.38,-610 538.38,-616 538.38,-616 538.38,-640.5 538.38,-640.5 538.38,-646.5 532.38,-652.5 526.38,-652.5"/>
44
- <text xml:space="preserve" text-anchor="middle" x="452" y="-638.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Loop.run</text>
45
- <text xml:space="preserve" text-anchor="middle" x="452" y="-624.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">ts_state = TaskSummarizer.fresh</text>
46
- <text xml:space="preserve" text-anchor="middle" x="452" y="-611.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">request_kind + request_intent</text>
43
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M706.38,-628.5C706.38,-628.5 557.62,-628.5 557.62,-628.5 551.62,-628.5 545.62,-622.5 545.62,-616.5 545.62,-616.5 545.62,-592 545.62,-592 545.62,-586 551.62,-580 557.62,-580 557.62,-580 706.38,-580 706.38,-580 712.38,-580 718.38,-586 718.38,-592 718.38,-592 718.38,-616.5 718.38,-616.5 718.38,-622.5 712.38,-628.5 706.38,-628.5"/>
44
+ <text xml:space="preserve" text-anchor="middle" x="632" y="-614.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Loop.run</text>
45
+ <text xml:space="preserve" text-anchor="middle" x="632" y="-600.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">ts_state = TaskSummarizer.fresh</text>
46
+ <text xml:space="preserve" text-anchor="middle" x="632" y="-587.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">request_intent short&#45;circuit only</text>
47
47
  </g>
48
48
  <!-- User&#45;&gt;Loop -->
49
49
  <g id="edge1" class="edge">
50
50
  <title>User&#45;&gt;Loop</title>
51
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M286.64,-628.25C309.22,-628.25 331.81,-628.25 354.39,-628.25"/>
52
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="354.09,-631.05 362.09,-628.25 354.09,-625.45 354.09,-631.05"/>
51
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M466.64,-604.25C489.22,-604.25 511.81,-604.25 534.39,-604.25"/>
52
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="534.09,-607.05 542.09,-604.25 534.09,-601.45 534.09,-607.05"/>
53
53
  </g>
54
54
  <!-- Kind -->
55
55
  <g id="node3" class="node">
56
56
  <title>Kind</title>
57
- <path fill="#fcd34d" stroke="#334155" stroke-width="2" d="M1036.62,-652.5C1036.62,-652.5 853.38,-652.5 853.38,-652.5 847.38,-652.5 841.38,-646.5 841.38,-640.5 841.38,-640.5 841.38,-616 841.38,-616 841.38,-610 847.38,-604 853.38,-604 853.38,-604 1036.62,-604 1036.62,-604 1042.62,-604 1048.62,-610 1048.62,-616 1048.62,-616 1048.62,-640.5 1048.62,-640.5 1048.62,-646.5 1042.62,-652.5 1036.62,-652.5"/>
58
- <text xml:space="preserve" text-anchor="middle" x="945" y="-638.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">request_kind (LLM + heuristic)</text>
59
- <text xml:space="preserve" text-anchor="middle" x="945" y="-624.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">statement | question | autonomous_goal</text>
60
- <text xml:space="preserve" text-anchor="middle" x="945" y="-611.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">host&#45;evidence Qs → goal</text>
57
+ <path fill="#fcd34d" stroke="#334155" stroke-width="2" d="M1207.25,-622.25C1207.25,-622.25 1096.75,-622.25 1096.75,-622.25 1090.75,-622.25 1084.75,-616.25 1084.75,-610.25 1084.75,-610.25 1084.75,-598.25 1084.75,-598.25 1084.75,-592.25 1090.75,-586.25 1096.75,-586.25 1096.75,-586.25 1207.25,-586.25 1207.25,-586.25 1213.25,-586.25 1219.25,-592.25 1219.25,-598.25 1219.25,-598.25 1219.25,-610.25 1219.25,-610.25 1219.25,-616.25 1213.25,-622.25 1207.25,-622.25"/>
58
+ <text xml:space="preserve" text-anchor="middle" x="1152" y="-607.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">no request type</text>
59
+ <text xml:space="preserve" text-anchor="middle" x="1152" y="-593.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">every other turn is a goal</text>
61
60
  </g>
62
61
  <!-- Loop&#45;&gt;Kind -->
63
62
  <g id="edge2" class="edge">
64
63
  <title>Loop&#45;&gt;Kind</title>
65
- <path fill="none" stroke="#fbbf24" stroke-width="2" d="M538.66,-628.25C635.68,-628.25 732.7,-628.25 829.73,-628.25"/>
66
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="2" points="829.61,-631.05 837.61,-628.25 829.61,-625.45 829.61,-631.05"/>
64
+ <path fill="none" stroke="#fbbf24" stroke-width="2" d="M718.84,-604.25C836.96,-604.25 955.08,-604.25 1073.2,-604.25"/>
65
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="2" points="1072.87,-607.05 1080.87,-604.25 1072.87,-601.45 1072.87,-607.05"/>
67
66
  </g>
68
67
  <!-- About -->
69
- <g id="node8" class="node">
68
+ <g id="node9" class="node">
70
69
  <title>About</title>
71
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M134,-461C134,-461 28,-461 28,-461 22,-461 16,-455 16,-449 16,-449 16,-424.5 16,-424.5 16,-418.5 22,-412.5 28,-412.5 28,-412.5 134,-412.5 134,-412.5 140,-412.5 146,-418.5 146,-424.5 146,-424.5 146,-449 146,-449 146,-455 140,-461 134,-461"/>
72
- <text xml:space="preserve" text-anchor="middle" x="81" y="-446.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">about_to(tools:)</text>
73
- <text xml:space="preserve" text-anchor="middle" x="81" y="-433.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">task k/n English primary</text>
74
- <text xml:space="preserve" text-anchor="middle" x="81" y="-419.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">via tools (intent)</text>
70
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M134,-447.5C134,-447.5 28,-447.5 28,-447.5 22,-447.5 16,-441.5 16,-435.5 16,-435.5 16,-411 16,-411 16,-405 22,-399 28,-399 28,-399 134,-399 134,-399 140,-399 146,-405 146,-411 146,-411 146,-435.5 146,-435.5 146,-441.5 140,-447.5 134,-447.5"/>
71
+ <text xml:space="preserve" text-anchor="middle" x="81" y="-433.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">about_to(tools:)</text>
72
+ <text xml:space="preserve" text-anchor="middle" x="81" y="-419.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">task k/n English primary</text>
73
+ <text xml:space="preserve" text-anchor="middle" x="81" y="-406.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">via tools (intent)</text>
75
74
  </g>
76
75
  <!-- Loop&#45;&gt;About -->
77
- <g id="edge8" class="edge">
76
+ <g id="edge9" class="edge">
78
77
  <title>Loop&#45;&gt;About</title>
79
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M374.41,-603.37C324.47,-586.52 259.03,-561.62 205,-531.5 172.46,-513.36 138.95,-487.52 114.98,-467.56"/>
80
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="116.98,-465.58 109.06,-462.57 113.37,-469.86 116.98,-465.58"/>
81
- <text xml:space="preserve" text-anchor="middle" x="307.99" y="-562.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">before each</text>
82
- <text xml:space="preserve" text-anchor="middle" x="307.99" y="-551.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">tool batch</text>
83
- <text xml:space="preserve" text-anchor="middle" x="307.99" y="-541.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(goals only)</text>
78
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M545.29,-588.08C429.59,-567.51 235.64,-531.77 205,-518 170.35,-502.43 136.31,-475.64 112.69,-454.67"/>
79
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="114.68,-452.69 106.86,-449.41 110.92,-456.85 114.68,-452.69"/>
80
+ <text xml:space="preserve" text-anchor="middle" x="341.07" y="-538.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">before each</text>
81
+ <text xml:space="preserve" text-anchor="middle" x="341.07" y="-527.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">tool batch</text>
84
82
  </g>
85
- <!-- Stmt -->
83
+ <!-- Greet -->
86
84
  <g id="node4" class="node">
87
- <title>Stmt</title>
88
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M1320,-454.75C1320,-454.75 1172,-454.75 1172,-454.75 1166,-454.75 1160,-448.75 1160,-442.75 1160,-442.75 1160,-430.75 1160,-430.75 1160,-424.75 1166,-418.75 1172,-418.75 1172,-418.75 1320,-418.75 1320,-418.75 1326,-418.75 1332,-424.75 1332,-430.75 1332,-430.75 1332,-442.75 1332,-442.75 1332,-448.75 1326,-454.75 1320,-454.75"/>
89
- <text xml:space="preserve" text-anchor="middle" x="1246" y="-439.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">statement</text>
90
- <text xml:space="preserve" text-anchor="middle" x="1246" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">answer_statement / greeting ack</text>
85
+ <title>Greet</title>
86
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M1314.5,-441.25C1314.5,-441.25 1253.5,-441.25 1253.5,-441.25 1247.5,-441.25 1241.5,-435.25 1241.5,-429.25 1241.5,-429.25 1241.5,-417.25 1241.5,-417.25 1241.5,-411.25 1247.5,-405.25 1253.5,-405.25 1253.5,-405.25 1314.5,-405.25 1314.5,-405.25 1320.5,-405.25 1326.5,-411.25 1326.5,-417.25 1326.5,-417.25 1326.5,-429.25 1326.5,-429.25 1326.5,-435.25 1320.5,-441.25 1314.5,-441.25"/>
87
+ <text xml:space="preserve" text-anchor="middle" x="1284" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">greeting</text>
88
+ <text xml:space="preserve" text-anchor="middle" x="1284" y="-412.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">fixed short ack</text>
91
89
  </g>
92
- <!-- Kind&#45;&gt;Stmt -->
90
+ <!-- Kind&#45;&gt;Greet -->
93
91
  <g id="edge3" class="edge">
94
- <title>Kind&#45;&gt;Stmt</title>
95
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1004.41,-603.06C1044.25,-585.66 1097.07,-560.26 1140,-531.5 1170.67,-510.95 1201.86,-482.22 1222.39,-462"/>
96
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1224.1,-464.24 1227.8,-456.61 1220.15,-460.27 1224.1,-464.24"/>
97
- <text xml:space="preserve" text-anchor="middle" x="1145.1" y="-551.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">statement</text>
92
+ <title>Kind&#45;&gt;Greet</title>
93
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1167.28,-585.33C1181.59,-568.32 1203.36,-541.89 1221,-518 1237.57,-495.57 1255.17,-469.12 1267.55,-450.05"/>
94
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1269.79,-451.74 1271.77,-443.5 1265.08,-448.7 1269.79,-451.74"/>
95
+ <text xml:space="preserve" text-anchor="middle" x="1230.74" y="-533.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">greeting</text>
98
96
  </g>
99
- <!-- Ques -->
97
+ <!-- HowTo -->
100
98
  <g id="node5" class="node">
101
- <title>Ques</title>
102
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M1107.75,-461C1107.75,-461 952.25,-461 952.25,-461 946.25,-461 940.25,-455 940.25,-449 940.25,-449 940.25,-424.5 940.25,-424.5 940.25,-418.5 946.25,-412.5 952.25,-412.5 952.25,-412.5 1107.75,-412.5 1107.75,-412.5 1113.75,-412.5 1119.75,-418.5 1119.75,-424.5 1119.75,-424.5 1119.75,-449 1119.75,-449 1119.75,-455 1113.75,-461 1107.75,-461"/>
103
- <text xml:space="preserve" text-anchor="middle" x="1030" y="-446.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">question (knowledge/howto/recall)</text>
104
- <text xml:space="preserve" text-anchor="middle" x="1030" y="-433.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">answer_question / howto / recall</text>
105
- <text xml:space="preserve" text-anchor="middle" x="1030" y="-419.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">no tools / no plan</text>
99
+ <title>HowTo</title>
100
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M1050.25,-441.25C1050.25,-441.25 939.75,-441.25 939.75,-441.25 933.75,-441.25 927.75,-435.25 927.75,-429.25 927.75,-429.25 927.75,-417.25 927.75,-417.25 927.75,-411.25 933.75,-405.25 939.75,-405.25 939.75,-405.25 1050.25,-405.25 1050.25,-405.25 1056.25,-405.25 1062.25,-411.25 1062.25,-417.25 1062.25,-417.25 1062.25,-429.25 1062.25,-429.25 1062.25,-435.25 1056.25,-441.25 1050.25,-441.25"/>
101
+ <text xml:space="preserve" text-anchor="middle" x="995" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">howto</text>
102
+ <text xml:space="preserve" text-anchor="middle" x="995" y="-412.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">example commands only</text>
106
103
  </g>
107
- <!-- Kind&#45;&gt;Ques -->
104
+ <!-- Kind&#45;&gt;HowTo -->
108
105
  <g id="edge4" class="edge">
109
- <title>Kind&#45;&gt;Ques</title>
110
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M840.65,-622.44C747.79,-614.58 634.19,-593.91 686.75,-539.5 695.68,-530.25 906,-536.1 918,-531.5 952.04,-518.46 983.17,-490.51 1003.92,-468.5"/>
111
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1005.86,-470.52 1009.21,-462.74 1001.74,-466.73 1005.86,-470.52"/>
112
- <text xml:space="preserve" text-anchor="middle" x="704.38" y="-551.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">question</text>
106
+ <title>Kind&#45;&gt;HowTo</title>
107
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1083.95,-599.71C963.58,-592.74 723.35,-575.4 698.25,-547 692.07,-540.01 691.78,-532.73 698.25,-526 714.27,-509.35 884.95,-527.52 906,-518 937.73,-503.64 963.69,-472.25 979.22,-449.74"/>
108
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="981.45,-451.45 983.56,-443.24 976.79,-448.34 981.45,-451.45"/>
109
+ <text xml:space="preserve" text-anchor="middle" x="710.62" y="-533.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">howto</text>
113
110
  </g>
114
- <!-- Plan -->
111
+ <!-- Recal -->
115
112
  <g id="node6" class="node">
113
+ <title>Recal</title>
114
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M1189.25,-441.25C1189.25,-441.25 1114.75,-441.25 1114.75,-441.25 1108.75,-441.25 1102.75,-435.25 1102.75,-429.25 1102.75,-429.25 1102.75,-417.25 1102.75,-417.25 1102.75,-411.25 1108.75,-405.25 1114.75,-405.25 1114.75,-405.25 1189.25,-405.25 1189.25,-405.25 1195.25,-405.25 1201.25,-411.25 1201.25,-417.25 1201.25,-417.25 1201.25,-429.25 1201.25,-429.25 1201.25,-435.25 1195.25,-441.25 1189.25,-441.25"/>
115
+ <text xml:space="preserve" text-anchor="middle" x="1152" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">recall</text>
116
+ <text xml:space="preserve" text-anchor="middle" x="1152" y="-412.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">prior&#45;turn answer</text>
117
+ </g>
118
+ <!-- Kind&#45;&gt;Recal -->
119
+ <g id="edge5" class="edge">
120
+ <title>Kind&#45;&gt;Recal</title>
121
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1152,-585.43C1152,-553.99 1152,-488.48 1152,-451.39"/>
122
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1154.8,-451.7 1152,-443.7 1149.2,-451.7 1154.8,-451.7"/>
123
+ <text xml:space="preserve" text-anchor="middle" x="1163.25" y="-533.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">recall</text>
124
+ </g>
125
+ <!-- Plan -->
126
+ <g id="node7" class="node">
116
127
  <title>Plan</title>
117
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1464.38,-312.5C1464.38,-312.5 1339.62,-312.5 1339.62,-312.5 1333.62,-312.5 1327.62,-306.5 1327.62,-300.5 1327.62,-300.5 1327.62,-276 1327.62,-276 1327.62,-270 1333.62,-264 1339.62,-264 1339.62,-264 1464.38,-264 1464.38,-264 1470.38,-264 1476.38,-270 1476.38,-276 1476.38,-276 1476.38,-300.5 1476.38,-300.5 1476.38,-306.5 1470.38,-312.5 1464.38,-312.5"/>
118
- <text xml:space="preserve" text-anchor="middle" x="1402" y="-298.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">plan(request)</text>
119
- <text xml:space="preserve" text-anchor="middle" x="1402" y="-284.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">enumerated · LLM · fallback</text>
120
- <text xml:space="preserve" text-anchor="middle" x="1402" y="-271.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">ordered work units</text>
128
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1483.38,-305.75C1483.38,-305.75 1358.62,-305.75 1358.62,-305.75 1352.62,-305.75 1346.62,-299.75 1346.62,-293.75 1346.62,-293.75 1346.62,-269.25 1346.62,-269.25 1346.62,-263.25 1352.62,-257.25 1358.62,-257.25 1358.62,-257.25 1483.38,-257.25 1483.38,-257.25 1489.38,-257.25 1495.38,-263.25 1495.38,-269.25 1495.38,-269.25 1495.38,-293.75 1495.38,-293.75 1495.38,-299.75 1489.38,-305.75 1483.38,-305.75"/>
129
+ <text xml:space="preserve" text-anchor="middle" x="1421" y="-291.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">plan(request)</text>
130
+ <text xml:space="preserve" text-anchor="middle" x="1421" y="-277.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">enumerated · LLM · fallback</text>
131
+ <text xml:space="preserve" text-anchor="middle" x="1421" y="-264.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">ordered work units</text>
121
132
  </g>
122
133
  <!-- Kind&#45;&gt;Plan -->
123
- <g id="edge5" class="edge">
134
+ <g id="edge6" class="edge">
124
135
  <title>Kind&#45;&gt;Plan</title>
125
- <path fill="none" stroke="#a78bfa" stroke-width="2" d="M1049.23,-615.31C1154.93,-601.05 1308.67,-573.7 1350,-531.5 1404.96,-475.39 1407.97,-376.07 1405.18,-323.73"/>
126
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1407.99,-323.83 1404.69,-316.03 1402.41,-324.19 1407.99,-323.83"/>
127
- <text xml:space="preserve" text-anchor="middle" x="1377.33" y="-551.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">autonomous_goal</text>
136
+ <path fill="none" stroke="#a78bfa" stroke-width="2" d="M1219.79,-588.32C1261.18,-575.95 1312.26,-554.33 1345,-518 1396.77,-460.56 1413.31,-367.49 1418.57,-317.27"/>
137
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1421.35,-317.6 1419.32,-309.37 1415.78,-317.07 1421.35,-317.6"/>
138
+ <text xml:space="preserve" text-anchor="middle" x="1345.57" y="-533.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">goal</text>
128
139
  </g>
129
140
  <!-- EmitP -->
130
- <g id="node7" class="node">
141
+ <g id="node8" class="node">
131
142
  <title>EmitP</title>
132
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1674,-326C1674,-326 1568,-326 1568,-326 1562,-326 1556,-320 1556,-314 1556,-314 1556,-262.5 1556,-262.5 1556,-256.5 1562,-250.5 1568,-250.5 1568,-250.5 1674,-250.5 1674,-250.5 1680,-250.5 1686,-256.5 1686,-262.5 1686,-262.5 1686,-314 1686,-314 1686,-320 1680,-326 1674,-326"/>
133
- <text xml:space="preserve" text-anchor="middle" x="1621" y="-311.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">emit_plan!</text>
134
- <text xml:space="preserve" text-anchor="middle" x="1621" y="-298.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Kind: autonomous_goal</text>
135
- <text xml:space="preserve" text-anchor="middle" x="1621" y="-284.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Goal: ...</text>
136
- <text xml:space="preserve" text-anchor="middle" x="1621" y="-271.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Tangible tasks (N):</text>
137
- <text xml:space="preserve" text-anchor="middle" x="1621" y="-257.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a"> &#160;each may use 1+ tools</text>
143
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1693,-312.5C1693,-312.5 1587,-312.5 1587,-312.5 1581,-312.5 1575,-306.5 1575,-300.5 1575,-300.5 1575,-262.5 1575,-262.5 1575,-256.5 1581,-250.5 1587,-250.5 1587,-250.5 1693,-250.5 1693,-250.5 1699,-250.5 1705,-256.5 1705,-262.5 1705,-262.5 1705,-300.5 1705,-300.5 1705,-306.5 1699,-312.5 1693,-312.5"/>
144
+ <text xml:space="preserve" text-anchor="middle" x="1640" y="-298.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">emit_plan!</text>
145
+ <text xml:space="preserve" text-anchor="middle" x="1640" y="-284.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Goal: (original request)</text>
146
+ <text xml:space="preserve" text-anchor="middle" x="1640" y="-271.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Tangible tasks (N):</text>
147
+ <text xml:space="preserve" text-anchor="middle" x="1640" y="-257.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a"> &#160;each may use 1+ tools</text>
138
148
  </g>
139
149
  <!-- Plan&#45;&gt;EmitP -->
140
- <g id="edge6" class="edge">
150
+ <g id="edge7" class="edge">
141
151
  <title>Plan&#45;&gt;EmitP</title>
142
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1476.85,-288.25C1499.68,-288.25 1522.51,-288.25 1545.34,-288.25"/>
143
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1545.15,-291.05 1553.15,-288.25 1545.15,-285.45 1545.15,-291.05"/>
152
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1495.85,-281.5C1518.68,-281.5 1541.51,-281.5 1564.34,-281.5"/>
153
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1564.15,-284.3 1572.15,-281.5 1564.15,-278.7 1564.15,-284.3"/>
144
154
  </g>
145
155
  <!-- UI -->
146
- <g id="node16" class="node">
156
+ <g id="node17" class="node">
147
157
  <title>UI</title>
148
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M1270.5,-48.5C1270.5,-48.5 1137.5,-48.5 1137.5,-48.5 1131.5,-48.5 1125.5,-42.5 1125.5,-36.5 1125.5,-36.5 1125.5,-12 1125.5,-12 1125.5,-6 1131.5,0 1137.5,0 1137.5,0 1270.5,0 1270.5,0 1276.5,0 1282.5,-6 1282.5,-12 1282.5,-12 1282.5,-36.5 1282.5,-36.5 1282.5,-42.5 1276.5,-48.5 1270.5,-48.5"/>
149
- <text xml:space="preserve" text-anchor="middle" x="1204" y="-34.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">REPL on_tool</text>
150
- <text xml:space="preserve" text-anchor="middle" x="1204" y="-20.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">name=&#39;task&#39;, full text, result=&#39;&#39;</text>
151
- <text xml:space="preserve" text-anchor="middle" x="1204" y="-7.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(no truncation)</text>
158
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M1289.5,-48.5C1289.5,-48.5 1156.5,-48.5 1156.5,-48.5 1150.5,-48.5 1144.5,-42.5 1144.5,-36.5 1144.5,-36.5 1144.5,-12 1144.5,-12 1144.5,-6 1150.5,0 1156.5,0 1156.5,0 1289.5,0 1289.5,0 1295.5,0 1301.5,-6 1301.5,-12 1301.5,-12 1301.5,-36.5 1301.5,-36.5 1301.5,-42.5 1295.5,-48.5 1289.5,-48.5"/>
159
+ <text xml:space="preserve" text-anchor="middle" x="1223" y="-34.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">REPL on_tool</text>
160
+ <text xml:space="preserve" text-anchor="middle" x="1223" y="-20.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">name=&#39;task&#39;, full text, result=&#39;&#39;</text>
161
+ <text xml:space="preserve" text-anchor="middle" x="1223" y="-7.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(no truncation)</text>
152
162
  </g>
153
163
  <!-- EmitP&#45;&gt;UI -->
154
- <g id="edge7" class="edge">
164
+ <g id="edge8" class="edge">
155
165
  <title>EmitP&#45;&gt;UI</title>
156
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1561.25,-249.71C1477.5,-197.09 1326.94,-102.49 1250.81,-54.66"/>
157
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="1252.73,-52.56 1244.46,-50.67 1249.75,-57.3 1252.73,-52.56"/>
158
- <text xml:space="preserve" text-anchor="middle" x="1558.3" y="-136.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">full goal once</text>
166
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1589.7,-249.71C1508.83,-200.21 1350.93,-103.56 1271.33,-54.84"/>
167
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="1272.89,-52.51 1264.61,-50.72 1269.97,-57.28 1272.89,-52.51"/>
168
+ <text xml:space="preserve" text-anchor="middle" x="1591.89" y="-136.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">full goal once</text>
159
169
  </g>
160
170
  <!-- FP -->
161
- <g id="node9" class="node">
171
+ <g id="node10" class="node">
162
172
  <title>FP</title>
163
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M304.5,-454.75C304.5,-454.75 237.5,-454.75 237.5,-454.75 231.5,-454.75 225.5,-448.75 225.5,-442.75 225.5,-442.75 225.5,-430.75 225.5,-430.75 225.5,-424.75 231.5,-418.75 237.5,-418.75 237.5,-418.75 304.5,-418.75 304.5,-418.75 310.5,-418.75 316.5,-424.75 316.5,-430.75 316.5,-430.75 316.5,-442.75 316.5,-442.75 316.5,-448.75 310.5,-454.75 304.5,-454.75"/>
164
- <text xml:space="preserve" text-anchor="middle" x="271" y="-439.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">brief_fingerprint</text>
165
- <text xml:space="preserve" text-anchor="middle" x="271" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">last_brief_fp</text>
173
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M304.5,-441.25C304.5,-441.25 237.5,-441.25 237.5,-441.25 231.5,-441.25 225.5,-435.25 225.5,-429.25 225.5,-429.25 225.5,-417.25 225.5,-417.25 225.5,-411.25 231.5,-405.25 237.5,-405.25 237.5,-405.25 304.5,-405.25 304.5,-405.25 310.5,-405.25 316.5,-411.25 316.5,-417.25 316.5,-417.25 316.5,-429.25 316.5,-429.25 316.5,-435.25 310.5,-441.25 304.5,-441.25"/>
174
+ <text xml:space="preserve" text-anchor="middle" x="271" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">brief_fingerprint</text>
175
+ <text xml:space="preserve" text-anchor="middle" x="271" y="-412.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">last_brief_fp</text>
166
176
  </g>
167
177
  <!-- About&#45;&gt;FP -->
168
- <g id="edge9" class="edge">
178
+ <g id="edge10" class="edge">
169
179
  <title>About&#45;&gt;FP</title>
170
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M146.68,-436.75C169.49,-436.75 192.29,-436.75 215.09,-436.75"/>
171
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="214.9,-439.55 222.9,-436.75 214.9,-433.95 214.9,-439.55"/>
180
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M146.68,-423.25C169.49,-423.25 192.29,-423.25 215.09,-423.25"/>
181
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="214.9,-426.05 222.9,-423.25 214.9,-420.45 214.9,-426.05"/>
172
182
  </g>
173
183
  <!-- Dup -->
174
- <g id="node10" class="node">
184
+ <g id="node11" class="node">
175
185
  <title>Dup</title>
176
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M465.29,-452.14C465.29,-452.14 407.83,-439.36 407.83,-439.36 401.97,-438.05 401.97,-435.45 407.83,-434.14 407.83,-434.14 465.29,-421.36 465.29,-421.36 471.14,-420.05 482.86,-420.05 488.71,-421.36 488.71,-421.36 546.17,-434.14 546.17,-434.14 552.03,-435.45 552.03,-438.05 546.17,-439.36 546.17,-439.36 488.71,-452.14 488.71,-452.14 482.86,-453.45 471.14,-453.45 465.29,-452.14"/>
177
- <text xml:space="preserve" text-anchor="middle" x="477" y="-433.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">duplicate_brief?</text>
186
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M465.29,-438.64C465.29,-438.64 407.83,-425.86 407.83,-425.86 401.97,-424.55 401.97,-421.95 407.83,-420.64 407.83,-420.64 465.29,-407.86 465.29,-407.86 471.14,-406.55 482.86,-406.55 488.71,-407.86 488.71,-407.86 546.17,-420.64 546.17,-420.64 552.03,-421.95 552.03,-424.55 546.17,-425.86 546.17,-425.86 488.71,-438.64 488.71,-438.64 482.86,-439.95 471.14,-439.95 465.29,-438.64"/>
187
+ <text xml:space="preserve" text-anchor="middle" x="477" y="-419.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">duplicate_brief?</text>
178
188
  </g>
179
189
  <!-- FP&#45;&gt;Dup -->
180
- <g id="edge10" class="edge">
190
+ <g id="edge11" class="edge">
181
191
  <title>FP&#45;&gt;Dup</title>
182
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M316.87,-436.75C339.03,-436.75 361.18,-436.75 383.34,-436.75"/>
183
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="383.21,-439.55 391.21,-436.75 383.21,-433.95 383.21,-439.55"/>
192
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M316.87,-423.25C339.03,-423.25 361.18,-423.25 383.34,-423.25"/>
193
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="383.21,-426.05 391.21,-423.25 383.21,-420.45 383.21,-426.05"/>
184
194
  </g>
185
195
  <!-- EmitB -->
186
- <g id="node11" class="node">
196
+ <g id="node12" class="node">
187
197
  <title>EmitB</title>
188
- <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M887.88,-461C887.88,-461 802.12,-461 802.12,-461 796.12,-461 790.12,-455 790.12,-449 790.12,-449 790.12,-424.5 790.12,-424.5 790.12,-418.5 796.12,-412.5 802.12,-412.5 802.12,-412.5 887.88,-412.5 887.88,-412.5 893.88,-412.5 899.88,-418.5 899.88,-424.5 899.88,-424.5 899.88,-449 899.88,-449 899.88,-455 893.88,-461 887.88,-461"/>
189
- <text xml:space="preserve" text-anchor="middle" x="845" y="-446.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">emit task line</text>
190
- <text xml:space="preserve" text-anchor="middle" x="845" y="-433.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">task k/N: ...</text>
191
- <text xml:space="preserve" text-anchor="middle" x="845" y="-419.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">via shell×2 (search)</text>
198
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M875.5,-447.5C875.5,-447.5 802.5,-447.5 802.5,-447.5 796.5,-447.5 790.5,-441.5 790.5,-435.5 790.5,-435.5 790.5,-411 790.5,-411 790.5,-405 796.5,-399 802.5,-399 802.5,-399 875.5,-399 875.5,-399 881.5,-399 887.5,-405 887.5,-411 887.5,-411 887.5,-435.5 887.5,-435.5 887.5,-441.5 881.5,-447.5 875.5,-447.5"/>
199
+ <text xml:space="preserve" text-anchor="middle" x="839" y="-433.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">emit task line</text>
200
+ <text xml:space="preserve" text-anchor="middle" x="839" y="-419.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">task k/N:</text>
201
+ <text xml:space="preserve" text-anchor="middle" x="839" y="-406.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">via shell (search)</text>
192
202
  </g>
193
203
  <!-- Dup&#45;&gt;EmitB -->
194
- <g id="edge11" class="edge">
204
+ <g id="edge12" class="edge">
195
205
  <title>Dup&#45;&gt;EmitB</title>
196
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M492.7,-451.82C517.14,-474.11 566.81,-514.89 618,-530.33 682.68,-549.84 709.1,-559.57 770,-530.33 795.74,-517.98 815.42,-492.01 828.15,-470.56"/>
197
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="830.52,-472.05 832.04,-463.71 825.65,-469.28 830.52,-472.05"/>
198
- <text xml:space="preserve" text-anchor="middle" x="741" y="-551.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">new</text>
206
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M493.25,-437.98C518.01,-459.31 567.64,-497.87 618,-512.46 682.89,-531.26 709.35,-542.22 770,-512.46 793.58,-500.89 811.39,-476.95 823.01,-456.78"/>
207
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="825.42,-458.21 826.81,-449.85 820.51,-455.52 825.42,-458.21"/>
208
+ <text xml:space="preserve" text-anchor="middle" x="742" y="-533.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">new</text>
199
209
  </g>
200
210
  <!-- Skip -->
201
- <g id="node12" class="node">
211
+ <g id="node13" class="node">
202
212
  <title>Skip</title>
203
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M738.38,-454.75C738.38,-454.75 649.62,-454.75 649.62,-454.75 643.62,-454.75 637.62,-448.75 637.62,-442.75 637.62,-442.75 637.62,-430.75 637.62,-430.75 637.62,-424.75 643.62,-418.75 649.62,-418.75 649.62,-418.75 738.38,-418.75 738.38,-418.75 744.38,-418.75 750.38,-424.75 750.38,-430.75 750.38,-430.75 750.38,-442.75 750.38,-442.75 750.38,-448.75 744.38,-454.75 738.38,-454.75"/>
204
- <text xml:space="preserve" text-anchor="middle" x="694" y="-439.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">return nil</text>
205
- <text xml:space="preserve" text-anchor="middle" x="694" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(suppress duplicate)</text>
213
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M738.38,-441.25C738.38,-441.25 649.62,-441.25 649.62,-441.25 643.62,-441.25 637.62,-435.25 637.62,-429.25 637.62,-429.25 637.62,-417.25 637.62,-417.25 637.62,-411.25 643.62,-405.25 649.62,-405.25 649.62,-405.25 738.38,-405.25 738.38,-405.25 744.38,-405.25 750.38,-411.25 750.38,-417.25 750.38,-417.25 750.38,-429.25 750.38,-429.25 750.38,-435.25 744.38,-441.25 738.38,-441.25"/>
214
+ <text xml:space="preserve" text-anchor="middle" x="694" y="-426.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">return nil</text>
215
+ <text xml:space="preserve" text-anchor="middle" x="694" y="-412.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(suppress duplicate)</text>
206
216
  </g>
207
217
  <!-- Dup&#45;&gt;Skip -->
208
- <g id="edge12" class="edge">
218
+ <g id="edge13" class="edge">
209
219
  <title>Dup&#45;&gt;Skip</title>
210
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M560.9,-436.75C582.93,-436.75 606.39,-436.75 627.38,-436.75"/>
211
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="627.19,-439.55 635.19,-436.75 627.19,-433.95 627.19,-439.55"/>
212
- <text xml:space="preserve" text-anchor="middle" x="597.76" y="-441.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">same fp</text>
220
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M560.9,-423.25C582.93,-423.25 606.39,-423.25 627.38,-423.25"/>
221
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="627.19,-426.05 635.19,-423.25 627.19,-420.45 627.19,-426.05"/>
222
+ <text xml:space="preserve" text-anchor="middle" x="597.76" y="-428.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">same fp</text>
213
223
  </g>
214
224
  <!-- Tools -->
215
- <g id="node13" class="node">
225
+ <g id="node14" class="node">
216
226
  <title>Tools</title>
217
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M731.25,-164C731.25,-164 644.75,-164 644.75,-164 638.75,-164 632.75,-158 632.75,-152 632.75,-152 632.75,-127.5 632.75,-127.5 632.75,-121.5 638.75,-115.5 644.75,-115.5 644.75,-115.5 731.25,-115.5 731.25,-115.5 737.25,-115.5 743.25,-121.5 743.25,-127.5 743.25,-127.5 743.25,-152 743.25,-152 743.25,-158 737.25,-164 731.25,-164"/>
218
- <text xml:space="preserve" text-anchor="middle" x="688" y="-149.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Dispatch tools</text>
219
- <text xml:space="preserve" text-anchor="middle" x="688" y="-136.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">shell · pwn_eval · ...</text>
220
- <text xml:space="preserve" text-anchor="middle" x="688" y="-122.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">own REPL lines</text>
227
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M750.25,-164C750.25,-164 597.75,-164 597.75,-164 591.75,-164 585.75,-158 585.75,-152 585.75,-152 585.75,-127.5 585.75,-127.5 585.75,-121.5 591.75,-115.5 597.75,-115.5 597.75,-115.5 750.25,-115.5 750.25,-115.5 756.25,-115.5 762.25,-121.5 762.25,-127.5 762.25,-127.5 762.25,-152 762.25,-152 762.25,-158 756.25,-164 750.25,-164"/>
228
+ <text xml:space="preserve" text-anchor="middle" x="674" y="-149.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Dispatch tools</text>
229
+ <text xml:space="preserve" text-anchor="middle" x="674" y="-136.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">shell · pwn_eval · CORE_TOOLS</text>
230
+ <text xml:space="preserve" text-anchor="middle" x="674" y="-122.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">own REPL lines</text>
221
231
  </g>
222
232
  <!-- EmitB&#45;&gt;Tools -->
223
- <g id="edge14" class="edge">
233
+ <g id="edge15" class="edge">
224
234
  <title>EmitB&#45;&gt;Tools</title>
225
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M832.15,-411.61C804.01,-358.73 736.91,-232.65 705.18,-173.04"/>
226
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="707.74,-171.88 701.51,-166.14 702.8,-174.51 707.74,-171.88"/>
235
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M824.93,-398.25C795.28,-347.66 726.35,-230.07 692.89,-172.98"/>
236
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="695.49,-171.87 689.03,-166.39 690.66,-174.7 695.49,-171.87"/>
227
237
  </g>
228
238
  <!-- EmitB&#45;&gt;UI -->
229
- <g id="edge13" class="edge">
239
+ <g id="edge14" class="edge">
230
240
  <title>EmitB&#45;&gt;UI</title>
231
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M892.39,-411.52C971.74,-370.01 1126.27,-284.92 1161,-234.5 1197.58,-181.4 1204.31,-103.91 1204.86,-59.65"/>
232
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="1207.66,-59.92 1204.87,-51.91 1202.06,-59.91 1207.66,-59.92"/>
241
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M887.97,-398.16C977.62,-353.65 1160.71,-260.68 1180,-234.5 1218.25,-182.59 1224.38,-104.67 1224.37,-60.02"/>
242
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="1227.18,-60.15 1224.29,-52.18 1221.58,-60.21 1227.18,-60.15"/>
233
243
  </g>
234
244
  <!-- Skip&#45;&gt;Tools -->
235
- <g id="edge15" class="edge">
245
+ <g id="edge16" class="edge">
236
246
  <title>Skip&#45;&gt;Tools</title>
237
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M693.64,-418.18C692.67,-370.36 689.96,-237.25 688.68,-174.41"/>
238
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="691.49,-174.51 688.53,-166.57 685.89,-174.62 691.49,-174.51"/>
247
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M692.75,-404.64C689.48,-358.67 680.66,-234.46 676.38,-174.3"/>
248
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="679.19,-174.27 675.83,-166.49 673.6,-174.67 679.19,-174.27"/>
239
249
  </g>
240
250
  <!-- Rec -->
241
- <g id="node14" class="node">
251
+ <g id="node15" class="node">
242
252
  <title>Rec</title>
243
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M933.62,-164C933.62,-164 834.38,-164 834.38,-164 828.38,-164 822.38,-158 822.38,-152 822.38,-152 822.38,-127.5 822.38,-127.5 822.38,-121.5 828.38,-115.5 834.38,-115.5 834.38,-115.5 933.62,-115.5 933.62,-115.5 939.62,-115.5 945.62,-121.5 945.62,-127.5 945.62,-127.5 945.62,-152 945.62,-152 945.62,-158 939.62,-164 933.62,-164"/>
244
- <text xml:space="preserve" text-anchor="middle" x="884" y="-149.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">record!</text>
245
- <text xml:space="preserve" text-anchor="middle" x="884" y="-136.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">advance plan_idx</text>
246
- <text xml:space="preserve" text-anchor="middle" x="884" y="-122.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(silent unless verbose)</text>
253
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M952.62,-164C952.62,-164 853.38,-164 853.38,-164 847.38,-164 841.38,-158 841.38,-152 841.38,-152 841.38,-127.5 841.38,-127.5 841.38,-121.5 847.38,-115.5 853.38,-115.5 853.38,-115.5 952.62,-115.5 952.62,-115.5 958.62,-115.5 964.62,-121.5 964.62,-127.5 964.62,-127.5 964.62,-152 964.62,-152 964.62,-158 958.62,-164 952.62,-164"/>
254
+ <text xml:space="preserve" text-anchor="middle" x="903" y="-149.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">record!</text>
255
+ <text xml:space="preserve" text-anchor="middle" x="903" y="-136.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">advance plan_idx</text>
256
+ <text xml:space="preserve" text-anchor="middle" x="903" y="-122.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(silent unless verbose)</text>
247
257
  </g>
248
258
  <!-- Tools&#45;&gt;Rec -->
249
- <g id="edge16" class="edge">
259
+ <g id="edge17" class="edge">
250
260
  <title>Tools&#45;&gt;Rec</title>
251
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M743.89,-139.75C766.64,-139.75 789.39,-139.75 812.13,-139.75"/>
252
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="811.91,-142.55 819.91,-139.75 811.91,-136.95 811.91,-142.55"/>
261
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M762.56,-139.75C785.36,-139.75 808.16,-139.75 830.96,-139.75"/>
262
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="830.77,-142.55 838.77,-139.75 830.77,-136.95 830.77,-142.55"/>
253
263
  </g>
254
264
  <!-- Rec&#45;&gt;About -->
255
- <g id="edge17" class="edge">
265
+ <g id="edge18" class="edge">
256
266
  <title>Rec&#45;&gt;About</title>
257
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M859.03,-164.66C835.82,-185.72 799.43,-215.85 763,-234.5 707.93,-262.69 320.93,-370.13 155.6,-415.42"/>
258
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="155.34,-412.59 148.36,-417.4 156.81,-417.99 155.34,-412.59"/>
259
- <text xml:space="preserve" text-anchor="middle" x="757.32" y="-284.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">next batch</text>
267
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M878.59,-164.47C855.47,-185.69 818.9,-216.2 782,-234.5 753.41,-248.68 330.83,-358.06 155.93,-403.03"/>
268
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="155.49,-400.25 148.44,-404.96 156.88,-405.68 155.49,-400.25"/>
269
+ <text xml:space="preserve" text-anchor="middle" x="774.6" y="-278.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">next batch</text>
260
270
  </g>
261
271
  <!-- Flush -->
262
- <g id="node15" class="node">
272
+ <g id="node16" class="node">
263
273
  <title>Flush</title>
264
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1130.75,-157.75C1130.75,-157.75 1041.25,-157.75 1041.25,-157.75 1035.25,-157.75 1029.25,-151.75 1029.25,-145.75 1029.25,-145.75 1029.25,-133.75 1029.25,-133.75 1029.25,-127.75 1035.25,-121.75 1041.25,-121.75 1041.25,-121.75 1130.75,-121.75 1130.75,-121.75 1136.75,-121.75 1142.75,-127.75 1142.75,-133.75 1142.75,-133.75 1142.75,-145.75 1142.75,-145.75 1142.75,-151.75 1136.75,-157.75 1130.75,-157.75"/>
265
- <text xml:space="preserve" text-anchor="middle" x="1086" y="-142.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">flush! / emit!</text>
266
- <text xml:space="preserve" text-anchor="middle" x="1086" y="-129.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">optional closing brief</text>
274
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1149.75,-157.75C1149.75,-157.75 1060.25,-157.75 1060.25,-157.75 1054.25,-157.75 1048.25,-151.75 1048.25,-145.75 1048.25,-145.75 1048.25,-133.75 1048.25,-133.75 1048.25,-127.75 1054.25,-121.75 1060.25,-121.75 1060.25,-121.75 1149.75,-121.75 1149.75,-121.75 1155.75,-121.75 1161.75,-127.75 1161.75,-133.75 1161.75,-133.75 1161.75,-145.75 1161.75,-145.75 1161.75,-151.75 1155.75,-157.75 1149.75,-157.75"/>
275
+ <text xml:space="preserve" text-anchor="middle" x="1105" y="-142.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">flush! / emit!</text>
276
+ <text xml:space="preserve" text-anchor="middle" x="1105" y="-129.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">optional closing brief</text>
267
277
  </g>
268
278
  <!-- Rec&#45;&gt;Flush -->
269
- <g id="edge18" class="edge">
279
+ <g id="edge19" class="edge">
270
280
  <title>Rec&#45;&gt;Flush</title>
271
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M946.25,-139.75C969.28,-139.75 995.47,-139.75 1018.91,-139.75"/>
272
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1018.8,-142.55 1026.8,-139.75 1018.8,-136.95 1018.8,-142.55"/>
273
- <text xml:space="preserve" text-anchor="middle" x="987.44" y="-144.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">end of turn</text>
281
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M965.25,-139.75C988.28,-139.75 1014.47,-139.75 1037.91,-139.75"/>
282
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1037.8,-142.55 1045.8,-139.75 1037.8,-136.95 1037.8,-142.55"/>
283
+ <text xml:space="preserve" text-anchor="middle" x="1006.44" y="-144.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">end of turn</text>
274
284
  </g>
275
285
  <!-- Flush&#45;&gt;UI -->
276
- <g id="edge19" class="edge">
286
+ <g id="edge20" class="edge">
277
287
  <title>Flush&#45;&gt;UI</title>
278
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M1104.18,-121.26C1122.3,-103.83 1150.5,-76.71 1172.31,-55.73"/>
279
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1174.2,-57.8 1178.02,-50.24 1170.31,-53.77 1174.2,-57.8"/>
288
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" stroke-dasharray="5,2" d="M1123.18,-121.26C1141.3,-103.83 1169.5,-76.71 1191.31,-55.73"/>
289
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1193.2,-57.8 1197.02,-50.24 1189.31,-53.77 1193.2,-57.8"/>
280
290
  </g>
281
291
  </g>
282
292
  </svg>