pwn 0.5.621 → 0.5.626

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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -2
  3. data/Gemfile +1 -1
  4. data/README.md +7 -1
  5. data/bin/pwn_gqrx_scanner +78 -9
  6. data/documentation/Agent-Tool-Registry.md +3 -3
  7. data/documentation/Configuration.md +301 -47
  8. data/documentation/Cron.md +5 -3
  9. data/documentation/Diagrams.md +1 -1
  10. data/documentation/Extrospection.md +472 -26
  11. data/documentation/FFI.md +72 -8
  12. data/documentation/Home.md +4 -4
  13. data/documentation/How-PWN-Works.md +7 -3
  14. data/documentation/Mistakes.md +9 -0
  15. data/documentation/SDR.md +83 -10
  16. data/documentation/Skills-Memory-Learning.md +101 -11
  17. data/documentation/diagrams/agent-tool-registry.svg +56 -55
  18. data/documentation/diagrams/ai-integration-tool-calling.svg +24 -24
  19. data/documentation/diagrams/aws-cloud-security.svg +25 -25
  20. data/documentation/diagrams/burp-vs-zap-preference.svg +12 -12
  21. data/documentation/diagrams/code-scanning-sast.svg +25 -25
  22. data/documentation/diagrams/cron-scheduling.svg +23 -23
  23. data/documentation/diagrams/dot/agent-tool-registry.dot +2 -2
  24. data/documentation/diagrams/dot/extrospection-world-awareness.dot +33 -6
  25. data/documentation/diagrams/dot/hardware-hacking.dot +3 -1
  26. data/documentation/diagrams/dot/memory-skills-detailed.dot +4 -2
  27. data/documentation/diagrams/dot/mistakes-negative-feedback.dot +4 -2
  28. data/documentation/diagrams/dot/overall-pwn-architecture.dot +3 -3
  29. data/documentation/diagrams/dot/persistence-filesystem.dot +3 -3
  30. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +10 -4
  31. data/documentation/diagrams/dot/sdr-radio-flow.dot +39 -16
  32. data/documentation/diagrams/driver-framework.svg +13 -13
  33. data/documentation/diagrams/extrospection-world-awareness.svg +383 -177
  34. data/documentation/diagrams/fuzzing-workflow.svg +24 -24
  35. data/documentation/diagrams/hardware-hacking.svg +84 -69
  36. data/documentation/diagrams/history-to-drivers.svg +18 -18
  37. data/documentation/diagrams/memory-skills-detailed.svg +137 -120
  38. data/documentation/diagrams/mistakes-negative-feedback.svg +152 -137
  39. data/documentation/diagrams/network-infra-testing.svg +27 -27
  40. data/documentation/diagrams/overall-pwn-architecture.svg +97 -97
  41. data/documentation/diagrams/penetration-testing-workflow.svg +30 -30
  42. data/documentation/diagrams/persistence-filesystem.svg +100 -94
  43. data/documentation/diagrams/plugin-ecosystem.svg +35 -35
  44. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +254 -207
  45. data/documentation/diagrams/pwn-repl-prototyping.svg +20 -20
  46. data/documentation/diagrams/reporting-pipeline.svg +18 -18
  47. data/documentation/diagrams/reverse-engineering-flow.svg +21 -21
  48. data/documentation/diagrams/sdr-radio-flow.svg +223 -91
  49. data/documentation/diagrams/sessions-cron-automation.svg +18 -18
  50. data/documentation/diagrams/swarm-multi-agent.svg +39 -39
  51. data/documentation/diagrams/web-application-testing.svg +26 -26
  52. data/documentation/diagrams/zero-day-research-flow.svg +25 -25
  53. data/documentation/pwn-ai-Agent.md +16 -10
  54. data/documentation/pwn_silent_help_learn_demo.gif +0 -0
  55. data/lib/pwn/ai/agent/assembly.rb +1 -1
  56. data/lib/pwn/ai/agent/btc.rb +1 -1
  57. data/lib/pwn/ai/agent/burp_suite.rb +1 -1
  58. data/lib/pwn/ai/agent/extrospection.rb +2562 -57
  59. data/lib/pwn/ai/agent/gqrx.rb +2 -2
  60. data/lib/pwn/ai/agent/hacker_one.rb +1 -1
  61. data/lib/pwn/ai/agent/learning.rb +16 -16
  62. data/lib/pwn/ai/agent/loop.rb +1 -1
  63. data/lib/pwn/ai/agent/{introspection.rb → reflect.rb} +12 -12
  64. data/lib/pwn/ai/agent/sast.rb +1 -1
  65. data/lib/pwn/ai/agent/tools/extrospection.rb +311 -8
  66. data/lib/pwn/ai/agent/tools/learning.rb +7 -7
  67. data/lib/pwn/ai/agent/transparent_browser.rb +1 -1
  68. data/lib/pwn/ai/agent/vuln_gen.rb +2 -2
  69. data/lib/pwn/ai/agent.rb +1 -1
  70. data/lib/pwn/ai/open_ai.rb +10 -6
  71. data/lib/pwn/config.rb +5 -4
  72. data/lib/pwn/ffi/adalm_pluto.rb +498 -0
  73. data/lib/pwn/ffi/fftw.rb +192 -0
  74. data/lib/pwn/ffi/hack_rf.rb +193 -0
  75. data/lib/pwn/ffi/liquid.rb +244 -0
  76. data/lib/pwn/ffi/rtl_sdr.rb +210 -0
  77. data/lib/pwn/ffi/soapy_sdr.rb +177 -0
  78. data/lib/pwn/ffi/stdio.rb +9 -1
  79. data/lib/pwn/ffi/volk.rb +241 -0
  80. data/lib/pwn/ffi.rb +45 -2
  81. data/lib/pwn/plugins/burp_suite.rb +2 -2
  82. data/lib/pwn/sast/pom_version.rb +2 -2
  83. data/lib/pwn/sast/test_case_engine.rb +1 -1
  84. data/lib/pwn/sdr/decoder/adsb.rb +201 -12
  85. data/lib/pwn/sdr/decoder/apt.rb +19 -5
  86. data/lib/pwn/sdr/decoder/base.rb +314 -1
  87. data/lib/pwn/sdr/decoder/bluetooth.rb +91 -18
  88. data/lib/pwn/sdr/decoder/dect.rb +81 -23
  89. data/lib/pwn/sdr/decoder/dsp.rb +229 -15
  90. data/lib/pwn/sdr/decoder/flex.rb +23 -6
  91. data/lib/pwn/sdr/decoder/gps.rb +80 -18
  92. data/lib/pwn/sdr/decoder/gsm.rb +83 -28
  93. data/lib/pwn/sdr/decoder/iridium.rb +80 -18
  94. data/lib/pwn/sdr/decoder/lora.rb +84 -28
  95. data/lib/pwn/sdr/decoder/lte.rb +80 -18
  96. data/lib/pwn/sdr/decoder/morse.rb +23 -6
  97. data/lib/pwn/sdr/decoder/p25.rb +90 -31
  98. data/lib/pwn/sdr/decoder/pager.rb +23 -6
  99. data/lib/pwn/sdr/decoder/pocsag.rb +23 -6
  100. data/lib/pwn/sdr/decoder/rds.rb +219 -52
  101. data/lib/pwn/sdr/decoder/rfid.rb +81 -27
  102. data/lib/pwn/sdr/decoder/rtl433.rb +85 -27
  103. data/lib/pwn/sdr/decoder/rtty.rb +23 -6
  104. data/lib/pwn/sdr/decoder/wifi.rb +86 -32
  105. data/lib/pwn/sdr/decoder/zigbee.rb +88 -35
  106. data/lib/pwn/sdr/decoder.rb +6 -5
  107. data/lib/pwn/sdr/frequency_allocation.rb +124 -81
  108. data/lib/pwn/sdr/gqrx.rb +1513 -165
  109. data/lib/pwn/version.rb +1 -1
  110. data/spec/lib/pwn/ai/agent/extrospection_spec.rb +96 -0
  111. data/spec/lib/pwn/ai/agent/{introspection_spec.rb → reflect_spec.rb} +3 -3
  112. data/spec/lib/pwn/ai/agent/tools/extrospection_spec.rb +8 -24
  113. data/spec/lib/pwn/ffi/adalm_pluto_spec.rb +37 -0
  114. data/spec/lib/pwn/ffi/fftw_spec.rb +26 -0
  115. data/spec/lib/pwn/ffi/hack_rf_spec.rb +25 -0
  116. data/spec/lib/pwn/ffi/liquid_spec.rb +42 -0
  117. data/spec/lib/pwn/ffi/rtl_sdr_spec.rb +24 -0
  118. data/spec/lib/pwn/ffi/soapy_sdr_spec.rb +25 -0
  119. data/spec/lib/pwn/ffi/volk_spec.rb +36 -0
  120. data/spec/lib/pwn/sdr/decoder/base_iq_spec.rb +65 -0
  121. data/spec/lib/pwn/sdr/decoder/dsp_spec.rb +50 -4
  122. data/spec/lib/pwn/sdr/decoder/rds_spec.rb +45 -4
  123. data/third_party/pwn_rdoc.jsonl +279 -30
  124. metadata +21 -5
