pwn 0.5.669 → 0.5.673

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +1 -1
  4. data/README.md +13 -9
  5. data/documentation/AI-Integration.md +1 -1
  6. data/documentation/Agent-Tool-Registry.md +17 -5
  7. data/documentation/Configuration.md +19 -8
  8. data/documentation/Diagrams.md +2 -2
  9. data/documentation/Home.md +2 -2
  10. data/documentation/How-PWN-Works.md +12 -10
  11. data/documentation/Installation.md +3 -1
  12. data/documentation/Mistakes.md +3 -0
  13. data/documentation/Persistence.md +4 -1
  14. data/documentation/Reinforcement-Learning.md +90 -73
  15. data/documentation/Skills-Memory-Learning.md +28 -4
  16. data/documentation/What-is-PWN.md +8 -7
  17. data/documentation/Why-PWN.md +3 -2
  18. data/documentation/diagrams/agent-tool-registry.svg +188 -160
  19. data/documentation/diagrams/dot/agent-tool-registry.dot +7 -4
  20. data/documentation/diagrams/dot/memory-skills-detailed.dot +12 -5
  21. data/documentation/diagrams/dot/overall-pwn-architecture.dot +4 -3
  22. data/documentation/diagrams/dot/persistence-filesystem.dot +2 -1
  23. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +11 -4
  24. data/documentation/diagrams/dot/reinforcement-learning.dot +8 -3
  25. data/documentation/diagrams/dot/task-summarizer.dot +24 -12
  26. data/documentation/diagrams/memory-skills-detailed.svg +252 -210
  27. data/documentation/diagrams/overall-pwn-architecture.svg +21 -12
  28. data/documentation/diagrams/persistence-filesystem.svg +127 -113
  29. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +449 -397
  30. data/documentation/diagrams/reinforcement-learning.svg +276 -239
  31. data/documentation/diagrams/task-summarizer.svg +178 -126
  32. data/documentation/pwn-ai-Agent.md +66 -32
  33. data/lib/pwn/ai/agent/curriculum.rb +13 -4
  34. data/lib/pwn/ai/agent/dispatch.rb +3 -0
  35. data/lib/pwn/ai/agent/learning.rb +100 -14
  36. data/lib/pwn/ai/agent/loop.rb +692 -25
  37. data/lib/pwn/ai/agent/metrics.rb +52 -4
  38. data/lib/pwn/ai/agent/mistakes.rb +158 -1
  39. data/lib/pwn/ai/agent/policy.rb +935 -0
  40. data/lib/pwn/ai/agent/prompt_builder.rb +82 -6
  41. data/lib/pwn/ai/agent/reflect.rb +11 -3
  42. data/lib/pwn/ai/agent/registry.rb +18 -3
  43. data/lib/pwn/ai/agent/reward.rb +360 -48
  44. data/lib/pwn/ai/agent/task_summarizer.rb +415 -33
  45. data/lib/pwn/ai/agent/tool_guard.rb +157 -0
  46. data/lib/pwn/ai/agent/tools/policy.rb +76 -0
  47. data/lib/pwn/ai/agent/tools/ruby_eval.rb +27 -1
  48. data/lib/pwn/ai/agent/tools/shell.rb +28 -32
  49. data/lib/pwn/ai/agent.rb +2 -0
  50. data/lib/pwn/config.rb +14 -2
  51. data/lib/pwn/memory.rb +188 -0
  52. data/lib/pwn/sessions.rb +9 -4
  53. data/lib/pwn/version.rb +1 -1
  54. data/spec/integration/reinforced_feedback_loop_spec.rb +35 -9
  55. data/spec/lib/pwn/ai/agent/learning_spec.rb +119 -3
  56. data/spec/lib/pwn/ai/agent/loop_spec.rb +215 -3
  57. data/spec/lib/pwn/ai/agent/metrics_spec.rb +10 -0
  58. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +33 -0
  59. data/spec/lib/pwn/ai/agent/policy_spec.rb +165 -0
  60. data/spec/lib/pwn/ai/agent/prompt_builder_spec.rb +51 -0
  61. data/spec/lib/pwn/ai/agent/reward_spec.rb +75 -0
  62. data/spec/lib/pwn/ai/agent/signal_hygiene_spec.rb +118 -0
  63. data/spec/lib/pwn/ai/agent/task_summarizer_spec.rb +111 -6
  64. data/spec/lib/pwn/ai/agent/tool_guard_spec.rb +61 -0
  65. data/spec/lib/pwn/ai/agent/tools/policy_spec.rb +18 -0
  66. data/spec/lib/pwn/memory_spec.rb +62 -0
  67. data/spec/support/sandbox.rb +2 -0
  68. data/third_party/pwn_rdoc.jsonl +108 -4
  69. metadata +10 -3
@@ -4,436 +4,473 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Reinforcement_Learning Pages: 1 -->
7
- <svg width="2160pt" height="804pt"
8
- viewBox="0.00 0.00 2160.00 804.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 760.95)">
7
+ <svg width="2325pt" height="733pt"
8
+ viewBox="0.00 0.00 2325.00 733.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 689.7)">
10
10
  <title>PWN_Reinforcement_Learning</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-760.95 2116.75,-760.95 2116.75,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="754.77" y="-695.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="839.52" y="-684.3" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">reward signal · credit assignment · memory · self&#45;play · weight loop · intro/extro join</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-689.7 2281.94,-689.7 2281.94,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="837.37" y="-624.5" 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="922.12" y="-613.05" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">reward signal · credit assignment · memory · self&#45;play · weight loop · 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="M900,-372.5C900,-372.5 1674,-372.5 1674,-372.5 1680,-372.5 1686,-378.5 1686,-384.5 1686,-384.5 1686,-483 1686,-483 1686,-489 1680,-495 1674,-495 1674,-495 900,-495 900,-495 894,-495 888,-489 888,-483 888,-483 888,-384.5 888,-384.5 888,-378.5 894,-372.5 900,-372.5"/>
17
- <text xml:space="preserve" text-anchor="middle" x="1287" y="-472" 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="M20,-372.5C20,-372.5 959,-372.5 959,-372.5 965,-372.5 971,-378.5 971,-384.5 971,-384.5 971,-483 971,-483 971,-489 965,-495 959,-495 959,-495 20,-495 20,-495 14,-495 8,-489 8,-483 8,-483 8,-384.5 8,-384.5 8,-378.5 14,-372.5 20,-372.5"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="489.5" 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="M20,-372.5C20,-372.5 852,-372.5 852,-372.5 858,-372.5 864,-378.5 864,-384.5 864,-384.5 864,-483 864,-483 864,-489 858,-495 852,-495 852,-495 20,-495 20,-495 14,-495 8,-489 8,-483 8,-483 8,-384.5 8,-384.5 8,-378.5 14,-372.5 20,-372.5"/>
22
- <text xml:space="preserve" text-anchor="middle" x="436" y="-472" 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="M1007,-372.5C1007,-372.5 1838,-372.5 1838,-372.5 1844,-372.5 1850,-378.5 1850,-384.5 1850,-384.5 1850,-483 1850,-483 1850,-489 1844,-495 1838,-495 1838,-495 1007,-495 1007,-495 1001,-495 995,-489 995,-483 995,-483 995,-384.5 995,-384.5 995,-378.5 1001,-372.5 1007,-372.5"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="1422.5" 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="M41,-179C41,-179 513,-179 513,-179 519,-179 525,-185 525,-191 525,-191 525,-301.5 525,-301.5 525,-307.5 519,-313.5 513,-313.5 513,-313.5 41,-313.5 41,-313.5 35,-313.5 29,-307.5 29,-301.5 29,-301.5 29,-191 29,-191 29,-185 35,-179 41,-179"/>
27
- <text xml:space="preserve" text-anchor="middle" x="277" y="-290.5" 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="M1425,-179C1425,-179 1898,-179 1898,-179 1904,-179 1910,-185 1910,-191 1910,-191 1910,-301.5 1910,-301.5 1910,-307.5 1904,-313.5 1898,-313.5 1898,-313.5 1425,-313.5 1425,-313.5 1419,-313.5 1413,-307.5 1413,-301.5 1413,-301.5 1413,-191 1413,-191 1413,-185 1419,-179 1425,-179"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="1661.5" 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="M301,-8C301,-8 995,-8 995,-8 1001,-8 1007,-14 1007,-20 1007,-20 1007,-118.5 1007,-118.5 1007,-124.5 1001,-130.5 995,-130.5 995,-130.5 301,-130.5 301,-130.5 295,-130.5 289,-124.5 289,-118.5 289,-118.5 289,-20 289,-20 289,-14 295,-8 301,-8"/>
32
- <text xml:space="preserve" text-anchor="middle" x="648" y="-107.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
31
+ <path fill="#422006" stroke="#a16207" stroke-dasharray="5,2" d="M720,-8C720,-8 1538,-8 1538,-8 1544,-8 1550,-14 1550,-20 1550,-20 1550,-118.5 1550,-118.5 1550,-124.5 1544,-130.5 1538,-130.5 1538,-130.5 720,-130.5 720,-130.5 714,-130.5 708,-124.5 708,-118.5 708,-118.5 708,-20 708,-20 708,-14 714,-8 720,-8"/>
32
+ <text xml:space="preserve" text-anchor="middle" x="1129" 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="M452.5,-597.5C452.5,-597.5 409.5,-597.5 409.5,-597.5 403.5,-597.5 397.5,-591.5 397.5,-585.5 397.5,-585.5 397.5,-573.5 397.5,-573.5 397.5,-567.5 403.5,-561.5 409.5,-561.5 409.5,-561.5 452.5,-561.5 452.5,-561.5 458.5,-561.5 464.5,-567.5 464.5,-573.5 464.5,-573.5 464.5,-585.5 464.5,-585.5 464.5,-591.5 458.5,-597.5 452.5,-597.5"/>
38
- <text xml:space="preserve" text-anchor="middle" x="431" y="-576.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">👤 &#160;request</text>
37
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M373.5,-597.5C373.5,-597.5 330.5,-597.5 330.5,-597.5 324.5,-597.5 318.5,-591.5 318.5,-585.5 318.5,-585.5 318.5,-573.5 318.5,-573.5 318.5,-567.5 324.5,-561.5 330.5,-561.5 330.5,-561.5 373.5,-561.5 373.5,-561.5 379.5,-561.5 385.5,-567.5 385.5,-573.5 385.5,-573.5 385.5,-585.5 385.5,-585.5 385.5,-591.5 379.5,-597.5 373.5,-597.5"/>
38
+ <text xml:space="preserve" text-anchor="middle" x="352" y="-576.38" 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="M700.12,-607.5C700.12,-607.5 555.88,-607.5 555.88,-607.5 549.88,-607.5 543.88,-601.5 543.88,-595.5 543.88,-595.5 543.88,-563.5 543.88,-563.5 543.88,-557.5 549.88,-551.5 555.88,-551.5 555.88,-551.5 700.12,-551.5 700.12,-551.5 706.12,-551.5 712.12,-557.5 712.12,-563.5 712.12,-563.5 712.12,-595.5 712.12,-595.5 712.12,-601.5 706.12,-607.5 700.12,-607.5"/>
44
- <text xml:space="preserve" text-anchor="middle" x="628" y="-594" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Loop.run</text>
45
- <text xml:space="preserve" text-anchor="middle" x="628" y="-582" font-family="sans-Serif" font-size="10.00" fill="#0f172a">TaskSummarizer · budget pressure</text>
46
- <text xml:space="preserve" text-anchor="middle" x="628" y="-570" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_first · Dispatch · guard</text>
47
- <text xml:space="preserve" text-anchor="middle" x="628" y="-558" font-family="sans-Serif" font-size="10.00" fill="#0f172a">final answer</text>
43
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M621.12,-607.5C621.12,-607.5 476.88,-607.5 476.88,-607.5 470.88,-607.5 464.88,-601.5 464.88,-595.5 464.88,-595.5 464.88,-563.5 464.88,-563.5 464.88,-557.5 470.88,-551.5 476.88,-551.5 476.88,-551.5 621.12,-551.5 621.12,-551.5 627.12,-551.5 633.12,-557.5 633.12,-563.5 633.12,-563.5 633.12,-595.5 633.12,-595.5 633.12,-601.5 627.12,-607.5 621.12,-607.5"/>
44
+ <text xml:space="preserve" text-anchor="middle" x="549" y="-594" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Loop.run</text>
45
+ <text xml:space="preserve" text-anchor="middle" x="549" y="-582" font-family="sans-Serif" font-size="10.00" fill="#0f172a">TaskSummarizer · budget pressure</text>
46
+ <text xml:space="preserve" text-anchor="middle" x="549" y="-570" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_first · Dispatch · guard</text>
47
+ <text xml:space="preserve" text-anchor="middle" x="549" y="-558" font-family="sans-Serif" font-size="10.00" fill="#0f172a">final answer</text>
48
48
  </g>
