pwn 0.5.684 → 0.5.685

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -0
  3. data/documentation/Agent-Tool-Registry.md +1 -3
  4. data/documentation/Configuration.md +0 -2
  5. data/documentation/Home.md +2 -2
  6. data/documentation/How-PWN-Works.md +2 -2
  7. data/documentation/Installation.md +18 -2
  8. data/documentation/Persistence.md +1 -1
  9. data/documentation/Session-Workflow.md +8 -28
  10. data/documentation/Skills-Memory-Learning.md +20 -0
  11. data/documentation/Troubleshooting.md +1 -1
  12. data/documentation/Why-PWN.md +1 -1
  13. data/documentation/diagrams/dot/memory-skills-detailed.dot +1 -1
  14. data/documentation/diagrams/dot/overall-pwn-architecture.dot +1 -1
  15. data/documentation/diagrams/dot/persistence-filesystem.dot +1 -1
  16. data/documentation/diagrams/dot/sessions-cron-automation.dot +1 -1
  17. data/documentation/diagrams/memory-skills-detailed.svg +85 -84
  18. data/documentation/diagrams/overall-pwn-architecture.svg +15 -15
  19. data/documentation/diagrams/persistence-filesystem.svg +1 -1
  20. data/documentation/diagrams/sessions-cron-automation.svg +7 -6
  21. data/documentation/pwn-ai-Agent.md +4 -7
  22. data/etc/default_skills/bug-bounty-hunting/SKILL.md +70 -0
  23. data/etc/default_skills/deep-exploitation/SKILL.md +74 -0
  24. data/etc/default_skills/hardware-and-firmware-testing/SKILL.md +83 -0
  25. data/etc/default_skills/osint/SKILL.md +147 -0
  26. data/etc/default_skills/penetration-testing/SKILL.md +81 -0
  27. data/etc/default_skills/red-teaming/SKILL.md +70 -0
  28. data/etc/default_skills/reverse-engineering-binaries/SKILL.md +70 -0
  29. data/etc/default_skills/sast-code-scans/SKILL.md +66 -0
  30. data/etc/default_skills/social-engineering/SKILL.md +67 -0
  31. data/etc/default_skills/vulnerability-research-fundamentals/SKILL.md +74 -0
  32. data/etc/default_skills/web-application-penetration-testing/SKILL.md +68 -0
  33. data/lib/pwn/ai/agent/loop.rb +3 -28
  34. data/lib/pwn/ai/agent/mistakes.rb +6 -6
  35. data/lib/pwn/ai/agent/prompt_builder.rb +0 -4
  36. data/lib/pwn/ai/agent/tool_guard.rb +1 -46
  37. data/lib/pwn/ai/agent/tools/ruby_eval.rb +0 -10
  38. data/lib/pwn/ai/agent/tools/shell.rb +0 -6
  39. data/lib/pwn/config.rb +62 -1
  40. data/lib/pwn/migrate.rb +2 -0
  41. data/lib/pwn/version.rb +1 -1
  42. data/spec/integration/config_spec.rb +37 -0
  43. data/spec/lib/pwn/ai/agent/loop_spec.rb +9 -7
  44. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +7 -0
  45. data/spec/lib/pwn/ai/agent/signal_hygiene_spec.rb +5 -8
  46. data/spec/lib/pwn/ai/agent/tools/shell_spec.rb +10 -18
  47. data/third_party/pwn_rdoc.jsonl +3 -4
  48. metadata +12 -2
  49. data/documentation/PWN_Contributors_and_Users.png +0 -0
@@ -18,13 +18,13 @@
18
18
  </g>
19
19
  <g id="clust3" class="cluster">
20
20
  <title>cluster_files</title>
21
- <path fill="#422006" stroke="#a16207" d="M149,-306.5C149,-306.5 1705,-306.5 1705,-306.5 1711,-306.5 1717,-312.5 1717,-318.5 1717,-318.5 1717,-433.5 1717,-433.5 1717,-439.5 1711,-445.5 1705,-445.5 1705,-445.5 149,-445.5 149,-445.5 143,-445.5 137,-439.5 137,-433.5 137,-433.5 137,-318.5 137,-318.5 137,-312.5 143,-306.5 149,-306.5"/>
22
- <text xml:space="preserve" text-anchor="middle" x="927" y="-422.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
21
+ <path fill="#422006" stroke="#a16207" d="M135,-306.5C135,-306.5 1705,-306.5 1705,-306.5 1711,-306.5 1717,-312.5 1717,-318.5 1717,-318.5 1717,-433.5 1717,-433.5 1717,-439.5 1711,-445.5 1705,-445.5 1705,-445.5 135,-445.5 135,-445.5 129,-445.5 123,-439.5 123,-433.5 123,-433.5 123,-318.5 123,-318.5 123,-312.5 129,-306.5 135,-306.5"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="920" y="-422.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
23
23
  </g>
24
24
  <g id="clust5" class="cluster">
25
25
  <title>cluster_read</title>
26
- <path fill="#2e1065" stroke="#6d28d9" d="M384,-149C384,-149 1400,-149 1400,-149 1406,-149 1412,-155 1412,-161 1412,-161 1412,-259.5 1412,-259.5 1412,-265.5 1406,-271.5 1400,-271.5 1400,-271.5 384,-271.5 384,-271.5 378,-271.5 372,-265.5 372,-259.5 372,-259.5 372,-161 372,-161 372,-155 378,-149 384,-149"/>
27
- <text xml:space="preserve" text-anchor="middle" x="892" y="-248.5" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Read&#45;Side / Injection</text>
26
+ <path fill="#2e1065" stroke="#6d28d9" d="M386,-149C386,-149 1402,-149 1402,-149 1408,-149 1414,-155 1414,-161 1414,-161 1414,-259.5 1414,-259.5 1414,-265.5 1408,-271.5 1402,-271.5 1402,-271.5 386,-271.5 386,-271.5 380,-271.5 374,-265.5 374,-259.5 374,-259.5 374,-161 374,-161 374,-155 380,-149 386,-149"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="894" y="-248.5" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Read&#45;Side / Injection</text>
28
28
  </g>
29
29
  <!-- Rem -->
30
30
  <g id="node1" class="node">
@@ -74,16 +74,17 @@
74
74
  <!-- Fskl -->
75
75
  <g id="node11" class="node">
76
76
  <title>Fskl</title>
