pwn 0.5.639 → 0.5.643

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -3
  3. data/README.md +1 -1
  4. data/documentation/Cron.md +10 -8
  5. data/documentation/Reinforcement-Learning.md +43 -21
  6. data/documentation/diagrams/cron-scheduling.svg +134 -93
  7. data/documentation/diagrams/dot/cron-scheduling.dot +9 -3
  8. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +2 -2
  9. data/documentation/diagrams/dot/reinforcement-learning.dot +9 -3
  10. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +103 -101
  11. data/documentation/diagrams/reinforcement-learning.svg +211 -166
  12. data/documentation/pwn-ai-Agent.md +12 -0
  13. data/lib/pwn/ai/agent/curriculum.rb +647 -56
  14. data/lib/pwn/ai/agent/learning.rb +87 -15
  15. data/lib/pwn/ai/agent/loop.rb +164 -13
  16. data/lib/pwn/ai/agent/metrics.rb +32 -13
  17. data/lib/pwn/ai/agent/mistakes.rb +139 -8
  18. data/lib/pwn/ai/agent/prompt_builder.rb +2 -2
  19. data/lib/pwn/ai/agent/registry.rb +13 -3
  20. data/lib/pwn/ai/agent/result.rb +19 -2
  21. data/lib/pwn/ai/agent/reward.rb +415 -42
  22. data/lib/pwn/ai/agent/tools/curriculum.rb +51 -0
  23. data/lib/pwn/ai/agent/tools/reward.rb +15 -4
  24. data/lib/pwn/ai/anthropic.rb +265 -4
  25. data/lib/pwn/ai/ollama.rb +274 -10
  26. data/lib/pwn/ai/open_ai.rb +307 -4
  27. data/lib/pwn/config.rb +137 -12
  28. data/lib/pwn/cron.rb +24 -2
  29. data/lib/pwn/memory.rb +13 -1
  30. data/lib/pwn/version.rb +1 -1
  31. data/spec/integration/persistence_roundtrip_spec.rb +6 -1
  32. data/spec/integration/reinforced_feedback_loop_spec.rb +144 -8
  33. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +27 -0
  34. data/spec/lib/pwn/ai/agent/result_spec.rb +11 -0
  35. data/spec/lib/pwn/ai/agent/reward_spec.rb +89 -0
  36. data/spec/lib/pwn/ai/ollama_spec.rb +251 -0
  37. data/third_party/pwn_rdoc.jsonl +58 -7
  38. metadata +8 -8
@@ -4,311 +4,313 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Reinforcement_Learning Pages: 1 -->
7
- <svg width="1925pt" height="627pt"
8
- viewBox="0.00 0.00 1925.00 627.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 583.95)">
7
+ <svg width="2139pt" height="787pt"
8
+ viewBox="0.00 0.00 2139.00 787.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 744.08)">
10
10
  <title>PWN_Reinforcement_Learning</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-583.95 1881.9,-583.95 1881.9,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="637.35" y="-518.75" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent &#45; Reward + Curriculum Reinforcement Loop</text>
13
- <text xml:space="preserve" text-anchor="start" x="588.97" y="-507.3" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">R1..R4 reward signal &#160;· &#160;C1..C4 credit assignment &#160;· &#160;M1..M4 memory &#160;· &#160;S1..S4 self&#45;play &#160;· &#160;W1..W3 weight loop &#160;· &#160;E1..E3 intro↔extro join</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-744.08 2095.38,-744.08 2095.38,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="744.09" y="-678.88" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent &#45; Reward + Curriculum Reinforcement Loop</text>
13
+ <text xml:space="preserve" text-anchor="start" x="695.72" y="-667.42" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">R1..R4 reward signal &#160;· &#160;C1..C4 credit assignment &#160;· &#160;M1..M4 memory &#160;· &#160;S1..S4 self&#45;play &#160;· &#160;W1..W3 weight loop &#160;· &#160;E1..E3 intro↔extro join</text>
14
14
  <g id="clust2" class="cluster">
15
15
  <title>cluster_reward</title>
16
- <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M832,-314C832,-314 1599,-314 1599,-314 1605,-314 1611,-320 1611,-326 1611,-326 1611,-385.25 1611,-385.25 1611,-391.25 1605,-397.25 1599,-397.25 1599,-397.25 832,-397.25 832,-397.25 826,-397.25 820,-391.25 820,-385.25 820,-385.25 820,-326 820,-326 820,-320 826,-314 832,-314"/>
17
- <text xml:space="preserve" text-anchor="middle" x="1215.5" y="-374.25" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Tier 1 · Reward &#160;(PWN::AI::Agent::Reward)</text>
16
+ <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M883,-372.5C883,-372.5 1653,-372.5 1653,-372.5 1659,-372.5 1665,-378.5 1665,-384.5 1665,-384.5 1665,-483 1665,-483 1665,-489 1659,-495 1653,-495 1653,-495 883,-495 883,-495 877,-495 871,-489 871,-483 871,-483 871,-384.5 871,-384.5 871,-378.5 877,-372.5 883,-372.5"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="1268" y="-472" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Tier 1 · Reward &#160;(PWN::AI::Agent::Reward)</text>
18
18
  </g>
19
19
  <g id="clust4" class="cluster">
20
20
  <title>cluster_curr</title>
21
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M56,-310C56,-310 784,-310 784,-310 790,-310 796,-316 796,-322 796,-322 796,-389.25 796,-389.25 796,-395.25 790,-401.25 784,-401.25 784,-401.25 56,-401.25 56,-401.25 50,-401.25 44,-395.25 44,-389.25 44,-389.25 44,-322 44,-322 44,-316 50,-310 56,-310"/>
22
- <text xml:space="preserve" text-anchor="middle" x="420" y="-378.25" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Tier 4 · Curriculum &#160;(PWN::AI::Agent::Curriculum)</text>
21
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M107,-372.5C107,-372.5 835,-372.5 835,-372.5 841,-372.5 847,-378.5 847,-384.5 847,-384.5 847,-483 847,-483 847,-489 841,-495 835,-495 835,-495 107,-495 107,-495 101,-495 95,-489 95,-483 95,-483 95,-384.5 95,-384.5 95,-378.5 101,-372.5 107,-372.5"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="471" y="-472" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Tier 4 · Curriculum &#160;(PWN::AI::Agent::Curriculum)</text>
23
23
  </g>
24
24
  <g id="clust6" class="cluster">
25
25
  <title>cluster_weight</title>
26
- <path fill="#450a0a" stroke="#b91c1c" stroke-width="2" d="M20,-147.75C20,-147.75 522,-147.75 522,-147.75 528,-147.75 534,-153.75 534,-159.75 534,-159.75 534,-239 534,-239 534,-245 528,-251 522,-251 522,-251 20,-251 20,-251 14,-251 8,-245 8,-239 8,-239 8,-159.75 8,-159.75 8,-153.75 14,-147.75 20,-147.75"/>
27
- <text xml:space="preserve" text-anchor="middle" x="271" y="-228" font-family="sans-Serif" font-size="20.00" fill="#fecaca">Tier 5 · Weight Loop</text>
26
+ <path fill="#450a0a" stroke="#b91c1c" stroke-width="2" d="M20,-179C20,-179 522,-179 522,-179 528,-179 534,-185 534,-191 534,-191 534,-301.5 534,-301.5 534,-307.5 528,-313.5 522,-313.5 522,-313.5 20,-313.5 20,-313.5 14,-313.5 8,-307.5 8,-301.5 8,-301.5 8,-191 8,-191 8,-185 14,-179 20,-179"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="271" y="-290.5" font-family="sans-Serif" font-size="20.00" fill="#fecaca">Tier 5 · Weight Loop</text>
28
28
  </g>
29
29
  <g id="clust8" class="cluster">
30
30
  <title>cluster_files</title>
31
- <path fill="#422006" stroke="#a16207" stroke-dasharray="5,2" d="M313,-8C313,-8 1007,-8 1007,-8 1013,-8 1019,-14 1019,-20 1019,-20 1019,-87.25 1019,-87.25 1019,-93.25 1013,-99.25 1007,-99.25 1007,-99.25 313,-99.25 313,-99.25 307,-99.25 301,-93.25 301,-87.25 301,-87.25 301,-20 301,-20 301,-14 307,-8 313,-8"/>
32
- <text xml:space="preserve" text-anchor="middle" x="660" y="-76.25" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
31
+ <path fill="#422006" stroke="#a16207" stroke-dasharray="5,2" d="M310,-8C310,-8 1004,-8 1004,-8 1010,-8 1016,-14 1016,-20 1016,-20 1016,-118.5 1016,-118.5 1016,-124.5 1010,-130.5 1004,-130.5 1004,-130.5 310,-130.5 310,-130.5 304,-130.5 298,-124.5 298,-118.5 298,-118.5 298,-20 298,-20 298,-14 304,-8 310,-8"/>
32
+ <text xml:space="preserve" text-anchor="middle" x="657" y="-107.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
33
33
  </g>
34
34
  <!-- Req -->
35
35
  <g id="node1" class="node">
36
36
  <title>Req</title>