@@ -4,263 +4,278 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Mistakes_Negative_Feedback Pages: 1 -->
7
- <svg width="959pt" height="895pt"
8
- viewBox="0.00 0.00 959.00 895.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 852.14)">
7
+ <svg width="1042pt" height="908pt"
8
+ viewBox="0.00 0.00 1042.00 908.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 864.64)">
10
10
  <title>PWN_Mistakes_Negative_Feedback</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-852.14 916.2,-852.14 916.2,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="179.62" y="-786.94" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::Mistakes — Negative&#45;Feedback Loop</text>
13
- <text xml:space="preserve" text-anchor="start" x="260.25" y="-775.49" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#94a3b8">learn from mistakes · do NOT repeat them · cross&#45;session · self&#45;correcting</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-864.64 999.2,-864.64 999.2,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="221.12" y="-799.44" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::Mistakes — Negative&#45;Feedback Loop</text>
13
+ <text xml:space="preserve" text-anchor="start" x="301.75" y="-787.99" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">learn from mistakes · do NOT repeat them · cross&#45;session · self&#45;correcting</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_in</title>
16
- <path fill="#450a0a" stroke="#b91c1c" stroke-dasharray="5,2" d="M20,-678.69C20,-678.69 737,-678.69 737,-678.69 743,-678.69 749,-684.69 749,-690.69 749,-690.69 749,-749.94 749,-749.94 749,-755.94 743,-761.94 737,-761.94 737,-761.94 20,-761.94 20,-761.94 14,-761.94 8,-755.94 8,-749.94 8,-749.94 8,-690.69 8,-690.69 8,-684.69 14,-678.69 20,-678.69"/>
17
- <text xml:space="preserve" text-anchor="middle" x="378.5" y="-738.94" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#fecaca">Four ingest paths</text>
16
+ <path fill="#450a0a" stroke="#b91c1c" stroke-dasharray="5,2" d="M20,-678.69C20,-678.69 936,-678.69 936,-678.69 942,-678.69 948,-684.69 948,-690.69 948,-690.69 948,-762.44 948,-762.44 948,-768.44 942,-774.44 936,-774.44 936,-774.44 20,-774.44 20,-774.44 14,-774.44 8,-768.44 8,-762.44 8,-762.44 8,-690.69 8,-690.69 8,-684.69 14,-678.69 20,-678.69"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="478" y="-751.44" font-family="sans-Serif" font-size="20.00" fill="#fecaca">Five ingest paths</text>
18
18
  </g>
19
19
  <g id="clust3" class="cluster">
20
20
  <title>cluster_fp</title>
21
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M170,-536.44C170,-536.44 590,-536.44 590,-536.44 596,-536.44 602,-542.44 602,-548.44 602,-548.44 602,-620.19 602,-620.19 602,-626.19 596,-632.19 590,-632.19 590,-632.19 170,-632.19 170,-632.19 164,-632.19 158,-626.19 158,-620.19 158,-620.19 158,-548.44 158,-548.44 158,-542.44 164,-536.44 170,-536.44"/>
22
- <text xml:space="preserve" text-anchor="middle" x="380" y="-609.19" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#a7f3d0">Fingerprint &#160;(stable across sessions)</text>
21
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M185,-536.44C185,-536.44 605,-536.44 605,-536.44 611,-536.44 617,-542.44 617,-548.44 617,-548.44 617,-620.19 617,-620.19 617,-626.19 611,-632.19 605,-632.19 605,-632.19 185,-632.19 185,-632.19 179,-632.19 173,-626.19 173,-620.19 173,-620.19 173,-548.44 173,-548.44 173,-542.44 179,-536.44 185,-536.44"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="395" y="-609.19" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Fingerprint &#160;(stable across sessions)</text>
23
23
  </g>
24
24
  <g id="clust5" class="cluster">
25
25
  <title>cluster_react</title>
26
- <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M295,-230.75C295,-230.75 853,-230.75 853,-230.75 859,-230.75 865,-236.75 865,-242.75 865,-242.75 865,-328 865,-328 865,-334 859,-340 853,-340 853,-340 295,-340 295,-340 289,-340 283,-334 283,-328 283,-328 283,-242.75 283,-242.75 283,-236.75 289,-230.75 295,-230.75"/>
27
- <text xml:space="preserve" text-anchor="middle" x="574" y="-317" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#ddd6fe">Reactions inside Loop.run</text>
26
+ <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M310,-230.75C310,-230.75 868,-230.75 868,-230.75 874,-230.75 880,-236.75 880,-242.75 880,-242.75 880,-328 880,-328 880,-334 874,-340 868,-340 868,-340 310,-340 310,-340 304,-340 298,-334 298,-328 298,-328 298,-242.75 298,-242.75 298,-236.75 304,-230.75 310,-230.75"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="589" y="-317" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Reactions inside Loop.run</text>
28
28
  </g>
29
29
  <g id="clust7" class="cluster">
30
30
  <title>cluster_out</title>
31
- <path fill="#422006" stroke="#a16207" stroke-width="2" d="M162,-110.5C162,-110.5 653,-110.5 653,-110.5 659,-110.5 665,-116.5 665,-122.5 665,-122.5 665,-181.75 665,-181.75 665,-187.75 659,-193.75 653,-193.75 653,-193.75 162,-193.75 162,-193.75 156,-193.75 150,-187.75 150,-181.75 150,-181.75 150,-122.5 150,-122.5 150,-116.5 156,-110.5 162,-110.5"/>
32
- <text xml:space="preserve" text-anchor="middle" x="407.5" y="-170.75" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#fde68a">Injected into every future prompt</text>
31
+ <path fill="#422006" stroke="#a16207" stroke-width="2" d="M177,-110.5C177,-110.5 668,-110.5 668,-110.5 674,-110.5 680,-116.5 680,-122.5 680,-122.5 680,-181.75 680,-181.75 680,-187.75 674,-193.75 668,-193.75 668,-193.75 177,-193.75 177,-193.75 171,-193.75 165,-187.75 165,-181.75 165,-181.75 165,-122.5 165,-122.5 165,-116.5 171,-110.5 177,-110.5"/>
32
+ <text xml:space="preserve" text-anchor="middle" x="422.5" y="-170.75" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Injected into every future prompt</text>
33
33
  </g>