77
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M258.75,-362.75C258.75,-364.96 233.31,-366.75 202,-366.75 170.69,-366.75 145.25,-364.96 145.25,-362.75 145.25,-362.75 145.25,-326.75 145.25,-326.75 145.25,-324.54 170.69,-322.75 202,-322.75 233.31,-322.75 258.75,-324.54 258.75,-326.75 258.75,-326.75 258.75,-362.75 258.75,-362.75"/>
78
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M258.75,-362.75C258.75,-360.54 233.31,-358.75 202,-358.75 170.69,-358.75 145.25,-360.54 145.25,-362.75"/>
79
- <text xml:space="preserve" text-anchor="middle" x="202" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skills/&lt;n&gt;/SKILL.md</text>
80
- <text xml:space="preserve" text-anchor="middle" x="202" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">YAML front&#45;matter refs</text>
77
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M259.25,-369.5C259.25,-372.53 230.45,-375 195,-375 159.55,-375 130.75,-372.53 130.75,-369.5 130.75,-369.5 130.75,-320 130.75,-320 130.75,-316.97 159.55,-314.5 195,-314.5 230.45,-314.5 259.25,-316.97 259.25,-320 259.25,-320 259.25,-369.5 259.25,-369.5"/>
78
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M259.25,-369.5C259.25,-366.47 230.45,-364 195,-364 159.55,-364 130.75,-366.47 130.75,-369.5"/>
79
+ <text xml:space="preserve" text-anchor="middle" x="195" y="-353.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skills/&lt;n&gt;/SKILL.md</text>
80
+ <text xml:space="preserve" text-anchor="middle" x="195" y="-341.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">YAML front&#45;matter + refs</text>
81
+ <text xml:space="preserve" text-anchor="middle" x="195" y="-329.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(+ etc/default_skills seed)</text>
81
82
  </g>
82
83
  <!-- Skc&#45;&gt;Fskl -->
83
84
  <g id="edge2" class="edge">
84
85
  <title>Skc&#45;&gt;Fskl</title>
85
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M79.04,-511.88C102.44,-480.27 151.77,-413.61 180.33,-375.03"/>
86
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="182.41,-376.92 184.92,-368.83 177.91,-373.59 182.41,-376.92"/>
86
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M78.37,-511.88C99.03,-482.45 141.02,-422.64 168.57,-383.39"/>
87
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="170.79,-385.11 173.09,-376.96 166.2,-381.9 170.79,-385.11"/>
87
88
  </g>
88
89
  <!-- Note -->
89
90
  <g id="node3" class="node">
@@ -116,8 +117,8 @@
116
117
  <!-- Dist&#45;&gt;Fskl -->
117
118
  <g id="edge4" class="edge">
118
119
  <title>Dist&#45;&gt;Fskl</title>
119
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M188.25,-511.89C179.41,-501.86 169.65,-488.52 165,-474.5 153.88,-440.98 168.97,-401.93 183.09,-375.7"/>
120
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="185.35,-377.39 186.83,-369.04 180.47,-374.64 185.35,-377.39"/>
120
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M188.25,-511.89C179.41,-501.86 169.65,-488.52 165,-474.5 155.19,-444.91 164.23,-410.48 174.88,-384.67"/>
121
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="177.43,-385.83 178.06,-377.38 172.3,-383.59 177.43,-385.83"/>
121
122
  </g>
122
123
  <!-- Fses -->
123
124
  <g id="node13" class="node">
@@ -249,28 +250,28 @@
249
250
  <!-- Rec -->
250
251
  <g id="node19" class="node">
251
252
  <title>Rec</title>
252
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1237.88,-197C1237.88,-197 1182.12,-197 1182.12,-197 1176.12,-197 1170.12,-191 1170.12,-185 1170.12,-185 1170.12,-173 1170.12,-173 1170.12,-167 1176.12,-161 1182.12,-161 1182.12,-161 1237.88,-161 1237.88,-161 1243.88,-161 1249.88,-167 1249.88,-173 1249.88,-173 1249.88,-185 1249.88,-185 1249.88,-191 1243.88,-197 1237.88,-197"/>
253
- <text xml:space="preserve" text-anchor="middle" x="1210" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory_recall</text>
253
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1239.88,-197C1239.88,-197 1184.12,-197 1184.12,-197 1178.12,-197 1172.12,-191 1172.12,-185 1172.12,-185 1172.12,-173 1172.12,-173 1172.12,-167 1178.12,-161 1184.12,-161 1184.12,-161 1239.88,-161 1239.88,-161 1245.88,-161 1251.88,-167 1251.88,-173 1251.88,-173 1251.88,-185 1251.88,-185 1251.88,-191 1245.88,-197 1239.88,-197"/>
254
+ <text xml:space="preserve" text-anchor="middle" x="1212" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory_recall</text>
254
255
  </g>
255
256
  <!-- Fmem&#45;&gt;Rec -->
256
257
  <g id="edge8" class="edge">
257
258
  <title>Fmem&#45;&gt;Rec</title>
258
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1273.46,-322.34C1260.16,-292.52 1236.08,-238.5 1221.71,-206.28"/>
259
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1224.38,-205.38 1218.56,-199.21 1219.26,-207.66 1224.38,-205.38"/>
259
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1273.72,-322.34C1260.79,-292.52 1237.37,-238.5 1223.39,-206.28"/>
260
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1226.08,-205.44 1220.33,-199.22 1220.95,-207.67 1226.08,-205.44"/>
260
261
  </g>
261
262
  <!-- Midx -->
262
263
  <g id="node20" class="node">
263
264
  <title>Midx</title>
264
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1118.12,-201C1118.12,-201 1057.88,-201 1057.88,-201 1051.88,-201 1045.88,-195 1045.88,-189 1045.88,-189 1045.88,-169 1045.88,-169 1045.88,-163 1051.88,-157 1057.88,-157 1057.88,-157 1118.12,-157 1118.12,-157 1124.12,-157 1130.12,-163 1130.12,-169 1130.12,-169 1130.12,-189 1130.12,-189 1130.12,-195 1124.12,-201 1118.12,-201"/>
265
- <text xml:space="preserve" text-anchor="middle" x="1088" y="-187.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MemoryIndex</text>
266
- <text xml:space="preserve" text-anchor="middle" x="1088" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">recall_semantic</text>
267
- <text xml:space="preserve" text-anchor="middle" x="1088" y="-163.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(cosine top&#45;K)</text>
265
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1120.12,-201C1120.12,-201 1059.88,-201 1059.88,-201 1053.88,-201 1047.88,-195 1047.88,-189 1047.88,-189 1047.88,-169 1047.88,-169 1047.88,-163 1053.88,-157 1059.88,-157 1059.88,-157 1120.12,-157 1120.12,-157 1126.12,-157 1132.12,-163 1132.12,-169 1132.12,-169 1132.12,-189 1132.12,-189 1132.12,-195 1126.12,-201 1120.12,-201"/>
266
+ <text xml:space="preserve" text-anchor="middle" x="1090" y="-187.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MemoryIndex</text>
267
+ <text xml:space="preserve" text-anchor="middle" x="1090" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">recall_semantic</text>
268
+ <text xml:space="preserve" text-anchor="middle" x="1090" y="-163.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(cosine top&#45;K)</text>
268
269
  </g>