37
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M517.5,-497.75C517.5,-497.75 474.5,-497.75 474.5,-497.75 468.5,-497.75 462.5,-491.75 462.5,-485.75 462.5,-485.75 462.5,-473.75 462.5,-473.75 462.5,-467.75 468.5,-461.75 474.5,-461.75 474.5,-461.75 517.5,-461.75 517.5,-461.75 523.5,-461.75 529.5,-467.75 529.5,-473.75 529.5,-473.75 529.5,-485.75 529.5,-485.75 529.5,-491.75 523.5,-497.75 517.5,-497.75"/>
38
- <text xml:space="preserve" text-anchor="middle" x="496" y="-476.62" font-family="sans-Serif" font-size="10.00" fill="#0f172a">👤 &#160;request</text>
37
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M482.5,-591.88C482.5,-591.88 439.5,-591.88 439.5,-591.88 433.5,-591.88 427.5,-585.88 427.5,-579.88 427.5,-579.88 427.5,-567.88 427.5,-567.88 427.5,-561.88 433.5,-555.88 439.5,-555.88 439.5,-555.88 482.5,-555.88 482.5,-555.88 488.5,-555.88 494.5,-561.88 494.5,-567.88 494.5,-567.88 494.5,-579.88 494.5,-579.88 494.5,-585.88 488.5,-591.88 482.5,-591.88"/>
38
+ <text xml:space="preserve" text-anchor="middle" x="461" y="-570.75" font-family="sans-Serif" font-size="10.00" fill="#0f172a">👤 &#160;request</text>
39
39
  </g>
40
40
  <!-- Loop -->
41
41
  <g id="node2" class="node">
42
42
  <title>Loop</title>
43
- <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M733.38,-501.75C733.38,-501.75 620.62,-501.75 620.62,-501.75 614.62,-501.75 608.62,-495.75 608.62,-489.75 608.62,-489.75 608.62,-469.75 608.62,-469.75 608.62,-463.75 614.62,-457.75 620.62,-457.75 620.62,-457.75 733.38,-457.75 733.38,-457.75 739.38,-457.75 745.38,-463.75 745.38,-469.75 745.38,-469.75 745.38,-489.75 745.38,-489.75 745.38,-495.75 739.38,-501.75 733.38,-501.75"/>
44
- <text xml:space="preserve" text-anchor="middle" x="677" y="-488.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Loop.run</text>
45
- <text xml:space="preserve" text-anchor="middle" x="677" y="-476.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_first · Dispatch · guard</text>
46
- <text xml:space="preserve" text-anchor="middle" x="677" y="-464.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">final answer</text>
43
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M698.38,-595.88C698.38,-595.88 585.62,-595.88 585.62,-595.88 579.62,-595.88 573.62,-589.88 573.62,-583.88 573.62,-583.88 573.62,-563.88 573.62,-563.88 573.62,-557.88 579.62,-551.88 585.62,-551.88 585.62,-551.88 698.38,-551.88 698.38,-551.88 704.38,-551.88 710.38,-557.88 710.38,-563.88 710.38,-563.88 710.38,-583.88 710.38,-583.88 710.38,-589.88 704.38,-595.88 698.38,-595.88"/>
44
+ <text xml:space="preserve" text-anchor="middle" x="642" y="-582.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Loop.run</text>
45
+ <text xml:space="preserve" text-anchor="middle" x="642" y="-570.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_first · Dispatch · guard</text>
46
+ <text xml:space="preserve" text-anchor="middle" x="642" y="-558.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">final answer</text>
47
47
  </g>
48
48
  <!-- Req&#45;&gt;Loop -->
49
49
  <g id="edge1" class="edge">
50
50
  <title>Req&#45;&gt;Loop</title>
51
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M529.94,-479.75C552.24,-479.75 574.53,-479.75 596.83,-479.75"/>
52
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="596.75,-482.55 604.75,-479.75 596.75,-476.95 596.75,-482.55"/>
51
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M494.94,-573.88C517.24,-573.88 539.53,-573.88 561.83,-573.88"/>
52
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="561.75,-576.68 569.75,-573.88 561.75,-571.08 561.75,-576.68"/>
53
53
  </g>
54
54
  <!-- R1 -->
55
55
  <g id="node3" class="node">
56
56
  <title>R1</title>
57
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M940,-358C940,-358 840,-358 840,-358 834,-358 828,-352 828,-346 828,-346 828,-334 828,-334 828,-328 834,-322 840,-322 840,-322 940,-322 940,-322 946,-322 952,-328 952,-334 952,-334 952,-346 952,-346 952,-352 946,-358 940,-358"/>
58
- <text xml:space="preserve" text-anchor="middle" x="890" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R1 &#160;judge (ORM)</text>
59
- <text xml:space="preserve" text-anchor="middle" x="890" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">score · verdict · rationale</text>
57
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1293,-420.5C1293,-420.5 1193,-420.5 1193,-420.5 1187,-420.5 1181,-414.5 1181,-408.5 1181,-408.5 1181,-396.5 1181,-396.5 1181,-390.5 1187,-384.5 1193,-384.5 1193,-384.5 1293,-384.5 1293,-384.5 1299,-384.5 1305,-390.5 1305,-396.5 1305,-396.5 1305,-408.5 1305,-408.5 1305,-414.5 1299,-420.5 1293,-420.5"/>
58
+ <text xml:space="preserve" text-anchor="middle" x="1243" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R1 &#160;judge (ORM)</text>
59
+ <text xml:space="preserve" text-anchor="middle" x="1243" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">score · verdict · rationale</text>
60
60
  </g>
61
61
  <!-- Loop&#45;&gt;R1 -->
62
62
  <g id="edge3" class="edge">
63
63
  <title>Loop&#45;&gt;R1</title>
64
- <path fill="none" stroke="#a78bfa" stroke-width="2" d="M715.32,-456.83C741.25,-441.73 776.09,-420.91 806,-401.25 823.3,-389.88 842.06,-376.52 857.46,-365.27"/>
65
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="858.87,-367.71 863.66,-360.72 855.56,-363.2 858.87,-367.71"/>
66
- <text xml:space="preserve" text-anchor="middle" x="800.93" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
64
+ <path fill="none" stroke="#a78bfa" stroke-width="2" d="M711.27,-551.35C774.65,-531.82 861.05,-505.66 877.75,-503 908.84,-498.04 1132.44,-508.24 1161,-495 1190.16,-481.48 1213.41,-452.17 1227.59,-430.34"/>
65
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1229.82,-432.06 1231.69,-423.79 1225.07,-429.09 1229.82,-432.06"/>
66
+ <text xml:space="preserve" text-anchor="middle" x="886.38" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
67
67
  </g>
68
68
  <!-- R2 -->
69
69
  <g id="node4" class="node">
70
70
  <title>R2</title>
71
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1292,-358C1292,-358 1228,-358 1228,-358 1222,-358 1216,-352 1216,-346 1216,-346 1216,-334 1216,-334 1216,-328 1222,-322 1228,-322 1228,-322 1292,-322 1292,-322 1298,-322 1304,-328 1304,-334 1304,-334 1304,-346 1304,-346 1304,-352 1298,-358 1292,-358"/>
72
- <text xml:space="preserve" text-anchor="middle" x="1260" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R2 &#160;prm (PRM)</text>
73
- <text xml:space="preserve" text-anchor="middle" x="1260" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">per&#45;step +1/0/−1</text>
71
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1645,-420.5C1645,-420.5 1581,-420.5 1581,-420.5 1575,-420.5 1569,-414.5 1569,-408.5 1569,-408.5 1569,-396.5 1569,-396.5 1569,-390.5 1575,-384.5 1581,-384.5 1581,-384.5 1645,-384.5 1645,-384.5 1651,-384.5 1657,-390.5 1657,-396.5 1657,-396.5 1657,-408.5 1657,-408.5 1657,-414.5 1651,-420.5 1645,-420.5"/>
72
+ <text xml:space="preserve" text-anchor="middle" x="1613" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R2 &#160;prm (PRM)</text>
73
+ <text xml:space="preserve" text-anchor="middle" x="1613" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">per&#45;step +1/0/−1</text>
74
74
  </g>
75
75
  <!-- Loop&#45;&gt;R2 -->
76
76
  <g id="edge4" class="edge">
77
77
  <title>Loop&#45;&gt;R2</title>
78
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M746.21,-473.57C868.66,-463.55 1117.93,-439.13 1196,-401.25 1213.1,-392.95 1228.71,-378.47 1240.23,-365.78"/>
79
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1242.08,-367.92 1245.23,-360.06 1237.86,-364.24 1242.08,-367.92"/>
80
- <text xml:space="preserve" text-anchor="middle" x="1189.68" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">session</text>
78
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M711.35,-557.42C763.57,-545.68 836.87,-528.96 901,-513.5 919.5,-509.04 923.64,-505.48 942.5,-503 959.21,-500.81 1534.11,-502.88 1549,-495 1574.97,-481.25 1592.62,-451.71 1602.7,-429.89"/>
79
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1605.26,-431.05 1605.9,-422.6 1600.12,-428.8 1605.26,-431.05"/>
80
+ <text xml:space="preserve" text-anchor="middle" x="958.25" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">session</text>
81
81
  </g>
82
82
  <!-- R3 -->
83
83
  <g id="node5" class="node">
84
84
  <title>R3</title>
85
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1451.75,-358C1451.75,-358 1356.25,-358 1356.25,-358 1350.25,-358 1344.25,-352 1344.25,-346 1344.25,-346 1344.25,-334 1344.25,-334 1344.25,-328 1350.25,-322 1356.25,-322 1356.25,-322 1451.75,-322 1451.75,-322 1457.75,-322 1463.75,-328 1463.75,-334 1463.75,-334 1463.75,-346 1463.75,-346 1463.75,-352 1457.75,-358 1451.75,-358"/>
86
- <text xml:space="preserve" text-anchor="middle" x="1404" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R3 &#160;sentinel</text>
87
- <text xml:space="preserve" text-anchor="middle" x="1404" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">proxy ≠ judge ≠ (1−corr)</text>
85
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M989.25,-424.5C989.25,-424.5 890.75,-424.5 890.75,-424.5 884.75,-424.5 878.75,-418.5 878.75,-412.5 878.75,-412.5 878.75,-392.5 878.75,-392.5 878.75,-386.5 884.75,-380.5 890.75,-380.5 890.75,-380.5 989.25,-380.5 989.25,-380.5 995.25,-380.5 1001.25,-386.5 1001.25,-392.5 1001.25,-392.5 1001.25,-412.5 1001.25,-412.5 1001.25,-418.5 995.25,-424.5 989.25,-424.5"/>
86
+ <text xml:space="preserve" text-anchor="middle" x="940" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R3 &#160;sentinel (ring N=40)</text>
87
+ <text xml:space="preserve" text-anchor="middle" x="940" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">proxy ≠ judge ≠ (1−corr)</text>
88
+ <text xml:space="preserve" text-anchor="middle" x="940" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">→ proxy_distrust haircut</text>
88
89
  </g>