49
49
  <!-- Req&#45;&gt;Loop -->
50
50
  <g id="edge1" class="edge">
51
51
  <title>Req&#45;&gt;Loop</title>
52
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M464.86,-579.5C487.22,-579.5 509.58,-579.5 531.95,-579.5"/>
53
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="531.9,-582.3 539.9,-579.5 531.9,-576.7 531.9,-582.3"/>
52
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M385.86,-579.5C408.22,-579.5 430.58,-579.5 452.95,-579.5"/>
53
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="452.9,-582.3 460.9,-579.5 452.9,-576.7 452.9,-582.3"/>
54
54
  </g>
55
55
  <!-- R1 -->
56
56
  <g id="node3" class="node">
57
57
  <title>R1</title>
58
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1316,-420.5C1316,-420.5 1216,-420.5 1216,-420.5 1210,-420.5 1204,-414.5 1204,-408.5 1204,-408.5 1204,-396.5 1204,-396.5 1204,-390.5 1210,-384.5 1216,-384.5 1216,-384.5 1316,-384.5 1316,-384.5 1322,-384.5 1328,-390.5 1328,-396.5 1328,-396.5 1328,-408.5 1328,-408.5 1328,-414.5 1322,-420.5 1316,-420.5"/>
59
- <text xml:space="preserve" text-anchor="middle" x="1266" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">judge (outcome)</text>
60
- <text xml:space="preserve" text-anchor="middle" x="1266" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">score · verdict · rationale</text>
58
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M126.25,-424.5C126.25,-424.5 27.75,-424.5 27.75,-424.5 21.75,-424.5 15.75,-418.5 15.75,-412.5 15.75,-412.5 15.75,-392.5 15.75,-392.5 15.75,-386.5 21.75,-380.5 27.75,-380.5 27.75,-380.5 126.25,-380.5 126.25,-380.5 132.25,-380.5 138.25,-386.5 138.25,-392.5 138.25,-392.5 138.25,-412.5 138.25,-412.5 138.25,-418.5 132.25,-424.5 126.25,-424.5"/>
59
+ <text xml:space="preserve" text-anchor="middle" x="77" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">judge (cheap LLM ORM)</text>
60
+ <text xml:space="preserve" text-anchor="middle" x="77" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">score · verdict · source</text>
61
+ <text xml:space="preserve" text-anchor="middle" x="77" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">evidence&#45;prior fallback</text>
61
62
  </g>
62
63
  <!-- Loop&#45;&gt;R1 -->
63
- <g id="edge3" class="edge">
64
+ <g id="edge4" class="edge">
64
65
  <title>Loop&#45;&gt;R1</title>
65
- <path fill="none" stroke="#a78bfa" stroke-width="2" d="M712.8,-553.74C785.05,-532.82 880.08,-505.82 898.75,-503 930.1,-498.26 1155.23,-508.33 1184,-495 1213.16,-481.48 1236.41,-452.17 1250.6,-430.35"/>
66
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1252.83,-432.06 1254.69,-423.79 1248.07,-429.1 1252.83,-432.06"/>
67
- <text xml:space="preserve" text-anchor="middle" x="907.38" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
66
+ <path fill="none" stroke="#a78bfa" stroke-width="2" d="M463.99,-562.46C375.84,-545.1 244.53,-516.93 198,-495 164.26,-479.1 130.83,-452.79 107.68,-432.46"/>
67
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="109.72,-430.53 101.89,-427.28 105.99,-434.7 109.72,-430.53"/>
68
+ <text xml:space="preserve" text-anchor="middle" x="255.27" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
68
69
  </g>
69
70
  <!-- R2 -->
70
71
  <g id="node4" class="node">
71
72
  <title>R2</title>
72
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1665.88,-424.5C1665.88,-424.5 1604.12,-424.5 1604.12,-424.5 1598.12,-424.5 1592.12,-418.5 1592.12,-412.5 1592.12,-412.5 1592.12,-392.5 1592.12,-392.5 1592.12,-386.5 1598.12,-380.5 1604.12,-380.5 1604.12,-380.5 1665.88,-380.5 1665.88,-380.5 1671.88,-380.5 1677.88,-386.5 1677.88,-392.5 1677.88,-392.5 1677.88,-412.5 1677.88,-412.5 1677.88,-418.5 1671.88,-424.5 1665.88,-424.5"/>
73
- <text xml:space="preserve" text-anchor="middle" x="1635" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">prm (process)</text>
74
- <text xml:space="preserve" text-anchor="middle" x="1635" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">per&#45;step +1/0/&#45;1</text>
75
- <text xml:space="preserve" text-anchor="middle" x="1635" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">→ Registry.rank</text>
73
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M639.88,-424.5C639.88,-424.5 578.12,-424.5 578.12,-424.5 572.12,-424.5 566.12,-418.5 566.12,-412.5 566.12,-412.5 566.12,-392.5 566.12,-392.5 566.12,-386.5 572.12,-380.5 578.12,-380.5 578.12,-380.5 639.88,-380.5 639.88,-380.5 645.88,-380.5 651.88,-386.5 651.88,-392.5 651.88,-392.5 651.88,-412.5 651.88,-412.5 651.88,-418.5 645.88,-424.5 639.88,-424.5"/>
74
+ <text xml:space="preserve" text-anchor="middle" x="609" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">prm (process)</text>
75
+ <text xml:space="preserve" text-anchor="middle" x="609" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">per&#45;step +1/0/&#45;1</text>
76
+ <text xml:space="preserve" text-anchor="middle" x="609" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">→ Registry.rank</text>
76
77
  </g>
77
78
  <!-- Loop&#45;&gt;R2 -->
78
- <g id="edge4" class="edge">
79
+ <g id="edge5" class="edge">
79
80
  <title>Loop&#45;&gt;R2</title>
80
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M713.04,-560.28C771.81,-547.54 851.76,-529.94 922,-513.5 940.94,-509.07 945.2,-505.48 964.5,-503 981.24,-500.85 1557.11,-502.95 1572,-495 1596.16,-482.1 1612.9,-455.36 1623.02,-434.1"/>
81
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1625.54,-435.33 1626.27,-426.88 1620.43,-433.03 1625.54,-435.33"/>
82
- <text xml:space="preserve" text-anchor="middle" x="980.25" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">session</text>
81
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M464.05,-566.2C410.14,-555.01 355.84,-535.23 386.5,-503 398.73,-490.14 530.5,-503.65 546,-495 569.91,-481.66 586.68,-454.97 596.87,-433.84"/>
82
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="599.37,-435.12 600.15,-426.68 594.27,-432.79 599.37,-435.12"/>
83
+ <text xml:space="preserve" text-anchor="middle" x="402.25" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">session</text>
83
84
  </g>
84
85
  <!-- R3 -->
85
86
  <g id="node5" class="node">
86
87
  <title>R3</title>
87
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1008,-424.5C1008,-424.5 908,-424.5 908,-424.5 902,-424.5 896,-418.5 896,-412.5 896,-412.5 896,-392.5 896,-392.5 896,-386.5 902,-380.5 908,-380.5 908,-380.5 1008,-380.5 1008,-380.5 1014,-380.5 1020,-386.5 1020,-392.5 1020,-392.5 1020,-412.5 1020,-412.5 1020,-418.5 1014,-424.5 1008,-424.5"/>
88
- <text xml:space="preserve" text-anchor="middle" x="958" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sentinel (ring N=40)</text>
89
- <text xml:space="preserve" text-anchor="middle" x="958" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">proxy != judge != (1&#45;corr)</text>
90
- <text xml:space="preserve" text-anchor="middle" x="958" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">warm + proxy distrust</text>
88
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M514,-424.5C514,-424.5 414,-424.5 414,-424.5 408,-424.5 402,-418.5 402,-412.5 402,-412.5 402,-392.5 402,-392.5 402,-386.5 408,-380.5 414,-380.5 414,-380.5 514,-380.5 514,-380.5 520,-380.5 526,-386.5 526,-392.5 526,-392.5 526,-412.5 526,-412.5 526,-418.5 520,-424.5 514,-424.5"/>
89
+ <text xml:space="preserve" text-anchor="middle" x="464" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sentinel (ring N=40)</text>
90
+ <text xml:space="preserve" text-anchor="middle" x="464" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">proxy != judge != (1&#45;corr)</text>
91
+ <text xml:space="preserve" text-anchor="middle" x="464" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">warm + proxy distrust</text>
91
92
  </g>
92
93
  <!-- Loop&#45;&gt;R3 -->
93
- <g id="edge5" class="edge">
94
+ <g id="edge6" class="edge">
94
95
  <title>Loop&#45;&gt;R3</title>
95
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M664.41,-550.55C688.68,-533.57 722.06,-513.25 755,-503 780.31,-495.12 850.11,-506.47 874,-495 901.97,-481.57 925.04,-454.33 939.88,-433.04"/>
96
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="942.1,-434.76 944.24,-426.56 937.45,-431.63 942.1,-434.76"/>
96
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M463.91,-569.19C428.51,-560.64 390.67,-544.36 369,-513.5 366.32,-509.68 366.72,-507.07 369,-503 372.31,-497.08 376.79,-499.35 382,-495 404.3,-476.37 426.09,-451.66 441.59,-432.61"/>
97
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="443.57,-434.62 446.4,-426.63 439.21,-431.11 443.57,-434.62"/>
97
98
  </g>
98
99
  <!-- R4 -->
99
100
  <g id="node6" class="node">
100
101
  <title>R4</title>