34
34
  <!-- ToolFail -->
35
35
  <g id="node1" class="node">
36
36
  <title>ToolFail</title>
37
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M143.5,-722.69C143.5,-722.69 28.5,-722.69 28.5,-722.69 22.5,-722.69 16.5,-716.69 16.5,-710.69 16.5,-710.69 16.5,-698.69 16.5,-698.69 16.5,-692.69 22.5,-686.69 28.5,-686.69 28.5,-686.69 143.5,-686.69 143.5,-686.69 149.5,-686.69 155.5,-692.69 155.5,-698.69 155.5,-698.69 155.5,-710.69 155.5,-710.69 155.5,-716.69 149.5,-722.69 143.5,-722.69"/>
38
- <text xml:space="preserve" text-anchor="middle" x="86" y="-707.74" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">:tool</text>
39
- <text xml:space="preserve" text-anchor="middle" x="86" y="-694.24" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">Dispatch → success:false</text>
37
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M143.5,-728.94C143.5,-728.94 28.5,-728.94 28.5,-728.94 22.5,-728.94 16.5,-722.94 16.5,-716.94 16.5,-716.94 16.5,-704.94 16.5,-704.94 16.5,-698.94 22.5,-692.94 28.5,-692.94 28.5,-692.94 143.5,-692.94 143.5,-692.94 149.5,-692.94 155.5,-698.94 155.5,-704.94 155.5,-704.94 155.5,-716.94 155.5,-716.94 155.5,-722.94 149.5,-728.94 143.5,-728.94"/>
38
+ <text xml:space="preserve" text-anchor="middle" x="86" y="-713.99" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:tool</text>
39
+ <text xml:space="preserve" text-anchor="middle" x="86" y="-700.49" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Dispatch → success:false</text>
40
40
  </g>
41
41
  <!-- Norm -->
42
- <g id="node5" class="node">
42
+ <g id="node6" class="node">
43
43
  <title>Norm</title>
44
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M332,-592.94C332,-592.94 178,-592.94 178,-592.94 172,-592.94 166,-586.94 166,-580.94 166,-580.94 166,-556.44 166,-556.44 166,-550.44 172,-544.44 178,-544.44 178,-544.44 332,-544.44 332,-544.44 338,-544.44 344,-550.44 344,-556.44 344,-556.44 344,-580.94 344,-580.94 344,-586.94 338,-592.94 332,-592.94"/>
45
- <text xml:space="preserve" text-anchor="middle" x="255" y="-578.49" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">normalize_error()</text>
46
- <text xml:space="preserve" text-anchor="middle" x="255" y="-564.99" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">strip paths · :LINE · 0xADDR</text>
47
- <text xml:space="preserve" text-anchor="middle" x="255" y="-551.49" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">port N · TIMESTAMP · UUID · pid</text>
44
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M347,-592.94C347,-592.94 193,-592.94 193,-592.94 187,-592.94 181,-586.94 181,-580.94 181,-580.94 181,-556.44 181,-556.44 181,-550.44 187,-544.44 193,-544.44 193,-544.44 347,-544.44 347,-544.44 353,-544.44 359,-550.44 359,-556.44 359,-556.44 359,-580.94 359,-580.94 359,-586.94 353,-592.94 347,-592.94"/>
45
+ <text xml:space="preserve" text-anchor="middle" x="270" y="-578.49" font-family="sans-Serif" font-size="11.00" fill="#0f172a">normalize_error()</text>
46
+ <text xml:space="preserve" text-anchor="middle" x="270" y="-564.99" font-family="sans-Serif" font-size="11.00" fill="#0f172a">strip paths · :LINE · 0xADDR</text>
47
+ <text xml:space="preserve" text-anchor="middle" x="270" y="-551.49" font-family="sans-Serif" font-size="11.00" fill="#0f172a">port N · TIMESTAMP · UUID · pid</text>
48
48
  </g>
49
49
  <!-- ToolFail&#45;&gt;Norm -->
50
50
  <g id="edge1" class="edge">
51
51
  <title>ToolFail&#45;&gt;Norm</title>
52
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M108.09,-686.17C135.76,-664.23 183.59,-626.31 217.14,-599.71"/>
53
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="218.84,-601.93 223.37,-594.77 215.36,-597.54 218.84,-601.93"/>
54
- <text xml:space="preserve" text-anchor="middle" x="181.56" y="-642.14" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">record()</text>
52
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M108.93,-692.46C139.51,-669.15 194.08,-627.55 231.14,-599.31"/>
53
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="232.54,-601.76 237.21,-594.68 229.15,-597.31 232.54,-601.76"/>
54
+ <text xml:space="preserve" text-anchor="middle" x="188.61" y="-642.14" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">record()</text>
55
55
  </g>
56
56
  <!-- LoopFail -->
57
57
  <g id="node2" class="node">
58
58
  <title>LoopFail</title>
59
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M329.38,-722.69C329.38,-722.69 210.62,-722.69 210.62,-722.69 204.62,-722.69 198.62,-716.69 198.62,-710.69 198.62,-710.69 198.62,-698.69 198.62,-698.69 198.62,-692.69 204.62,-686.69 210.62,-686.69 210.62,-686.69 329.38,-686.69 329.38,-686.69 335.38,-686.69 341.38,-692.69 341.38,-698.69 341.38,-698.69 341.38,-710.69 341.38,-710.69 341.38,-716.69 335.38,-722.69 329.38,-722.69"/>
60
- <text xml:space="preserve" text-anchor="middle" x="270" y="-707.74" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">:loop</text>
61
- <text xml:space="preserve" text-anchor="middle" x="270" y="-694.24" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">iteration budget exhausted</text>
59
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M329.38,-728.94C329.38,-728.94 210.62,-728.94 210.62,-728.94 204.62,-728.94 198.62,-722.94 198.62,-716.94 198.62,-716.94 198.62,-704.94 198.62,-704.94 198.62,-698.94 204.62,-692.94 210.62,-692.94 210.62,-692.94 329.38,-692.94 329.38,-692.94 335.38,-692.94 341.38,-698.94 341.38,-704.94 341.38,-704.94 341.38,-716.94 341.38,-716.94 341.38,-722.94 335.38,-728.94 329.38,-728.94"/>
60
+ <text xml:space="preserve" text-anchor="middle" x="270" y="-713.99" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:loop</text>
61
+ <text xml:space="preserve" text-anchor="middle" x="270" y="-700.49" font-family="sans-Serif" font-size="11.00" fill="#0f172a">iteration budget exhausted</text>
62
62
  </g>
63
63
  <!-- LoopFail&#45;&gt;Norm -->
64
64
  <g id="edge2" class="edge">
65
65
  <title>LoopFail&#45;&gt;Norm</title>
66
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M268.04,-686.17C265.69,-665.16 261.69,-629.48 258.74,-603.13"/>
67
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="261.56,-603.14 257.89,-595.5 256,-603.76 261.56,-603.14"/>
66
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M270,-692.46C270,-670.22 270,-631.34 270,-603.29"/>
67
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="272.8,-603.46 270,-595.46 267.2,-603.46 272.8,-603.46"/>
68
68
  </g>
69
69
  <!-- UserCorr -->
70
70
  <g id="node3" class="node">
71
71
  <title>UserCorr</title>