89
90
  <!-- Loop&#45;&gt;R3 -->
90
91
  <g id="edge5" class="edge">
91
92
  <title>Loop&#45;&gt;R3</title>
92
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M745.95,-472.5C848.46,-462.91 1047.03,-443.19 1215,-419.75 1263.67,-412.96 1278.87,-420.69 1324,-401.25 1344.26,-392.52 1364.09,-377.64 1378.94,-364.86"/>
93
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1380.62,-367.11 1384.75,-359.71 1376.91,-362.92 1380.62,-367.11"/>
93
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M665.37,-550.97C684.42,-534.58 712.84,-513.3 742,-503 766.15,-494.46 833.95,-506.18 857,-495 884.77,-481.53 907.54,-454.29 922.16,-433.02"/>
94
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="924.37,-434.76 926.46,-426.55 919.7,-431.67 924.37,-434.76"/>
94
95
  </g>
95
96
  <!-- R4 -->
96
97
  <g id="node6" class="node">
97
98
  <title>R4</title>
98
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1590.62,-358C1590.62,-358 1515.38,-358 1515.38,-358 1509.38,-358 1503.38,-352 1503.38,-346 1503.38,-346 1503.38,-334 1503.38,-334 1503.38,-328 1509.38,-322 1515.38,-322 1515.38,-322 1590.62,-322 1590.62,-322 1596.62,-322 1602.62,-328 1602.62,-334 1602.62,-334 1602.62,-346 1602.62,-346 1602.62,-352 1596.62,-358 1590.62,-358"/>
99
- <text xml:space="preserve" text-anchor="middle" x="1553" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R4 &#160;semantic_ok</text>
100
- <text xml:space="preserve" text-anchor="middle" x="1553" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">grep exit 1 ≠ failure</text>
99
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1128.62,-420.5C1128.62,-420.5 1053.38,-420.5 1053.38,-420.5 1047.38,-420.5 1041.38,-414.5 1041.38,-408.5 1041.38,-408.5 1041.38,-396.5 1041.38,-396.5 1041.38,-390.5 1047.38,-384.5 1053.38,-384.5 1053.38,-384.5 1128.62,-384.5 1128.62,-384.5 1134.62,-384.5 1140.62,-390.5 1140.62,-396.5 1140.62,-396.5 1140.62,-408.5 1140.62,-408.5 1140.62,-414.5 1134.62,-420.5 1128.62,-420.5"/>
100
+ <text xml:space="preserve" text-anchor="middle" x="1091" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">R4 &#160;semantic_ok</text>
101
+ <text xml:space="preserve" text-anchor="middle" x="1091" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">grep exit 1 ≠ failure</text>
101
102
  </g>
102
103
  <!-- Loop&#45;&gt;R4 -->
103
104
  <g id="edge2" class="edge">
104
105
  <title>Loop&#45;&gt;R4</title>
105
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M746.1,-477.51C916.39,-473.6 1351.91,-458.15 1484,-401.25 1502.49,-393.29 1519.56,-378.47 1532.1,-365.53"/>
106
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1533.82,-367.78 1537.23,-360.02 1529.73,-363.96 1533.82,-367.78"/>
107
- <text xml:space="preserve" text-anchor="middle" x="1479.93" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">Dispatch</text>
106
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M678.61,-551.02C708.51,-534.44 752.46,-512.86 794,-503 818.56,-497.17 998.57,-506.58 1021,-495 1047.9,-481.11 1067.47,-451.66 1078.96,-429.9"/>
107
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1081.4,-431.27 1082.51,-422.87 1076.4,-428.75 1081.4,-431.27"/>
108
+ <text xml:space="preserve" text-anchor="middle" x="812" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">Dispatch</text>
108
109
  </g>
109
110
  <!-- S2 -->
110
111
  <g id="node9" class="node">
111
112
  <title>S2</title>
112
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M304.12,-358C304.12,-358 225.88,-358 225.88,-358 219.88,-358 213.88,-352 213.88,-346 213.88,-346 213.88,-334 213.88,-334 213.88,-328 219.88,-322 225.88,-322 225.88,-322 304.12,-322 304.12,-322 310.12,-322 316.12,-328 316.12,-334 316.12,-334 316.12,-346 316.12,-346 316.12,-352 310.12,-358 304.12,-358"/>
113
- <text xml:space="preserve" text-anchor="middle" x="265" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S2 &#160;counterfactual</text>
114
- <text xml:space="preserve" text-anchor="middle" x="265" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">fork alt&#45;persona A/B</text>
113
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M193.12,-420.5C193.12,-420.5 114.88,-420.5 114.88,-420.5 108.88,-420.5 102.88,-414.5 102.88,-408.5 102.88,-408.5 102.88,-396.5 102.88,-396.5 102.88,-390.5 108.88,-384.5 114.88,-384.5 114.88,-384.5 193.12,-384.5 193.12,-384.5 199.12,-384.5 205.12,-390.5 205.12,-396.5 205.12,-396.5 205.12,-408.5 205.12,-408.5 205.12,-414.5 199.12,-420.5 193.12,-420.5"/>
114
+ <text xml:space="preserve" text-anchor="middle" x="154" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S2 &#160;counterfactual</text>
115
+ <text xml:space="preserve" text-anchor="middle" x="154" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">fork alt&#45;persona A/B</text>
115
116
  </g>
116
117
  <!-- Loop&#45;&gt;S2 -->
117
118
  <g id="edge9" class="edge">
118
119
  <title>Loop&#45;&gt;S2</title>
119
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M607.89,-467.06C522.59,-451.95 383.04,-424.77 336,-401.25 317.94,-392.22 300.61,-377.67 287.59,-365.12"/>
120
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="289.87,-363.44 282.22,-359.8 285.92,-367.42 289.87,-363.44"/>
121
- <text xml:space="preserve" text-anchor="middle" x="411.06" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">[REPEATING]</text>
120
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M572.95,-561.3C458.32,-541.89 239.79,-504.03 225,-495 199.32,-479.33 179.4,-450.72 167.29,-429.65"/>
121
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="169.85,-428.51 163.53,-422.86 164.95,-431.22 169.85,-428.51"/>
122
+ <text xml:space="preserve" text-anchor="middle" x="331.63" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">[REPEATING]</text>
122
123
  </g>
123
124
  <!-- S3 -->
124
125
  <g id="node10" class="node">
125
126
  <title>S3</title>
126
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M162.25,-358C162.25,-358 63.75,-358 63.75,-358 57.75,-358 51.75,-352 51.75,-346 51.75,-346 51.75,-334 51.75,-334 51.75,-328 57.75,-322 63.75,-322 63.75,-322 162.25,-322 162.25,-322 168.25,-322 174.25,-328 174.25,-334 174.25,-334 174.25,-346 174.25,-346 174.25,-352 168.25,-358 162.25,-358"/>
127
- <text xml:space="preserve" text-anchor="middle" x="113" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S3 &#160;critic</text>
128
- <text xml:space="preserve" text-anchor="middle" x="113" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tool&#45;armed constitutional</text>
127
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M355.25,-420.5C355.25,-420.5 256.75,-420.5 256.75,-420.5 250.75,-420.5 244.75,-414.5 244.75,-408.5 244.75,-408.5 244.75,-396.5 244.75,-396.5 244.75,-390.5 250.75,-384.5 256.75,-384.5 256.75,-384.5 355.25,-384.5 355.25,-384.5 361.25,-384.5 367.25,-390.5 367.25,-396.5 367.25,-396.5 367.25,-408.5 367.25,-408.5 367.25,-414.5 361.25,-420.5 355.25,-420.5"/>
128
+ <text xml:space="preserve" text-anchor="middle" x="306" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S3 &#160;critic</text>
129
+ <text xml:space="preserve" text-anchor="middle" x="306" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tool&#45;armed constitutional</text>
129
130
  </g>
130
131
  <!-- Loop&#45;&gt;S3 -->
131
132
  <g id="edge8" class="edge">
132
133
  <title>Loop&#45;&gt;S3</title>
133
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M607.81,-467.22C589.05,-464.12 568.75,-460.79 550,-457.75 391.86,-432.13 341.65,-463.41 194,-401.25 173.5,-392.62 153.43,-377.75 138.39,-364.93"/>
134
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="140.35,-362.93 132.49,-359.76 136.66,-367.14 140.35,-362.93"/>
135
- <text xml:space="preserve" text-anchor="middle" x="244.2" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
134
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M572.71,-562.34C518.8,-551.73 443.85,-531.54 387,-495 360.33,-477.86 337.2,-449.56 322.56,-428.96"/>
135
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="324.99,-427.54 318.13,-422.56 320.38,-430.73 324.99,-427.54"/>
136
+ <text xml:space="preserve" text-anchor="middle" x="426.99" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
136
137
  </g>
137
138
  <!-- S4 -->
138
139
  <g id="node11" class="node">
139
140
  <title>S4</title>