269
270
  <!-- Fmem&#45;&gt;Midx -->
270
271
  <g id="edge23" class="edge">
271
272
  <title>Fmem&#45;&gt;Midx</title>
272
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M1239.32,-322.83C1206.32,-306.52 1164.36,-284.52 1150,-271.5 1130.85,-254.14 1114.69,-229.73 1103.68,-210.48"/>
273
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1106.13,-209.13 1099.79,-203.49 1101.23,-211.85 1106.13,-209.13"/>
273
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M1239.98,-322.77C1207.48,-306.43 1166.15,-284.41 1152,-271.5 1132.91,-254.08 1116.75,-229.67 1105.71,-210.44"/>
274
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1108.17,-209.09 1101.83,-203.46 1103.27,-211.81 1108.17,-209.09"/>
274
275
  </g>
275
276
  <!-- ReVal -->
276
277
  <g id="node28" class="node">
@@ -290,65 +291,65 @@
290
291
  <!-- Fidx&#45;&gt;Midx -->
291
292
  <g id="edge22" class="edge">
292
293
  <title>Fidx&#45;&gt;Midx</title>
293
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1128.95,-314.1C1120.05,-284.95 1106.52,-240.65 1097.48,-211.03"/>
294
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1100.18,-210.31 1095.17,-203.48 1094.83,-211.95 1100.18,-210.31"/>
294
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1129.31,-314.1C1120.76,-284.95 1107.78,-240.65 1099.1,-211.03"/>
295
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1101.82,-210.37 1096.88,-203.49 1096.45,-211.95 1101.82,-210.37"/>
295
296
  </g>
296
297
  <!-- Skv -->
297
298
  <g id="node21" class="node">
298
299
  <title>Skv</title>
299
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M448.25,-197C448.25,-197 391.75,-197 391.75,-197 385.75,-197 379.75,-191 379.75,-185 379.75,-185 379.75,-173 379.75,-173 379.75,-167 385.75,-161 391.75,-161 391.75,-161 448.25,-161 448.25,-161 454.25,-161 460.25,-167 460.25,-173 460.25,-173 460.25,-185 460.25,-185 460.25,-191 454.25,-197 448.25,-197"/>
300
- <text xml:space="preserve" text-anchor="middle" x="420" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skill_list · view</text>
300
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M450.25,-197C450.25,-197 393.75,-197 393.75,-197 387.75,-197 381.75,-191 381.75,-185 381.75,-185 381.75,-173 381.75,-173 381.75,-167 387.75,-161 393.75,-161 393.75,-161 450.25,-161 450.25,-161 456.25,-161 462.25,-167 462.25,-173 462.25,-173 462.25,-185 462.25,-185 462.25,-191 456.25,-197 450.25,-197"/>
301
+ <text xml:space="preserve" text-anchor="middle" x="422" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skill_list · view</text>
301
302
  </g>
302
303
  <!-- Fskl&#45;&gt;Skv -->
303
304
  <g id="edge9" class="edge">
304
305
  <title>Fskl&#45;&gt;Skv</title>
305
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M230.5,-322.34C271.48,-291.56 346.78,-235 389.07,-203.23"/>
306
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="390.53,-205.64 395.25,-198.59 387.17,-201.16 390.53,-205.64"/>
306
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M235.58,-314.47C279.73,-282.63 349.39,-232.38 389.89,-203.16"/>
307
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="391.38,-205.54 396.23,-198.59 388.1,-201 391.38,-205.54"/>
307
308
  </g>
308
309
  <!-- Out -->
309
310
  <g id="node22" class="node">
310
311
  <title>Out</title>
311
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M873.88,-197C873.88,-197 800.12,-197 800.12,-197 794.12,-197 788.12,-191 788.12,-185 788.12,-185 788.12,-173 788.12,-173 788.12,-167 794.12,-161 800.12,-161 800.12,-161 873.88,-161 873.88,-161 879.88,-161 885.88,-167 885.88,-173 885.88,-173 885.88,-185 885.88,-185 885.88,-191 879.88,-197 873.88,-197"/>
312
- <text xml:space="preserve" text-anchor="middle" x="837" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_outcomes</text>
313
- <text xml:space="preserve" text-anchor="middle" x="837" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_stats</text>
312
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M875.88,-197C875.88,-197 802.12,-197 802.12,-197 796.12,-197 790.12,-191 790.12,-185 790.12,-185 790.12,-173 790.12,-173 790.12,-167 796.12,-161 802.12,-161 802.12,-161 875.88,-161 875.88,-161 881.88,-161 887.88,-167 887.88,-173 887.88,-173 887.88,-185 887.88,-185 887.88,-191 881.88,-197 875.88,-197"/>
313
+ <text xml:space="preserve" text-anchor="middle" x="839" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_outcomes</text>
314
+ <text xml:space="preserve" text-anchor="middle" x="839" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_stats</text>
314
315
  </g>
315
316
  <!-- Flrn&#45;&gt;Out -->
316
317
  <g id="edge10" class="edge">
317
318
  <title>Flrn&#45;&gt;Out</title>
318
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M678.51,-323.24C687.01,-317.68 696.3,-311.75 705,-306.5 732.42,-289.95 743.83,-292.52 768,-271.5 789.84,-252.51 809.14,-225.55 821.73,-205.82"/>
319
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="823.97,-207.52 825.83,-199.25 819.22,-204.56 823.97,-207.52"/>
319
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M678.17,-323.35C686.74,-317.74 696.16,-311.76 705,-306.5 733.2,-289.73 745.1,-292.87 770,-271.5 791.96,-252.65 811.25,-225.68 823.8,-205.9"/>
320
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="826.05,-207.59 827.88,-199.31 821.29,-204.64 826.05,-207.59"/>
320
321
  </g>
321
322
  <!-- Exem -->
322
323
  <g id="node25" class="node">
323
324
  <title>Exem</title>