72
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M537.25,-722.69C537.25,-722.69 396.75,-722.69 396.75,-722.69 390.75,-722.69 384.75,-716.69 384.75,-710.69 384.75,-710.69 384.75,-698.69 384.75,-698.69 384.75,-692.69 390.75,-686.69 396.75,-686.69 396.75,-686.69 537.25,-686.69 537.25,-686.69 543.25,-686.69 549.25,-692.69 549.25,-698.69 549.25,-698.69 549.25,-710.69 549.25,-710.69 549.25,-716.69 543.25,-722.69 537.25,-722.69"/>
73
- <text xml:space="preserve" text-anchor="middle" x="467" y="-707.74" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">:user_correction</text>
74
- <text xml:space="preserve" text-anchor="middle" x="467" y="-694.24" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">&quot;no that&#39;s wrong&quot; / &quot;still broken&quot;</text>
72
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M928.25,-728.94C928.25,-728.94 787.75,-728.94 787.75,-728.94 781.75,-728.94 775.75,-722.94 775.75,-716.94 775.75,-716.94 775.75,-704.94 775.75,-704.94 775.75,-698.94 781.75,-692.94 787.75,-692.94 787.75,-692.94 928.25,-692.94 928.25,-692.94 934.25,-692.94 940.25,-698.94 940.25,-704.94 940.25,-704.94 940.25,-716.94 940.25,-716.94 940.25,-722.94 934.25,-728.94 928.25,-728.94"/>
73
+ <text xml:space="preserve" text-anchor="middle" x="858" y="-713.99" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:user_correction</text>
74
+ <text xml:space="preserve" text-anchor="middle" x="858" y="-700.49" font-family="sans-Serif" font-size="11.00" fill="#0f172a">&quot;no that&#39;s wrong&quot; / &quot;still broken&quot;</text>
75
75
  </g>
76
76
  <!-- Sig -->
77
- <g id="node6" class="node">
77
+ <g id="node7" class="node">
78
78
  <title>Sig</title>
79
- <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M582.25,-586.69C582.25,-586.69 441.75,-586.69 441.75,-586.69 435.75,-586.69 429.75,-580.69 429.75,-574.69 429.75,-574.69 429.75,-562.69 429.75,-562.69 429.75,-556.69 435.75,-550.69 441.75,-550.69 441.75,-550.69 582.25,-550.69 582.25,-550.69 588.25,-550.69 594.25,-556.69 594.25,-562.69 594.25,-562.69 594.25,-574.69 594.25,-574.69 594.25,-580.69 588.25,-586.69 582.25,-586.69"/>
80
- <text xml:space="preserve" text-anchor="middle" x="512" y="-571.74" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">signature = sha12(tool + norm)</text>
81
- <text xml:space="preserve" text-anchor="middle" x="512" y="-558.24" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">count++ &#160;(cross&#45;session)</text>
79
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M597.25,-586.69C597.25,-586.69 456.75,-586.69 456.75,-586.69 450.75,-586.69 444.75,-580.69 444.75,-574.69 444.75,-574.69 444.75,-562.69 444.75,-562.69 444.75,-556.69 450.75,-550.69 456.75,-550.69 456.75,-550.69 597.25,-550.69 597.25,-550.69 603.25,-550.69 609.25,-556.69 609.25,-562.69 609.25,-562.69 609.25,-574.69 609.25,-574.69 609.25,-580.69 603.25,-586.69 597.25,-586.69"/>
80
+ <text xml:space="preserve" text-anchor="middle" x="527" y="-571.74" font-family="sans-Serif" font-size="11.00" fill="#0f172a">signature = sha12(tool + norm)</text>
81
+ <text xml:space="preserve" text-anchor="middle" x="527" y="-558.24" font-family="sans-Serif" font-size="11.00" fill="#0f172a">count++ &#160;(cross&#45;session)</text>
82
82
  </g>
83
83
  <!-- UserCorr&#45;&gt;Sig -->
84
84
  <g id="edge3" class="edge">
85
85
  <title>UserCorr&#45;&gt;Sig</title>
86
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M472.88,-686.17C480.52,-663.42 493.93,-623.49 502.89,-596.81"/>
87
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="505.45,-597.98 505.35,-589.5 500.14,-596.2 505.45,-597.98"/>
88
- <text xml:space="preserve" text-anchor="middle" x="527.9" y="-642.14" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">+ flip_last_outcome</text>
86
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M816.41,-692.32C755.97,-666.7 643.92,-619.23 578.39,-591.46"/>
87
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="579.73,-588.99 571.27,-588.45 577.55,-594.15 579.73,-588.99"/>
88
+ <text xml:space="preserve" text-anchor="middle" x="752.07" y="-642.14" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">+ flip_last_outcome</text>
89
89
  </g>
90
90
  <!-- ModelRec -->
91
91
  <g id="node4" class="node">
92
92
  <title>ModelRec</title>
93
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M729.38,-722.69C729.38,-722.69 604.62,-722.69 604.62,-722.69 598.62,-722.69 592.62,-716.69 592.62,-710.69 592.62,-710.69 592.62,-698.69 592.62,-698.69 592.62,-692.69 598.62,-686.69 604.62,-686.69 604.62,-686.69 729.38,-686.69 729.38,-686.69 735.38,-686.69 741.38,-692.69 741.38,-698.69 741.38,-698.69 741.38,-710.69 741.38,-710.69 741.38,-716.69 735.38,-722.69 729.38,-722.69"/>
94
- <text xml:space="preserve" text-anchor="middle" x="667" y="-707.74" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">:model</text>
95
- <text xml:space="preserve" text-anchor="middle" x="667" y="-694.24" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">mistakes_record(tool, error)</text>
93
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M521.38,-728.94C521.38,-728.94 396.62,-728.94 396.62,-728.94 390.62,-728.94 384.62,-722.94 384.62,-716.94 384.62,-716.94 384.62,-704.94 384.62,-704.94 384.62,-698.94 390.62,-692.94 396.62,-692.94 396.62,-692.94 521.38,-692.94 521.38,-692.94 527.38,-692.94 533.38,-698.94 533.38,-704.94 533.38,-704.94 533.38,-716.94 533.38,-716.94 533.38,-722.94 527.38,-728.94 521.38,-728.94"/>
94
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-713.99" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:model</text>
95
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-700.49" font-family="sans-Serif" font-size="11.00" fill="#0f172a">mistakes_record(tool, error)</text>
96
96
  </g>
97
97
  <!-- ModelRec&#45;&gt;Sig -->
98
98
  <g id="edge4" class="edge">
99
99
  <title>ModelRec&#45;&gt;Sig</title>
100
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M646.74,-686.17C619.5,-662.63 570.96,-620.66 540.18,-594.05"/>
101
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="542.13,-592.04 534.25,-588.92 538.47,-596.27 542.13,-592.04"/>
100
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M467.47,-692.46C479.18,-668.31 500.4,-624.54 514.09,-596.31"/>
101
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="516.59,-597.58 517.56,-589.16 511.55,-595.13 516.59,-597.58"/>
102
102
  </g>
