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,204 +4,245 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Cron Pages: 1 -->
7
- <svg width="1424pt" height="459pt"
8
- viewBox="0.00 0.00 1424.00 459.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 416.2)">
7
+ <svg width="1575pt" height="617pt"
8
+ viewBox="0.00 0.00 1575.00 617.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 574.2)">
10
10
  <title>PWN_Cron</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-416.2 1380.95,-416.2 1380.95,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="467.5" y="-351" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::Cron &#45; Scheduled Autonomous Jobs</text>
13
- <text xml:space="preserve" text-anchor="start" x="440.88" y="-339.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">prompt · ruby · script → jobs.yml → crontab → pwn&#45;ai &#160;· &#160;seeded self&#45;improvement (Curriculum)</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-574.2 1531.7,-574.2 1531.7,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="542.88" y="-509" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::Cron &#45; Scheduled Autonomous Jobs</text>
13
+ <text xml:space="preserve" text-anchor="start" x="516.25" y="-497.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">prompt · ruby · script → jobs.yml → crontab → pwn&#45;ai &#160;· &#160;seeded self&#45;improvement (Curriculum)</text>
14
14
  <g id="clust2" class="cluster">
15
15
  <title>cluster_kinds</title>
16
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M844,-99C844,-99 998.25,-99 998.25,-99 1004.25,-99 1010.25,-105 1010.25,-111 1010.25,-111 1010.25,-314 1010.25,-314 1010.25,-320 1004.25,-326 998.25,-326 998.25,-326 844,-326 844,-326 838,-326 832,-320 832,-314 832,-314 832,-111 832,-111 832,-105 838,-99 844,-99"/>
17
- <text xml:space="preserve" text-anchor="middle" x="921.12" y="-303" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Job Kinds</text>
16
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M844,-257C844,-257 998.25,-257 998.25,-257 1004.25,-257 1010.25,-263 1010.25,-269 1010.25,-269 1010.25,-472 1010.25,-472 1010.25,-478 1004.25,-484 998.25,-484 998.25,-484 844,-484 844,-484 838,-484 832,-478 832,-472 832,-472 832,-269 832,-269 832,-263 838,-257 844,-257"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="921.12" y="-461" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Job Kinds</text>
18
18
  </g>
19
19
  <g id="clust4" class="cluster">
20
20
  <title>cluster_seed</title>
21
- <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M1101.25,-8C1101.25,-8 1325.75,-8 1325.75,-8 1331.75,-8 1337.75,-14 1337.75,-20 1337.75,-20 1337.75,-177 1337.75,-177 1337.75,-183 1331.75,-189 1325.75,-189 1325.75,-189 1101.25,-189 1101.25,-189 1095.25,-189 1089.25,-183 1089.25,-177 1089.25,-177 1089.25,-20 1089.25,-20 1089.25,-14 1095.25,-8 1101.25,-8"/>
22
- <text xml:space="preserve" text-anchor="middle" x="1213.5" y="-166" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Seeded Self&#45;Improvement</text>
21
+ <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M1101.25,-8C1101.25,-8 1476.5,-8 1476.5,-8 1482.5,-8 1488.5,-14 1488.5,-20 1488.5,-20 1488.5,-359 1488.5,-359 1488.5,-365 1482.5,-371 1476.5,-371 1476.5,-371 1101.25,-371 1101.25,-371 1095.25,-371 1089.25,-365 1089.25,-359 1089.25,-359 1089.25,-20 1089.25,-20 1089.25,-14 1095.25,-8 1101.25,-8"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="1288.88" y="-348" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Seeded Self&#45;Improvement (install_defaults)</text>
23
23
  </g>
24
24
  <!-- Create -->
25
25
  <g id="node1" class="node">
26
26
  <title>Create</title>
27
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M118,-255.25C118,-255.25 27.75,-255.25 27.75,-255.25 21.75,-255.25 15.75,-249.25 15.75,-243.25 15.75,-243.25 15.75,-218.75 15.75,-218.75 15.75,-212.75 21.75,-206.75 27.75,-206.75 27.75,-206.75 118,-206.75 118,-206.75 124,-206.75 130,-212.75 130,-218.75 130,-218.75 130,-243.25 130,-243.25 130,-249.25 124,-255.25 118,-255.25"/>
28
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-240.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">cron_create</text>
29
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-227.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">name · schedule</text>
30
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-213.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">prompt | ruby | script</text>
27
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M118,-413.25C118,-413.25 27.75,-413.25 27.75,-413.25 21.75,-413.25 15.75,-407.25 15.75,-401.25 15.75,-401.25 15.75,-376.75 15.75,-376.75 15.75,-370.75 21.75,-364.75 27.75,-364.75 27.75,-364.75 118,-364.75 118,-364.75 124,-364.75 130,-370.75 130,-376.75 130,-376.75 130,-401.25 130,-401.25 130,-407.25 124,-413.25 118,-413.25"/>
28
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-398.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">cron_create</text>
29
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-385.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">name · schedule</text>
30
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-371.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">prompt | ruby | script</text>
31
31
  </g>
32
32
  <!-- Jobs -->
33
33
  <g id="node3" class="node">
34
34
  <title>Jobs</title>