140
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M459.88,-358C459.88,-358 368.12,-358 368.12,-358 362.12,-358 356.12,-352 356.12,-346 356.12,-346 356.12,-334 356.12,-334 356.12,-328 362.12,-322 368.12,-322 368.12,-322 459.88,-322 459.88,-322 465.88,-322 471.88,-328 471.88,-334 471.88,-334 471.88,-346 471.88,-346 471.88,-352 465.88,-358 459.88,-358"/>
141
- <text xml:space="preserve" text-anchor="middle" x="414" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S4 &#160;red_team_plan</text>
142
- <text xml:space="preserve" text-anchor="middle" x="414" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">adversarial plan review</text>
141
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M510.88,-420.5C510.88,-420.5 419.12,-420.5 419.12,-420.5 413.12,-420.5 407.12,-414.5 407.12,-408.5 407.12,-408.5 407.12,-396.5 407.12,-396.5 407.12,-390.5 413.12,-384.5 419.12,-384.5 419.12,-384.5 510.88,-384.5 510.88,-384.5 516.88,-384.5 522.88,-390.5 522.88,-396.5 522.88,-396.5 522.88,-408.5 522.88,-408.5 522.88,-414.5 516.88,-420.5 510.88,-420.5"/>
142
+ <text xml:space="preserve" text-anchor="middle" x="465" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S4 &#160;red_team_plan</text>
143
+ <text xml:space="preserve" text-anchor="middle" x="465" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">adversarial plan review</text>
143
144
  </g>
144
145
  <!-- Loop&#45;&gt;S4 -->
145
146
  <g id="edge7" class="edge">
146
147
  <title>Loop&#45;&gt;S4</title>
147
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M613.39,-456.82C576.77,-443.05 530.52,-423.68 492,-401.25 474.03,-390.79 455.55,-376.69 441.09,-364.76"/>
148
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="442.93,-362.65 435.01,-359.65 439.33,-366.94 442.93,-362.65"/>
149
- <text xml:space="preserve" text-anchor="middle" x="544.54" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">plan_first</text>
148
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M611.27,-551.17C591.04,-536.3 564.44,-515.61 543,-495 521.27,-474.11 499.25,-447.68 484.17,-428.61"/>
149
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="486.5,-427.04 479.36,-422.47 482.09,-430.49 486.5,-427.04"/>
150
+ <text xml:space="preserve" text-anchor="middle" x="582.21" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">plan_first</text>
150
151
  </g>
151
152
  <!-- C3 -->
152
153
  <g id="node12" class="node">
153
154
  <title>C3</title>
154
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M607.75,-358C607.75,-358 524.25,-358 524.25,-358 518.25,-358 512.25,-352 512.25,-346 512.25,-346 512.25,-334 512.25,-334 512.25,-328 518.25,-322 524.25,-322 524.25,-322 607.75,-322 607.75,-322 613.75,-322 619.75,-328 619.75,-334 619.75,-334 619.75,-346 619.75,-346 619.75,-352 613.75,-358 607.75,-358"/>
155
- <text xml:space="preserve" text-anchor="middle" x="566" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">C3 &#160;hindsight (HER)</text>
156
- <text xml:space="preserve" text-anchor="middle" x="566" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">relabel achieved&#45;goal</text>
155
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M658.75,-420.5C658.75,-420.5 575.25,-420.5 575.25,-420.5 569.25,-420.5 563.25,-414.5 563.25,-408.5 563.25,-408.5 563.25,-396.5 563.25,-396.5 563.25,-390.5 569.25,-384.5 575.25,-384.5 575.25,-384.5 658.75,-384.5 658.75,-384.5 664.75,-384.5 670.75,-390.5 670.75,-396.5 670.75,-396.5 670.75,-408.5 670.75,-408.5 670.75,-414.5 664.75,-420.5 658.75,-420.5"/>
156
+ <text xml:space="preserve" text-anchor="middle" x="617" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">C3 &#160;hindsight (HER)</text>
157
+ <text xml:space="preserve" text-anchor="middle" x="617" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">relabel achieved&#45;goal</text>
157
158
  </g>
158
159
  <!-- Loop&#45;&gt;C3 -->
159
160
  <g id="edge10" class="edge">
160
161
  <title>Loop&#45;&gt;C3</title>
161
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M659.41,-456.92C639.47,-432.17 607.01,-391.9 586.09,-365.93"/>
162
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="588.43,-364.37 581.23,-359.9 584.07,-367.88 588.43,-364.37"/>
163
- <text xml:space="preserve" text-anchor="middle" x="649.52" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">failed goal</text>
162
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M638.78,-551.08C634.24,-520.31 625.95,-464.17 621.02,-430.7"/>
163
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="623.82,-430.55 619.89,-423.05 618.28,-431.37 623.82,-430.55"/>
164
+ <text xml:space="preserve" text-anchor="middle" x="654.58" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">failed goal</text>
164
165
  </g>
165
166
  <!-- E3 -->
166
167
  <g id="node7" class="node">
167
168
  <title>E3</title>
168
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1164.12,-358C1164.12,-358 1043.88,-358 1043.88,-358 1037.88,-358 1031.88,-352 1031.88,-346 1031.88,-346 1031.88,-334 1031.88,-334 1031.88,-328 1037.88,-322 1043.88,-322 1043.88,-322 1164.12,-322 1164.12,-322 1170.12,-322 1176.12,-328 1176.12,-334 1176.12,-334 1176.12,-346 1176.12,-346 1176.12,-352 1170.12,-358 1164.12,-358"/>
169
- <text xml:space="preserve" text-anchor="middle" x="1104" y="-342.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">E3 &#160;verify_as_reward</text>
170
- <text xml:space="preserve" text-anchor="middle" x="1104" y="-330.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_verify caps/floors judge</text>
169
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1517.12,-420.5C1517.12,-420.5 1396.88,-420.5 1396.88,-420.5 1390.88,-420.5 1384.88,-414.5 1384.88,-408.5 1384.88,-408.5 1384.88,-396.5 1384.88,-396.5 1384.88,-390.5 1390.88,-384.5 1396.88,-384.5 1396.88,-384.5 1517.12,-384.5 1517.12,-384.5 1523.12,-384.5 1529.12,-390.5 1529.12,-396.5 1529.12,-396.5 1529.12,-408.5 1529.12,-408.5 1529.12,-414.5 1523.12,-420.5 1517.12,-420.5"/>
170
+ <text xml:space="preserve" text-anchor="middle" x="1457" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">E3 &#160;verify_as_reward</text>
171
+ <text xml:space="preserve" text-anchor="middle" x="1457" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_verify caps/floors judge</text>
171
172
  </g>
172
173
  <!-- R1&#45;&gt;E3 -->
173
174
  <g id="edge6" class="edge">
174
175
  <title>R1&#45;&gt;E3</title>
175
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M952.76,-340C974.34,-340 998.84,-340 1021.74,-340"/>
176
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1021.47,-342.8 1029.47,-340 1021.47,-337.2 1021.47,-342.8"/>
177
- <text xml:space="preserve" text-anchor="middle" x="991.94" y="-344.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">ground</text>
176
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1305.76,-402.5C1327.34,-402.5 1351.84,-402.5 1374.74,-402.5"/>
177
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1374.47,-405.3 1382.47,-402.5 1374.47,-399.7 1374.47,-405.3"/>
178
+ <text xml:space="preserve" text-anchor="middle" x="1344.94" y="-407.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">ground</text>
178
179
  </g>
179
180
  <!-- Fses -->
180
181
  <g id="node17" class="node">
181
182
  <title>Fses</title>