324
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M735.62,-197C735.62,-197 642.38,-197 642.38,-197 636.38,-197 630.38,-191 630.38,-185 630.38,-185 630.38,-173 630.38,-173 630.38,-167 636.38,-161 642.38,-161 642.38,-161 735.62,-161 735.62,-161 741.62,-161 747.62,-167 747.62,-173 747.62,-173 747.62,-185 747.62,-185 747.62,-191 741.62,-197 735.62,-197"/>
325
- <text xml:space="preserve" text-anchor="middle" x="689" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.exemplars_for</text>
326
- <text xml:space="preserve" text-anchor="middle" x="689" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(few&#45;shot trace)</text>
325
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M737.62,-197C737.62,-197 644.38,-197 644.38,-197 638.38,-197 632.38,-191 632.38,-185 632.38,-185 632.38,-173 632.38,-173 632.38,-167 638.38,-161 644.38,-161 644.38,-161 737.62,-161 737.62,-161 743.62,-161 749.62,-167 749.62,-173 749.62,-173 749.62,-185 749.62,-185 749.62,-191 743.62,-197 737.62,-197"/>
326
+ <text xml:space="preserve" text-anchor="middle" x="691" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.exemplars_for</text>
327
+ <text xml:space="preserve" text-anchor="middle" x="691" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(few&#45;shot trace)</text>
327
328
  </g>
328
329
  <!-- Flrn&#45;&gt;Exem -->
329
330
  <g id="edge24" class="edge">
330
331
  <title>Flrn&#45;&gt;Exem</title>
331
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M653.36,-322.34C660.8,-292.65 674.24,-238.97 682.32,-206.69"/>
332
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="684.94,-207.76 684.16,-199.32 679.5,-206.4 684.94,-207.76"/>
332
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M653.62,-322.34C661.42,-292.65 675.52,-238.97 683.99,-206.69"/>
333
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="686.6,-207.76 685.93,-199.32 681.19,-206.34 686.6,-207.76"/>
333
334
  </g>
334
335
  <!-- Sesv -->
335
336
  <g id="node23" class="node">
336
337
  <title>Sesv</title>
337
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M578.12,-197C578.12,-197 511.88,-197 511.88,-197 505.88,-197 499.88,-191 499.88,-185 499.88,-185 499.88,-173 499.88,-173 499.88,-167 505.88,-161 511.88,-161 511.88,-161 578.12,-161 578.12,-161 584.12,-161 590.12,-167 590.12,-173 590.12,-173 590.12,-185 590.12,-185 590.12,-191 584.12,-197 578.12,-197"/>
338
- <text xml:space="preserve" text-anchor="middle" x="545" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_view</text>
339
- <text xml:space="preserve" text-anchor="middle" x="545" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_current</text>
338
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M580.12,-197C580.12,-197 513.88,-197 513.88,-197 507.88,-197 501.88,-191 501.88,-185 501.88,-185 501.88,-173 501.88,-173 501.88,-167 507.88,-161 513.88,-161 513.88,-161 580.12,-161 580.12,-161 586.12,-161 592.12,-167 592.12,-173 592.12,-173 592.12,-185 592.12,-185 592.12,-191 586.12,-197 580.12,-197"/>
339
+ <text xml:space="preserve" text-anchor="middle" x="547" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_view</text>
340
+ <text xml:space="preserve" text-anchor="middle" x="547" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_current</text>
340
341
  </g>
341
342
  <!-- Fses&#45;&gt;Sesv -->
342
343
  <g id="edge11" class="edge">
343
344
  <title>Fses&#45;&gt;Sesv</title>
344
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M386.12,-323.15C424.39,-302.43 478,-273.28 480,-271.5 501.09,-252.75 519.12,-225.93 530.8,-206.17"/>
345
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="533.16,-207.68 534.73,-199.35 528.31,-204.89 533.16,-207.68"/>
345
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M386.32,-323.05C396.3,-317.66 407.05,-311.86 417,-306.5 445.88,-290.93 457.41,-293.22 482,-271.5 503.28,-252.71 521.39,-225.67 533.05,-205.86"/>
346
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="535.41,-207.36 536.96,-199.03 530.55,-204.58 535.41,-207.36"/>
346
347
  </g>
347
348
  <!-- Fses&#45;&gt;Exem -->
348
349
  <g id="edge25" class="edge">
349
350
  <title>Fses&#45;&gt;Exem</title>
350
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M381.77,-322.77C392.68,-316.75 405.05,-310.69 417,-306.5 499.27,-277.66 534.3,-314.74 610,-271.5 637.55,-255.76 660.11,-226.71 673.97,-205.55"/>
351
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="676.22,-207.22 678.14,-198.97 671.49,-204.23 676.22,-207.22"/>
351
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M381.76,-322.76C392.67,-316.74 405.05,-310.68 417,-306.5 500.12,-277.44 535.5,-315.1 612,-271.5 639.56,-255.79 662.12,-226.73 675.97,-205.56"/>
352
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="678.23,-207.23 680.14,-198.98 673.5,-204.24 678.23,-207.23"/>
352
353
  </g>
353
354
  <!-- Teach -->
354
355
  <g id="node29" class="node">
@@ -368,15 +369,15 @@
368
369
  <!-- Mlst -->
369
370
  <g id="node24" class="node">
370
371
  <title>Mlst</title>
371
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M993.88,-197C993.88,-197 938.12,-197 938.12,-197 932.12,-197 926.12,-191 926.12,-185 926.12,-185 926.12,-173 926.12,-173 926.12,-167 932.12,-161 938.12,-161 938.12,-161 993.88,-161 993.88,-161 999.88,-161 1005.88,-167 1005.88,-173 1005.88,-173 1005.88,-185 1005.88,-185 1005.88,-191 999.88,-197 993.88,-197"/>
372
- <text xml:space="preserve" text-anchor="middle" x="966" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_list</text>
373
- <text xml:space="preserve" text-anchor="middle" x="966" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">correction_hint</text>
372
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M995.88,-197C995.88,-197 940.12,-197 940.12,-197 934.12,-197 928.12,-191 928.12,-185 928.12,-185 928.12,-173 928.12,-173 928.12,-167 934.12,-161 940.12,-161 940.12,-161 995.88,-161 995.88,-161 1001.88,-161 1007.88,-167 1007.88,-173 1007.88,-173 1007.88,-185 1007.88,-185 1007.88,-191 1001.88,-197 995.88,-197"/>
373
+ <text xml:space="preserve" text-anchor="middle" x="968" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_list</text>
374
+ <text xml:space="preserve" text-anchor="middle" x="968" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">correction_hint</text>
374
375
  </g>
375
376
  <!-- Fmis&#45;&gt;Mlst -->
376
377
  <g id="edge12" class="edge">
377
378
  <title>Fmis&#45;&gt;Mlst</title>
378
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M980.78,-322.34C977.71,-292.77 972.17,-239.43 968.81,-207.11"/>
379
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="971.62,-207.04 968.01,-199.37 966.05,-207.62 971.62,-207.04"/>
379
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M981.04,-322.34C978.33,-292.77 973.44,-239.43 970.48,-207.11"/>
380
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="973.29,-207.08 969.77,-199.37 967.72,-207.59 973.29,-207.08"/>
380
381
  </g>
381
382
  <!-- Fext -->
382
383
  <g id="node15" class="node">
@@ -396,80 +397,80 @@
396
397
  <!-- PolR -->
397
398
  <g id="node26" class="node">
398
399
  <title>PolR</title>
399
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1392.12,-197C1392.12,-197 1301.88,-197 1301.88,-197 1295.88,-197 1289.88,-191 1289.88,-185 1289.88,-185 1289.88,-173 1289.88,-173 1289.88,-167 1295.88,-161 1301.88,-161 1301.88,-161 1392.12,-161 1392.12,-161 1398.12,-161 1404.12,-167 1404.12,-173 1404.12,-173 1404.12,-185 1404.12,-185 1404.12,-191 1398.12,-197 1392.12,-197"/>
400
- <text xml:space="preserve" text-anchor="middle" x="1347" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_stats · evaluate</text>
401
- <text xml:space="preserve" text-anchor="middle" x="1347" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_recommend</text>
400
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1394.12,-197C1394.12,-197 1303.88,-197 1303.88,-197 1297.88,-197 1291.88,-191 1291.88,-185 1291.88,-185 1291.88,-173 1291.88,-173 1291.88,-167 1297.88,-161 1303.88,-161 1303.88,-161 1394.12,-161 1394.12,-161 1400.12,-161 1406.12,-167 1406.12,-173 1406.12,-173 1406.12,-185 1406.12,-185 1406.12,-191 1400.12,-197 1394.12,-197"/>
401
+ <text xml:space="preserve" text-anchor="middle" x="1349" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_stats · evaluate</text>
402
+ <text xml:space="preserve" text-anchor="middle" x="1349" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_recommend</text>
402
403
  </g>
403
404
  <!-- Fpol&#45;&gt;PolR -->
404
405
  <g id="edge34" class="edge">
405
406
  <title>Fpol&#45;&gt;PolR</title>
406
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1449.57,-322.34C1427.9,-292.26 1388.49,-237.57 1365.34,-205.45"/>
407
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1367.65,-203.86 1360.7,-199.01 1363.1,-207.14 1367.65,-203.86"/>
407
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1449.84,-322.34C1428.53,-292.26 1389.79,-237.57 1367.03,-205.45"/>
408
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1369.38,-203.93 1362.47,-199.02 1364.81,-207.16 1369.38,-203.93"/>
408
409
  </g>
409
410
  <!-- Prompt -->
410
411
  <g id="node27" class="node">
411
412
  <title>Prompt</title>
412
- <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M995,-68C995,-68 799,-68 799,-68 793,-68 787,-62 787,-56 787,-56 787,-12 787,-12 787,-6 793,0 799,0 799,0 995,0 995,0 1001,0 1007,-6 1007,-12 1007,-12 1007,-56 1007,-56 1007,-62 1001,-68 995,-68"/>
413
- <text xml:space="preserve" text-anchor="middle" x="897" y="-54.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PromptBuilder.build(request:)</text>
414
- <text xml:space="preserve" text-anchor="middle" x="897" y="-42.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">engine&#45;aware .budget</text>
415
- <text xml:space="preserve" text-anchor="middle" x="897" y="-30.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MEMORY (relevance&#45;ranked) + SKILLS</text>
416
- <text xml:space="preserve" text-anchor="middle" x="897" y="-18.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ LEARNING + KNOWN MISTAKES/FIXES</text>
417
- <text xml:space="preserve" text-anchor="middle" x="897" y="-6.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ METRICS (per&#45;engine) + POLICY + EXTRO</text>
413
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M997,-68C997,-68 801,-68 801,-68 795,-68 789,-62 789,-56 789,-56 789,-12 789,-12 789,-6 795,0 801,0 801,0 997,0 997,0 1003,0 1009,-6 1009,-12 1009,-12 1009,-56 1009,-56 1009,-62 1003,-68 997,-68"/>
414
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-54.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PromptBuilder.build(request:)</text>
415
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-42.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">engine&#45;aware .budget</text>
416
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-30.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MEMORY (relevance&#45;ranked) + SKILLS</text>
417
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-18.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ LEARNING + KNOWN MISTAKES/FIXES</text>
418
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-6.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ METRICS (per&#45;engine) + POLICY + EXTRO</text>
418
419
  </g>
419
420
  <!-- Rec&#45;&gt;Prompt -->
420
421
  <g id="edge13" class="edge">
421
422
  <title>Rec&#45;&gt;Prompt</title>
422
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1191.07,-160.4C1171.91,-143.39 1140.8,-117.93 1110,-102 1081.09,-87.05 1048.23,-74.7 1017.12,-64.85"/>
423
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1018.32,-62.29 1009.85,-62.59 1016.66,-67.64 1018.32,-62.29"/>
423
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1193.07,-160.4C1173.91,-143.39 1142.8,-117.93 1112,-102 1083.09,-87.05 1050.23,-74.7 1019.12,-64.85"/>
424
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1020.32,-62.29 1011.85,-62.59 1018.66,-67.64 1020.32,-62.29"/>
424
425
  </g>
425
426
  <!-- Midx&#45;&gt;Prompt -->
426
427
  <g id="edge26" class="edge">
427
428
  <title>Midx&#45;&gt;Prompt</title>
428
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1067.41,-156.02C1051.88,-140.07 1029.63,-118.49 1008,-102 995.49,-92.46 981.54,-83.14 967.87,-74.63"/>
429
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="969.34,-72.24 961.05,-70.45 966.41,-77.02 969.34,-72.24"/>
430
- <text xml:space="preserve" text-anchor="middle" x="1065.8" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">MEMORY block</text>
431
- <text xml:space="preserve" text-anchor="middle" x="1065.8" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(top&#45;K by cosine)</text>
429
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1069.41,-156.02C1053.88,-140.07 1031.63,-118.49 1010,-102 997.49,-92.46 983.54,-83.14 969.87,-74.63"/>
430
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="971.34,-72.24 963.05,-70.45 968.41,-77.02 971.34,-72.24"/>
431
+ <text xml:space="preserve" text-anchor="middle" x="1067.8" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">MEMORY block</text>
432
+ <text xml:space="preserve" text-anchor="middle" x="1067.8" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(top&#45;K by cosine)</text>
432
433
  </g>
433
434
  <!-- Skv&#45;&gt;Prompt -->
434
435
  <g id="edge14" class="edge">
435
436
  <title>Skv&#45;&gt;Prompt</title>
436
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M453.48,-160.48C462,-156.4 471.22,-152.29 480,-149 577.79,-112.36 692.46,-81.87 776.78,-61.67"/>
437
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="777.34,-64.41 784.47,-59.84 776.04,-58.97 777.34,-64.41"/>
437
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M455.48,-160.48C464,-156.4 473.22,-152.29 482,-149 579.79,-112.36 694.46,-81.87 778.78,-61.67"/>
438
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="779.34,-64.41 786.47,-59.84 778.04,-58.97 779.34,-64.41"/>
438
439
  </g>
439
440
  <!-- Out&#45;&gt;Prompt -->
440
441
  <g id="edge15" class="edge">
441
442
  <title>Out&#45;&gt;Prompt</title>
442
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M844.36,-160.47C852.93,-140.03 867.41,-105.53 879.01,-77.87"/>
443
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="881.55,-79.06 882.06,-70.6 876.39,-76.9 881.55,-79.06"/>
443
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M846.36,-160.47C854.93,-140.03 869.41,-105.53 881.01,-77.87"/>
444
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="883.55,-79.06 884.06,-70.6 878.39,-76.9 883.55,-79.06"/>
444
445
  </g>
445
446
  <!-- Sesv&#45;&gt;Prompt -->
446
447
  <g id="edge16" class="edge">
447
448
  <title>Sesv&#45;&gt;Prompt</title>
448
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M583.72,-160.41C592.34,-156.58 601.46,-152.6 610,-149 672.71,-122.57 743.79,-94.32 799.53,-72.56"/>
449
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="800.42,-75.22 806.86,-69.7 798.38,-70 800.42,-75.22"/>
449
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M585.72,-160.41C594.34,-156.58 603.46,-152.6 612,-149 674.71,-122.57 745.79,-94.32 801.53,-72.56"/>
450
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="802.42,-75.22 808.86,-69.7 800.38,-70 802.42,-75.22"/>
450
451
  </g>
451
452
  <!-- Mlst&#45;&gt;Prompt -->
452
453
  <g id="edge17" class="edge">
453
454
  <title>Mlst&#45;&gt;Prompt</title>
454
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M957.54,-160.47C947.76,-140.21 931.32,-106.13 918.04,-78.6"/>
455
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="920.62,-77.5 914.62,-71.51 915.57,-79.94 920.62,-77.5"/>
456
- <text xml:space="preserve" text-anchor="middle" x="967.68" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">do NOT repeat</text>
455
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M959.54,-160.47C949.76,-140.21 933.32,-106.13 920.04,-78.6"/>
456
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="922.62,-77.5 916.62,-71.51 917.57,-79.94 922.62,-77.5"/>
457
+ <text xml:space="preserve" text-anchor="middle" x="969.68" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">do NOT repeat</text>
457
458
  </g>
458
459
  <!-- Exem&#45;&gt;Prompt -->
459
460
  <g id="edge27" class="edge">
460
461
  <title>Exem&#45;&gt;Prompt</title>
461
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M712.4,-160.43C733.4,-144.78 765.2,-121.43 793.5,-102 806.92,-92.78 821.51,-83.13 835.38,-74.11"/>
462
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="836.61,-76.65 841.8,-69.95 833.56,-71.95 836.61,-76.65"/>
463
- <text xml:space="preserve" text-anchor="middle" x="822.75" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">few&#45;shot msgs</text>
464
- <text xml:space="preserve" text-anchor="middle" x="822.75" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(local only)</text>
462
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M714.4,-160.43C735.4,-144.78 767.2,-121.43 795.5,-102 808.92,-92.78 823.51,-83.13 837.38,-74.11"/>
463
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="838.61,-76.65 843.8,-69.95 835.56,-71.95 838.61,-76.65"/>
464
+ <text xml:space="preserve" text-anchor="middle" x="824.75" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">few&#45;shot msgs</text>
465
+ <text xml:space="preserve" text-anchor="middle" x="824.75" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(local only)</text>
465
466
  </g>
466
467
  <!-- PolR&#45;&gt;Prompt -->
467
468
  <g id="edge35" class="edge">
468
469
  <title>PolR&#45;&gt;Prompt</title>
469
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1307.52,-160.48C1269.46,-144.01 1210.01,-119.35 1157,-102 1112.01,-87.27 1061.81,-73.69 1017.6,-62.66"/>
470
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1018.32,-59.95 1009.88,-60.74 1016.97,-65.38 1018.32,-59.95"/>
471
- <text xml:space="preserve" text-anchor="middle" x="1243.75" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">POLICY block</text>
472
- <text xml:space="preserve" text-anchor="middle" x="1243.75" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">advisory only</text>
470
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1309.52,-160.48C1271.46,-144.01 1212.01,-119.35 1159,-102 1114.01,-87.27 1063.81,-73.69 1019.6,-62.66"/>
471
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1020.32,-59.95 1011.88,-60.74 1018.97,-65.38 1020.32,-59.95"/>
472
+ <text xml:space="preserve" text-anchor="middle" x="1245.75" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">POLICY block</text>
473
+ <text xml:space="preserve" text-anchor="middle" x="1245.75" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">advisory only</text>
473
474
  </g>
474
475
  <!-- ReVal&#45;&gt;Fmem -->
475
476
  <g id="edge28" class="edge">
@@ -18,8 +18,8 @@
18
18
  </g>
19
19
  <g id="clust3" class="cluster">
20
20
  <title>cluster_entry</title>
21
- <path fill="#0c4a6e" stroke="#0369a1" stroke-width="2" d="M359,-476.62C359,-476.62 881,-476.62 881,-476.62 887,-476.62 893,-482.62 893,-488.62 893,-488.62 893,-550.12 893,-550.12 893,-556.12 887,-562.12 881,-562.12 881,-562.12 359,-562.12 359,-562.12 353,-562.12 347,-556.12 347,-550.12 347,-550.12 347,-488.62 347,-488.62 347,-482.62 353,-476.62 359,-476.62"/>
22
- <text xml:space="preserve" text-anchor="middle" x="620" y="-537.23" font-family="sans-Serif" font-size="22.00" fill="#7dd3fc">Entry Points &#160;(bin/)</text>
21
+ <path fill="#0c4a6e" stroke="#0369a1" stroke-width="2" d="M359,-476.62C359,-476.62 933,-476.62 933,-476.62 939,-476.62 945,-482.62 945,-488.62 945,-488.62 945,-550.12 945,-550.12 945,-556.12 939,-562.12 933,-562.12 933,-562.12 359,-562.12 359,-562.12 353,-562.12 347,-556.12 347,-550.12 347,-550.12 347,-488.62 347,-488.62 347,-482.62 353,-476.62 359,-476.62"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="646" y="-537.23" font-family="sans-Serif" font-size="22.00" fill="#7dd3fc">Entry Points &#160;(bin/)</text>
23
23
  </g>
24
24
  <g id="clust5" class="cluster">
25
25
  <title>cluster_agent</title>
@@ -92,16 +92,16 @@
92
92
  <!-- Cronb -->
93
93
  <g id="node8" class="node">
94
94
  <title>Cronb</title>
95
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M872.88,-520.62C872.88,-520.62 805.12,-520.62 805.12,-520.62 799.12,-520.62 793.12,-514.62 793.12,-508.62 793.12,-508.62 793.12,-496.62 793.12,-496.62 793.12,-490.62 799.12,-484.62 805.12,-484.62 805.12,-484.62 872.88,-484.62 872.88,-484.62 878.88,-484.62 884.88,-490.62 884.88,-496.62 884.88,-496.62 884.88,-508.62 884.88,-508.62 884.88,-514.62 878.88,-520.62 872.88,-520.62"/>
96
- <text xml:space="preserve" text-anchor="middle" x="839" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">⏱ &#160;PWN::Cron</text>
97
- <text xml:space="preserve" text-anchor="middle" x="839" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Scheduled jobs</text>
95
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M924.75,-520.62C924.75,-520.62 805.25,-520.62 805.25,-520.62 799.25,-520.62 793.25,-514.62 793.25,-508.62 793.25,-508.62 793.25,-496.62 793.25,-496.62 793.25,-490.62 799.25,-484.62 805.25,-484.62 805.25,-484.62 924.75,-484.62 924.75,-484.62 930.75,-484.62 936.75,-490.62 936.75,-496.62 936.75,-496.62 936.75,-508.62 936.75,-508.62 936.75,-514.62 930.75,-520.62 924.75,-520.62"/>
96
+ <text xml:space="preserve" text-anchor="middle" x="865" y="-505.68" font-family="sans-Serif" font-size="11.00" fill="#0f172a">⏱ &#160;PWN::Cron</text>
97
+ <text xml:space="preserve" text-anchor="middle" x="865" y="-492.18" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Jobs + background worker</text>
98
98
  </g>
99
99
  <!-- CI&#45;&gt;Cronb -->
100
100
  <g id="edge4" class="edge">
101
101
  <title>CI&#45;&gt;Cronb</title>
102
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M729.33,-628.43C751.35,-603.37 792.06,-557.05 817.2,-528.43"/>
103
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="819.07,-530.55 822.25,-522.69 814.86,-526.85 819.07,-530.55"/>
104
- <text xml:space="preserve" text-anchor="middle" x="795.62" y="-572.08" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">crontab</text>
102
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M732.52,-628.43C759.35,-603.16 809.13,-556.26 839.44,-527.7"/>
103
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="841,-530.08 844.9,-522.56 837.16,-526.01 841,-530.08"/>
104
+ <text xml:space="preserve" text-anchor="middle" x="809.4" y="-572.08" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">crontab</text>
105
105
  </g>
106
106
  <!-- LLM -->
107
107
  <g id="node3" class="node">
@@ -174,7 +174,7 @@
174
174
  <!-- CLI&#45;&gt;Plugins -->
175
175
  <g id="edge18" class="edge">
176
176
  <title>CLI&#45;&gt;Plugins</title>
177
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M750.98,-484.02C758.25,-481.32 765.79,-478.73 773,-476.62 870.43,-448.16 897.12,-450.19 997,-432.12 1007.86,-430.16 1038.85,-432.53 1046,-424.12 1081.98,-381.79 1083.86,-339.78 1046,-299.12 1018.06,-269.13 346.65,-264.99 310,-246.62 292.78,-238 278.65,-221.52 268.89,-207.34"/>
177
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M750.97,-483.98C758.24,-481.28 765.78,-478.71 773,-476.62 891.7,-442.34 967.31,-519.39 1046,-424.12 1081.38,-381.29 1083.86,-339.78 1046,-299.12 1018.06,-269.13 346.65,-264.99 310,-246.62 292.78,-238 278.65,-221.52 268.89,-207.34"/>
178
178
  <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="271.45,-206.15 264.73,-200.99 266.77,-209.21 271.45,-206.15"/>
179
179
  </g>
180
180
  <!-- Prompt -->
@@ -190,9 +190,9 @@
190
190
  <!-- Loop&#45;&gt;LLM -->
191
191
  <g id="edge29" class="edge">
192
192
  <title>Loop&#45;&gt;LLM</title>
193
- <path fill="none" stroke="#c4b5fd" stroke-width="2" d="M408.22,-383.26C428.04,-398.63 452.81,-414.95 478,-424.12 515.73,-437.87 528.09,-427.7 568,-432.12 642.64,-440.4 853.52,-420.13 903,-476.62 935.41,-513.62 919.64,-574.27 904.71,-612.03"/>
194
- <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="2" points="902.2,-610.78 901.73,-619.24 907.37,-612.93 902.2,-610.78"/>
195
- <text xml:space="preserve" text-anchor="middle" x="946.73" y="-499.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">tool&#45;use API</text>
193
+ <path fill="none" stroke="#c4b5fd" stroke-width="2" d="M408.22,-383.26C428.04,-398.63 452.81,-414.95 478,-424.12 515.73,-437.87 528.05,-428.05 568,-432.12 654.12,-440.9 897.39,-412.01 955,-476.62 990.42,-516.35 950.47,-577.24 919.12,-614.13"/>
194
+ <polygon fill="#c4b5fd" stroke="#c4b5fd" stroke-width="2" points="917.33,-611.92 914.18,-619.79 921.55,-615.6 917.33,-611.92"/>
195
+ <text xml:space="preserve" text-anchor="middle" x="993.61" y="-499.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">tool&#45;use API</text>
196
196
  </g>
197
197
  <!-- Loop&#45;&gt;Plugins -->
198
198
  <g id="edge10" class="edge">
@@ -400,9 +400,9 @@
400
400
  <!-- Reports&#45;&gt;User -->
401
401
  <g id="edge32" class="edge">
402
402
  <title>Reports&#45;&gt;User</title>
403
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1134.52,-199.46C1143.96,-213.15 1158.13,-232.17 1173,-246.62 1177.34,-250.84 1180.28,-249.86 1184,-254.62 1230.64,-314.32 1238.74,-357.87 1202,-424.12 1074.31,-654.41 895.95,-548.78 641,-614.62 630.5,-617.34 619.48,-620.86 608.99,-624.55"/>
404
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="608.12,-621.89 601.56,-627.25 610.03,-627.15 608.12,-621.89"/>
405
- <text xml:space="preserve" text-anchor="middle" x="1212.2" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">findings</text>
403
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1134.52,-199.46C1143.96,-213.15 1158.13,-232.17 1173,-246.62 1177.34,-250.84 1180.28,-249.86 1184,-254.62 1230.64,-314.32 1234.96,-355.91 1202,-424.12 1087.43,-661.21 896.54,-551.12 641,-614.62 630.25,-617.3 618.97,-620.87 608.28,-624.64"/>
404
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="607.64,-621.89 601.08,-627.25 609.56,-627.15 607.64,-621.89"/>
405
+ <text xml:space="preserve" text-anchor="middle" x="1212.78" y="-434.07" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">findings</text>
406
406
  </g>
407
407
  <!-- CronF -->
408
408
  <g id="node30" class="node">
@@ -82,7 +82,7 @@
82
82
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M418.38,-1210.75C418.38,-1213.78 379.83,-1216.25 332.38,-1216.25 284.92,-1216.25 246.38,-1213.78 246.38,-1210.75 246.38,-1210.75 246.38,-1161.25 246.38,-1161.25 246.38,-1158.22 284.92,-1155.75 332.38,-1155.75 379.83,-1155.75 418.38,-1158.22 418.38,-1161.25 418.38,-1161.25 418.38,-1210.75 418.38,-1210.75"/>
83
83
  <path fill="none" stroke="#334155" stroke-width="1.3" d="M418.38,-1210.75C418.38,-1207.72 379.83,-1205.25 332.38,-1205.25 284.92,-1205.25 246.38,-1207.72 246.38,-1210.75"/>
84
84
  <text xml:space="preserve" text-anchor="middle" x="332.38" y="-1194.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skills/&lt;name&gt;/SKILL.md</text>
85
- <text xml:space="preserve" text-anchor="middle" x="332.38" y="-1182.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">agentskills.io spec</text>
85
+ <text xml:space="preserve" text-anchor="middle" x="332.38" y="-1182.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">agentskills.io + default_skills seed</text>
86
86
  <text xml:space="preserve" text-anchor="middle" x="332.38" y="-1170.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">name+description frontmatter + refs</text>
87
87
  </g>
88
88
  <!-- Root&#45;&gt;skl -->
@@ -85,14 +85,15 @@
85
85
  <!-- Fire -->
86
86
  <g id="node6" class="node">
87
87
  <title>Fire</title>
88
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M564.88,-124C564.88,-124 457.38,-124 457.38,-124 451.38,-124 445.38,-118 445.38,-112 445.38,-112 445.38,-100 445.38,-100 445.38,-94 451.38,-88 457.38,-88 457.38,-88 564.88,-88 564.88,-88 570.88,-88 576.88,-94 576.88,-100 576.88,-100 576.88,-112 576.88,-112 576.88,-118 570.88,-124 564.88,-124"/>
89
- <text xml:space="preserve" text-anchor="middle" x="511.12" y="-102.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">crontab → PWN::Cron.run</text>
88
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M547.25,-124C547.25,-124 475,-124 475,-124 469,-124 463,-118 463,-112 463,-112 463,-100 463,-100 463,-94 469,-88 475,-88 475,-88 547.25,-88 547.25,-88 553.25,-88 559.25,-94 559.25,-100 559.25,-100 559.25,-112 559.25,-112 559.25,-118 553.25,-124 547.25,-124"/>
89
+ <text xml:space="preserve" text-anchor="middle" x="511.12" y="-108.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">worker / crontab</text>
90
+ <text xml:space="preserve" text-anchor="middle" x="511.12" y="-96.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">→ PWN::Cron.run</text>
90
91
  </g>
91
92
  <!-- Cron&#45;&gt;Fire -->
92
93
  <g id="edge5" class="edge">
93
94
  <title>Cron&#45;&gt;Fire</title>
94
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M321.78,-106C352.43,-106 397.14,-106 435.31,-106"/>
95
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="434.89,-108.8 442.89,-106 434.89,-103.2 434.89,-108.8"/>
95
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M321.78,-106C357.21,-106 411.43,-106 452.61,-106"/>
96
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="452.55,-108.8 460.55,-106 452.55,-103.2 452.55,-108.8"/>
96
97
  </g>
97
98
  <!-- Resume -->
98
99
  <g id="node7" class="node">
@@ -123,8 +124,8 @@
123
124
  <!-- Fire&#45;&gt;Next -->
124
125
  <g id="edge8" class="edge">
125
126
  <title>Fire&#45;&gt;Next</title>
126
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M577.44,-106C607.81,-106 643.74,-106 673.7,-106"/>
127
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="673.65,-108.8 681.65,-106 673.65,-103.2 673.65,-108.8"/>
127
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M559.85,-106C593.17,-106 637.95,-106 674.01,-106"/>
128
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="673.96,-108.8 681.96,-106 673.96,-103.2 673.96,-108.8"/>
128
129
  </g>
129
130
  <!-- Resume&#45;&gt;Next -->
130
131
  <g id="edge9" class="edge">
@@ -61,8 +61,7 @@ $ pwn --ai "run bin/pwn_sast against ./src and push findings to DefectDojo"
61
61
  [Registry](Agent-Tool-Registry.md). **ToolGuard** runs first on `shell` and
62
62
  `pwn_eval`: it maps common wrong keys (`value`/`cmd`) onto the schema, drops
63
63
  placeholder payloads (`...`, `{...}`), refuses bash-only syntax unless
64
- `ai.agent.shell_bash` is on, and blocks live sweeps unless the request is
65
- in-scope or `ai.agent.recon_authorized` is true. **Metrics** records
64
+ `ai.agent.shell_bash` is on. **Metrics** records
66
65
  `duration/success/engine` (via `Reward.semantic_ok` - `grep` exit 1 ≠
67
66
  failure); **Policy.observe_step** records the hygiene reward for that tool. Dispatch is *tolerant* - Levenshtein-repairs near-miss tool names
68
67
  and cleans up almost-JSON args, fingerprinting every repair into
@@ -110,7 +109,7 @@ The two that matter most:
110
109
  | Tool | Reach |
111
110
  |---|---|
112
111
  | `pwn_eval` | **Any** Ruby in-process - the whole `PWN::` namespace, `require`, monkey-patch, everything |
113
- | `shell` | **Any** OS command on the host. Runs through `PWN::AI::Agent::ToolGuard` first (placeholder, schema, bash-only syntax, unauthorized recon). |
112
+ | `shell` | **Any** OS command on the host. Runs through `PWN::AI::Agent::ToolGuard` first (placeholder, schema, bash-only syntax). |
114
113
 
115
114
  Everything else (memory, skills, learning, **mistakes**, **reward**,
116
115
  **curriculum**, **policy**, extrospection, cron, swarm, sessions, metrics) is a
@@ -220,11 +219,9 @@ for cheap short-circuits. Everything else is a goal: TaskSummarizer compass + CO
220
219
  | How-to | "how to do a ping sweep of a subnet using hping3?" | Short explanation with example commands only. No tools. |
221
220
  | Greeting | "Howdy, it's cloudy." / "hi" | Fixed short ack. No tools, no LLM, no weather echo. |
222
221
  | Recall | "what did I just say?" / "how did you respond?" | Cheap prior-turn answer from the session transcript. |
223
- | Live recon | "using hping3 what live hosts can you find in this subnet?" | Needs in-scope / authorized wording, or `ai.agent.recon_authorized=true`. |
224
- | Goal | "refactor Loop.run and run rubocop" / "what color is a cherry" | Task compass + CORE_TOOLS. There is no statement/question type. |
222
+ | Goal | "refactor Loop.run" / "find live hosts on this subnet" / "what color is a cherry" | Task compass + CORE_TOOLS. There is no statement/question type. |
225
223
 
226
- The `shell` tool also blocks hping3 / nmap-style sweep commands when recon is
227
- not authorized. On how-to asks, memory SOPs about repo rubocop/rake hygiene are
224
+ On how-to asks, memory SOPs about repo rubocop/rake hygiene are
228
225
  kept out of the prompt so the model does not pivot into unrelated verification.
229
226
 
230
227
  Keyword routing, unfinished-goal resume (`continue` / `resume`), and