101
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1151.5,-420.5C1151.5,-420.5 1072.5,-420.5 1072.5,-420.5 1066.5,-420.5 1060.5,-414.5 1060.5,-408.5 1060.5,-408.5 1060.5,-396.5 1060.5,-396.5 1060.5,-390.5 1066.5,-384.5 1072.5,-384.5 1072.5,-384.5 1151.5,-384.5 1151.5,-384.5 1157.5,-384.5 1163.5,-390.5 1163.5,-396.5 1163.5,-396.5 1163.5,-408.5 1163.5,-408.5 1163.5,-414.5 1157.5,-420.5 1151.5,-420.5"/>
102
- <text xml:space="preserve" text-anchor="middle" x="1112" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">semantic_ok</text>
103
- <text xml:space="preserve" text-anchor="middle" x="1112" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">grep exit 1 != failure</text>
102
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M782.5,-420.5C782.5,-420.5 703.5,-420.5 703.5,-420.5 697.5,-420.5 691.5,-414.5 691.5,-408.5 691.5,-408.5 691.5,-396.5 691.5,-396.5 691.5,-390.5 697.5,-384.5 703.5,-384.5 703.5,-384.5 782.5,-384.5 782.5,-384.5 788.5,-384.5 794.5,-390.5 794.5,-396.5 794.5,-396.5 794.5,-408.5 794.5,-408.5 794.5,-414.5 788.5,-420.5 782.5,-420.5"/>
103
+ <text xml:space="preserve" text-anchor="middle" x="743" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">semantic_ok</text>
104
+ <text xml:space="preserve" text-anchor="middle" x="743" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">grep exit 1 != failure</text>
104
105
  </g>
105
106
  <!-- Loop&#45;&gt;R4 -->
106
107
  <g id="edge2" class="edge">
107
108
  <title>Loop&#45;&gt;R4</title>