182
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M644.5,-56C644.5,-58.21 625.45,-60 602,-60 578.55,-60 559.5,-58.21 559.5,-56 559.5,-56 559.5,-20 559.5,-20 559.5,-17.79 578.55,-16 602,-16 625.45,-16 644.5,-17.79 644.5,-20 644.5,-20 644.5,-56 644.5,-56"/>
183
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M644.5,-56C644.5,-53.79 625.45,-52 602,-52 578.55,-52 559.5,-53.79 559.5,-56"/>
184
- <text xml:space="preserve" text-anchor="middle" x="602" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions/*.jsonl</text>
185
- <text xml:space="preserve" text-anchor="middle" x="602" y="-28.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(step_reward)</text>
183
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M641.5,-56C641.5,-58.21 622.45,-60 599,-60 575.55,-60 556.5,-58.21 556.5,-56 556.5,-56 556.5,-20 556.5,-20 556.5,-17.79 575.55,-16 599,-16 622.45,-16 641.5,-17.79 641.5,-20 641.5,-20 641.5,-56 641.5,-56"/>
184
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M641.5,-56C641.5,-53.79 622.45,-52 599,-52 575.55,-52 556.5,-53.79 556.5,-56"/>
185
+ <text xml:space="preserve" text-anchor="middle" x="599" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions/*.jsonl</text>
186
+ <text xml:space="preserve" text-anchor="middle" x="599" y="-28.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(step_reward)</text>
186
187
  </g>
187
188
  <!-- R2&#45;&gt;Fses -->
188
189
  <g id="edge11" class="edge">
189
190
  <title>R2&#45;&gt;Fses</title>
190
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1228.34,-321.46C1138.01,-271.75 879.67,-131.95 787,-107.25 760.75,-100.25 689.87,-110.19 665,-99.25 649.28,-92.34 635.12,-79.72 624.23,-67.81"/>
191
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="626.55,-66.21 619.17,-62.02 622.33,-69.89 626.55,-66.21"/>
192
- <text xml:space="preserve" text-anchor="middle" x="1118.79" y="-180.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">step_reward</text>
191
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1575.7,-383.86C1567,-379.95 1557.73,-375.95 1549,-372.5 1219.16,-242.05 1137.47,-186.28 786,-138.5 758.64,-134.78 686.02,-144.13 662,-130.5 638.18,-116.99 621.4,-90.31 611.18,-69.24"/>
192
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="613.79,-68.2 607.9,-62.1 608.7,-70.54 613.79,-68.2"/>
193
+ <text xml:space="preserve" text-anchor="middle" x="1427.86" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">step_reward</text>
193
194
  </g>
194
195
  <!-- Fmis -->
195
196
  <g id="node16" class="node">
196
197
  <title>Fmis</title>
197
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M865.38,-52.73C865.38,-54.53 848.17,-56 827,-56 805.83,-56 788.62,-54.53 788.62,-52.73 788.62,-52.73 788.62,-23.27 788.62,-23.27 788.62,-21.47 805.83,-20 827,-20 848.17,-20 865.38,-21.47 865.38,-23.27 865.38,-23.27 865.38,-52.73 865.38,-52.73"/>
198
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M865.38,-52.73C865.38,-50.92 848.17,-49.45 827,-49.45 805.83,-49.45 788.62,-50.92 788.62,-52.73"/>
199
- <text xml:space="preserve" text-anchor="middle" x="827" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes.json</text>
198
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M862.38,-52.73C862.38,-54.53 845.17,-56 824,-56 802.83,-56 785.62,-54.53 785.62,-52.73 785.62,-52.73 785.62,-23.27 785.62,-23.27 785.62,-21.47 802.83,-20 824,-20 845.17,-20 862.38,-21.47 862.38,-23.27 862.38,-23.27 862.38,-52.73 862.38,-52.73"/>
199
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M862.38,-52.73C862.38,-50.92 845.17,-49.45 824,-49.45 802.83,-49.45 785.62,-50.92 785.62,-52.73"/>
200
+ <text xml:space="preserve" text-anchor="middle" x="824" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes.json</text>
200
201
  </g>
201
202
  <!-- R3&#45;&gt;Fmis -->
202
203
  <g id="edge13" class="edge">
203
204
  <title>R3&#45;&gt;Fmis</title>
204
- <path fill="none" stroke="#fb7185" stroke-width="1.3" stroke-dasharray="5,2" d="M1371.25,-321.5C1340.86,-304.75 1294.83,-278.11 1257.5,-251 1178.66,-193.75 1182.59,-143.11 1092,-107.25 1049.2,-90.31 927,-118.09 885,-99.25 868.43,-91.82 854.21,-77.27 844,-64.34"/>
205
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="846.39,-62.86 839.35,-58.14 841.91,-66.22 846.39,-62.86"/>
206
- <text xml:space="preserve" text-anchor="middle" x="1286.75" y="-180.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">reward_signal</text>
205
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" stroke-dasharray="5,2" d="M933.09,-379.91C913.01,-317.15 854.67,-134.85 832.6,-65.87"/>
206
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="835.32,-65.19 830.21,-58.42 829.99,-66.89 835.32,-65.19"/>
207
+ <text xml:space="preserve" text-anchor="middle" x="940.88" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">reward_signal</text>
207
208
  </g>
208
209
  <!-- Frws -->
209
210
  <g id="node21" class="node">
210
211
  <title>Frws</title>
211
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1010.62,-52.73C1010.62,-54.53 987.04,-56 958,-56 928.96,-56 905.38,-54.53 905.38,-52.73 905.38,-52.73 905.38,-23.27 905.38,-23.27 905.38,-21.47 928.96,-20 958,-20 987.04,-20 1010.62,-21.47 1010.62,-23.27 1010.62,-23.27 1010.62,-52.73 1010.62,-52.73"/>
212
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M1010.62,-52.73C1010.62,-50.92 987.04,-49.45 958,-49.45 928.96,-49.45 905.38,-50.92 905.38,-52.73"/>
213
- <text xml:space="preserve" text-anchor="middle" x="958" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">reward_sentinel.json</text>
212
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1007.62,-52.73C1007.62,-54.53 984.04,-56 955,-56 925.96,-56 902.38,-54.53 902.38,-52.73 902.38,-52.73 902.38,-23.27 902.38,-23.27 902.38,-21.47 925.96,-20 955,-20 984.04,-20 1007.62,-21.47 1007.62,-23.27 1007.62,-23.27 1007.62,-52.73 1007.62,-52.73"/>
213
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1007.62,-52.73C1007.62,-50.92 984.04,-49.45 955,-49.45 925.96,-49.45 902.38,-50.92 902.38,-52.73"/>
214
+ <text xml:space="preserve" text-anchor="middle" x="955" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">reward_sentinel.json</text>
214
215
  </g>
215
216
  <!-- R3&#45;&gt;Frws -->
216
217
  <g id="edge12" class="edge">
217
218
  <title>R3&#45;&gt;Frws</title>
218
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1400.76,-321.59C1391.24,-276.1 1358.63,-153.94 1276,-107.25 1195.52,-61.78 1087.94,-46.55 1020.82,-41.49"/>
219
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1021.36,-38.72 1013.18,-40.95 1020.97,-44.3 1021.36,-38.72"/>
219
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M967.53,-380.16C985.91,-364.09 1008.56,-340.28 1019,-313.5 1047.26,-241.03 1043.45,-212.97 1021,-138.5 1012.52,-110.37 993.19,-82.88 977.63,-63.95"/>
220
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="979.81,-62.19 972.51,-57.89 975.54,-65.81 979.81,-62.19"/>
220
221
  </g>
221
222
  <!-- S1 -->
222
223
  <g id="node8" class="node">
223
224
  <title>S1</title>
224
- <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M775.88,-362C775.88,-362 672.12,-362 672.12,-362 666.12,-362 660.12,-356 660.12,-350 660.12,-350 660.12,-330 660.12,-330 660.12,-324 666.12,-318 672.12,-318 672.12,-318 775.88,-318 775.88,-318 781.88,-318 787.88,-324 787.88,-330 787.88,-330 787.88,-350 787.88,-350 787.88,-356 781.88,-362 775.88,-362"/>
225
- <text xml:space="preserve" text-anchor="middle" x="724" y="-348.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S1 &#160;practice</text>
226
- <text xml:space="preserve" text-anchor="middle" x="724" y="-336.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Mistakes.top → self&#45;play</text>
227
- <text xml:space="preserve" text-anchor="middle" x="724" y="-324.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">auto&#45;resolve on judge≥0.7</text>
225
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M826.88,-424.5C826.88,-424.5 723.12,-424.5 723.12,-424.5 717.12,-424.5 711.12,-418.5 711.12,-412.5 711.12,-412.5 711.12,-392.5 711.12,-392.5 711.12,-386.5 717.12,-380.5 723.12,-380.5 723.12,-380.5 826.88,-380.5 826.88,-380.5 832.88,-380.5 838.88,-386.5 838.88,-392.5 838.88,-392.5 838.88,-412.5 838.88,-412.5 838.88,-418.5 832.88,-424.5 826.88,-424.5"/>
226
+ <text xml:space="preserve" text-anchor="middle" x="775" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">S1 &#160;practice</text>
227
+ <text xml:space="preserve" text-anchor="middle" x="775" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Mistakes.top → self&#45;play</text>
228
+ <text xml:space="preserve" text-anchor="middle" x="775" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">auto&#45;resolve on judge≥0.7</text>
228
229
  </g>
229
230
  <!-- S1&#45;&gt;Fmis -->
230
231
  <g id="edge14" class="edge">
231
232
  <title>S1&#45;&gt;Fmis</title>
232
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M740.11,-308.57C744.59,-299.51 749.25,-289.47 753,-280 783,-204.32 808.47,-111.38 820.16,-66.22"/>
233
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="737.72,-307.08 736.61,-315.49 742.72,-309.61 737.72,-307.08"/>
234
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="822.87,-66.92 822.14,-58.47 817.45,-65.53 822.87,-66.92"/>
235
- <text xml:space="preserve" text-anchor="middle" x="822.38" y="-180.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">auto&#45;resolve</text>
233
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M779.26,-369.96C788.74,-299.84 811.43,-132.01 820.33,-66.17"/>
234
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="776.52,-369.39 778.22,-377.69 782.06,-370.14 776.52,-369.39"/>
235
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="823.07,-66.76 821.37,-58.46 817.52,-66.01 823.07,-66.76"/>
236
+ <text xml:space="preserve" text-anchor="middle" x="829.87" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">auto&#45;resolve</text>
236
237
  </g>
237
238
  <!-- Fcur -->
238
239
  <g id="node19" class="node">
239
240
  <title>Fcur</title>
240
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M749,-52.73C749,-54.53 734.66,-56 717,-56 699.34,-56 685,-54.53 685,-52.73 685,-52.73 685,-23.27 685,-23.27 685,-21.47 699.34,-20 717,-20 734.66,-20 749,-21.47 749,-23.27 749,-23.27 749,-52.73 749,-52.73"/>
241
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M749,-52.73C749,-50.92 734.66,-49.45 717,-49.45 699.34,-49.45 685,-50.92 685,-52.73"/>
242
- <text xml:space="preserve" text-anchor="middle" x="717" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">curriculum/</text>
241
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M746,-52.73C746,-54.53 731.66,-56 714,-56 696.34,-56 682,-54.53 682,-52.73 682,-52.73 682,-23.27 682,-23.27 682,-21.47 696.34,-20 714,-20 731.66,-20 746,-21.47 746,-23.27 746,-23.27 746,-52.73 746,-52.73"/>
242
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M746,-52.73C746,-50.92 731.66,-49.45 714,-49.45 696.34,-49.45 682,-50.92 682,-52.73"/>
243
+ <text xml:space="preserve" text-anchor="middle" x="714" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">curriculum/</text>
243
244
  </g>
244
245
  <!-- S1&#45;&gt;Fcur -->
245
246
  <g id="edge15" class="edge">
246
247
  <title>S1&#45;&gt;Fcur</title>
247
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M723.5,-317.42C722.25,-263.94 719.01,-125.3 717.64,-66.27"/>
248
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="720.44,-66.43 717.45,-58.5 714.84,-66.56 720.44,-66.43"/>
248
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M771.32,-379.64C760.74,-316.74 730.22,-135.4 718.58,-66.24"/>
249
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="721.36,-65.87 717.27,-58.45 715.84,-66.8 721.36,-65.87"/>
249
250
  </g>
250
251
  <!-- W1 -->
251
252
  <g id="node13" class="node">
252
253
  <title>W1</title>
253
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M332,-205.75C332,-205.75 226,-205.75 226,-205.75 220,-205.75 214,-199.75 214,-193.75 214,-193.75 214,-173.75 214,-173.75 214,-167.75 220,-161.75 226,-161.75 226,-161.75 332,-161.75 332,-161.75 338,-161.75 344,-167.75 344,-173.75 344,-173.75 344,-193.75 344,-193.75 344,-199.75 338,-205.75 332,-205.75"/>
254
- <text xml:space="preserve" text-anchor="middle" x="279" y="-192.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">W1 &#160;preference ledger</text>
255
- <text xml:space="preserve" text-anchor="middle" x="279" y="-180.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(prompt, rejected, chosen)</text>
256
- <text xml:space="preserve" text-anchor="middle" x="279" y="-168.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">5 free sources</text>
254
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M332,-243C332,-243 226,-243 226,-243 220,-243 214,-237 214,-231 214,-231 214,-199 214,-199 214,-193 220,-187 226,-187 226,-187 332,-187 332,-187 338,-187 344,-193 344,-199 344,-199 344,-231 344,-231 344,-237 338,-243 332,-243"/>
255
+ <text xml:space="preserve" text-anchor="middle" x="279" y="-229.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">W1 &#160;preference ledger</text>
256
+ <text xml:space="preserve" text-anchor="middle" x="279" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(prompt, rejected, chosen)</text>
257
+ <text xml:space="preserve" text-anchor="middle" x="279" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">5 free sources</text>
258
+ <text xml:space="preserve" text-anchor="middle" x="279" y="-193.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">export_dpo ≤40%/source</text>
257
259
  </g>
258
260
  <!-- S2&#45;&gt;W1 -->
259
261
  <g id="edge16" class="edge">
260
262
  <title>S2&#45;&gt;W1</title>
261
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M266.58,-321.61C268.9,-296.01 273.28,-247.8 276.17,-215.98"/>
262
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="278.93,-216.45 276.87,-208.23 273.36,-215.95 278.93,-216.45"/>
263
- <text xml:space="preserve" text-anchor="middle" x="300.12" y="-266.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(loser,winner)</text>
263
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M165.76,-384.05C186.13,-353.82 228.36,-291.16 255.09,-251.48"/>
264
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="257.3,-253.21 259.45,-245.01 252.66,-250.08 257.3,-253.21"/>
265
+ <text xml:space="preserve" text-anchor="middle" x="233.43" y="-328.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(loser,winner)</text>
264
266
  </g>
265
267
  <!-- S3&#45;&gt;W1 -->
266
268
  <g id="edge17" class="edge">
267
269
  <title>S3&#45;&gt;W1</title>
268
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M131.72,-321.61C160.22,-295.12 214.77,-244.44 248.88,-212.74"/>
269
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="250.44,-215.11 254.4,-207.61 246.63,-211.01 250.44,-215.11"/>
270
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M303.46,-384.05C299.12,-354.26 290.21,-292.98 284.42,-253.23"/>
271
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="287.19,-252.84 283.27,-245.32 281.65,-253.64 287.19,-252.84"/>
270
272
  </g>
271
273
  <!-- C3&#45;&gt;Fses -->
272
274
  <g id="edge18" class="edge">
273
275
  <title>C3&#45;&gt;Fses</title>
274
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M568.09,-321.57C573.98,-272.53 590.74,-132.84 598.26,-70.13"/>
275
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="601.02,-70.63 599.2,-62.36 595.46,-69.97 601.02,-70.63"/>
276
- <text xml:space="preserve" text-anchor="middle" x="614.25" y="-180.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">success:true</text>
276
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M616.13,-384.02C613.28,-326.61 604.18,-143.38 600.53,-69.91"/>
277
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="603.35,-70.11 600.15,-62.26 597.76,-70.39 603.35,-70.11"/>
278
+ <text xml:space="preserve" text-anchor="middle" x="638.1" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">success:true</text>
277
279
  </g>
278
280
  <!-- Fprf -->
279
281
  <g id="node18" class="node">
280
282
  <title>Fprf</title>
281
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M519.12,-52.73C519.12,-54.53 498.9,-56 474,-56 449.1,-56 428.88,-54.53 428.88,-52.73 428.88,-52.73 428.88,-23.27 428.88,-23.27 428.88,-21.47 449.1,-20 474,-20 498.9,-20 519.12,-21.47 519.12,-23.27 519.12,-23.27 519.12,-52.73 519.12,-52.73"/>
282
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M519.12,-52.73C519.12,-50.92 498.9,-49.45 474,-49.45 449.1,-49.45 428.88,-50.92 428.88,-52.73"/>
283
- <text xml:space="preserve" text-anchor="middle" x="474" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preferences.jsonl</text>
283
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M516.12,-52.73C516.12,-54.53 495.9,-56 471,-56 446.1,-56 425.88,-54.53 425.88,-52.73 425.88,-52.73 425.88,-23.27 425.88,-23.27 425.88,-21.47 446.1,-20 471,-20 495.9,-20 516.12,-21.47 516.12,-23.27 516.12,-23.27 516.12,-52.73 516.12,-52.73"/>
284
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M516.12,-52.73C516.12,-50.92 495.9,-49.45 471,-49.45 446.1,-49.45 425.88,-50.92 425.88,-52.73"/>
285
+ <text xml:space="preserve" text-anchor="middle" x="471" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preferences.jsonl</text>
284
286
  </g>
285
287
  <!-- W1&#45;&gt;Fprf -->
286
288
  <g id="edge19" class="edge">
287
289
  <title>W1&#45;&gt;Fprf</title>
288
- <path fill="none" stroke="#f59e0b" stroke-width="2" d="M330.59,-161.2C341.59,-156.69 353.16,-152.01 364,-147.75 399.34,-133.85 417.08,-144.53 444,-117.75 457.57,-104.25 465.1,-83.99 469.23,-67.39"/>
289
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="471.96,-67.99 470.93,-59.58 466.49,-66.8 471.96,-67.99"/>
290
+ <path fill="none" stroke="#f59e0b" stroke-width="2" d="M344.37,-186.9C350.99,-184.21 357.62,-181.54 364,-179 398.51,-165.26 417.21,-176.66 442,-149 462.14,-126.53 468.57,-91.69 470.48,-67.26"/>
291
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="473.26,-67.69 470.91,-59.55 467.67,-67.38 473.26,-67.69"/>
290
292
  </g>
291
293
  <!-- W2 -->
292
294
  <g id="node14" class="node">
293
295
  <title>W2</title>
294
- <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M161.88,-211.75C161.88,-211.75 28.12,-211.75 28.12,-211.75 22.12,-211.75 16.12,-205.75 16.12,-199.75 16.12,-199.75 16.12,-167.75 16.12,-167.75 16.12,-161.75 22.12,-155.75 28.12,-155.75 28.12,-155.75 161.88,-155.75 161.88,-155.75 167.88,-155.75 173.88,-161.75 173.88,-167.75 173.88,-167.75 173.88,-199.75 173.88,-199.75 173.88,-205.75 167.88,-211.75 161.88,-211.75"/>
295
- <text xml:space="preserve" text-anchor="middle" x="95" y="-198.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">W2 &#160;train_and_gate</text>
296
- <text xml:space="preserve" text-anchor="middle" x="95" y="-186.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SFT+DPO → LoRA vN+1</text>
297
- <text xml:space="preserve" text-anchor="middle" x="95" y="-174.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">replay Mistakes.top vN vs vN+1</text>
298
- <text xml:space="preserve" text-anchor="middle" x="95" y="-162.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">promote iff resolved(N+1) &gt; (N)</text>
296
+ <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M161.88,-243C161.88,-243 28.12,-243 28.12,-243 22.12,-243 16.12,-237 16.12,-231 16.12,-231 16.12,-199 16.12,-199 16.12,-193 22.12,-187 28.12,-187 28.12,-187 161.88,-187 161.88,-187 167.88,-187 173.88,-193 173.88,-199 173.88,-199 173.88,-231 173.88,-231 173.88,-237 167.88,-243 161.88,-243"/>
297
+ <text xml:space="preserve" text-anchor="middle" x="95" y="-229.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">W2 &#160;train_and_gate</text>
298
+ <text xml:space="preserve" text-anchor="middle" x="95" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SFT+DPO → LoRA vN+1</text>
299
+ <text xml:space="preserve" text-anchor="middle" x="95" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">replay Mistakes.top vN vs vN+1</text>
300
+ <text xml:space="preserve" text-anchor="middle" x="95" y="-193.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">promote iff resolved(N+1) &gt; (N)</text>
299
301
  </g>
300
302
  <!-- Fftn -->
301
303
  <g id="node20" class="node">
302
304
  <title>Fftn</title>
303
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M389.25,-52.73C389.25,-54.53 371.21,-56 349,-56 326.79,-56 308.75,-54.53 308.75,-52.73 308.75,-52.73 308.75,-23.27 308.75,-23.27 308.75,-21.47 326.79,-20 349,-20 371.21,-20 389.25,-21.47 389.25,-23.27 389.25,-23.27 389.25,-52.73 389.25,-52.73"/>
304
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M389.25,-52.73C389.25,-50.92 371.21,-49.45 349,-49.45 326.79,-49.45 308.75,-50.92 308.75,-52.73"/>
305
- <text xml:space="preserve" text-anchor="middle" x="349" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">finetune/*.jsonl</text>
305
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M386.25,-52.73C386.25,-54.53 368.21,-56 346,-56 323.79,-56 305.75,-54.53 305.75,-52.73 305.75,-52.73 305.75,-23.27 305.75,-23.27 305.75,-21.47 323.79,-20 346,-20 368.21,-20 386.25,-21.47 386.25,-23.27 386.25,-23.27 386.25,-52.73 386.25,-52.73"/>
306
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M386.25,-52.73C386.25,-50.92 368.21,-49.45 346,-49.45 323.79,-49.45 305.75,-50.92 305.75,-52.73"/>
307
+ <text xml:space="preserve" text-anchor="middle" x="346" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">finetune/*.jsonl</text>
306
308
  </g>
307
309
  <!-- W2&#45;&gt;Fftn -->
308
310
  <g id="edge22" class="edge">
309
311
  <title>W2&#45;&gt;Fftn</title>
310
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M133.5,-154.77C154.71,-139.88 181.77,-121.71 207,-107.25 237.94,-89.51 274.2,-72.14 302.33,-59.36"/>
311
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="303.23,-62.02 309.37,-56.18 300.93,-56.92 303.23,-62.02"/>
312
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M135.05,-186.08C184.43,-151.65 267.43,-93.78 313.21,-61.86"/>
313
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="314.74,-64.21 319.7,-57.34 311.53,-59.62 314.74,-64.21"/>
312
314
  </g>
313
315
  <!-- Ollama -->
314
316
  <g id="node22" class="node">
@@ -320,73 +322,116 @@
320
322
  <!-- W2&#45;&gt;Ollama -->
321
323
  <g id="edge23" class="edge">
322
324
  <title>W2&#45;&gt;Ollama</title>
323
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M94.87,-154.92C94.82,-143.41 94.77,-129.94 94.75,-117.75 94.72,-100.97 94.77,-82.18 94.84,-67.17"/>
324
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="97.64,-67.56 94.88,-59.54 92.04,-67.53 97.64,-67.56"/>
325
- <text xml:space="preserve" text-anchor="middle" x="106.38" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">LoRA</text>
325
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M94.35,-186.17C94.11,-174.66 93.87,-161.19 93.75,-149 93.48,-121.32 93.92,-89.72 94.35,-67.51"/>
326
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="97.15,-67.61 94.51,-59.55 91.55,-67.49 97.15,-67.61"/>
327
+ <text xml:space="preserve" text-anchor="middle" x="105.38" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">LoRA</text>
326
328
  </g>
327
329
  <!-- W3 -->
328
330
  <g id="node15" class="node">
329
331
  <title>W3</title>
330
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M514.38,-201.75C514.38,-201.75 395.62,-201.75 395.62,-201.75 389.62,-201.75 383.62,-195.75 383.62,-189.75 383.62,-189.75 383.62,-177.75 383.62,-177.75 383.62,-171.75 389.62,-165.75 395.62,-165.75 395.62,-165.75 514.38,-165.75 514.38,-165.75 520.38,-165.75 526.38,-171.75 526.38,-177.75 526.38,-177.75 526.38,-189.75 526.38,-189.75 526.38,-195.75 520.38,-201.75 514.38,-201.75"/>
331
- <text xml:space="preserve" text-anchor="middle" x="455" y="-186.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">W3 &#160;calibrate</text>
332
- <text xml:space="preserve" text-anchor="middle" x="455" y="-174.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">p(success) vs actual → Brier</text>
332
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M514.38,-233C514.38,-233 395.62,-233 395.62,-233 389.62,-233 383.62,-227 383.62,-221 383.62,-221 383.62,-209 383.62,-209 383.62,-203 389.62,-197 395.62,-197 395.62,-197 514.38,-197 514.38,-197 520.38,-197 526.38,-203 526.38,-209 526.38,-209 526.38,-221 526.38,-221 526.38,-227 520.38,-233 514.38,-233"/>
333
+ <text xml:space="preserve" text-anchor="middle" x="455" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">W3 &#160;calibrate</text>
334
+ <text xml:space="preserve" text-anchor="middle" x="455" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">p(success) vs actual → Brier</text>
333
335
  </g>
334
336
  <!-- W3&#45;&gt;Loop -->
335
337
  <g id="edge25" class="edge">
336
338
  <title>W3&#45;&gt;Loop</title>
337
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M477.07,-202.18C498.63,-218.11 533.06,-240.69 567,-251 679.23,-285.11 1540.41,-224.77 1621,-310 1648.86,-339.47 1647.26,-370.34 1621,-401.25 1588.05,-440.03 1558.55,-413.83 1508,-419.75 1232.77,-451.98 904.04,-469.02 756.06,-475.55"/>
338
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="755.98,-472.75 748.11,-475.89 756.23,-478.34 755.98,-472.75"/>
339
- <text xml:space="preserve" text-anchor="middle" x="1662.67" y="-336.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">calibration</text>
339
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M473.18,-233.64C498.38,-256.81 546.44,-296.54 596,-313.5 709.6,-352.39 1592.45,-285.31 1675,-372.5 1712.43,-412.04 1713.26,-456.26 1675,-495 1668.7,-501.37 1038.91,-502.02 1030,-503 1007.43,-505.49 1002.3,-509.2 980,-513.5 891.3,-530.6 789.11,-548.27 720.52,-559.84"/>
340
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="720.43,-557.01 713.01,-561.1 721.36,-562.54 720.43,-557.01"/>
341
+ <text xml:space="preserve" text-anchor="middle" x="1724.76" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">calibration</text>
340
342
  </g>
341
343
  <!-- Fmis&#45;&gt;W2 -->
342
344
  <g id="edge24" class="edge">
343
345
  <title>Fmis&#45;&gt;W2</title>
344
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M815.48,-56.55C805.14,-70.7 788.6,-89.76 769,-99.25 653.59,-155.14 319.45,-121.18 194,-147.75 188.21,-148.98 182.29,-150.46 176.37,-152.1"/>
345
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="175.87,-149.33 168.98,-154.27 177.45,-154.71 175.87,-149.33"/>
346
- <text xml:space="preserve" text-anchor="middle" x="761.71" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">eval set</text>
346
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M818.27,-56.63C810.28,-78.1 793.58,-113.59 766,-130.5 657.24,-197.17 318.77,-152.44 194,-179 188.27,-180.22 182.41,-181.69 176.56,-183.32"/>
347
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="176.15,-180.52 169.26,-185.45 177.72,-185.89 176.15,-180.52"/>
348
+ <text xml:space="preserve" text-anchor="middle" x="759.79" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">eval set</text>
347
349
  </g>
348
350
  <!-- Fses&#45;&gt;W2 -->
349
351
  <g id="edge21" class="edge">
350
352
  <title>Fses&#45;&gt;W2</title>
351
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M585.66,-60.39C574.14,-73.83 557.52,-90.27 539,-99.25 504.17,-116.14 231.6,-138.56 194,-147.75 188.91,-148.99 183.71,-150.4 178.5,-151.92"/>
352
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="177.85,-149.19 171,-154.18 179.47,-154.55 177.85,-149.19"/>
353
- <text xml:space="preserve" text-anchor="middle" x="537.83" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_finetune</text>
353
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M590.5,-60.3C580.74,-81.78 562.57,-114.05 536,-130.5 519.68,-140.6 212.64,-174.43 194,-179 188.91,-180.25 183.71,-181.66 178.5,-183.17"/>
354
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="177.85,-180.45 171,-185.44 179.47,-185.81 177.85,-180.45"/>
355
+ <text xml:space="preserve" text-anchor="middle" x="527.83" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_finetune</text>
354
356
  </g>
355
357
  <!-- Fprf&#45;&gt;W2 -->
356
358
  <g id="edge20" class="edge">
357
359
  <title>Fprf&#45;&gt;W2</title>
358
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M460.95,-56.49C449.15,-70.81 430.37,-90.13 409,-99.25 381.26,-111.09 302.87,-100.39 273.5,-107.25 233.05,-116.7 190.09,-134.6 156.46,-150.6"/>
359
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="155.44,-147.98 149.45,-153.98 157.87,-153.02 155.44,-147.98"/>
360
- <text xml:space="preserve" text-anchor="middle" x="296.75" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_dpo</text>
360
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M464.23,-56.46C454.8,-78.11 435.48,-114.15 406,-130.5 379.81,-145.02 300.64,-131.62 271.5,-138.5 231.45,-147.95 188.98,-165.85 155.73,-181.85"/>
361
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="154.78,-179.2 148.82,-185.22 157.24,-184.23 154.78,-179.2"/>
362
+ <text xml:space="preserve" text-anchor="middle" x="294.75" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_dpo</text>
361
363
  </g>
362
364
  <!-- Ollama&#45;&gt;Loop -->
363
- <g id="edge28" class="edge">
365
+ <g id="edge32" class="edge">
364
366
  <title>Ollama&#45;&gt;Loop</title>
365
- <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M139.3,-56.56C178.48,-71.13 237.56,-90.78 291,-99.25 345.44,-107.88 731.94,-104.74 787,-107.25 1026.98,-118.19 1092.95,-89.45 1326,-147.75 1499.4,-191.13 1596.38,-160.27 1694,-310 1716.15,-343.97 1720.02,-370.14 1694,-401.25 1664.16,-436.93 1637.17,-414.13 1591,-419.75 1284.13,-457.09 916.24,-471.74 756.97,-476.63"/>
366
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="757.27,-473.82 749.36,-476.86 757.44,-479.42 757.27,-473.82"/>
367
- <text xml:space="preserve" text-anchor="middle" x="1702.95" y="-271.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">promoted vN+1</text>
368
- <text xml:space="preserve" text-anchor="middle" x="1702.95" y="-260.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(next session)</text>
367
+ <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M122.38,-56.63C158.59,-78.83 225.17,-115.83 288,-130.5 341.89,-143.08 730.7,-136.4 786,-138.5 936.61,-144.21 1320.02,-131.35 1463,-179 1611.05,-228.34 1682.06,-235.07 1756,-372.5 1781.79,-420.45 1794.27,-456.28 1756,-495 1749.38,-501.7 1087.36,-501.97 1078,-503 1055.43,-505.48 1050.34,-509.44 1028,-513.5 922.56,-532.67 800.17,-550.8 721.96,-561.87"/>
368
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="721.75,-559.07 714.22,-562.96 722.53,-564.62 721.75,-559.07"/>
369
+ <text xml:space="preserve" text-anchor="middle" x="1768.75" y="-333.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">promoted vN+1</text>
370
+ <text xml:space="preserve" text-anchor="middle" x="1768.75" y="-323.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(next session)</text>
369
371
  </g>
370
372
  <!-- Cron -->
371
373
  <g id="node23" class="node">
372
374
  <title>Cron</title>
373
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M1451,-497.75C1451,-497.75 1321,-497.75 1321,-497.75 1315,-497.75 1309,-491.75 1309,-485.75 1309,-485.75 1309,-473.75 1309,-473.75 1309,-467.75 1315,-461.75 1321,-461.75 1321,-461.75 1451,-461.75 1451,-461.75 1457,-461.75 1463,-467.75 1463,-473.75 1463,-473.75 1463,-485.75 1463,-485.75 1463,-491.75 1457,-497.75 1451,-497.75"/>
374
- <text xml:space="preserve" text-anchor="middle" x="1386" y="-482.62" font-family="sans-Serif" font-size="10.00" fill="#0f172a">⏱ &#160;PWN::Cron.install_defaults</text>
375
- <text xml:space="preserve" text-anchor="middle" x="1386" y="-469.88" font-family="sans-Serif" font-size="10.00" fill="#0f172a">nightly practice · weekly train</text>
375
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M994,-596.25C994,-596.25 864,-596.25 864,-596.25 858,-596.25 852,-590.25 852,-584.25 852,-584.25 852,-563.5 852,-563.5 852,-557.5 858,-551.5 864,-551.5 864,-551.5 994,-551.5 994,-551.5 1000,-551.5 1006,-557.5 1006,-563.5 1006,-563.5 1006,-584.25 1006,-584.25 1006,-590.25 1000,-596.25 994,-596.25"/>
376
+ <text xml:space="preserve" text-anchor="middle" x="929" y="-582.75" font-family="sans-Serif" font-size="10.00" fill="#0f172a">⏱ &#160;PWN::Cron.install_defaults</text>
377
+ <text xml:space="preserve" text-anchor="middle" x="929" y="-570" font-family="sans-Serif" font-size="10.00" fill="#0f172a">practice · offline_judge</text>
378
+ <text xml:space="preserve" text-anchor="middle" x="929" y="-558" font-family="sans-Serif" font-size="10.00" fill="#0f172a">train dry_run · consolidate</text>
376
379
  </g>
377
380
  <!-- Cron&#45;&gt;S1 -->
378
381
  <g id="edge26" class="edge">
379
382
  <title>Cron&#45;&gt;S1</title>
380
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1446.82,-461.1C1480.11,-448.56 1510.76,-430.26 1490,-409.25 1476.72,-395.81 827.98,-407.04 810,-401.25 789.76,-394.73 770.1,-381.64 754.71,-369.32"/>
381
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="756.52,-367.19 748.58,-364.25 752.95,-371.51 756.52,-367.19"/>
382
- <text xml:space="preserve" text-anchor="middle" x="1511.42" y="-411.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 3 * * *</text>
383
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M965.81,-550.89C984.89,-536.83 1001.46,-518.4 987,-503 977.4,-492.77 873.69,-500.97 861,-495 832.79,-481.72 809.26,-454.72 793.98,-433.48"/>
384
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="796.33,-431.95 789.47,-426.98 791.74,-435.15 796.33,-431.95"/>
385
+ <text xml:space="preserve" text-anchor="middle" x="1007.46" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 3 * * *</text>
383
386
  </g>
384
387
  <!-- Cron&#45;&gt;W2 -->
385
- <g id="edge27" class="edge">
388
+ <g id="edge28" class="edge">
386
389
  <title>Cron&#45;&gt;W2</title>
387
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1463.55,-465.39C1607.22,-437.67 1890.79,-367.34 1783,-259 1767.43,-243.36 215.1,-257.47 194,-251 172.39,-244.38 151.2,-231.34 134,-218.57"/>
388
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="136,-216.58 127.95,-213.94 132.6,-221.03 136,-216.58"/>
389
- <text xml:space="preserve" text-anchor="middle" x="1822.57" y="-336.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 4 * * 0</text>
390
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M999.82,-550.93C1057.41,-534.23 1141.09,-512.55 1216,-503 1230.88,-501.1 1744.93,-505.12 1756,-495 1813.16,-442.75 1826.62,-376.4 1772,-321.5 1756.54,-305.96 214.26,-321.86 194,-313.5 163.48,-300.9 137.3,-273.91 119.54,-251.51"/>
391
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="121.91,-250 114.81,-245.37 117.47,-253.42 121.91,-250"/>
392
+ <text xml:space="preserve" text-anchor="middle" x="1822.76" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 4 * * 0</text>
393
+ </g>
394
+ <!-- OJ -->
395
+ <g id="node24" class="node">
396
+ <title>OJ</title>
397
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1283.62,-591.88C1283.62,-591.88 1148.38,-591.88 1148.38,-591.88 1142.38,-591.88 1136.38,-585.88 1136.38,-579.88 1136.38,-579.88 1136.38,-567.88 1136.38,-567.88 1136.38,-561.88 1142.38,-555.88 1148.38,-555.88 1148.38,-555.88 1283.62,-555.88 1283.62,-555.88 1289.62,-555.88 1295.62,-561.88 1295.62,-567.88 1295.62,-567.88 1295.62,-579.88 1295.62,-579.88 1295.62,-585.88 1289.62,-591.88 1283.62,-591.88"/>
398
+ <text xml:space="preserve" text-anchor="middle" x="1216" y="-576.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">P3 &#160;offline_judge</text>
399
+ <text xml:space="preserve" text-anchor="middle" x="1216" y="-564.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ORM/PRM + W3 cal from PLAN</text>
400
+ </g>
401
+ <!-- Cron&#45;&gt;OJ -->
402
+ <g id="edge27" class="edge">
403
+ <title>Cron&#45;&gt;OJ</title>
404
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1006.29,-573.88C1043.25,-573.88 1087.72,-573.88 1126.18,-573.88"/>
405
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1125.85,-576.68 1133.85,-573.88 1125.85,-571.08 1125.85,-576.68"/>
406
+ <text xml:space="preserve" text-anchor="middle" x="1071.19" y="-578.83" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">30 3 * * *</text>
407
+ </g>
408
+ <!-- MemGC -->
409
+ <g id="node25" class="node">
410
+ <title>MemGC</title>
411
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1464.62,-591.88C1464.62,-591.88 1347.38,-591.88 1347.38,-591.88 1341.38,-591.88 1335.38,-585.88 1335.38,-579.88 1335.38,-579.88 1335.38,-567.88 1335.38,-567.88 1335.38,-561.88 1341.38,-555.88 1347.38,-555.88 1347.38,-555.88 1464.62,-555.88 1464.62,-555.88 1470.62,-555.88 1476.62,-561.88 1476.62,-567.88 1476.62,-567.88 1476.62,-579.88 1476.62,-579.88 1476.62,-585.88 1470.62,-591.88 1464.62,-591.88"/>
412
+ <text xml:space="preserve" text-anchor="middle" x="1406" y="-576.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">M1/M3 &#160;Learning.consolidate</text>
413
+ <text xml:space="preserve" text-anchor="middle" x="1406" y="-564.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">nightly memory GC</text>
414
+ </g>
415
+ <!-- Cron&#45;&gt;MemGC -->
416
+ <g id="edge29" class="edge">
417
+ <title>Cron&#45;&gt;MemGC</title>
418
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M988.99,-596.78C1028.32,-610.55 1081.25,-626.74 1129.62,-633.81 1209.3,-645.46 1300.33,-617.58 1355.45,-596.04"/>
419
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1356.43,-598.67 1362.82,-593.1 1354.36,-593.47 1356.43,-598.67"/>
420
+ <text xml:space="preserve" text-anchor="middle" x="1145" y="-636.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 5 * * *</text>
421
+ </g>
422
+ <!-- OJ&#45;&gt;R1 -->
423
+ <g id="edge30" class="edge">
424
+ <title>OJ&#45;&gt;R1</title>
425
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M1218.79,-555.39C1223.48,-525.92 1233.01,-466.17 1238.61,-431.04"/>
426
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1241.34,-431.69 1239.84,-423.35 1235.81,-430.8 1241.34,-431.69"/>
427
+ <text xml:space="preserve" text-anchor="middle" x="1241.33" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">backfill</text>
428
+ </g>
429
+ <!-- OJ&#45;&gt;W3 -->
430
+ <g id="edge31" class="edge">
431
+ <title>OJ&#45;&gt;W3</title>
432
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1293.11,-555.23C1300.48,-553.84 1307.87,-552.57 1315,-551.5 1388.78,-540.47 1933.52,-549.92 1984,-495 2020.84,-454.91 2010.57,-420.02 1984,-372.5 1962.87,-334.71 1942.63,-333.41 1901,-321.5 1831.29,-301.56 665.14,-335.31 596,-313.5 550.28,-299.08 506.26,-264.2 479.91,-240.32"/>
433
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="481.86,-238.31 474.09,-234.93 478.06,-242.42 481.86,-238.31"/>
434
+ <text xml:space="preserve" text-anchor="middle" x="2030.06" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">p(success)</text>
390
435
  </g>
391
436
  </g>
392
437
  </svg>