103
- <!-- Norm&#45;&gt;Sig -->
103
+ <!-- Verify -->
104
+ <g id="node5" class="node">
105
+ <title>Verify</title>
106
+ <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M721.12,-735.19C721.12,-735.19 588.88,-735.19 588.88,-735.19 582.88,-735.19 576.88,-729.19 576.88,-723.19 576.88,-723.19 576.88,-698.69 576.88,-698.69 576.88,-692.69 582.88,-686.69 588.88,-686.69 588.88,-686.69 721.12,-686.69 721.12,-686.69 727.12,-686.69 733.12,-692.69 733.12,-698.69 733.12,-698.69 733.12,-723.19 733.12,-723.19 733.12,-729.19 727.12,-735.19 721.12,-735.19"/>
107
+ <text xml:space="preserve" text-anchor="middle" x="655" y="-720.74" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:model (proactive)</text>
108
+ <text xml:space="preserve" text-anchor="middle" x="655" y="-707.24" font-family="sans-Serif" font-size="11.00" fill="#0f172a">extro_verify → :refuted</text>
109
+ <text xml:space="preserve" text-anchor="middle" x="655" y="-693.74" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(browser&#45;caught assumption)</text>
110
+ </g>
111
+ <!-- Verify&#45;&gt;Sig -->
104
112
  <g id="edge5" class="edge">
113
+ <title>Verify&#45;&gt;Sig</title>
114
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M633,-685.83C609.91,-660.53 573.76,-620.92 550.22,-595.13"/>
115
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="552.56,-593.54 545.09,-589.51 548.42,-597.31 552.56,-593.54"/>
116
+ <text xml:space="preserve" text-anchor="middle" x="622.29" y="-642.14" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">assumption</text>
117
+ </g>
118
+ <!-- Norm&#45;&gt;Sig -->
119
+ <g id="edge6" class="edge">
105
120
  <title>Norm&#45;&gt;Sig</title>
106
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M344.6,-568.69C369.42,-568.69 394.24,-568.69 419.07,-568.69"/>
107
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="418.99,-571.49 426.99,-568.69 418.99,-565.89 418.99,-571.49"/>
121
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M359.6,-568.69C384.42,-568.69 409.24,-568.69 434.07,-568.69"/>
122
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="433.99,-571.49 441.99,-568.69 433.99,-565.89 433.99,-571.49"/>
108
123
  </g>
109
124
  <!-- Store -->
110
- <g id="node7" class="node">
125
+ <g id="node8" class="node">
111
126
  <title>Store</title>
112
- <path fill="#fcd34d" stroke="#334155" stroke-width="2" d="M591.25,-455.88C591.25,-459.22 555.73,-461.94 512,-461.94 468.27,-461.94 432.75,-459.22 432.75,-455.88 432.75,-455.88 432.75,-401.31 432.75,-401.31 432.75,-397.97 468.27,-395.25 512,-395.25 555.73,-395.25 591.25,-397.97 591.25,-401.31 591.25,-401.31 591.25,-455.88 591.25,-455.88"/>
113
- <path fill="none" stroke="#334155" stroke-width="2" d="M591.25,-455.88C591.25,-452.53 555.73,-449.81 512,-449.81 468.27,-449.81 432.75,-452.53 432.75,-455.88"/>
114
- <text xml:space="preserve" text-anchor="middle" x="512" y="-438.39" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/mistakes.json</text>
115
- <text xml:space="preserve" text-anchor="middle" x="512" y="-424.89" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">{sig → tool·error·count·fix</text>
116
- <text xml:space="preserve" text-anchor="middle" x="512" y="-411.39" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a"> resolved·regressed·sessions}</text>
127
+ <path fill="#fcd34d" stroke="#334155" stroke-width="2" d="M606.25,-455.88C606.25,-459.22 570.73,-461.94 527,-461.94 483.27,-461.94 447.75,-459.22 447.75,-455.88 447.75,-455.88 447.75,-401.31 447.75,-401.31 447.75,-397.97 483.27,-395.25 527,-395.25 570.73,-395.25 606.25,-397.97 606.25,-401.31 606.25,-401.31 606.25,-455.88 606.25,-455.88"/>
128
+ <path fill="none" stroke="#334155" stroke-width="2" d="M606.25,-455.88C606.25,-452.53 570.73,-449.81 527,-449.81 483.27,-449.81 447.75,-452.53 447.75,-455.88"/>
129
+ <text xml:space="preserve" text-anchor="middle" x="527" y="-438.39" font-family="sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/mistakes.json</text>
130
+ <text xml:space="preserve" text-anchor="middle" x="527" y="-424.89" font-family="sans-Serif" font-size="11.00" fill="#0f172a">{sig → tool·error·count·fix</text>
131
+ <text xml:space="preserve" text-anchor="middle" x="527" y="-411.39" font-family="sans-Serif" font-size="11.00" fill="#0f172a"> resolved·regressed·sessions}</text>
117
132
  </g>
118
133
  <!-- Sig&#45;&gt;Store -->
119
- <g id="edge6" class="edge">
134
+ <g id="edge7" class="edge">
120
135
  <title>Sig&#45;&gt;Store</title>
121
- <path fill="none" stroke="#f59e0b" stroke-width="2" d="M512,-549.92C512,-530.73 512,-499.44 512,-473.58"/>
122
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="514.8,-473.91 512,-465.91 509.2,-473.91 514.8,-473.91"/>
123
- <text xml:space="preserve" text-anchor="middle" x="525.5" y="-499.89" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">persist</text>
136
+ <path fill="none" stroke="#f59e0b" stroke-width="2" d="M527,-549.92C527,-530.73 527,-499.44 527,-473.58"/>
137
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="529.8,-473.91 527,-465.91 524.2,-473.91 529.8,-473.91"/>
138
+ <text xml:space="preserve" text-anchor="middle" x="540.5" y="-499.89" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">persist</text>
124
139
  </g>
125
140
  <!-- Guard -->
126
- <g id="node8" class="node">
141
+ <g id="node9" class="node">
127
142
  <title>Guard</title>
128
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M845.12,-300.75C845.12,-300.75 682.88,-300.75 682.88,-300.75 676.88,-300.75 670.88,-294.75 670.88,-288.75 670.88,-288.75 670.88,-250.75 670.88,-250.75 670.88,-244.75 676.88,-238.75 682.88,-238.75 682.88,-238.75 845.12,-238.75 845.12,-238.75 851.12,-238.75 857.12,-244.75 857.12,-250.75 857.12,-250.75 857.12,-288.75 857.12,-288.75 857.12,-294.75 851.12,-300.75 845.12,-300.75"/>
129
- <text xml:space="preserve" text-anchor="middle" x="764" y="-286.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">guard_repeated_failure</text>
130
- <text xml:space="preserve" text-anchor="middle" x="764" y="-272.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">max(turn, PERSISTENT count) ≥ 3</text>
131
- <text xml:space="preserve" text-anchor="middle" x="764" y="-259.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">→ trips on 1st recurrence</text>
132
- <text xml:space="preserve" text-anchor="middle" x="764" y="-245.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">in a new session</text>
143
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M860.12,-300.75C860.12,-300.75 697.88,-300.75 697.88,-300.75 691.88,-300.75 685.88,-294.75 685.88,-288.75 685.88,-288.75 685.88,-250.75 685.88,-250.75 685.88,-244.75 691.88,-238.75 697.88,-238.75 697.88,-238.75 860.12,-238.75 860.12,-238.75 866.12,-238.75 872.12,-244.75 872.12,-250.75 872.12,-250.75 872.12,-288.75 872.12,-288.75 872.12,-294.75 866.12,-300.75 860.12,-300.75"/>
144
+ <text xml:space="preserve" text-anchor="middle" x="779" y="-286.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">guard_repeated_failure</text>
145
+ <text xml:space="preserve" text-anchor="middle" x="779" y="-272.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">max(turn, PERSISTENT count) ≥ 3</text>
146
+ <text xml:space="preserve" text-anchor="middle" x="779" y="-259.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ trips on 1st recurrence</text>
147
+ <text xml:space="preserve" text-anchor="middle" x="779" y="-245.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">in a new session</text>
133
148
  </g>
134
149
  <!-- Store&#45;&gt;Guard -->
135
- <g id="edge7" class="edge">
150
+ <g id="edge8" class="edge">
136
151
  <title>Store&#45;&gt;Guard</title>
137
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M564.21,-395.1C605.71,-369.27 663.68,-333.19 706.5,-306.54"/>
138
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="707.87,-308.99 713.18,-302.38 704.91,-304.23 707.87,-308.99"/>
139
- <text xml:space="preserve" text-anchor="middle" x="649.25" y="-350.32" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">count</text>
152
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M579.21,-395.1C620.71,-369.27 678.68,-333.19 721.5,-306.54"/>
153
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="722.87,-308.99 728.18,-302.38 719.91,-304.23 722.87,-308.99"/>
154
+ <text xml:space="preserve" text-anchor="middle" x="664.25" y="-350.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">count</text>
140
155
  </g>
141
156
  <!-- Hint -->
142
- <g id="node9" class="node">
157
+ <g id="node10" class="node">
143
158
  <title>Hint</title>
144
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M467.25,-300.75C467.25,-300.75 302.75,-300.75 302.75,-300.75 296.75,-300.75 290.75,-294.75 290.75,-288.75 290.75,-288.75 290.75,-250.75 290.75,-250.75 290.75,-244.75 296.75,-238.75 302.75,-238.75 302.75,-238.75 467.25,-238.75 467.25,-238.75 473.25,-238.75 479.25,-244.75 479.25,-250.75 479.25,-250.75 479.25,-288.75 479.25,-288.75 479.25,-294.75 473.25,-300.75 467.25,-300.75"/>
145
- <text xml:space="preserve" text-anchor="middle" x="385" y="-286.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">correction_hint</text>
146
- <text xml:space="preserve" text-anchor="middle" x="385" y="-272.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">append to failed result:</text>
147
- <text xml:space="preserve" text-anchor="middle" x="385" y="-259.3" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">&quot;seen N×, sig=…, KNOWN FIX: …&quot;</text>
148
- <text xml:space="preserve" text-anchor="middle" x="385" y="-245.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">→ self&#45;correct NEXT iter</text>
159
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M482.25,-300.75C482.25,-300.75 317.75,-300.75 317.75,-300.75 311.75,-300.75 305.75,-294.75 305.75,-288.75 305.75,-288.75 305.75,-250.75 305.75,-250.75 305.75,-244.75 311.75,-238.75 317.75,-238.75 317.75,-238.75 482.25,-238.75 482.25,-238.75 488.25,-238.75 494.25,-244.75 494.25,-250.75 494.25,-250.75 494.25,-288.75 494.25,-288.75 494.25,-294.75 488.25,-300.75 482.25,-300.75"/>
160
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-286.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">correction_hint</text>
161
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-272.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">append to failed result:</text>
162
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-259.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">&quot;seen N×, sig=…, KNOWN FIX: …&quot;</text>
163
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-245.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ self&#45;correct NEXT iter</text>
149
164
  </g>
150
165
  <!-- Store&#45;&gt;Hint -->
151
- <g id="edge8" class="edge">
166
+ <g id="edge9" class="edge">
152
167
  <title>Store&#45;&gt;Hint</title>
153
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M485.07,-394.33C464.79,-369.29 436.96,-334.92 415.8,-308.79"/>
154
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="418.19,-307.29 410.98,-302.83 413.84,-310.81 418.19,-307.29"/>
155
- <text xml:space="preserve" text-anchor="middle" x="463.23" y="-350.32" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">fix?</text>
168
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M500.07,-394.33C479.79,-369.29 451.96,-334.92 430.8,-308.79"/>
169
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="433.19,-307.29 425.98,-302.83 428.84,-310.81 433.19,-307.29"/>
170
+ <text xml:space="preserve" text-anchor="middle" x="478.23" y="-350.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">fix?</text>
156
171
  </g>
157
172
  <!-- Regr -->
158
- <g id="node10" class="node">
173
+ <g id="node11" class="node">
159
174
  <title>Regr</title>
160
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M616,-294C616,-294 534,-294 534,-294 528,-294 522,-288 522,-282 522,-282 522,-257.5 522,-257.5 522,-251.5 528,-245.5 534,-245.5 534,-245.5 616,-245.5 616,-245.5 622,-245.5 628,-251.5 628,-257.5 628,-257.5 628,-282 628,-282 628,-288 622,-294 616,-294"/>
161
- <text xml:space="preserve" text-anchor="middle" x="575" y="-279.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">[REGRESSED]</text>
162
- <text xml:space="preserve" text-anchor="middle" x="575" y="-266.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">resolved sig recurs</text>
163
- <text xml:space="preserve" text-anchor="middle" x="575" y="-252.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">→ reopen + tag</text>
175
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M631,-294C631,-294 549,-294 549,-294 543,-294 537,-288 537,-282 537,-282 537,-257.5 537,-257.5 537,-251.5 543,-245.5 549,-245.5 549,-245.5 631,-245.5 631,-245.5 637,-245.5 643,-251.5 643,-257.5 643,-257.5 643,-282 643,-282 643,-288 637,-294 631,-294"/>
176
+ <text xml:space="preserve" text-anchor="middle" x="590" y="-279.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">[REGRESSED]</text>
177
+ <text xml:space="preserve" text-anchor="middle" x="590" y="-266.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">resolved sig recurs</text>
178
+ <text xml:space="preserve" text-anchor="middle" x="590" y="-252.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ reopen + tag</text>
164
179
  </g>
165
180
  <!-- Store&#45;&gt;Regr -->
166
- <g id="edge9" class="edge">
181
+ <g id="edge10" class="edge">
167
182
  <title>Store&#45;&gt;Regr</title>
168
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M525.36,-394.33C536.15,-367.46 551.25,-329.87 561.96,-303.22"/>
169
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="564.43,-304.58 564.81,-296.11 559.23,-302.49 564.43,-304.58"/>
170
- <text xml:space="preserve" text-anchor="middle" x="576.12" y="-350.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">resolved∧recur</text>
183
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M540.36,-394.33C551.15,-367.46 566.25,-329.87 576.96,-303.22"/>
184
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="579.43,-304.58 579.81,-296.11 574.23,-302.49 579.43,-304.58"/>
185
+ <text xml:space="preserve" text-anchor="middle" x="591.12" y="-350.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">resolved∧recur</text>
171
186
  </g>
172
187
  <!-- KMist -->
173
- <g id="node11" class="node">
188
+ <g id="node12" class="node">
174
189
  <title>KMist</title>
175
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M644.5,-154.5C644.5,-154.5 499.5,-154.5 499.5,-154.5 493.5,-154.5 487.5,-148.5 487.5,-142.5 487.5,-142.5 487.5,-130.5 487.5,-130.5 487.5,-124.5 493.5,-118.5 499.5,-118.5 499.5,-118.5 644.5,-118.5 644.5,-118.5 650.5,-118.5 656.5,-124.5 656.5,-130.5 656.5,-130.5 656.5,-142.5 656.5,-142.5 656.5,-148.5 650.5,-154.5 644.5,-154.5"/>
176
- <text xml:space="preserve" text-anchor="middle" x="572" y="-139.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">KNOWN MISTAKES</text>
177
- <text xml:space="preserve" text-anchor="middle" x="572" y="-126.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">✗ [sig] tool ×N [REPEATING]…</text>
190
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M659.5,-154.5C659.5,-154.5 514.5,-154.5 514.5,-154.5 508.5,-154.5 502.5,-148.5 502.5,-142.5 502.5,-142.5 502.5,-130.5 502.5,-130.5 502.5,-124.5 508.5,-118.5 514.5,-118.5 514.5,-118.5 659.5,-118.5 659.5,-118.5 665.5,-118.5 671.5,-124.5 671.5,-130.5 671.5,-130.5 671.5,-142.5 671.5,-142.5 671.5,-148.5 665.5,-154.5 659.5,-154.5"/>
191
+ <text xml:space="preserve" text-anchor="middle" x="587" y="-139.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">KNOWN MISTAKES</text>
192
+ <text xml:space="preserve" text-anchor="middle" x="587" y="-126.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">✗ [sig] tool ×N [REPEATING]…</text>
178
193
  </g>
179
194
  <!-- Guard&#45;&gt;KMist -->
180
- <g id="edge10" class="edge">
195
+ <g id="edge11" class="edge">
181
196
  <title>Guard&#45;&gt;KMist</title>
182
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M719.47,-238.31C684.79,-214.6 637.39,-182.2 605.79,-160.6"/>
183
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="607.53,-158.4 599.34,-156.19 604.37,-163.02 607.53,-158.4"/>
197
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M734.47,-238.31C699.79,-214.6 652.39,-182.2 620.79,-160.6"/>
198
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="622.53,-158.4 614.34,-156.19 619.37,-163.02 622.53,-158.4"/>
184
199
  </g>
185
200
  <!-- KFix -->
186
- <g id="node12" class="node">
201
+ <g id="node13" class="node">
187
202
  <title>KFix</title>
188
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M432.75,-154.5C432.75,-154.5 337.25,-154.5 337.25,-154.5 331.25,-154.5 325.25,-148.5 325.25,-142.5 325.25,-142.5 325.25,-130.5 325.25,-130.5 325.25,-124.5 331.25,-118.5 337.25,-118.5 337.25,-118.5 432.75,-118.5 432.75,-118.5 438.75,-118.5 444.75,-124.5 444.75,-130.5 444.75,-130.5 444.75,-142.5 444.75,-142.5 444.75,-148.5 438.75,-154.5 432.75,-154.5"/>
189
- <text xml:space="preserve" text-anchor="middle" x="385" y="-139.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">KNOWN FIXES</text>
190
- <text xml:space="preserve" text-anchor="middle" x="385" y="-126.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">✓ [sig] tool — FIX: …</text>
203
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M447.75,-154.5C447.75,-154.5 352.25,-154.5 352.25,-154.5 346.25,-154.5 340.25,-148.5 340.25,-142.5 340.25,-142.5 340.25,-130.5 340.25,-130.5 340.25,-124.5 346.25,-118.5 352.25,-118.5 352.25,-118.5 447.75,-118.5 447.75,-118.5 453.75,-118.5 459.75,-124.5 459.75,-130.5 459.75,-130.5 459.75,-142.5 459.75,-142.5 459.75,-148.5 453.75,-154.5 447.75,-154.5"/>
204
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-139.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">KNOWN FIXES</text>
205
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-126.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">✓ [sig] tool — FIX: …</text>
191
206
  </g>
192
207
  <!-- Hint&#45;&gt;KFix -->
193
208
  <!-- Regr&#45;&gt;KMist -->
194
- <g id="edge12" class="edge">
209
+ <g id="edge13" class="edge">
195
210
  <title>Regr&#45;&gt;KMist</title>
196
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M574.46,-244.98C573.94,-222.33 573.16,-188.26 572.62,-164.57"/>
197
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="575.42,-164.71 572.44,-156.78 569.82,-164.84 575.42,-164.71"/>
211
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M589.46,-244.98C588.94,-222.33 588.16,-188.26 587.62,-164.57"/>
212
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="590.42,-164.71 587.44,-156.78 584.82,-164.84 590.42,-164.71"/>
198
213
  </g>
199
214
  <!-- Prompt -->
200
- <g id="node14" class="node">
215
+ <g id="node15" class="node">
201
216
  <title>Prompt</title>
202
- <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M416.25,-36C416.25,-36 353.75,-36 353.75,-36 347.75,-36 341.75,-30 341.75,-24 341.75,-24 341.75,-12 341.75,-12 341.75,-6 347.75,0 353.75,0 353.75,0 416.25,0 416.25,0 422.25,0 428.25,-6 428.25,-12 428.25,-12 428.25,-24 428.25,-24 428.25,-30 422.25,-36 416.25,-36"/>
203
- <text xml:space="preserve" text-anchor="middle" x="385" y="-21.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">PromptBuilder</text>
204
- <text xml:space="preserve" text-anchor="middle" x="385" y="-7.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">system prompt</text>
217
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M431.25,-36C431.25,-36 368.75,-36 368.75,-36 362.75,-36 356.75,-30 356.75,-24 356.75,-24 356.75,-12 356.75,-12 356.75,-6 362.75,0 368.75,0 368.75,0 431.25,0 431.25,0 437.25,0 443.25,-6 443.25,-12 443.25,-12 443.25,-24 443.25,-24 443.25,-30 437.25,-36 431.25,-36"/>
218
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-21.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PromptBuilder</text>
219
+ <text xml:space="preserve" text-anchor="middle" x="400" y="-7.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">system prompt</text>
205
220
  </g>
206
221
  <!-- KMist&#45;&gt;Prompt -->
207
- <g id="edge16" class="edge">
222
+ <g id="edge17" class="edge">
208
223
  <title>KMist&#45;&gt;Prompt</title>
209
- <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M503.87,-117.86C491.34,-115.07 478.32,-112.46 466,-110.5 429.11,-104.64 156.29,-109.99 131,-82.5 102.58,-51.61 247.4,-32.24 330.26,-23.84"/>
210
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="330.33,-26.65 338.02,-23.08 329.78,-21.08 330.33,-26.65"/>
211
- <text xml:space="preserve" text-anchor="middle" x="161" y="-73.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">do NOT repeat</text>
224
+ <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M518.87,-117.86C506.34,-115.07 493.32,-112.46 481,-110.5 444.11,-104.64 171.29,-109.99 146,-82.5 117.58,-51.61 262.4,-32.24 345.26,-23.84"/>
225
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="345.33,-26.65 353.02,-23.08 344.78,-21.08 345.33,-26.65"/>
226
+ <text xml:space="preserve" text-anchor="middle" x="176" y="-73.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">do NOT repeat</text>
212
227
  </g>
213
228
  <!-- KMist&#45;&gt;Prompt -->
214
229
  <!-- KFix&#45;&gt;Prompt -->
215
- <g id="edge17" class="edge">
230
+ <g id="edge18" class="edge">
216
231
  <title>KFix&#45;&gt;Prompt</title>
217
- <path fill="none" stroke="#fbbf24" stroke-width="2" stroke-dasharray="5,2" d="M324.56,-119.66C297.76,-109.32 274.88,-93.67 287.75,-72 297.43,-55.69 314.09,-44.08 330.92,-35.97"/>
218
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="2" points="331.84,-38.62 338.02,-32.82 329.57,-33.51 331.84,-38.62"/>
219
- <text xml:space="preserve" text-anchor="middle" x="320.38" y="-73.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">do THIS instead</text>
232
+ <path fill="none" stroke="#fbbf24" stroke-width="2" stroke-dasharray="5,2" d="M339.56,-119.66C312.76,-109.32 289.88,-93.67 302.75,-72 312.43,-55.69 329.09,-44.08 345.92,-35.97"/>
233
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="2" points="346.84,-38.62 353.02,-32.82 344.57,-33.51 346.84,-38.62"/>
234
+ <text xml:space="preserve" text-anchor="middle" x="335.38" y="-73.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">do THIS instead</text>
220
235
  </g>
221
236
  <!-- KFix&#45;&gt;Prompt -->
222
237
  <!-- Mem -->
223
- <g id="node13" class="node">
238
+ <g id="node14" class="node">
224
239
  <title>Mem</title>
225
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M270,-154.5C270,-154.5 170,-154.5 170,-154.5 164,-154.5 158,-148.5 158,-142.5 158,-142.5 158,-130.5 158,-130.5 158,-124.5 164,-118.5 170,-118.5 170,-118.5 270,-118.5 270,-118.5 276,-118.5 282,-124.5 282,-130.5 282,-130.5 282,-142.5 282,-142.5 282,-148.5 276,-154.5 270,-154.5"/>
226
- <text xml:space="preserve" text-anchor="middle" x="220" y="-139.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">PWN::Memory :lesson</text>
227
- <text xml:space="preserve" text-anchor="middle" x="220" y="-126.05" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">&quot;AVOID X — FIX: Y&quot;</text>
240
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M285,-154.5C285,-154.5 185,-154.5 185,-154.5 179,-154.5 173,-148.5 173,-142.5 173,-142.5 173,-130.5 173,-130.5 173,-124.5 179,-118.5 185,-118.5 185,-118.5 285,-118.5 285,-118.5 291,-118.5 297,-124.5 297,-130.5 297,-130.5 297,-142.5 297,-142.5 297,-148.5 291,-154.5 285,-154.5"/>
241
+ <text xml:space="preserve" text-anchor="middle" x="235" y="-139.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PWN::Memory :lesson</text>
242
+ <text xml:space="preserve" text-anchor="middle" x="235" y="-126.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">&quot;AVOID X — FIX: Y&quot;</text>
228
243
  </g>
229
244
  <!-- Mem&#45;&gt;Prompt -->
230
- <g id="edge18" class="edge">
245
+ <g id="edge19" class="edge">
231
246
  <title>Mem&#45;&gt;Prompt</title>
232
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M274.34,-117.85C311.92,-105.23 356.33,-89.31 363,-82.5 372.53,-72.76 377.94,-58.7 381.01,-46.27"/>
233
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="383.7,-47.11 382.6,-38.71 378.22,-45.96 383.7,-47.11"/>
234
- <text xml:space="preserve" text-anchor="middle" x="402.91" y="-73.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">MEMORY block</text>
247
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M289.34,-117.85C326.92,-105.23 371.33,-89.31 378,-82.5 387.53,-72.76 392.94,-58.7 396.01,-46.27"/>
248
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="398.7,-47.11 397.6,-38.71 393.22,-45.96 398.7,-47.11"/>
249
+ <text xml:space="preserve" text-anchor="middle" x="417.91" y="-73.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">MEMORY block</text>
235
250
  </g>
236
251
  <!-- Mem&#45;&gt;Prompt -->
237
252
  <!-- Resolve -->
238
- <g id="node15" class="node">
253
+ <g id="node16" class="node">
239
254
  <title>Resolve</title>
240
- <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M263.25,-446.59C263.25,-446.59 188.75,-446.59 188.75,-446.59 182.75,-446.59 176.75,-440.59 176.75,-434.59 176.75,-434.59 176.75,-422.59 176.75,-422.59 176.75,-416.59 182.75,-410.59 188.75,-410.59 188.75,-410.59 263.25,-410.59 263.25,-410.59 269.25,-410.59 275.25,-416.59 275.25,-422.59 275.25,-422.59 275.25,-434.59 275.25,-434.59 275.25,-440.59 269.25,-446.59 263.25,-446.59"/>
241
- <text xml:space="preserve" text-anchor="middle" x="226" y="-431.64" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">mistakes_resolve</text>
242
- <text xml:space="preserve" text-anchor="middle" x="226" y="-418.14" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">(signature, fix)</text>
255
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M278.25,-446.59C278.25,-446.59 203.75,-446.59 203.75,-446.59 197.75,-446.59 191.75,-440.59 191.75,-434.59 191.75,-434.59 191.75,-422.59 191.75,-422.59 191.75,-416.59 197.75,-410.59 203.75,-410.59 203.75,-410.59 278.25,-410.59 278.25,-410.59 284.25,-410.59 290.25,-416.59 290.25,-422.59 290.25,-422.59 290.25,-434.59 290.25,-434.59 290.25,-440.59 284.25,-446.59 278.25,-446.59"/>
256
+ <text xml:space="preserve" text-anchor="middle" x="241" y="-431.64" font-family="sans-Serif" font-size="11.00" fill="#0f172a">mistakes_resolve</text>
257
+ <text xml:space="preserve" text-anchor="middle" x="241" y="-418.14" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(signature, fix)</text>
243
258
  </g>
244
259
  <!-- Resolve&#45;&gt;Store -->
245
- <g id="edge13" class="edge">
260
+ <g id="edge14" class="edge">
246
261
  <title>Resolve&#45;&gt;Store</title>
247
- <path fill="none" stroke="#34d399" stroke-width="2" d="M276.14,-428.59C316.05,-428.59 372.95,-428.59 420.87,-428.59"/>
248
- <polygon fill="#34d399" stroke="#34d399" stroke-width="2" points="420.86,-431.39 428.86,-428.59 420.86,-425.79 420.86,-431.39"/>
249
- <text xml:space="preserve" text-anchor="middle" x="354" y="-444.04" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">resolved:true</text>
250
- <text xml:space="preserve" text-anchor="middle" x="354" y="-433.54" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">fix:…</text>
262
+ <path fill="none" stroke="#34d399" stroke-width="2" d="M291.14,-428.59C331.05,-428.59 387.95,-428.59 435.87,-428.59"/>
263
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="2" points="435.86,-431.39 443.86,-428.59 435.86,-425.79 435.86,-431.39"/>
264
+ <text xml:space="preserve" text-anchor="middle" x="369" y="-444.04" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">resolved:true</text>
265
+ <text xml:space="preserve" text-anchor="middle" x="369" y="-433.54" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">fix:…</text>
251
266
  </g>
252
267
  <!-- Resolve&#45;&gt;KFix -->
253
- <g id="edge14" class="edge">
268
+ <g id="edge15" class="edge">
254
269
  <title>Resolve&#45;&gt;KFix</title>
255
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M226.55,-409.87C228.43,-373.56 236.69,-289.26 273,-230.75 291.16,-201.49 321.67,-176.98 346.27,-160.45"/>
256
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="347.55,-162.95 352.71,-156.23 344.48,-158.27 347.55,-162.95"/>
270
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M241.55,-409.87C243.43,-373.56 251.69,-289.26 288,-230.75 306.16,-201.49 336.67,-176.98 361.27,-160.45"/>
271
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="362.55,-162.95 367.71,-156.23 359.48,-158.27 362.55,-162.95"/>
257
272
  </g>
258
273
  <!-- Resolve&#45;&gt;Mem -->
259
- <g id="edge15" class="edge">
274
+ <g id="edge16" class="edge">
260
275
  <title>Resolve&#45;&gt;Mem</title>
261
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M207.1,-409.87C191.14,-393.5 169.46,-367.6 160.25,-340 144.89,-293.94 146.6,-277.35 160.25,-230.75 167.7,-205.31 184.46,-180.22 198.34,-162.49"/>
262
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="200.39,-164.4 203.23,-156.41 196.03,-160.89 200.39,-164.4"/>
263
- <text xml:space="preserve" text-anchor="middle" x="177.12" y="-266.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">promote</text>
276
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M222.1,-409.87C206.14,-393.5 184.46,-367.6 175.25,-340 159.89,-293.94 161.6,-277.35 175.25,-230.75 182.7,-205.31 199.46,-180.22 213.34,-162.49"/>
277
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="215.39,-164.4 218.23,-156.41 211.03,-160.89 215.39,-164.4"/>
278
+ <text xml:space="preserve" text-anchor="middle" x="192.12" y="-266.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">promote</text>
264
279
  </g>
265
280
  </g>
266
281
  </svg>