108
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M681.52,-550.61C717.39,-533.43 766.26,-512.85 812,-503 836.78,-497.66 1017.39,-506.47 1040,-495 1067.29,-481.15 1087.48,-451.69 1099.42,-429.92"/>
109
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1101.89,-431.26 1103.12,-422.87 1096.93,-428.65 1101.89,-431.26"/>
110
- <text xml:space="preserve" text-anchor="middle" x="830" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">Dispatch</text>
109
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M485.92,-550.53C463.32,-536.81 446.95,-519.68 463,-503 479.12,-486.26 651.33,-505.62 672,-495 699.07,-481.09 718.95,-451.64 730.68,-429.89"/>
110
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="733.13,-431.25 734.31,-422.85 728.15,-428.68 733.13,-431.25"/>
111
+ <text xml:space="preserve" text-anchor="middle" x="481" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">Dispatch</text>
112
+ </g>
113
+ <!-- R5 -->
114
+ <g id="node7" class="node">
115
+ <title>R5</title>
116
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M951.25,-424.5C951.25,-424.5 846.75,-424.5 846.75,-424.5 840.75,-424.5 834.75,-418.5 834.75,-412.5 834.75,-412.5 834.75,-392.5 834.75,-392.5 834.75,-386.5 840.75,-380.5 846.75,-380.5 846.75,-380.5 951.25,-380.5 951.25,-380.5 957.25,-380.5 963.25,-386.5 963.25,-392.5 963.25,-392.5 963.25,-412.5 963.25,-412.5 963.25,-418.5 957.25,-424.5 951.25,-424.5"/>
117
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Policy (live MDP)</text>
118
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan · complete · usable</text>
119
+ <text xml:space="preserve" text-anchor="middle" x="899" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">warm Q + episode budget</text>
120
+ </g>
121
+ <!-- Loop&#45;&gt;R5 -->
122
+ <g id="edge3" class="edge">
123
+ <title>Loop&#45;&gt;R5</title>
124
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M538.16,-550.54C533.96,-534.53 532.61,-515.25 544.5,-503 554.97,-492.21 801.33,-501.25 815,-495 842.85,-482.27 865.64,-455.51 880.43,-434.2"/>
125
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="882.67,-435.89 884.77,-427.68 878.01,-432.79 882.67,-435.89"/>
126
+ <text xml:space="preserve" text-anchor="middle" x="560.25" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(s,a,r,s&#39;)</text>
111
127
  </g>
112
128
  <!-- S2 -->
113
- <g id="node9" class="node">
129
+ <g id="node10" class="node">
114
130
  <title>S2</title>
115
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M133.62,-420.5C133.62,-420.5 28.38,-420.5 28.38,-420.5 22.38,-420.5 16.38,-414.5 16.38,-408.5 16.38,-408.5 16.38,-396.5 16.38,-396.5 16.38,-390.5 22.38,-384.5 28.38,-384.5 28.38,-384.5 133.62,-384.5 133.62,-384.5 139.62,-384.5 145.62,-390.5 145.62,-396.5 145.62,-396.5 145.62,-408.5 145.62,-408.5 145.62,-414.5 139.62,-420.5 133.62,-420.5"/>
116
- <text xml:space="preserve" text-anchor="middle" x="81" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">counterfactual</text>
117
- <text xml:space="preserve" text-anchor="middle" x="81" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">real_dispatch vs imagined</text>
131
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1321.62,-420.5C1321.62,-420.5 1216.38,-420.5 1216.38,-420.5 1210.38,-420.5 1204.38,-414.5 1204.38,-408.5 1204.38,-408.5 1204.38,-396.5 1204.38,-396.5 1204.38,-390.5 1210.38,-384.5 1216.38,-384.5 1216.38,-384.5 1321.62,-384.5 1321.62,-384.5 1327.62,-384.5 1333.62,-390.5 1333.62,-396.5 1333.62,-396.5 1333.62,-408.5 1333.62,-408.5 1333.62,-414.5 1327.62,-420.5 1321.62,-420.5"/>
132
+ <text xml:space="preserve" text-anchor="middle" x="1269" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">counterfactual</text>
133
+ <text xml:space="preserve" text-anchor="middle" x="1269" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">real_dispatch vs imagined</text>
118
134
  </g>
119
135
  <!-- Loop&#45;&gt;S2 -->
120
- <g id="edge9" class="edge">
136
+ <g id="edge12" class="edge">
121
137
  <title>Loop&#45;&gt;S2</title>
122
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M542.96,-562.28C523.9,-558.69 503.76,-554.93 485,-551.5 343.37,-525.59 292.44,-563.87 166,-495 137.09,-479.25 112.57,-449.99 97.4,-428.79"/>
123
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="99.86,-427.42 92.99,-422.44 95.26,-430.61 99.86,-427.42"/>
124
- <text xml:space="preserve" text-anchor="middle" x="229.96" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">[REPEATING]</text>
138
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M590.59,-550.53C618.9,-533.2 657.95,-512.48 695.75,-503 722.12,-496.39 1160.2,-506.14 1185,-495 1215.22,-481.43 1239.41,-451.2 1253.94,-429.19"/>
139
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1256.21,-430.83 1258.14,-422.58 1251.49,-427.82 1256.21,-430.83"/>
140
+ <text xml:space="preserve" text-anchor="middle" x="723.88" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">[REPEATING]</text>
125
141
  </g>
126
142
  <!-- S3 -->
127
- <g id="node10" class="node">
143
+ <g id="node11" class="node">
128
144
  <title>S3</title>
129
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M337.88,-420.5C337.88,-420.5 198.12,-420.5 198.12,-420.5 192.12,-420.5 186.12,-414.5 186.12,-408.5 186.12,-408.5 186.12,-396.5 186.12,-396.5 186.12,-390.5 192.12,-384.5 198.12,-384.5 198.12,-384.5 337.88,-384.5 337.88,-384.5 343.88,-384.5 349.88,-390.5 349.88,-396.5 349.88,-396.5 349.88,-408.5 349.88,-408.5 349.88,-414.5 343.88,-420.5 337.88,-420.5"/>
130
- <text xml:space="preserve" text-anchor="middle" x="268" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">critic</text>
131
- <text xml:space="preserve" text-anchor="middle" x="268" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tool&#45;armed · revised_answer DPO</text>
145
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1525.88,-420.5C1525.88,-420.5 1386.12,-420.5 1386.12,-420.5 1380.12,-420.5 1374.12,-414.5 1374.12,-408.5 1374.12,-408.5 1374.12,-396.5 1374.12,-396.5 1374.12,-390.5 1380.12,-384.5 1386.12,-384.5 1386.12,-384.5 1525.88,-384.5 1525.88,-384.5 1531.88,-384.5 1537.88,-390.5 1537.88,-396.5 1537.88,-396.5 1537.88,-408.5 1537.88,-408.5 1537.88,-414.5 1531.88,-420.5 1525.88,-420.5"/>
146
+ <text xml:space="preserve" text-anchor="middle" x="1456" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">critic</text>
147
+ <text xml:space="preserve" text-anchor="middle" x="1456" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tool&#45;armed · revised_answer DPO</text>
132
148
  </g>
133
149
  <!-- Loop&#45;&gt;S3 -->
134
- <g id="edge8" class="edge">
150
+ <g id="edge11" class="edge">
135
151
  <title>Loop&#45;&gt;S3</title>
136
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M542.96,-560.52C490.78,-547.22 423.87,-525.99 370,-495 338.96,-477.14 309.16,-448.65 289.87,-428.21"/>
137
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="292.09,-426.48 284.6,-422.52 287.98,-430.29 292.09,-426.48"/>
138
- <text xml:space="preserve" text-anchor="middle" x="411.23" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
152
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M634.12,-556.5C719.91,-534.34 840.07,-503.36 842.75,-503 870.9,-499.22 1327.55,-505.36 1354,-495 1388.33,-481.55 1418.47,-450.86 1436.92,-428.72"/>
153
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="1439.07,-430.51 1441.93,-422.53 1434.72,-426.98 1439.07,-430.51"/>
154
+ <text xml:space="preserve" text-anchor="middle" x="851.38" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
139
155
  </g>
140
156
  <!-- S4 -->
141
- <g id="node11" class="node">
157
+ <g id="node12" class="node">
142
158
  <title>S4</title>
143
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M493.88,-420.5C493.88,-420.5 402.12,-420.5 402.12,-420.5 396.12,-420.5 390.12,-414.5 390.12,-408.5 390.12,-408.5 390.12,-396.5 390.12,-396.5 390.12,-390.5 396.12,-384.5 402.12,-384.5 402.12,-384.5 493.88,-384.5 493.88,-384.5 499.88,-384.5 505.88,-390.5 505.88,-396.5 505.88,-396.5 505.88,-408.5 505.88,-408.5 505.88,-414.5 499.88,-420.5 493.88,-420.5"/>
144
- <text xml:space="preserve" text-anchor="middle" x="448" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">red_team_plan</text>
145
- <text xml:space="preserve" text-anchor="middle" x="448" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">adversarial plan review</text>
159
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1681.88,-420.5C1681.88,-420.5 1590.12,-420.5 1590.12,-420.5 1584.12,-420.5 1578.12,-414.5 1578.12,-408.5 1578.12,-408.5 1578.12,-396.5 1578.12,-396.5 1578.12,-390.5 1584.12,-384.5 1590.12,-384.5 1590.12,-384.5 1681.88,-384.5 1681.88,-384.5 1687.88,-384.5 1693.88,-390.5 1693.88,-396.5 1693.88,-396.5 1693.88,-408.5 1693.88,-408.5 1693.88,-414.5 1687.88,-420.5 1681.88,-420.5"/>
160
+ <text xml:space="preserve" text-anchor="middle" x="1636" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">red_team_plan</text>
161
+ <text xml:space="preserve" text-anchor="middle" x="1636" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">adversarial plan review</text>
146
162
  </g>
147
163
  <!-- Loop&#45;&gt;S4 -->
148
- <g id="edge7" class="edge">
164
+ <g id="edge10" class="edge">
149
165
  <title>Loop&#45;&gt;S4</title>
150
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M590.77,-550.64C570.83,-535.08 546.26,-514.87 526,-495 504.48,-473.9 482.42,-447.5 467.28,-428.49"/>
151
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="469.61,-426.92 462.46,-422.37 465.21,-430.39 469.61,-426.92"/>
152
- <text xml:space="preserve" text-anchor="middle" x="563.18" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">plan_first</text>
166
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M634.02,-562.3C698,-549.81 787.74,-531.66 866,-513.5 884.11,-509.3 888.07,-505.47 906.5,-503 924.44,-500.6 1541.61,-502.69 1558,-495 1586.9,-481.44 1609.11,-451.43 1622.3,-429.46"/>
167
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="1624.69,-430.94 1626.26,-422.61 1619.83,-428.14 1624.69,-430.94"/>
168
+ <text xml:space="preserve" text-anchor="middle" x="925.25" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">plan_first</text>
153
169
  </g>
154
170
  <!-- C3 -->
155
- <g id="node12" class="node">
171
+ <g id="node13" class="node">
156
172
  <title>C3</title>
157
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M641.75,-420.5C641.75,-420.5 558.25,-420.5 558.25,-420.5 552.25,-420.5 546.25,-414.5 546.25,-408.5 546.25,-408.5 546.25,-396.5 546.25,-396.5 546.25,-390.5 552.25,-384.5 558.25,-384.5 558.25,-384.5 641.75,-384.5 641.75,-384.5 647.75,-384.5 653.75,-390.5 653.75,-396.5 653.75,-396.5 653.75,-408.5 653.75,-408.5 653.75,-414.5 647.75,-420.5 641.75,-420.5"/>
158
- <text xml:space="preserve" text-anchor="middle" x="600" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">hindsight (HER)</text>
159
- <text xml:space="preserve" text-anchor="middle" x="600" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">relabel achieved&#45;goal</text>
173
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1829.75,-420.5C1829.75,-420.5 1746.25,-420.5 1746.25,-420.5 1740.25,-420.5 1734.25,-414.5 1734.25,-408.5 1734.25,-408.5 1734.25,-396.5 1734.25,-396.5 1734.25,-390.5 1740.25,-384.5 1746.25,-384.5 1746.25,-384.5 1829.75,-384.5 1829.75,-384.5 1835.75,-384.5 1841.75,-390.5 1841.75,-396.5 1841.75,-396.5 1841.75,-408.5 1841.75,-408.5 1841.75,-414.5 1835.75,-420.5 1829.75,-420.5"/>
174
+ <text xml:space="preserve" text-anchor="middle" x="1788" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">hindsight (HER)</text>
175
+ <text xml:space="preserve" text-anchor="middle" x="1788" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">relabel achieved&#45;goal</text>
160
176
  </g>
161
177
  <!-- Loop&#45;&gt;C3 -->
162
- <g id="edge10" class="edge">
178
+ <g id="edge13" class="edge">
163
179
  <title>Loop&#45;&gt;C3</title>
164
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M623.56,-550.77C618.3,-517.9 609.59,-463.46 604.37,-430.79"/>
165
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="607.14,-430.4 603.11,-422.94 601.61,-431.28 607.14,-430.4"/>
166
- <text xml:space="preserve" text-anchor="middle" x="638.71" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">failed goal</text>
180
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M634.03,-562.39C654.32,-558.68 675.91,-554.85 696,-551.5 808.59,-532.74 837.17,-530.75 950,-513.5 979.9,-508.93 987.1,-505.51 1017.25,-503 1036.54,-501.39 1696.58,-503.44 1714,-495 1742.12,-481.38 1763.05,-451.38 1775.35,-429.43"/>
181
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1777.69,-430.99 1779,-422.61 1772.75,-428.34 1777.69,-430.99"/>
182
+ <text xml:space="preserve" text-anchor="middle" x="1038.62" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">failed goal</text>
183
+ </g>
184
+ <!-- R1&#45;&gt;R5 -->
185
+ <g id="edge8" class="edge">
186
+ <title>R1&#45;&gt;R5</title>
187
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M100.59,-425.2C123.42,-445.46 160.05,-473.7 198,-485.46 263.48,-505.75 751.58,-511.5 815,-485.46 840.72,-474.9 862.76,-452.25 877.81,-433.27"/>
188
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="879.98,-435.03 882.62,-426.98 875.54,-431.63 879.98,-435.03"/>
189
+ <text xml:space="preserve" text-anchor="middle" x="778" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">terminal</text>
167
190
  </g>
168
191
  <!-- E3 -->
169
- <g id="node7" class="node">
192
+ <g id="node8" class="node">
170
193
  <title>E3</title>
171
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1540.12,-420.5C1540.12,-420.5 1419.88,-420.5 1419.88,-420.5 1413.88,-420.5 1407.88,-414.5 1407.88,-408.5 1407.88,-408.5 1407.88,-396.5 1407.88,-396.5 1407.88,-390.5 1413.88,-384.5 1419.88,-384.5 1419.88,-384.5 1540.12,-384.5 1540.12,-384.5 1546.12,-384.5 1552.12,-390.5 1552.12,-396.5 1552.12,-396.5 1552.12,-408.5 1552.12,-408.5 1552.12,-414.5 1546.12,-420.5 1540.12,-420.5"/>
172
- <text xml:space="preserve" text-anchor="middle" x="1480" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">verify_as_reward</text>
173
- <text xml:space="preserve" text-anchor="middle" x="1480" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_verify caps/floors judge</text>
194
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M350.12,-420.5C350.12,-420.5 229.88,-420.5 229.88,-420.5 223.88,-420.5 217.88,-414.5 217.88,-408.5 217.88,-408.5 217.88,-396.5 217.88,-396.5 217.88,-390.5 223.88,-384.5 229.88,-384.5 229.88,-384.5 350.12,-384.5 350.12,-384.5 356.12,-384.5 362.12,-390.5 362.12,-396.5 362.12,-396.5 362.12,-408.5 362.12,-408.5 362.12,-414.5 356.12,-420.5 350.12,-420.5"/>
195
+ <text xml:space="preserve" text-anchor="middle" x="290" y="-405" font-family="sans-Serif" font-size="10.00" fill="#0f172a">verify_as_reward</text>
196
+ <text xml:space="preserve" text-anchor="middle" x="290" y="-393" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extro_verify caps/floors judge</text>
174
197
  </g>
175
198
  <!-- R1&#45;&gt;E3 -->
176
- <g id="edge6" class="edge">
199
+ <g id="edge7" class="edge">
177
200
  <title>R1&#45;&gt;E3</title>
178
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1328.76,-402.5C1350.34,-402.5 1374.84,-402.5 1397.74,-402.5"/>
179
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1397.47,-405.3 1405.47,-402.5 1397.47,-399.7 1397.47,-405.3"/>
180
- <text xml:space="preserve" text-anchor="middle" x="1367.94" y="-407.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">ground</text>
201
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M139.18,-402.5C160.67,-402.5 185.09,-402.5 207.92,-402.5"/>
202
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="207.63,-405.3 215.63,-402.5 207.63,-399.7 207.63,-405.3"/>
203
+ <text xml:space="preserve" text-anchor="middle" x="178.06" y="-407.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">ground</text>
181
204
  </g>
182
205
  <!-- Fses -->
183
- <g id="node17" class="node">
206
+ <g id="node18" class="node">
184
207
  <title>Fses</title>
185
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M632.5,-56C632.5,-58.21 613.45,-60 590,-60 566.55,-60 547.5,-58.21 547.5,-56 547.5,-56 547.5,-20 547.5,-20 547.5,-17.79 566.55,-16 590,-16 613.45,-16 632.5,-17.79 632.5,-20 632.5,-20 632.5,-56 632.5,-56"/>
186
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M632.5,-56C632.5,-53.79 613.45,-52 590,-52 566.55,-52 547.5,-53.79 547.5,-56"/>
187
- <text xml:space="preserve" text-anchor="middle" x="590" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions/*.jsonl</text>
188
- <text xml:space="preserve" text-anchor="middle" x="590" y="-28.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(step_reward)</text>
208
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1291.5,-56C1291.5,-58.21 1272.45,-60 1249,-60 1225.55,-60 1206.5,-58.21 1206.5,-56 1206.5,-56 1206.5,-20 1206.5,-20 1206.5,-17.79 1225.55,-16 1249,-16 1272.45,-16 1291.5,-17.79 1291.5,-20 1291.5,-20 1291.5,-56 1291.5,-56"/>
209
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1291.5,-56C1291.5,-53.79 1272.45,-52 1249,-52 1225.55,-52 1206.5,-53.79 1206.5,-56"/>
210
+ <text xml:space="preserve" text-anchor="middle" x="1249" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions/*.jsonl</text>
211
+ <text xml:space="preserve" text-anchor="middle" x="1249" y="-28.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(step_reward)</text>
189
212
  </g>
190
213
  <!-- R2&#45;&gt;Fses -->
191
- <g id="edge11" class="edge">
214
+ <g id="edge14" class="edge">
192
215
  <title>R2&#45;&gt;Fses</title>
193
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1591.55,-380.75C1585.05,-377.86 1578.38,-375.02 1572,-372.5 1229.5,-237.01 1142.43,-184.53 777,-138.5 749.6,-135.05 677.02,-144.13 653,-130.5 629.18,-116.99 612.4,-90.31 602.18,-69.24"/>
194
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="604.79,-68.2 598.9,-62.1 599.7,-70.54 604.79,-68.2"/>
195
- <text xml:space="preserve" text-anchor="middle" x="1445.07" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">step_reward</text>
216
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M652.17,-379.95C658.71,-377.18 665.46,-374.58 672,-372.5 807.72,-329.28 859.65,-377.29 987,-313.5 1101.81,-255.99 1193.67,-126.93 1230.98,-68.61"/>
217
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1233.12,-70.45 1235.03,-62.2 1228.39,-67.46 1233.12,-70.45"/>
218
+ <text xml:space="preserve" text-anchor="middle" x="1173.43" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">step_reward</text>
196
219
  </g>
197
220
  <!-- Fmis -->
198
- <g id="node16" class="node">
221
+ <g id="node17" class="node">
199
222
  <title>Fmis</title>
200
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M853.38,-52.73C853.38,-54.53 836.17,-56 815,-56 793.83,-56 776.62,-54.53 776.62,-52.73 776.62,-52.73 776.62,-23.27 776.62,-23.27 776.62,-21.47 793.83,-20 815,-20 836.17,-20 853.38,-21.47 853.38,-23.27 853.38,-23.27 853.38,-52.73 853.38,-52.73"/>
201
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M853.38,-52.73C853.38,-50.92 836.17,-49.45 815,-49.45 793.83,-49.45 776.62,-50.92 776.62,-52.73"/>
202
- <text xml:space="preserve" text-anchor="middle" x="815" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes.json</text>
223
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M938.38,-52.73C938.38,-54.53 921.17,-56 900,-56 878.83,-56 861.62,-54.53 861.62,-52.73 861.62,-52.73 861.62,-23.27 861.62,-23.27 861.62,-21.47 878.83,-20 900,-20 921.17,-20 938.38,-21.47 938.38,-23.27 938.38,-23.27 938.38,-52.73 938.38,-52.73"/>
224
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M938.38,-52.73C938.38,-50.92 921.17,-49.45 900,-49.45 878.83,-49.45 861.62,-50.92 861.62,-52.73"/>
225
+ <text xml:space="preserve" text-anchor="middle" x="900" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes.json</text>
203
226
  </g>
204
227
  <!-- R3&#45;&gt;Fmis -->
205
- <g id="edge13" class="edge">
228
+ <g id="edge16" class="edge">
206
229
  <title>R3&#45;&gt;Fmis</title>
207
- <path fill="none" stroke="#fb7185" stroke-width="1.3" stroke-dasharray="5,2" d="M949.48,-379.91C924.67,-317.02 852.52,-134.11 825.43,-65.45"/>
208
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="828.18,-64.79 822.64,-58.38 822.97,-66.85 828.18,-64.79"/>
209
- <text xml:space="preserve" text-anchor="middle" x="952.28" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">reward_signal</text>
230
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" stroke-dasharray="5,2" d="M491.1,-380.15C542.97,-339.54 660.32,-249.01 763.5,-179 797.44,-155.97 812.83,-159.33 842,-130.5 861.28,-111.44 877.24,-84.83 887.51,-65.21"/>
231
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="889.92,-66.64 891.05,-58.24 884.93,-64.1 889.92,-66.64"/>
232
+ <text xml:space="preserve" text-anchor="middle" x="792.75" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">reward_signal</text>
210
233
  </g>
211
234
  <!-- Frws -->
212
- <g id="node21" class="node">
235
+ <g id="node23" class="node">
213
236
  <title>Frws</title>
214
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M998.62,-52.73C998.62,-54.53 975.04,-56 946,-56 916.96,-56 893.38,-54.53 893.38,-52.73 893.38,-52.73 893.38,-23.27 893.38,-23.27 893.38,-21.47 916.96,-20 946,-20 975.04,-20 998.62,-21.47 998.62,-23.27 998.62,-23.27 998.62,-52.73 998.62,-52.73"/>
215
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M998.62,-52.73C998.62,-50.92 975.04,-49.45 946,-49.45 916.96,-49.45 893.38,-50.92 893.38,-52.73"/>
216
- <text xml:space="preserve" text-anchor="middle" x="946" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">reward_sentinel.json</text>
237
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M821.62,-52.73C821.62,-54.53 798.04,-56 769,-56 739.96,-56 716.38,-54.53 716.38,-52.73 716.38,-52.73 716.38,-23.27 716.38,-23.27 716.38,-21.47 739.96,-20 769,-20 798.04,-20 821.62,-21.47 821.62,-23.27 821.62,-23.27 821.62,-52.73 821.62,-52.73"/>
238
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M821.62,-52.73C821.62,-50.92 798.04,-49.45 769,-49.45 739.96,-49.45 716.38,-50.92 716.38,-52.73"/>
239
+ <text xml:space="preserve" text-anchor="middle" x="769" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">reward_sentinel.json</text>
217
240
  </g>
218
241
  <!-- R3&#45;&gt;Frws -->
219
- <g id="edge12" class="edge">
242
+ <g id="edge15" class="edge">
220
243
  <title>R3&#45;&gt;Frws</title>
221
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M979.19,-380.15C994.09,-363.54 1012.79,-339.08 1021,-313.5 1039.27,-256.58 1027.52,-238.42 1021,-179 1018.99,-160.67 1019.22,-155.47 1012,-138.5 1000.43,-111.29 981.26,-83.52 966.56,-64.25"/>
222
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="968.89,-62.69 961.77,-58.1 964.47,-66.13 968.89,-62.69"/>
244
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M467.66,-379.86C476.99,-330.82 505.99,-209.99 575,-138.5 611.54,-100.65 665.59,-74.57 707.36,-58.64"/>
245
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="708.25,-61.29 714.77,-55.88 706.3,-56.04 708.25,-61.29"/>
246
+ </g>
247
+ <!-- Fpol -->
248
+ <g id="node19" class="node">
249
+ <title>Fpol</title>
250
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1061.75,-56C1061.75,-58.21 1043.04,-60 1020,-60 996.96,-60 978.25,-58.21 978.25,-56 978.25,-56 978.25,-20 978.25,-20 978.25,-17.79 996.96,-16 1020,-16 1043.04,-16 1061.75,-17.79 1061.75,-20 1061.75,-20 1061.75,-56 1061.75,-56"/>
251
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1061.75,-56C1061.75,-53.79 1043.04,-52 1020,-52 996.96,-52 978.25,-53.79 978.25,-56"/>
252
+ <text xml:space="preserve" text-anchor="middle" x="1020" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy.json +</text>
253
+ <text xml:space="preserve" text-anchor="middle" x="1020" y="-28.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_traj.jsonl</text>
254
+ </g>
255
+ <!-- R5&#45;&gt;Fpol -->
256
+ <g id="edge9" class="edge">
257
+ <title>R5&#45;&gt;Fpol</title>
258
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M882.7,-379.7C871.04,-362.67 856.33,-337.87 850,-313.5 834.98,-255.64 817.52,-229.19 850,-179 878.59,-134.83 917.71,-164.34 958,-130.5 978.13,-113.59 994.47,-88.57 1005.32,-68.97"/>
259
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1007.67,-70.5 1008.98,-62.12 1002.73,-67.86 1007.67,-70.5"/>
223
260
  </g>
224
261
  <!-- S1 -->
225
- <g id="node8" class="node">
262
+ <g id="node9" class="node">
226
263
  <title>S1</title>
227
- <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M843.75,-424.5C843.75,-424.5 706.25,-424.5 706.25,-424.5 700.25,-424.5 694.25,-418.5 694.25,-412.5 694.25,-412.5 694.25,-392.5 694.25,-392.5 694.25,-386.5 700.25,-380.5 706.25,-380.5 706.25,-380.5 843.75,-380.5 843.75,-380.5 849.75,-380.5 855.75,-386.5 855.75,-392.5 855.75,-392.5 855.75,-412.5 855.75,-412.5 855.75,-418.5 849.75,-424.5 843.75,-424.5"/>
228
- <text xml:space="preserve" text-anchor="middle" x="775" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">practice</text>
229
- <text xml:space="preserve" text-anchor="middle" x="775" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">budget&#45;first + winning_trace DPO</text>
230
- <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&gt;=0.7</text>
264
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M1152.75,-424.5C1152.75,-424.5 1015.25,-424.5 1015.25,-424.5 1009.25,-424.5 1003.25,-418.5 1003.25,-412.5 1003.25,-412.5 1003.25,-392.5 1003.25,-392.5 1003.25,-386.5 1009.25,-380.5 1015.25,-380.5 1015.25,-380.5 1152.75,-380.5 1152.75,-380.5 1158.75,-380.5 1164.75,-386.5 1164.75,-392.5 1164.75,-392.5 1164.75,-412.5 1164.75,-412.5 1164.75,-418.5 1158.75,-424.5 1152.75,-424.5"/>
265
+ <text xml:space="preserve" text-anchor="middle" x="1084" y="-411" font-family="sans-Serif" font-size="10.00" fill="#0f172a">practice</text>
266
+ <text xml:space="preserve" text-anchor="middle" x="1084" y="-399" font-family="sans-Serif" font-size="10.00" fill="#0f172a">budget&#45;first + winning_trace DPO</text>
267
+ <text xml:space="preserve" text-anchor="middle" x="1084" y="-387" font-family="sans-Serif" font-size="10.00" fill="#0f172a">auto&#45;resolve on judge&gt;=0.7</text>
231
268
  </g>
232
269
  <!-- S1&#45;&gt;Fmis -->
233
- <g id="edge14" class="edge">
270
+ <g id="edge17" class="edge">
234
271
  <title>S1&#45;&gt;Fmis</title>
235
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M778.48,-369.96C786.22,-299.84 804.74,-132.01 812,-66.17"/>
236
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="775.72,-369.43 777.63,-377.68 781.29,-370.04 775.72,-369.43"/>
237
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="814.76,-66.72 812.85,-58.46 809.19,-66.11 814.76,-66.72"/>
238
- <text xml:space="preserve" text-anchor="middle" x="824.48" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">auto&#45;resolve</text>
272
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M1007.98,-375.45C978.91,-361.6 948.36,-341.51 930,-313.5 879.12,-235.88 888.04,-118.68 895.41,-66.15"/>
273
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="1006.71,-377.95 1015.15,-378.73 1009.04,-372.85 1006.71,-377.95"/>
274
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="898.14,-66.81 896.55,-58.48 892.6,-65.98 898.14,-66.81"/>
275
+ <text xml:space="preserve" text-anchor="middle" x="955.5" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">auto&#45;resolve</text>
239
276
  </g>
240
277
  <!-- Fcur -->
241
- <g id="node19" class="node">
278
+ <g id="node21" class="node">
242
279
  <title>Fcur</title>
243
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M737,-52.73C737,-54.53 722.66,-56 705,-56 687.34,-56 673,-54.53 673,-52.73 673,-52.73 673,-23.27 673,-23.27 673,-21.47 687.34,-20 705,-20 722.66,-20 737,-21.47 737,-23.27 737,-23.27 737,-52.73 737,-52.73"/>
244
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M737,-52.73C737,-50.92 722.66,-49.45 705,-49.45 687.34,-49.45 673,-50.92 673,-52.73"/>
245
- <text xml:space="preserve" text-anchor="middle" x="705" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">curriculum/</text>
280
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1166,-52.73C1166,-54.53 1151.66,-56 1134,-56 1116.34,-56 1102,-54.53 1102,-52.73 1102,-52.73 1102,-23.27 1102,-23.27 1102,-21.47 1116.34,-20 1134,-20 1151.66,-20 1166,-21.47 1166,-23.27 1166,-23.27 1166,-52.73 1166,-52.73"/>
281
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1166,-52.73C1166,-50.92 1151.66,-49.45 1134,-49.45 1116.34,-49.45 1102,-50.92 1102,-52.73"/>
282
+ <text xml:space="preserve" text-anchor="middle" x="1134" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">curriculum/</text>
246
283
  </g>
247
284
  <!-- S1&#45;&gt;Fcur -->
248
- <g id="edge15" class="edge">
285
+ <g id="edge18" class="edge">
249
286
  <title>S1&#45;&gt;Fcur</title>
250
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M770.78,-379.64C758.63,-316.74 723.62,-135.4 710.26,-66.24"/>
251
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="713.02,-65.76 708.75,-58.44 707.52,-66.82 713.02,-65.76"/>
287
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1087.02,-379.64C1095.69,-316.74 1120.7,-135.4 1130.24,-66.24"/>
288
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1133,-66.76 1131.32,-58.46 1127.45,-66 1133,-66.76"/>
252
289
  </g>
253
290
  <!-- W1 -->
254
- <g id="node13" class="node">
291
+ <g id="node14" class="node">
255
292
  <title>W1</title>
256
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M322.5,-243C322.5,-243 225.5,-243 225.5,-243 219.5,-243 213.5,-237 213.5,-231 213.5,-231 213.5,-199 213.5,-199 213.5,-193 219.5,-187 225.5,-187 225.5,-187 322.5,-187 322.5,-187 328.5,-187 334.5,-193 334.5,-199 334.5,-199 334.5,-231 334.5,-231 334.5,-237 328.5,-243 322.5,-243"/>
257
- <text xml:space="preserve" text-anchor="middle" x="274" y="-229.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preference ledger</text>
258
- <text xml:space="preserve" text-anchor="middle" x="274" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">trajectory pairs</text>
259
- <text xml:space="preserve" text-anchor="middle" x="274" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">scrub + geometry filter</text>
260
- <text xml:space="preserve" text-anchor="middle" x="274" y="-193.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">write+export &lt;=40%/src</text>
293
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M1530.5,-243C1530.5,-243 1433.5,-243 1433.5,-243 1427.5,-243 1421.5,-237 1421.5,-231 1421.5,-231 1421.5,-199 1421.5,-199 1421.5,-193 1427.5,-187 1433.5,-187 1433.5,-187 1530.5,-187 1530.5,-187 1536.5,-187 1542.5,-193 1542.5,-199 1542.5,-199 1542.5,-231 1542.5,-231 1542.5,-237 1536.5,-243 1530.5,-243"/>
294
+ <text xml:space="preserve" text-anchor="middle" x="1482" y="-229.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preference ledger</text>
295
+ <text xml:space="preserve" text-anchor="middle" x="1482" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">trajectory pairs</text>
296
+ <text xml:space="preserve" text-anchor="middle" x="1482" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">scrub + geometry filter</text>
297
+ <text xml:space="preserve" text-anchor="middle" x="1482" y="-193.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">write+export &lt;=40%/src</text>
261
298
  </g>
262
299
  <!-- S2&#45;&gt;W1 -->
263
- <g id="edge16" class="edge">
300
+ <g id="edge19" class="edge">
264
301
  <title>S2&#45;&gt;W1</title>
265
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M106.26,-384.02C129.81,-367.2 165.35,-340.4 193,-313.5 212.82,-294.21 232.7,-270.36 247.81,-251.08"/>
266
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="249.87,-252.98 252.56,-244.95 245.45,-249.55 249.87,-252.98"/>
267
- <text xml:space="preserve" text-anchor="middle" x="209.87" y="-328.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(loser,winner)</text>
302
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1296.31,-384.04C1321.82,-367.22 1360.44,-340.44 1391,-313.5 1412.93,-294.17 1435.36,-270.2 1452.46,-250.86"/>
303
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1454.52,-252.77 1457.68,-244.9 1450.31,-249.07 1454.52,-252.77"/>
304
+ <text xml:space="preserve" text-anchor="middle" x="1406.72" y="-328.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(loser,winner)</text>
268
305
  </g>
269
306
  <!-- S3&#45;&gt;W1 -->
270
- <g id="edge17" class="edge">
307
+ <g id="edge20" class="edge">
271
308
  <title>S3&#45;&gt;W1</title>
272
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M268.56,-384.05C269.53,-354.26 271.51,-292.98 272.8,-253.23"/>
273
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="275.59,-253.43 273.05,-245.34 269.99,-253.25 275.59,-253.43"/>
309
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1457.4,-383.98C1458.78,-367.75 1461.1,-342.94 1464,-321.5 1467.09,-298.66 1471.41,-273.18 1475.04,-252.99"/>
310
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1477.79,-253.55 1476.47,-245.18 1472.28,-252.55 1477.79,-253.55"/>
274
311
  </g>
275
312
  <!-- C3&#45;&gt;Fses -->
276
- <g id="edge18" class="edge">
313
+ <g id="edge21" class="edge">
277
314
  <title>C3&#45;&gt;Fses</title>
278
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M599.52,-384.02C597.93,-326.61 592.88,-143.38 590.85,-69.91"/>
279
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="593.66,-70.18 590.64,-62.26 588.06,-70.33 593.66,-70.18"/>
280
- <text xml:space="preserve" text-anchor="middle" x="623.05" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">success:true</text>
315
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1748.67,-383.95C1737.64,-379.62 1725.51,-375.4 1714,-372.5 1605.47,-345.2 1573.97,-363.24 1464,-342.5 1457.68,-341.31 1356.78,-317.8 1352,-313.5 1279.68,-248.44 1257.94,-127.55 1251.56,-70.43"/>
316
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1254.35,-70.17 1250.74,-62.5 1248.78,-70.74 1254.35,-70.17"/>
317
+ <text xml:space="preserve" text-anchor="middle" x="1377.5" y="-211.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">success:true</text>
281
318
  </g>
282
319
  <!-- Fprf -->
283
- <g id="node18" class="node">
320
+ <g id="node20" class="node">
284
321
  <title>Fprf</title>
285
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M507.12,-52.73C507.12,-54.53 486.9,-56 462,-56 437.1,-56 416.88,-54.53 416.88,-52.73 416.88,-52.73 416.88,-23.27 416.88,-23.27 416.88,-21.47 437.1,-20 462,-20 486.9,-20 507.12,-21.47 507.12,-23.27 507.12,-23.27 507.12,-52.73 507.12,-52.73"/>
286
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M507.12,-52.73C507.12,-50.92 486.9,-49.45 462,-49.45 437.1,-49.45 416.88,-50.92 416.88,-52.73"/>
287
- <text xml:space="preserve" text-anchor="middle" x="462" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preferences.jsonl</text>
322
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1422.12,-52.73C1422.12,-54.53 1401.9,-56 1377,-56 1352.1,-56 1331.88,-54.53 1331.88,-52.73 1331.88,-52.73 1331.88,-23.27 1331.88,-23.27 1331.88,-21.47 1352.1,-20 1377,-20 1401.9,-20 1422.12,-21.47 1422.12,-23.27 1422.12,-23.27 1422.12,-52.73 1422.12,-52.73"/>
323
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1422.12,-52.73C1422.12,-50.92 1401.9,-49.45 1377,-49.45 1352.1,-49.45 1331.88,-50.92 1331.88,-52.73"/>
324
+ <text xml:space="preserve" text-anchor="middle" x="1377" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preferences.jsonl</text>
288
325
  </g>
289
326
  <!-- W1&#45;&gt;Fprf -->
290
- <g id="edge19" class="edge">
327
+ <g id="edge22" class="edge">
291
328
  <title>W1&#45;&gt;Fprf</title>
292
- <path fill="none" stroke="#f59e0b" stroke-width="2" d="M334.9,-187.3C341.66,-184.45 348.46,-181.64 355,-179 390.22,-164.8 409.78,-177.39 435,-149 454.96,-126.54 460.71,-91.7 462.1,-67.26"/>
293
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="464.89,-67.64 462.37,-59.55 459.3,-67.45 464.89,-67.64"/>
329
+ <path fill="none" stroke="#f59e0b" stroke-width="2" d="M1437.94,-186.67C1424.58,-176.38 1411.07,-163.59 1402,-149 1386.53,-124.1 1380.6,-90.7 1378.35,-67.26"/>
330
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="1381.14,-67.1 1377.73,-59.34 1375.56,-67.54 1381.14,-67.1"/>
294
331
  </g>
295
332
  <!-- W2 -->
296
- <g id="node14" class="node">
333
+ <g id="node15" class="node">
297
334
  <title>W2</title>
298
- <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M161.38,-243C161.38,-243 48.62,-243 48.62,-243 42.62,-243 36.62,-237 36.62,-231 36.62,-231 36.62,-199 36.62,-199 36.62,-193 42.62,-187 48.62,-187 48.62,-187 161.38,-187 161.38,-187 167.38,-187 173.38,-193 173.38,-199 173.38,-199 173.38,-231 173.38,-231 173.38,-237 167.38,-243 161.38,-243"/>
299
- <text xml:space="preserve" text-anchor="middle" x="105" y="-229.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">train_and_gate</text>
300
- <text xml:space="preserve" text-anchor="middle" x="105" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SFT+DPO → LoRA vN+1</text>
301
- <text xml:space="preserve" text-anchor="middle" x="105" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">gate + preference diet</text>
302
- <text xml:space="preserve" text-anchor="middle" x="105" y="-193.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">export_ready without trainer</text>
335
+ <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M1707.38,-243C1707.38,-243 1594.62,-243 1594.62,-243 1588.62,-243 1582.62,-237 1582.62,-231 1582.62,-231 1582.62,-199 1582.62,-199 1582.62,-193 1588.62,-187 1594.62,-187 1594.62,-187 1707.38,-187 1707.38,-187 1713.38,-187 1719.38,-193 1719.38,-199 1719.38,-199 1719.38,-231 1719.38,-231 1719.38,-237 1713.38,-243 1707.38,-243"/>
336
+ <text xml:space="preserve" text-anchor="middle" x="1651" y="-229.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">train_and_gate</text>
337
+ <text xml:space="preserve" text-anchor="middle" x="1651" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SFT+DPO → LoRA vN+1</text>
338
+ <text xml:space="preserve" text-anchor="middle" x="1651" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">gate + preference diet</text>
339
+ <text xml:space="preserve" text-anchor="middle" x="1651" y="-193.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">export_ready without trainer</text>
303
340
  </g>
304
341
  <!-- Fftn -->
305
- <g id="node20" class="node">
342
+ <g id="node22" class="node">
306
343
  <title>Fftn</title>
307
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M377.25,-52.73C377.25,-54.53 359.21,-56 337,-56 314.79,-56 296.75,-54.53 296.75,-52.73 296.75,-52.73 296.75,-23.27 296.75,-23.27 296.75,-21.47 314.79,-20 337,-20 359.21,-20 377.25,-21.47 377.25,-23.27 377.25,-23.27 377.25,-52.73 377.25,-52.73"/>
308
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M377.25,-52.73C377.25,-50.92 359.21,-49.45 337,-49.45 314.79,-49.45 296.75,-50.92 296.75,-52.73"/>
309
- <text xml:space="preserve" text-anchor="middle" x="337" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">finetune/*.jsonl</text>
344
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1542.25,-52.73C1542.25,-54.53 1524.21,-56 1502,-56 1479.79,-56 1461.75,-54.53 1461.75,-52.73 1461.75,-52.73 1461.75,-23.27 1461.75,-23.27 1461.75,-21.47 1479.79,-20 1502,-20 1524.21,-20 1542.25,-21.47 1542.25,-23.27 1542.25,-23.27 1542.25,-52.73 1542.25,-52.73"/>
345
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1542.25,-52.73C1542.25,-50.92 1524.21,-49.45 1502,-49.45 1479.79,-49.45 1461.75,-50.92 1461.75,-52.73"/>
346
+ <text xml:space="preserve" text-anchor="middle" x="1502" y="-34.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">finetune/*.jsonl</text>
310
347
  </g>
311
348
  <!-- W2&#45;&gt;Fftn -->
312
- <g id="edge22" class="edge">
349
+ <g id="edge25" class="edge">
313
350
  <title>W2&#45;&gt;Fftn</title>
314
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M141.15,-186.31C159.87,-171.99 183.13,-154.26 204,-138.5 238.82,-112.2 278.96,-82.22 305.95,-62.1"/>
315
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="307.56,-64.39 312.31,-57.37 304.22,-59.9 307.56,-64.39"/>
351
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1583.08,-186.04C1576.34,-183.55 1569.56,-181.16 1563,-179 1513.23,-162.62 1480.99,-190.49 1449,-149 1438.21,-135 1463.96,-92.57 1483.23,-64.68"/>
352
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1485.51,-66.31 1487.82,-58.15 1480.93,-63.09 1485.51,-66.31"/>
316
353
  </g>
317
354
  <!-- Ollama -->
318
- <g id="node22" class="node">
355
+ <g id="node24" class="node">
319
356
  <title>Ollama</title>
320
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M154.25,-56C154.25,-56 55.75,-56 55.75,-56 49.75,-56 43.75,-50 43.75,-44 43.75,-44 43.75,-32 43.75,-32 43.75,-26 49.75,-20 55.75,-20 55.75,-20 154.25,-20 154.25,-20 160.25,-20 166.25,-26 166.25,-32 166.25,-32 166.25,-44 166.25,-44 166.25,-50 160.25,-56 154.25,-56"/>
321
- <text xml:space="preserve" text-anchor="middle" x="105" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ollama create pwn&#45;vN+1</text>
322
- <text xml:space="preserve" text-anchor="middle" x="105" y="-28.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(local LoRA adapter)</text>
357
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M1817.25,-56C1817.25,-56 1718.75,-56 1718.75,-56 1712.75,-56 1706.75,-50 1706.75,-44 1706.75,-44 1706.75,-32 1706.75,-32 1706.75,-26 1712.75,-20 1718.75,-20 1718.75,-20 1817.25,-20 1817.25,-20 1823.25,-20 1829.25,-26 1829.25,-32 1829.25,-32 1829.25,-44 1829.25,-44 1829.25,-50 1823.25,-56 1817.25,-56"/>
358
+ <text xml:space="preserve" text-anchor="middle" x="1768" y="-40.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ollama create pwn&#45;vN+1</text>
359
+ <text xml:space="preserve" text-anchor="middle" x="1768" y="-28.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(local LoRA adapter)</text>
323
360
  </g>
324
361
  <!-- W2&#45;&gt;Ollama -->
325
- <g id="edge23" class="edge">
362
+ <g id="edge26" class="edge">
326
363
  <title>W2&#45;&gt;Ollama</title>
327
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M103.3,-186.18C102.68,-174.67 102.05,-161.2 101.75,-149 101.06,-121.32 102.19,-89.72 103.31,-67.51"/>
328
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="106.1,-67.69 103.73,-59.55 100.51,-67.39 106.1,-67.69"/>
329
- <text xml:space="preserve" text-anchor="middle" x="113.38" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">LoRA</text>
364
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M1688.8,-186.16C1701.25,-175.59 1714.35,-162.75 1724,-149 1741.67,-123.82 1753.71,-90.53 1760.67,-67.19"/>
365
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1763.35,-67.98 1762.85,-59.52 1757.97,-66.45 1763.35,-67.98"/>
366
+ <text xml:space="preserve" text-anchor="middle" x="1740.89" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">LoRA</text>
330
367
  </g>
331
368
  <!-- W3 -->
332
- <g id="node15" class="node">
369
+ <g id="node16" class="node">
333
370
  <title>W3</title>
334
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M505.38,-233C505.38,-233 386.62,-233 386.62,-233 380.62,-233 374.62,-227 374.62,-221 374.62,-221 374.62,-209 374.62,-209 374.62,-203 380.62,-197 386.62,-197 386.62,-197 505.38,-197 505.38,-197 511.38,-197 517.38,-203 517.38,-209 517.38,-209 517.38,-221 517.38,-221 517.38,-227 511.38,-233 505.38,-233"/>
335
- <text xml:space="preserve" text-anchor="middle" x="446" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">calibrate</text>
336
- <text xml:space="preserve" text-anchor="middle" x="446" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">p(success) vs actual → Brier</text>
371
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M1890.38,-233C1890.38,-233 1771.62,-233 1771.62,-233 1765.62,-233 1759.62,-227 1759.62,-221 1759.62,-221 1759.62,-209 1759.62,-209 1759.62,-203 1765.62,-197 1771.62,-197 1771.62,-197 1890.38,-197 1890.38,-197 1896.38,-197 1902.38,-203 1902.38,-209 1902.38,-209 1902.38,-221 1902.38,-221 1902.38,-227 1896.38,-233 1890.38,-233"/>
372
+ <text xml:space="preserve" text-anchor="middle" x="1831" y="-217.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">calibrate</text>
373
+ <text xml:space="preserve" text-anchor="middle" x="1831" y="-205.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">p(success) vs actual → Brier</text>
337
374
  </g>
338
375
  <!-- W3&#45;&gt;Loop -->
339
- <g id="edge25" class="edge">
376
+ <g id="edge28" class="edge">
340
377
  <title>W3&#45;&gt;Loop</title>
341
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M463.3,-233.26C487.76,-256.38 534.95,-296.48 584,-313.5 700.89,-354.07 1610.86,-282.72 1696,-372.5 1733.46,-412 1734.26,-456.26 1696,-495 1689.71,-501.36 1060.89,-502.02 1052,-503 1029.43,-505.49 1024.3,-509.22 1002,-513.5 907.03,-531.72 798.07,-550.4 722.35,-563.04"/>
342
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="722.19,-560.23 714.76,-564.3 723.11,-565.75 722.19,-560.23"/>
343
- <text xml:space="preserve" text-anchor="middle" x="1745.77" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">calibration</text>
378
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1809.04,-233.23C1779.62,-258.42 1734.08,-306.21 1761,-342.5 1788.39,-379.42 1832.61,-335.58 1860,-372.5 1892.44,-416.23 1897.55,-455.58 1860,-495 1815.34,-541.88 760.31,-544.07 696,-551.5 678.93,-553.47 660.85,-556.23 643.43,-559.24"/>
379
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="643.16,-556.44 635.77,-560.59 644.13,-561.96 643.16,-556.44"/>
380
+ <text xml:space="preserve" text-anchor="middle" x="1907.66" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">calibration</text>
344
381
  </g>
345
382
  <!-- Fmis&#45;&gt;W2 -->
346
- <g id="edge24" class="edge">
383
+ <g id="edge27" class="edge">
347
384
  <title>Fmis&#45;&gt;W2</title>
348
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M809.25,-56.6C801.24,-78.03 784.52,-113.49 757,-130.5 650.18,-196.52 316.36,-150.78 194,-179 188.94,-180.17 183.8,-181.57 178.65,-183.13"/>
349
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="178.05,-180.38 171.3,-185.5 179.77,-185.71 178.05,-180.38"/>
350
- <text xml:space="preserve" text-anchor="middle" x="751.17" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">eval set</text>
385
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M905.55,-56.32C913.45,-77.81 930.14,-113.69 958,-130.5 1073.48,-200.18 1431.65,-148.35 1563,-179 1568,-180.17 1573.1,-181.57 1578.18,-183.14"/>
386
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1576.97,-185.69 1585.44,-185.5 1578.7,-180.36 1576.97,-185.69"/>
387
+ <text xml:space="preserve" text-anchor="middle" x="1015.21" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">eval set</text>
351
388
  </g>
352
389
  <!-- Fses&#45;&gt;W2 -->
353
- <g id="edge21" class="edge">
390
+ <g id="edge24" class="edge">
354
391
  <title>Fses&#45;&gt;W2</title>
355
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M581.49,-60.28C571.71,-81.74 553.53,-114 527,-130.5 495.25,-150.24 230.14,-169.4 194,-179 189.52,-180.19 184.96,-181.54 180.39,-182.99"/>
356
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="179.59,-180.31 172.89,-185.49 181.36,-185.62 179.59,-180.31"/>
357
- <text xml:space="preserve" text-anchor="middle" x="533.09" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_finetune</text>
392
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1257,-60.45C1266.45,-82.4 1284.45,-115.35 1312,-130.5 1332.56,-141.81 1500.49,-131.89 1523,-138.5 1553.01,-147.3 1583.29,-164.7 1606.87,-180.57"/>
393
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1605.12,-182.76 1613.29,-184.99 1608.29,-178.15 1605.12,-182.76"/>
394
+ <text xml:space="preserve" text-anchor="middle" x="1581.39" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_finetune</text>
358
395
  </g>
359
396
  <!-- Fprf&#45;&gt;W2 -->
360
- <g id="edge20" class="edge">
397
+ <g id="edge23" class="edge">
361
398
  <title>Fprf&#45;&gt;W2</title>
362
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M455.23,-56.46C445.79,-78.1 426.47,-114.13 397,-130.5 371.41,-144.71 293.86,-131.25 265.5,-138.5 228.98,-147.83 190.68,-165.51 160.66,-181.41"/>
363
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="159.48,-178.87 153.76,-185.12 162.13,-183.8 159.48,-178.87"/>
364
- <text xml:space="preserve" text-anchor="middle" x="288.75" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_dpo</text>
399
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1383.73,-56.54C1393.11,-78.28 1412.38,-114.41 1442,-130.5 1460.57,-140.59 1615.61,-125.16 1632,-138.5 1643.33,-147.72 1648.48,-162.61 1650.65,-176.74"/>
400
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1647.83,-176.72 1651.49,-184.36 1653.39,-176.1 1647.83,-176.72"/>
401
+ <text xml:space="preserve" text-anchor="middle" x="1663.49" y="-140.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_dpo</text>
365
402
  </g>
366
403
  <!-- Ollama&#45;&gt;Loop -->
367
- <g id="edge32" class="edge">
404
+ <g id="edge35" class="edge">
368
405
  <title>Ollama&#45;&gt;Loop</title>
369
- <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M129.41,-56.63C161.76,-78.81 221.46,-115.8 279,-130.5 305.81,-137.35 749.35,-137.47 777,-138.5 931.82,-144.25 1325.57,-131.37 1473,-179 1625.4,-228.24 1699.94,-232.1 1777,-372.5 1803.2,-420.23 1815.27,-456.28 1777,-495 1770.39,-501.69 1109.35,-501.97 1100,-503 1077.43,-505.48 1072.34,-509.44 1050,-513.5 938.45,-533.79 809.54,-553.04 723.85,-565.25"/>
370
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="723.62,-562.45 716.09,-566.35 724.41,-568 723.62,-562.45"/>
371
- <text xml:space="preserve" text-anchor="middle" x="1790.72" y="-333.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">promoted vN+1</text>
372
- <text xml:space="preserve" text-anchor="middle" x="1790.72" y="-323.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(next session)</text>
406
+ <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M1804.27,-56.47C1927.84,-118.08 2316.29,-330.44 2161,-495 2063.53,-598.29 1983.87,-507.04 1842,-513.5 1332.92,-536.7 1202.68,-496.87 696,-551.5 679.23,-553.31 661.5,-555.94 644.37,-558.86"/>
407
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="644.18,-556.05 636.78,-560.19 645.15,-561.57 644.18,-556.05"/>
408
+ <text xml:space="preserve" text-anchor="middle" x="2207.24" y="-333.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">promoted vN+1</text>
409
+ <text xml:space="preserve" text-anchor="middle" x="2207.24" y="-323.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(next session)</text>
373
410
  </g>
374
411
  <!-- Cron -->
375
- <g id="node23" class="node">
412
+ <g id="node25" class="node">
376
413
  <title>Cron</title>
377
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M1006,-601.88C1006,-601.88 876,-601.88 876,-601.88 870,-601.88 864,-595.88 864,-589.88 864,-589.88 864,-569.12 864,-569.12 864,-563.12 870,-557.12 876,-557.12 876,-557.12 1006,-557.12 1006,-557.12 1012,-557.12 1018,-563.12 1018,-569.12 1018,-569.12 1018,-589.88 1018,-589.88 1018,-595.88 1012,-601.88 1006,-601.88"/>
378
- <text xml:space="preserve" text-anchor="middle" x="941" y="-588.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">⏱ &#160;PWN::Cron.install_defaults</text>
379
- <text xml:space="preserve" text-anchor="middle" x="941" y="-575.62" font-family="sans-Serif" font-size="10.00" fill="#0f172a">practice · offline_judge</text>
380
- <text xml:space="preserve" text-anchor="middle" x="941" y="-563.62" font-family="sans-Serif" font-size="10.00" fill="#0f172a">train dry_run · consolidate</text>
414
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M1126,-601.88C1126,-601.88 996,-601.88 996,-601.88 990,-601.88 984,-595.88 984,-589.88 984,-589.88 984,-569.12 984,-569.12 984,-563.12 990,-557.12 996,-557.12 996,-557.12 1126,-557.12 1126,-557.12 1132,-557.12 1138,-563.12 1138,-569.12 1138,-569.12 1138,-589.88 1138,-589.88 1138,-595.88 1132,-601.88 1126,-601.88"/>
415
+ <text xml:space="preserve" text-anchor="middle" x="1061" y="-588.38" font-family="sans-Serif" font-size="10.00" fill="#0f172a">⏱ &#160;PWN::Cron.install_defaults</text>
416
+ <text xml:space="preserve" text-anchor="middle" x="1061" y="-575.62" font-family="sans-Serif" font-size="10.00" fill="#0f172a">practice · offline_judge</text>
417
+ <text xml:space="preserve" text-anchor="middle" x="1061" y="-563.62" font-family="sans-Serif" font-size="10.00" fill="#0f172a">train dry_run · consolidate</text>
381
418
  </g>
382
419
  <!-- Cron&#45;&gt;S1 -->
383
- <g id="edge26" class="edge">
420
+ <g id="edge29" class="edge">
384
421
  <title>Cron&#45;&gt;S1</title>
385
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M980.65,-556.72C1003.5,-541.48 1024.69,-520.75 1008,-503 998.09,-492.46 891.36,-500.55 878,-495 845.99,-481.7 817.22,-454.14 798.27,-432.72"/>
386
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="800.62,-431.16 793.28,-426.93 796.38,-434.81 800.62,-431.16"/>
387
- <text xml:space="preserve" text-anchor="middle" x="1028.97" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 3 * * *</text>
422
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1063.87,-556.69C1067.89,-526.08 1075.23,-470.21 1079.85,-435.07"/>
423
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1082.61,-435.56 1080.88,-427.26 1077.06,-434.83 1082.61,-435.56"/>
424
+ <text xml:space="preserve" text-anchor="middle" x="1085.81" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 3 * * *</text>
388
425
  </g>
389
426
  <!-- Cron&#45;&gt;W2 -->
390
- <g id="edge28" class="edge">
427
+ <g id="edge31" class="edge">
391
428
  <title>Cron&#45;&gt;W2</title>
392
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1008.53,-556.51C1068.16,-538.26 1157.83,-513.63 1238,-503 1252.84,-501.03 1766.28,-505.46 1777,-495 1832.22,-441.11 1837.42,-376.2 1783,-321.5 1767.43,-305.86 214.17,-322.46 194,-313.5 165.46,-300.82 142.08,-274.02 126.46,-251.71"/>
393
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="128.97,-250.42 122.17,-245.37 124.33,-253.56 128.97,-250.42"/>
394
- <text xml:space="preserve" text-anchor="middle" x="1837.35" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 4 * * 0</text>
429
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1138.4,-561.42C1157.48,-557.68 1177.92,-554.08 1197,-551.5 1282.89,-539.9 1915.97,-558.47 1975,-495 2012.08,-455.13 2011.62,-412.79 1975,-372.5 1928.01,-320.79 1711.19,-392.13 1662,-342.5 1639.37,-319.67 1638.95,-281.81 1642.78,-253.45"/>
430
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1645.51,-254.13 1643.98,-245.79 1639.98,-253.26 1645.51,-254.13"/>
431
+ <text xml:space="preserve" text-anchor="middle" x="2018.76" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 4 * * 0</text>
395
432
  </g>
396
433
  <!-- OJ -->
397
- <g id="node24" class="node">
434
+ <g id="node26" class="node">
398
435
  <title>OJ</title>
399
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1308,-597.5C1308,-597.5 1166,-597.5 1166,-597.5 1160,-597.5 1154,-591.5 1154,-585.5 1154,-585.5 1154,-573.5 1154,-573.5 1154,-567.5 1160,-561.5 1166,-561.5 1166,-561.5 1308,-561.5 1308,-561.5 1314,-561.5 1320,-567.5 1320,-573.5 1320,-573.5 1320,-585.5 1320,-585.5 1320,-591.5 1314,-597.5 1308,-597.5"/>
400
- <text xml:space="preserve" text-anchor="middle" x="1237" y="-582" font-family="sans-Serif" font-size="10.00" fill="#0f172a">offline_judge</text>
401
- <text xml:space="preserve" text-anchor="middle" x="1237" y="-570" font-family="sans-Serif" font-size="10.00" fill="#0f172a">judges + calibrate + warm sentinel</text>
436
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M870,-597.5C870,-597.5 728,-597.5 728,-597.5 722,-597.5 716,-591.5 716,-585.5 716,-585.5 716,-573.5 716,-573.5 716,-567.5 722,-561.5 728,-561.5 728,-561.5 870,-561.5 870,-561.5 876,-561.5 882,-567.5 882,-573.5 882,-573.5 882,-585.5 882,-585.5 882,-591.5 876,-597.5 870,-597.5"/>
437
+ <text xml:space="preserve" text-anchor="middle" x="799" y="-582" font-family="sans-Serif" font-size="10.00" fill="#0f172a">offline_judge</text>
438
+ <text xml:space="preserve" text-anchor="middle" x="799" y="-570" font-family="sans-Serif" font-size="10.00" fill="#0f172a">judges + calibrate + warm sentinel</text>
402
439
  </g>
403
440
  <!-- Cron&#45;&gt;OJ -->
404
- <g id="edge27" class="edge">
441
+ <g id="edge30" class="edge">
405
442
  <title>Cron&#45;&gt;OJ</title>
406
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1018.38,-579.5C1056.76,-579.5 1103.41,-579.5 1143.74,-579.5"/>
407
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1143.61,-582.3 1151.61,-579.5 1143.61,-576.7 1143.61,-582.3"/>
408
- <text xml:space="preserve" text-anchor="middle" x="1086" y="-584.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">30 3 * * *</text>
443
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M983.51,-579.5C954.87,-579.5 922.11,-579.5 892.21,-579.5"/>
444
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="892.59,-576.7 884.59,-579.5 892.59,-582.3 892.59,-576.7"/>
445
+ <text xml:space="preserve" text-anchor="middle" x="933" y="-584.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">30 3 * * *</text>
409
446
  </g>
410
447
  <!-- MemGC -->
411
- <g id="node25" class="node">
448
+ <g id="node27" class="node">
412
449
  <title>MemGC</title>
413
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1453.62,-597.5C1453.62,-597.5 1372.38,-597.5 1372.38,-597.5 1366.38,-597.5 1360.38,-591.5 1360.38,-585.5 1360.38,-585.5 1360.38,-573.5 1360.38,-573.5 1360.38,-567.5 1366.38,-561.5 1372.38,-561.5 1372.38,-561.5 1453.62,-561.5 1453.62,-561.5 1459.62,-561.5 1465.62,-567.5 1465.62,-573.5 1465.62,-573.5 1465.62,-585.5 1465.62,-585.5 1465.62,-591.5 1459.62,-597.5 1453.62,-597.5"/>
414
- <text xml:space="preserve" text-anchor="middle" x="1413" y="-582" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.consolidate</text>
415
- <text xml:space="preserve" text-anchor="middle" x="1413" y="-570" font-family="sans-Serif" font-size="10.00" fill="#0f172a">nightly memory GC</text>
450
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1310.62,-597.5C1310.62,-597.5 1229.38,-597.5 1229.38,-597.5 1223.38,-597.5 1217.38,-591.5 1217.38,-585.5 1217.38,-585.5 1217.38,-573.5 1217.38,-573.5 1217.38,-567.5 1223.38,-561.5 1229.38,-561.5 1229.38,-561.5 1310.62,-561.5 1310.62,-561.5 1316.62,-561.5 1322.62,-567.5 1322.62,-573.5 1322.62,-573.5 1322.62,-585.5 1322.62,-585.5 1322.62,-591.5 1316.62,-597.5 1310.62,-597.5"/>
451
+ <text xml:space="preserve" text-anchor="middle" x="1270" y="-582" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.consolidate</text>
452
+ <text xml:space="preserve" text-anchor="middle" x="1270" y="-570" font-family="sans-Serif" font-size="10.00" fill="#0f172a">nightly memory GC</text>
416
453
  </g>
417
454
  <!-- Cron&#45;&gt;MemGC -->
418
- <g id="edge29" class="edge">
455
+ <g id="edge32" class="edge">
419
456
  <title>Cron&#45;&gt;MemGC</title>
420
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M997.22,-602.39C1037.71,-617.6 1094.08,-636.18 1145.62,-644.12 1224.37,-656.26 1314.05,-625.13 1366.96,-601.97"/>
421
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1367.8,-604.66 1373.96,-598.84 1365.52,-599.55 1367.8,-604.66"/>
422
- <text xml:space="preserve" text-anchor="middle" x="1161" y="-647.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 5 * * *</text>
457
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1138.53,-579.5C1161.19,-579.5 1185.68,-579.5 1207.3,-579.5"/>
458
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1207.05,-582.3 1215.05,-579.5 1207.05,-576.7 1207.05,-582.3"/>
459
+ <text xml:space="preserve" text-anchor="middle" x="1177.69" y="-584.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 5 * * *</text>
423
460
  </g>
424
461
  <!-- OJ&#45;&gt;R1 -->
425
- <g id="edge30" class="edge">
462
+ <g id="edge33" class="edge">
426
463
  <title>OJ&#45;&gt;R1</title>
427
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M1239.89,-561.08C1244.94,-530.58 1255.43,-467.28 1261.46,-430.88"/>
428
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1264.17,-431.66 1262.72,-423.31 1258.65,-430.75 1264.17,-431.66"/>
429
- <text xml:space="preserve" text-anchor="middle" x="1263.15" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">backfill</text>
464
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M753.75,-560.87C700.61,-540.51 615.47,-509.02 582,-503 540,-495.45 238.32,-509 198,-495 161.41,-482.3 126.92,-453.99 104.2,-432.2"/>
465
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="106.32,-430.36 98.65,-426.76 102.4,-434.36 106.32,-430.36"/>
466
+ <text xml:space="preserve" text-anchor="middle" x="633.06" y="-504.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">backfill</text>
430
467
  </g>
431
468
  <!-- OJ&#45;&gt;W3 -->
432
- <g id="edge31" class="edge">
469
+ <g id="edge34" class="edge">
433
470
  <title>OJ&#45;&gt;W3</title>
434
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1297.08,-560.9C1311.06,-557.32 1325.97,-553.92 1340,-551.5 1413.08,-538.91 1954.83,-549.61 2005,-495 2041.83,-454.91 2032.63,-419.41 2005,-372.5 1981.27,-332.22 1958.23,-333.34 1913,-321.5 1877.29,-312.15 619.15,-324.78 584,-313.5 539,-299.06 495.99,-264.18 470.28,-240.31"/>
435
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="472.35,-238.41 464.62,-234.94 468.5,-242.48 472.35,-238.41"/>
436
- <text xml:space="preserve" text-anchor="middle" x="2051.42" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">p(success)</text>
471
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M882.27,-563.04C908.36,-558.69 937.3,-554.37 964,-551.5 1083.58,-538.63 1962.2,-582.24 2045,-495 2261.15,-267.25 1843.74,-412.77 1781,-342.5 1754.84,-313.19 1783.79,-268.56 1807.28,-240.89"/>
472
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1809.24,-242.9 1812.41,-235.04 1805.03,-239.21 1809.24,-242.9"/>
473
+ <text xml:space="preserve" text-anchor="middle" x="2128.7" y="-399.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">p(success)</text>
437
474
  </g>
438
475
  </g>
439
476
  </svg>