35
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M424.12,-163.73C424.12,-165.53 398.35,-167 366.62,-167 334.9,-167 309.12,-165.53 309.12,-163.73 309.12,-163.73 309.12,-134.27 309.12,-134.27 309.12,-132.47 334.9,-131 366.62,-131 398.35,-131 424.12,-132.47 424.12,-134.27 424.12,-134.27 424.12,-163.73 424.12,-163.73"/>
36
- <path fill="none" stroke="#334155" stroke-width="1.4" d="M424.12,-163.73C424.12,-161.92 398.35,-160.45 366.62,-160.45 334.9,-160.45 309.12,-161.92 309.12,-163.73"/>
37
- <text xml:space="preserve" text-anchor="middle" x="366.62" y="-145.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/cron/jobs.yml</text>
35
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M424.12,-321.73C424.12,-323.53 398.35,-325 366.62,-325 334.9,-325 309.12,-323.53 309.12,-321.73 309.12,-321.73 309.12,-292.27 309.12,-292.27 309.12,-290.47 334.9,-289 366.62,-289 398.35,-289 424.12,-290.47 424.12,-292.27 424.12,-292.27 424.12,-321.73 424.12,-321.73"/>
36
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M424.12,-321.73C424.12,-319.92 398.35,-318.45 366.62,-318.45 334.9,-318.45 309.12,-319.92 309.12,-321.73"/>
37
+ <text xml:space="preserve" text-anchor="middle" x="366.62" y="-303.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/cron/jobs.yml</text>
38
38
  </g>
39
39
  <!-- Create&#45;&gt;Jobs -->
40
40
  <g id="edge1" class="edge">
41
41
  <title>Create&#45;&gt;Jobs</title>
42
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M130.47,-215.09C178.83,-201.5 248.46,-181.93 299.4,-167.61"/>
43
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="299.85,-170.4 306.79,-165.54 298.33,-165 299.85,-170.4"/>
44
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-199.29" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">write</text>
42
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M130.47,-373.09C178.83,-359.5 248.46,-339.93 299.4,-325.61"/>
43
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="299.85,-328.4 306.79,-323.54 298.33,-323 299.85,-328.4"/>
44
+ <text xml:space="preserve" text-anchor="middle" x="226.88" y="-357.29" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">write</text>
45
45
  </g>
46
46
  <!-- Crontab -->
47
47
  <g id="node4" class="node">
48
48
  <title>Crontab</title>
49
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M413.25,-262C413.25,-262 320,-262 320,-262 314,-262 308,-256 308,-250 308,-250 308,-238 308,-238 308,-232 314,-226 320,-226 320,-226 413.25,-226 413.25,-226 419.25,-226 425.25,-232 425.25,-238 425.25,-238 425.25,-250 425.25,-250 425.25,-256 419.25,-262 413.25,-262"/>
50
- <text xml:space="preserve" text-anchor="middle" x="366.62" y="-247.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">system crontab</text>
51
- <text xml:space="preserve" text-anchor="middle" x="366.62" y="-233.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(install_crontab: true)</text>
49
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M413.25,-420C413.25,-420 320,-420 320,-420 314,-420 308,-414 308,-408 308,-408 308,-396 308,-396 308,-390 314,-384 320,-384 320,-384 413.25,-384 413.25,-384 419.25,-384 425.25,-390 425.25,-396 425.25,-396 425.25,-408 425.25,-408 425.25,-414 419.25,-420 413.25,-420"/>
50
+ <text xml:space="preserve" text-anchor="middle" x="366.62" y="-405.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">system crontab</text>
51
+ <text xml:space="preserve" text-anchor="middle" x="366.62" y="-391.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(install_crontab: true)</text>
52
52
  </g>
53
53
  <!-- Create&#45;&gt;Crontab -->
54
54
  <g id="edge3" class="edge">
55
55
  <title>Create&#45;&gt;Crontab</title>
56
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M130.47,-233.52C178.24,-235.65 246.77,-238.7 297.53,-240.97"/>
57
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="297.35,-243.76 305.47,-241.32 297.6,-238.17 297.35,-243.76"/>
58
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-241" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">append</text>
56
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M130.47,-391.52C178.24,-393.65 246.77,-396.7 297.53,-398.97"/>
57
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="297.35,-401.76 305.47,-399.32 297.6,-396.17 297.35,-401.76"/>
58
+ <text xml:space="preserve" text-anchor="middle" x="226.88" y="-399" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">append</text>
59
59
  </g>
60
60
  <!-- Seed -->
61
61
  <g id="node2" class="node">
62
62
  <title>Seed</title>
63
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M133.75,-158C133.75,-158 12,-158 12,-158 6,-158 0,-152 0,-146 0,-146 0,-134 0,-134 0,-128 6,-122 12,-122 12,-122 133.75,-122 133.75,-122 139.75,-122 145.75,-128 145.75,-134 145.75,-134 145.75,-146 145.75,-146 145.75,-152 139.75,-158 133.75,-158"/>
64
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-143.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PWN::Cron.install_defaults</text>
65
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-129.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(pwn setup &#45;&#45;migrate)</text>
63
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.4" d="M133.75,-316C133.75,-316 12,-316 12,-316 6,-316 0,-310 0,-304 0,-304 0,-292 0,-292 0,-286 6,-280 12,-280 12,-280 133.75,-280 133.75,-280 139.75,-280 145.75,-286 145.75,-292 145.75,-292 145.75,-304 145.75,-304 145.75,-310 139.75,-316 133.75,-316"/>
64
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-301.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PWN::Cron.install_defaults</text>
65
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-287.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(pwn setup &#45;&#45;migrate)</text>
66
66
  </g>
67
67
  <!-- Seed&#45;&gt;Jobs -->
68
68
  <g id="edge2" class="edge">
69
69
  <title>Seed&#45;&gt;Jobs</title>
70
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M146.33,-138.19C181.04,-137.74 223.19,-137.79 261,-139.5 273.22,-140.05 286.22,-140.97 298.75,-142.02"/>
71
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="298.5,-144.81 306.71,-142.71 298.99,-139.23 298.5,-144.81"/>
72
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-141.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">idempotent seed</text>
70
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M146.33,-296.19C181.04,-295.74 223.19,-295.79 261,-297.5 273.22,-298.05 286.22,-298.97 298.75,-300.02"/>
71
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="298.5,-302.81 306.71,-300.71 298.99,-297.23 298.5,-302.81"/>
72
+ <text xml:space="preserve" text-anchor="middle" x="226.88" y="-299.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">idempotent seed</text>
73
73
  </g>
74
74
  <!-- Runner -->
75
75
  <g id="node5" class="node">
76
76
  <title>Runner</title>
77
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M679.25,-215C679.25,-215 596.5,-215 596.5,-215 590.5,-215 584.5,-209 584.5,-203 584.5,-203 584.5,-191 584.5,-191 584.5,-185 590.5,-179 596.5,-179 596.5,-179 679.25,-179 679.25,-179 685.25,-179 691.25,-185 691.25,-191 691.25,-191 691.25,-203 691.25,-203 691.25,-209 685.25,-215 679.25,-215"/>
78
- <text xml:space="preserve" text-anchor="middle" x="637.88" y="-193.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PWN::Cron.run(id)</text>
77
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M679.25,-373C679.25,-373 596.5,-373 596.5,-373 590.5,-373 584.5,-367 584.5,-361 584.5,-361 584.5,-349 584.5,-349 584.5,-343 590.5,-337 596.5,-337 596.5,-337 679.25,-337 679.25,-337 685.25,-337 691.25,-343 691.25,-349 691.25,-349 691.25,-361 691.25,-361 691.25,-367 685.25,-373 679.25,-373"/>
78
+ <text xml:space="preserve" text-anchor="middle" x="637.88" y="-351.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PWN::Cron.run(id)</text>
79
79
  </g>
80
80
  <!-- Jobs&#45;&gt;Runner -->
81
81
  <g id="edge5" class="edge">
82
82
  <title>Jobs&#45;&gt;Runner</title>
83
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M424.73,-159.18C468.59,-167 529.11,-177.79 574.29,-185.84"/>
84
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="573.67,-188.58 582.03,-187.22 574.65,-183.06 573.67,-188.58"/>
85
- <text xml:space="preserve" text-anchor="middle" x="504.88" y="-180.66" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">load job</text>
83
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M424.73,-317.18C468.59,-325 529.11,-335.79 574.29,-343.84"/>
84
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="573.67,-346.58 582.03,-345.22 574.65,-341.06 573.67,-346.58"/>
85
+ <text xml:space="preserve" text-anchor="middle" x="504.88" y="-338.66" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">load job</text>
86
86
  </g>
87
87
  <!-- Crontab&#45;&gt;Runner -->
88
88
  <g id="edge4" class="edge">
89
89
  <title>Crontab&#45;&gt;Runner</title>
90
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M425.72,-233.86C469.13,-226.28 528.45,-215.93 573.17,-208.12"/>
91
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="573.53,-210.9 580.93,-206.77 572.57,-205.38 573.53,-210.9"/>
92
- <text xml:space="preserve" text-anchor="middle" x="504.88" y="-226.66" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">fire on schedule</text>
90
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M425.72,-391.86C469.13,-384.28 528.45,-373.93 573.17,-366.12"/>
91
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="573.53,-368.9 580.93,-364.77 572.57,-363.38 573.53,-368.9"/>
92
+ <text xml:space="preserve" text-anchor="middle" x="504.88" y="-384.66" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">fire on schedule</text>
93
93
  </g>
94
94
  <!-- Prompt -->
95
95
  <g id="node6" class="node">
96
96
  <title>Prompt</title>
97
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M962.88,-215C962.88,-215 879.38,-215 879.38,-215 873.38,-215 867.38,-209 867.38,-203 867.38,-203 867.38,-191 867.38,-191 867.38,-185 873.38,-179 879.38,-179 879.38,-179 962.88,-179 962.88,-179 968.88,-179 974.88,-185 974.88,-191 974.88,-191 974.88,-203 974.88,-203 974.88,-209 968.88,-215 962.88,-215"/>
98
- <text xml:space="preserve" text-anchor="middle" x="921.12" y="-200.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:prompt</text>
99
- <text xml:space="preserve" text-anchor="middle" x="921.12" y="-186.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ pwn&#45;ai one&#45;shot</text>
97
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M962.88,-373C962.88,-373 879.38,-373 879.38,-373 873.38,-373 867.38,-367 867.38,-361 867.38,-361 867.38,-349 867.38,-349 867.38,-343 873.38,-337 879.38,-337 879.38,-337 962.88,-337 962.88,-337 968.88,-337 974.88,-343 974.88,-349 974.88,-349 974.88,-361 974.88,-361 974.88,-367 968.88,-373 962.88,-373"/>
98
+ <text xml:space="preserve" text-anchor="middle" x="921.12" y="-358.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:prompt</text>
99
+ <text xml:space="preserve" text-anchor="middle" x="921.12" y="-344.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ pwn&#45;ai one&#45;shot</text>
100
100
  </g>
101
101
  <!-- Runner&#45;&gt;Prompt -->
102
102
  <g id="edge6" class="edge">
103
103
  <title>Runner&#45;&gt;Prompt</title>
104
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M691.78,-197C738.77,-197 807.52,-197 857.29,-197"/>
105
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="857.02,-199.8 865.02,-197 857.02,-194.2 857.02,-199.8"/>
104
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M691.78,-355C738.77,-355 807.52,-355 857.29,-355"/>
105
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="857.02,-357.8 865.02,-355 857.02,-352.2 857.02,-357.8"/>
106
106
  </g>
107
107
  <!-- Ruby -->
108
108
  <g id="node7" class="node">
109
109
  <title>Ruby</title>
110
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M990.25,-143C990.25,-143 852,-143 852,-143 846,-143 840,-137 840,-131 840,-131 840,-119 840,-119 840,-113 846,-107 852,-107 852,-107 990.25,-107 990.25,-107 996.25,-107 1002.25,-113 1002.25,-119 1002.25,-119 1002.25,-131 1002.25,-131 1002.25,-137 996.25,-143 990.25,-143"/>
111
- <text xml:space="preserve" text-anchor="middle" x="921.12" y="-128.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:ruby</text>
112
- <text xml:space="preserve" text-anchor="middle" x="921.12" y="-114.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ TOPLEVEL_BINDING.eval</text>
110
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M990.25,-301C990.25,-301 852,-301 852,-301 846,-301 840,-295 840,-289 840,-289 840,-277 840,-277 840,-271 846,-265 852,-265 852,-265 990.25,-265 990.25,-265 996.25,-265 1002.25,-271 1002.25,-277 1002.25,-277 1002.25,-289 1002.25,-289 1002.25,-295 996.25,-301 990.25,-301"/>
111
+ <text xml:space="preserve" text-anchor="middle" x="921.12" y="-286.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:ruby</text>
112
+ <text xml:space="preserve" text-anchor="middle" x="921.12" y="-272.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ TOPLEVEL_BINDING.eval</text>
113
113
  </g>
114
114
  <!-- Runner&#45;&gt;Ruby -->
115
115
  <g id="edge7" class="edge">
116
116
  <title>Runner&#45;&gt;Ruby</title>
117
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M691.78,-183.46C732.86,-172.94 790.59,-158.16 837.72,-146.1"/>
118
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="838.33,-148.83 845.39,-144.13 836.95,-143.4 838.33,-148.83"/>
117
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M691.78,-341.46C732.86,-330.94 790.59,-316.16 837.72,-304.1"/>
118
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="838.33,-306.83 845.39,-302.13 836.95,-301.4 838.33,-306.83"/>
119
119
  </g>
120
120
  <!-- Script -->
121
121
  <g id="node8" class="node">
122
122
  <title>Script</title>
123
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M964.38,-287C964.38,-287 877.88,-287 877.88,-287 871.88,-287 865.88,-281 865.88,-275 865.88,-275 865.88,-263 865.88,-263 865.88,-257 871.88,-251 877.88,-251 877.88,-251 964.38,-251 964.38,-251 970.38,-251 976.38,-257 976.38,-263 976.38,-263 976.38,-275 976.38,-275 976.38,-281 970.38,-287 964.38,-287"/>
124
- <text xml:space="preserve" text-anchor="middle" x="921.12" y="-272.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:script</text>
125
- <text xml:space="preserve" text-anchor="middle" x="921.12" y="-258.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ exec external file</text>
123
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M964.38,-445C964.38,-445 877.88,-445 877.88,-445 871.88,-445 865.88,-439 865.88,-433 865.88,-433 865.88,-421 865.88,-421 865.88,-415 871.88,-409 877.88,-409 877.88,-409 964.38,-409 964.38,-409 970.38,-409 976.38,-415 976.38,-421 976.38,-421 976.38,-433 976.38,-433 976.38,-439 970.38,-445 964.38,-445"/>
124
+ <text xml:space="preserve" text-anchor="middle" x="921.12" y="-430.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:script</text>
125
+ <text xml:space="preserve" text-anchor="middle" x="921.12" y="-416.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ exec external file</text>
126
126
  </g>
127
127
  <!-- Runner&#45;&gt;Script -->
128
128
  <g id="edge8" class="edge">
129
129
  <title>Runner&#45;&gt;Script</title>
130
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M691.9,-212.33C706.85,-216.55 723.16,-221.05 738.25,-225 777.17,-235.19 821.01,-245.82 855.89,-254.08"/>
131
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="855.13,-256.77 863.56,-255.89 856.42,-251.32 855.13,-256.77"/>
130
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M691.9,-370.33C706.85,-374.55 723.16,-379.05 738.25,-383 777.17,-393.19 821.01,-403.82 855.89,-412.08"/>
131
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="855.13,-414.77 863.56,-413.89 856.42,-409.32 855.13,-414.77"/>
132
132
  </g>
133
133
  <!-- Log -->
134
- <g id="node11" class="node">
134
+ <g id="node13" class="node">
135
135
  <title>Log</title>
136
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1279.12,-264.69C1279.12,-267.1 1249.49,-269.06 1213,-269.06 1176.51,-269.06 1146.88,-267.1 1146.88,-264.69 1146.88,-264.69 1146.88,-225.31 1146.88,-225.31 1146.88,-222.9 1176.51,-220.94 1213,-220.94 1249.49,-220.94 1279.12,-222.9 1279.12,-225.31 1279.12,-225.31 1279.12,-264.69 1279.12,-264.69"/>
137
- <path fill="none" stroke="#334155" stroke-width="1.4" d="M1279.12,-264.69C1279.12,-262.27 1249.49,-260.31 1213,-260.31 1176.51,-260.31 1146.88,-262.27 1146.88,-264.69"/>
138
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-248.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/cron/log/&lt;id&gt;.log</text>
139
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-234.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">last_run · last_status</text>
136
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1354.5,-446.69C1354.5,-449.1 1324.86,-451.06 1288.38,-451.06 1251.89,-451.06 1222.25,-449.1 1222.25,-446.69 1222.25,-446.69 1222.25,-407.31 1222.25,-407.31 1222.25,-404.9 1251.89,-402.94 1288.38,-402.94 1324.86,-402.94 1354.5,-404.9 1354.5,-407.31 1354.5,-407.31 1354.5,-446.69 1354.5,-446.69"/>
137
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M1354.5,-446.69C1354.5,-444.27 1324.86,-442.31 1288.38,-442.31 1251.89,-442.31 1222.25,-444.27 1222.25,-446.69"/>
138
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-430.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/cron/log/&lt;id&gt;.log</text>
139
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-416.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">last_run · last_status</text>
140
140
  </g>
141
141
  <!-- Prompt&#45;&gt;Log -->
142
- <g id="edge11" class="edge">
142
+ <g id="edge13" class="edge">
143
143
  <title>Prompt&#45;&gt;Log</title>
144
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M975.29,-205.8C1020.51,-213.29 1085.98,-224.13 1136.61,-232.52"/>
145
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1135.91,-235.24 1144.26,-233.78 1136.83,-229.71 1135.91,-235.24"/>
144
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M975.24,-365.47C1037.59,-377.76 1141.46,-398.24 1212.1,-412.16"/>
145
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1211.52,-414.9 1219.91,-413.7 1212.6,-409.41 1211.52,-414.9"/>
146
146
  </g>
147
147
  <!-- Practice -->
148
148
  <g id="node9" class="node">
149
149
  <title>Practice</title>
150
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1273.88,-64.25C1273.88,-64.25 1152.12,-64.25 1152.12,-64.25 1146.12,-64.25 1140.12,-58.25 1140.12,-52.25 1140.12,-52.25 1140.12,-27.75 1140.12,-27.75 1140.12,-21.75 1146.12,-15.75 1152.12,-15.75 1152.12,-15.75 1273.88,-15.75 1273.88,-15.75 1279.88,-15.75 1285.88,-21.75 1285.88,-27.75 1285.88,-27.75 1285.88,-52.25 1285.88,-52.25 1285.88,-58.25 1279.88,-64.25 1273.88,-64.25"/>
151
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-49.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_practice_nightly</text>
152
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-36.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 3 * * *</text>
153
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-22.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.practice(limit:3)</text>
150
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1349.25,-331.25C1349.25,-331.25 1227.5,-331.25 1227.5,-331.25 1221.5,-331.25 1215.5,-325.25 1215.5,-319.25 1215.5,-319.25 1215.5,-294.75 1215.5,-294.75 1215.5,-288.75 1221.5,-282.75 1227.5,-282.75 1227.5,-282.75 1349.25,-282.75 1349.25,-282.75 1355.25,-282.75 1361.25,-288.75 1361.25,-294.75 1361.25,-294.75 1361.25,-319.25 1361.25,-319.25 1361.25,-325.25 1355.25,-331.25 1349.25,-331.25"/>
151
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-316.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_practice_nightly</text>
152
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-303.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 3 * * *</text>
153
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-289.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.practice(limit:3)</text>
154
154
  </g>
155
155
  <!-- Ruby&#45;&gt;Practice -->
156
156
  <g id="edge9" class="edge">
157
157
  <title>Ruby&#45;&gt;Practice</title>
158
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M985.74,-106.35C1028.23,-93.89 1084.5,-77.39 1130.3,-63.96"/>
159
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1130.83,-66.72 1137.72,-61.78 1129.25,-61.35 1130.83,-66.72"/>
158
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1002.73,-288.3C1062.83,-292.25 1144.63,-297.62 1205.12,-301.6"/>
159
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1204.89,-304.39 1213.06,-302.12 1205.26,-298.8 1204.89,-304.39"/>
160
160
  </g>
161
- <!-- Train -->
161
+ <!-- Offline -->
162
162
  <g id="node10" class="node">
163
+ <title>Offline</title>
164
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1342.5,-246.25C1342.5,-246.25 1234.25,-246.25 1234.25,-246.25 1228.25,-246.25 1222.25,-240.25 1222.25,-234.25 1222.25,-234.25 1222.25,-209.75 1222.25,-209.75 1222.25,-203.75 1228.25,-197.75 1234.25,-197.75 1234.25,-197.75 1342.5,-197.75 1342.5,-197.75 1348.5,-197.75 1354.5,-203.75 1354.5,-209.75 1354.5,-209.75 1354.5,-234.25 1354.5,-234.25 1354.5,-240.25 1348.5,-246.25 1342.5,-246.25"/>
165
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-231.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_offline_judge</text>
166
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-218.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">30 3 * * *</text>
167
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-204.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.offline_judge</text>
168
+ </g>
169
+ <!-- Ruby&#45;&gt;Offline -->
170
+ <g id="edge10" class="edge">
171
+ <title>Ruby&#45;&gt;Offline</title>
172
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1002.73,-269.54C1065.15,-259.11 1150.97,-244.78 1212.02,-234.58"/>
173
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1212.23,-237.39 1219.66,-233.31 1211.31,-231.86 1212.23,-237.39"/>
174
+ </g>
175
+ <!-- Train -->
176
+ <g id="node11" class="node">
163
177
  <title>Train</title>
164
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1272.75,-149.25C1272.75,-149.25 1153.25,-149.25 1153.25,-149.25 1147.25,-149.25 1141.25,-143.25 1141.25,-137.25 1141.25,-137.25 1141.25,-112.75 1141.25,-112.75 1141.25,-106.75 1147.25,-100.75 1153.25,-100.75 1153.25,-100.75 1272.75,-100.75 1272.75,-100.75 1278.75,-100.75 1284.75,-106.75 1284.75,-112.75 1284.75,-112.75 1284.75,-137.25 1284.75,-137.25 1284.75,-143.25 1278.75,-149.25 1272.75,-149.25"/>
165
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-134.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_train_weekly</text>
166
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-121.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 4 * * 0</text>
167
- <text xml:space="preserve" text-anchor="middle" x="1213" y="-107.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.train_and_gate</text>
178
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1348.12,-162C1348.12,-162 1228.62,-162 1228.62,-162 1222.62,-162 1216.62,-156 1216.62,-150 1216.62,-150 1216.62,-112 1216.62,-112 1216.62,-106 1222.62,-100 1228.62,-100 1228.62,-100 1348.12,-100 1348.12,-100 1354.12,-100 1360.12,-106 1360.12,-112 1360.12,-112 1360.12,-150 1360.12,-150 1360.12,-156 1354.12,-162 1348.12,-162"/>
179
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-147.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_train_weekly</text>
180
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-134.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 4 * * 0</text>
181
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-120.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.train_and_gate</text>
182
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-107.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(dry_run / export_ready)</text>
168
183
  </g>
169
184
  <!-- Ruby&#45;&gt;Train -->
170
- <g id="edge10" class="edge">
185
+ <g id="edge11" class="edge">
171
186
  <title>Ruby&#45;&gt;Train</title>
172
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1002.87,-125C1042.8,-125 1090.87,-125 1130.86,-125"/>
173
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1130.6,-127.8 1138.6,-125 1130.6,-122.2 1130.6,-127.8"/>
187
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M946.84,-264.34C978.33,-241.38 1035.2,-202.69 1089.25,-180 1126.44,-164.39 1169.73,-152.97 1206.34,-145.11"/>
188
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1206.8,-147.87 1214.06,-143.49 1205.65,-142.39 1206.8,-147.87"/>
189
+ </g>
190
+ <!-- MemGC -->
191
+ <g id="node12" class="node">
192
+ <title>MemGC</title>
193
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1351.88,-64.25C1351.88,-64.25 1224.88,-64.25 1224.88,-64.25 1218.88,-64.25 1212.88,-58.25 1212.88,-52.25 1212.88,-52.25 1212.88,-27.75 1212.88,-27.75 1212.88,-21.75 1218.88,-15.75 1224.88,-15.75 1224.88,-15.75 1351.88,-15.75 1351.88,-15.75 1357.88,-15.75 1363.88,-21.75 1363.88,-27.75 1363.88,-27.75 1363.88,-52.25 1363.88,-52.25 1363.88,-58.25 1357.88,-64.25 1351.88,-64.25"/>
194
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-49.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">learning_consolidate_nightly</text>
195
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-36.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 5 * * *</text>
196
+ <text xml:space="preserve" text-anchor="middle" x="1288.38" y="-22.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Learning.consolidate</text>
197
+ </g>
198
+ <!-- Ruby&#45;&gt;MemGC -->
199
+ <g id="edge12" class="edge">
200
+ <title>Ruby&#45;&gt;MemGC</title>
201
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M931.79,-264.48C953.83,-224.24 1011.93,-128.67 1089.25,-82 1123.24,-61.49 1165.79,-50.9 1202.73,-45.47"/>
202
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1203,-48.26 1210.54,-44.4 1202.24,-42.71 1203,-48.26"/>
174
203
  </g>
175
204
  <!-- Ruby&#45;&gt;Log -->
176
- <g id="edge12" class="edge">
205
+ <g id="edge14" class="edge">
177
206
  <title>Ruby&#45;&gt;Log</title>
178
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M968.96,-143.62C982.35,-149.09 996.93,-155.16 1010.25,-161 1045.76,-176.56 1053.57,-182.84 1089.25,-198 1105.64,-204.97 1123.45,-212.05 1140.28,-218.54"/>
179
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1139.21,-221.13 1147.68,-221.37 1141.21,-215.9 1139.21,-221.13"/>
207
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M974.49,-301.68C986.54,-306.71 999.08,-312.56 1010.25,-319 1048.69,-341.14 1049.21,-360.9 1089.25,-380 1127.78,-398.39 1174.05,-409.88 1212.18,-416.9"/>
208
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1211.39,-419.6 1219.75,-418.25 1212.36,-414.09 1211.39,-419.6"/>
180
209
  </g>
181
210
  <!-- Script&#45;&gt;Log -->
182
- <g id="edge13" class="edge">
211
+ <g id="edge15" class="edge">
183
212
  <title>Script&#45;&gt;Log</title>
184
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M976.99,-264.46C1022.08,-260.72 1086.43,-255.4 1136.4,-251.26"/>
185
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1136.49,-254.06 1144.23,-250.61 1136.02,-248.48 1136.49,-254.06"/>
213
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M976.81,-427C1039.34,-427 1142.09,-427 1212.14,-427"/>
214
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1211.84,-429.8 1219.84,-427 1211.84,-424.2 1211.84,-429.8"/>
186
215
  </g>
187
216
  <!-- Practice&#45;&gt;Log -->
188
- <g id="edge15" class="edge">
217
+ <g id="edge17" class="edge">
189
218
  <title>Practice&#45;&gt;Log</title>
190
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1139.52,-47.69C1105.87,-55.41 1069.23,-70.72 1049.75,-101 1030.76,-130.53 1030.76,-150.47 1049.75,-180 1068.83,-209.66 1103.96,-225.78 1136.76,-234.55"/>
191
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1136.04,-237.26 1144.47,-236.47 1137.38,-231.82 1136.04,-237.26"/>
219
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1288.38,-331.84C1288.38,-352.07 1288.38,-372.31 1288.38,-392.54"/>
220
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1285.58,-392.5 1288.38,-400.5 1291.18,-392.5 1285.58,-392.5"/>
221
+ </g>
222
+ <!-- Offline&#45;&gt;Log -->
223
+ <g id="edge18" class="edge">
224
+ <title>Offline&#45;&gt;Log</title>
225
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1221.6,-216.96C1164.23,-216.83 1085.32,-227.71 1049.75,-283 1030.76,-312.53 1030.76,-332.47 1049.75,-362 1083.44,-414.38 1155.55,-428.27 1211.74,-430.47"/>
226
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1211.63,-433.27 1219.71,-430.69 1211.79,-427.67 1211.63,-433.27"/>
192
227
  </g>
193
228
  <!-- Train&#45;&gt;Log -->
194
- <g id="edge16" class="edge">
229
+ <g id="edge19" class="edge">
195
230
  <title>Train&#45;&gt;Log</title>
196
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1213,-149.84C1213,-170.07 1213,-190.31 1213,-210.54"/>
197
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1210.2,-210.5 1213,-218.5 1215.8,-210.5 1210.2,-210.5"/>
231
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1216.05,-128.08C1159.33,-130.27 1084.38,-144.17 1049.75,-198 1010.32,-259.3 1010.32,-300.7 1049.75,-362 1083.44,-414.38 1155.55,-428.27 1211.74,-430.47"/>
232
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1211.63,-433.27 1219.71,-430.69 1211.79,-427.67 1211.63,-433.27"/>
233
+ </g>
234
+ <!-- MemGC&#45;&gt;Log -->
235
+ <g id="edge20" class="edge">
236
+ <title>MemGC&#45;&gt;Log</title>
237
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1212.46,-34.66C1156.11,-35.45 1083.43,-47.64 1049.75,-100 1018.25,-148.97 1018.25,-313.03 1049.75,-362 1083.44,-414.38 1155.55,-428.27 1211.74,-430.47"/>
238
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1211.63,-433.27 1219.71,-430.69 1211.79,-427.67 1211.63,-433.27"/>
198
239
  </g>
199
240
  <!-- Log&#45;&gt;Jobs -->
200
- <g id="edge14" class="edge">
241
+ <g id="edge16" class="edge">
201
242
  <title>Log&#45;&gt;Jobs</title>
202
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1146.27,-227.66C1126.7,-220.51 1106.02,-210.82 1089.25,-198 1041.99,-161.89 1063.28,-116.91 1010.25,-90 820.78,6.15 748.48,-135.93 537.5,-161 503.58,-165.03 465.67,-162.98 434.28,-159.51"/>
203
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="434.99,-156.78 426.72,-158.63 434.34,-162.34 434.99,-156.78"/>
204
- <text xml:space="preserve" text-anchor="middle" x="765.62" y="-99.43" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">update status</text>
243
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1221.77,-424.28C1180.35,-419.64 1127.61,-408.1 1089.25,-380 1034.09,-339.6 1069.73,-281.72 1010.25,-248 825.42,-143.21 748.48,-293.93 537.5,-319 503.58,-323.03 465.67,-320.98 434.28,-317.51"/>
244
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="434.99,-314.78 426.72,-316.63 434.34,-320.34 434.99,-314.78"/>
245
+ <text xml:space="preserve" text-anchor="middle" x="765.62" y="-256.44" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">update status</text>
205
246
  </g>
206
247
  </g>
207
248
  </svg>
@@ -28,12 +28,14 @@ digraph "PWN_Cron" {
28
28
  {rank=same; Prompt; Ruby; Script}
29
29
 
30
30
  subgraph cluster_seed {
31
- label="Seeded Self-Improvement"; fontcolor="#ddd6fe"; style=rounded;
31
+ label="Seeded Self-Improvement (install_defaults)"; fontcolor="#ddd6fe"; style=rounded;
32
32
  color="#6d28d9"; bgcolor="#2e1065"; penwidth=2;
33
33
  Practice [label="curriculum_practice_nightly\n0 3 * * *\nCurriculum.practice(limit:3)", fillcolor="#c4b5fd"];
34
- Train [label="curriculum_train_weekly\n0 4 * * 0\nCurriculum.train_and_gate", fillcolor="#c4b5fd"];
34
+ Offline [label="curriculum_offline_judge\n30 3 * * *\nCurriculum.offline_judge", fillcolor="#c4b5fd"];
35
+ Train [label="curriculum_train_weekly\n0 4 * * 0\nCurriculum.train_and_gate\n(dry_run / export_ready)", fillcolor="#c4b5fd"];
36
+ MemGC [label="learning_consolidate_nightly\n0 5 * * *\nLearning.consolidate", fillcolor="#c4b5fd"];
35
37
  }
36
- {rank=same; Practice; Train}
38
+ {rank=same; Practice; Offline; Train; MemGC}
37
39
 
38
40
  Log [label="~/.pwn/cron/log/<id>.log\nlast_run · last_status", shape=cylinder, fillcolor="#fcd34d"];
39
41
 
@@ -46,11 +48,15 @@ digraph "PWN_Cron" {
46
48
  Runner -> Ruby [color="#34d399"];
47
49
  Runner -> Script [color="#34d399"];
48
50
  Ruby -> Practice [color="#a78bfa"];
51
+ Ruby -> Offline [color="#a78bfa"];
49
52
  Ruby -> Train [color="#a78bfa"];
53
+ Ruby -> MemGC [color="#a78bfa"];
50
54
  Prompt -> Log [color="#f59e0b"];
51
55
  Ruby -> Log [color="#f59e0b"];
52
56
  Script -> Log [color="#f59e0b"];
53
57
  Log -> Jobs [label="update status", style=dashed, color="#fbbf24", constraint=false];
54
58
  Practice -> Log [style=dashed, color="#fbbf24", constraint=false];
59
+ Offline -> Log [style=dashed, color="#fbbf24", constraint=false];
55
60
  Train -> Log [style=dashed, color="#fbbf24", constraint=false];
61
+ MemGC -> Log [style=dashed, color="#fbbf24", constraint=false];
56
62
  }
@@ -37,8 +37,8 @@ Escalate [label="escalate\n≥N fails → Swarm hint", fillcolor="#c4b5fd
37
37
  Learning [label="Learning\nnote_outcome · reflect\nexemplars_for · export_finetune\nfact_check_local_final", fillcolor="#6ee7b7"];
38
38
  Mistakes [label="Mistakes\nrecord · resolve\nguard · correction_hint\n[REPEATING] · [REGRESSED]", fillcolor="#6ee7b7", penwidth=2];
39
39
  ReflectT [label="Reflect\nteacher-student\n(reflect_engine)", fillcolor="#6ee7b7", penwidth=2];
40
- Reward [label="Reward\njudge (ORM) · prm (PRM)\nsentinel · semantic_ok", fillcolor="#6ee7b7", penwidth=2];
41
- Curric [label="Curriculum\npractice · counterfactual\ncritic · hindsight · train_and_gate", fillcolor="#6ee7b7", penwidth=2];
40
+ Reward [label="Reward\njudge (ORM) · prm (PRM)\nsentinel ring · semantic_ok\nexport_dpo ≤40%/src", fillcolor="#6ee7b7", penwidth=2];
41
+ Curric [label="Curriculum\npractice · offline_judge\ncounterfactual · critic\nhindsight · train_and_gate", fillcolor="#6ee7b7", penwidth=2];
42
42
  }
43
43
  subgraph cluster_extro {
44
44
  label="EXTROSPECTION (world)"; fontcolor="#fde68a";
@@ -21,7 +21,7 @@ digraph "PWN_Reinforcement_Learning" {
21
21
  style=rounded; color="#6d28d9"; bgcolor="#2e1065"; penwidth=2;
22
22
  R1 [label="R1 judge (ORM)\nscore · verdict · rationale", fillcolor="#c4b5fd", penwidth=2];
23
23
  R2 [label="R2 prm (PRM)\nper-step +1/0/−1", fillcolor="#c4b5fd"];
24
- R3 [label="R3 sentinel\nproxy ≠ judge ≠ (1−corr)", fillcolor="#c4b5fd"];
24
+ R3 [label="R3 sentinel (ring N=40)\nproxy ≠ judge ≠ (1−corr)\n→ proxy_distrust haircut", fillcolor="#c4b5fd"];
25
25
  R4 [label="R4 semantic_ok\ngrep exit 1 ≠ failure", fillcolor="#c4b5fd"];
26
26
  E3 [label="E3 verify_as_reward\nextro_verify caps/floors judge", fillcolor="#c4b5fd"];
27
27
  }
@@ -43,7 +43,7 @@ digraph "PWN_Reinforcement_Learning" {
43
43
  subgraph cluster_weight {
44
44
  label="Tier 5 · Weight Loop"; fontcolor="#fecaca";
45
45
  style=rounded; color="#b91c1c"; bgcolor="#450a0a"; penwidth=2;
46
- W1 [label="W1 preference ledger\n(prompt, rejected, chosen)\n5 free sources", fillcolor="#fda4af"];
46
+ W1 [label="W1 preference ledger\n(prompt, rejected, chosen)\n5 free sources\nexport_dpo ≤40%/source", fillcolor="#fda4af"];
47
47
  W2 [label="W2 train_and_gate\nSFT+DPO → LoRA vN+1\nreplay Mistakes.top vN vs vN+1\npromote iff resolved(N+1) > (N)", fillcolor="#fda4af", penwidth=2];
48
48
  W3 [label="W3 calibrate\np(success) vs actual → Brier", fillcolor="#fda4af"];
49
49
  }
@@ -94,9 +94,15 @@ digraph "PWN_Reinforcement_Learning" {
94
94
  W3 -> Loop [label="calibration", style=dashed, color="#fbbf24", constraint=false];
95
95
 
96
96
  /* cron seeds */
97
- Cron [label="⏱ PWN::Cron.install_defaults\nnightly practice · weekly train", fillcolor="#7dd3fc"];
97
+ Cron [label="⏱ PWN::Cron.install_defaults\npractice · offline_judge\ntrain dry_run · consolidate", fillcolor="#7dd3fc"];
98
+ OJ [label="P3 offline_judge\nORM/PRM + W3 cal from PLAN", fillcolor="#6ee7b7"];
99
+ MemGC [label="M1/M3 Learning.consolidate\nnightly memory GC", fillcolor="#6ee7b7"];
98
100
  Cron -> S1 [label="0 3 * * *", color="#38bdf8", constraint=false];
101
+ Cron -> OJ [label="30 3 * * *", color="#38bdf8", constraint=false];
99
102
  Cron -> W2 [label="0 4 * * 0", color="#38bdf8", constraint=false];
103
+ Cron -> MemGC [label="0 5 * * *", color="#38bdf8", constraint=false];
104
+ OJ -> R1 [label="backfill", style=dashed, color="#a78bfa", constraint=false];
105
+ OJ -> W3 [label="p(success)", style=dashed, color="#fbbf24", constraint=false];
100
106
 
101
107
  Ollama -> Loop [label="promoted vN+1\n(next session)", style=dashed, color="#fb7185", constraint=false, penwidth=2];
102
108
  }