pwn 0.5.783 → 0.5.784

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -3
  3. data/Rakefile +19 -1
  4. data/bin/pwn_setup +1 -1
  5. data/build_gem.sh +1 -1
  6. data/documentation/Backup-Retention.md +27 -0
  7. data/documentation/Cron.md +64 -35
  8. data/documentation/How-PWN-Works.md +1 -1
  9. data/documentation/Installation.md +247 -6
  10. data/documentation/Persistence.md +1 -1
  11. data/documentation/Reinforcement-Learning.md +5 -6
  12. data/documentation/diagrams/cron-scheduling.svg +130 -128
  13. data/documentation/diagrams/dot/cron-scheduling.dot +3 -3
  14. data/etc/default_cron/session_cleanup.rb +1217 -10
  15. data/lib/pwn/ai/agent/extrospection.rb +6 -7
  16. data/lib/pwn/ai/agent/learning.rb +48 -7
  17. data/lib/pwn/ai/agent/policy.rb +5 -0
  18. data/lib/pwn/ai/agent/swarm.rb +31 -16
  19. data/lib/pwn/ai/router.rb +45 -2
  20. data/lib/pwn/cron.rb +120 -49
  21. data/lib/pwn/migrate.rb +292 -15
  22. data/lib/pwn/plugins/binary_parser.rb +5 -4
  23. data/lib/pwn/plugins/ghidra.rb +4 -3
  24. data/lib/pwn/plugins/log.rb +18 -2
  25. data/lib/pwn/plugins/repl/ai.rb +12 -1
  26. data/lib/pwn/plugins/repl/ai_console.rb +6 -2
  27. data/lib/pwn/plugins/repl/ai_swarm.rb +4 -4
  28. data/lib/pwn/sessions.rb +58 -16
  29. data/lib/pwn/setup.rb +9 -17
  30. data/lib/pwn/version.rb +1 -1
  31. data/scripts/build_gate.rb +58 -0
  32. data/spec/integration/build_gate_spec.rb +73 -0
  33. data/spec/integration/persistence_roundtrip_spec.rb +1 -7
  34. data/spec/lib/pwn/ai/agent/policy_spec.rb +27 -0
  35. data/spec/lib/pwn/ai/router_spec.rb +30 -2
  36. data/spec/lib/pwn/cron_spec.rb +113 -6
  37. data/spec/lib/pwn/migrate_spec.rb +160 -5
  38. data/spec/lib/pwn/plugins/log_spec.rb +7 -0
  39. data/spec/lib/pwn/plugins/repl/ai_console_spec.rb +16 -4
  40. data/spec/lib/pwn/plugins/repl/ai_swarm_spec.rb +11 -0
  41. data/spec/lib/pwn/redaction_spec.rb +13 -10
  42. data/spec/lib/pwn/session_cleanup_concurrency_spec.rb +201 -0
  43. data/spec/lib/pwn/session_cleanup_default_spec.rb +165 -2
  44. data/spec/lib/pwn/session_cleanup_legacy_spec.rb +101 -0
  45. data/spec/lib/pwn/session_cleanup_payload_spec.rb +335 -2
  46. data/spec/lib/pwn/session_cleanup_recovery_spec.rb +389 -0
  47. data/spec/lib/pwn/sessions_spec.rb +112 -0
  48. data/spec/lib/pwn/setup_spec.rb +3 -1
  49. data/spec/support/gate_failure_formatter.rb +14 -0
  50. data/third_party/pwn_rdoc.jsonl +15 -1
  51. metadata +14 -7
@@ -4,308 +4,310 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Cron Pages: 1 -->
7
- <svg width="1671pt" height="1049pt"
8
- viewBox="0.00 0.00 1671.00 1049.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 1006.14)">
7
+ <svg width="2020pt" height="1168pt"
8
+ viewBox="0.00 0.00 2020.00 1168.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 1124.5)">
10
10
  <title>PWN_Cron</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-1006.14 1627.7,-1006.14 1627.7,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="590.88" y="-940.94" 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="587.12" y="-929.49" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">prompt · ruby · script → jobs.yml → worker → pwn&#45;ai &#160;· &#160;hygiene on · curriculum opt&#45;in</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-1124.5 1977.2,-1124.5 1977.2,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="765.62" y="-1059.3" font-family="Helvetica,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="761.88" y="-1047.85" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#94a3b8">prompt · ruby · script → jobs.yml → worker → pwn&#45;ai &#160;· &#160;hygiene on · curriculum opt&#45;in</text>
14
14
  <g id="clust2" class="cluster">
15
15
  <title>cluster_kinds</title>
16
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M820.25,-378.93C820.25,-378.93 974.5,-378.93 974.5,-378.93 980.5,-378.93 986.5,-384.93 986.5,-390.93 986.5,-390.93 986.5,-593.93 986.5,-593.93 986.5,-599.93 980.5,-605.93 974.5,-605.93 974.5,-605.93 820.25,-605.93 820.25,-605.93 814.25,-605.93 808.25,-599.93 808.25,-593.93 808.25,-593.93 808.25,-390.93 808.25,-390.93 808.25,-384.93 814.25,-378.93 820.25,-378.93"/>
17
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-582.93" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Job Kinds</text>
16
+ <path fill="#022c22" stroke="#047857" stroke-width="2" d="M831.5,-464.36C831.5,-464.36 985.75,-464.36 985.75,-464.36 991.75,-464.36 997.75,-470.36 997.75,-476.36 997.75,-476.36 997.75,-679.36 997.75,-679.36 997.75,-685.36 991.75,-691.36 985.75,-691.36 985.75,-691.36 831.5,-691.36 831.5,-691.36 825.5,-691.36 819.5,-685.36 819.5,-679.36 819.5,-679.36 819.5,-476.36 819.5,-476.36 819.5,-470.36 825.5,-464.36 831.5,-464.36"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-668.36" font-family="Helvetica,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="M1085.5,-196.93C1085.5,-196.93 1345.25,-196.93 1345.25,-196.93 1351.25,-196.93 1357.25,-202.93 1357.25,-208.93 1357.25,-208.93 1357.25,-632.93 1357.25,-632.93 1357.25,-638.93 1351.25,-644.93 1345.25,-644.93 1345.25,-644.93 1085.5,-644.93 1085.5,-644.93 1079.5,-644.93 1073.5,-638.93 1073.5,-632.93 1073.5,-632.93 1073.5,-208.93 1073.5,-208.93 1073.5,-202.93 1079.5,-196.93 1085.5,-196.93"/>
22
- <text xml:space="preserve" text-anchor="middle" x="1215.38" y="-621.93" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Seeded Jobs (install_defaults)</text>
21
+ <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M1096.75,-282.36C1096.75,-282.36 1694.75,-282.36 1694.75,-282.36 1700.75,-282.36 1706.75,-288.36 1706.75,-294.36 1706.75,-294.36 1706.75,-718.36 1706.75,-718.36 1706.75,-724.36 1700.75,-730.36 1694.75,-730.36 1694.75,-730.36 1096.75,-730.36 1096.75,-730.36 1090.75,-730.36 1084.75,-724.36 1084.75,-718.36 1084.75,-718.36 1084.75,-294.36 1084.75,-294.36 1084.75,-288.36 1090.75,-282.36 1096.75,-282.36"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="1395.75" y="-707.36" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#ddd6fe">Optional curriculum templates / preserved legacy jobs (NOT seeded)</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,-562.18C118,-562.18 27.75,-562.18 27.75,-562.18 21.75,-562.18 15.75,-556.18 15.75,-550.18 15.75,-550.18 15.75,-525.68 15.75,-525.68 15.75,-519.68 21.75,-513.68 27.75,-513.68 27.75,-513.68 118,-513.68 118,-513.68 124,-513.68 130,-519.68 130,-525.68 130,-525.68 130,-550.18 130,-550.18 130,-556.18 124,-562.18 118,-562.18"/>
28
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-547.73" 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="-534.23" 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="-520.73" 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,-647.61C118,-647.61 27.75,-647.61 27.75,-647.61 21.75,-647.61 15.75,-641.61 15.75,-635.61 15.75,-635.61 15.75,-611.11 15.75,-611.11 15.75,-605.11 21.75,-599.11 27.75,-599.11 27.75,-599.11 118,-599.11 118,-599.11 124,-599.11 130,-605.11 130,-611.11 130,-611.11 130,-635.61 130,-635.61 130,-641.61 124,-647.61 118,-647.61"/>
28
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-633.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">cron_create</text>
29
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-619.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">name · schedule</text>
30
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-606.16" font-family="Helvetica,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="M439.12,-514.66C439.12,-516.46 413.35,-517.93 381.62,-517.93 349.9,-517.93 324.12,-516.46 324.12,-514.66 324.12,-514.66 324.12,-485.2 324.12,-485.2 324.12,-483.4 349.9,-481.93 381.62,-481.93 413.35,-481.93 439.12,-483.4 439.12,-485.2 439.12,-485.2 439.12,-514.66 439.12,-514.66"/>
36
- <path fill="none" stroke="#334155" stroke-width="1.4" d="M439.12,-514.66C439.12,-512.85 413.35,-511.39 381.62,-511.39 349.9,-511.39 324.12,-512.85 324.12,-514.66"/>
37
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-496.23" 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="M444.75,-600.08C444.75,-601.89 418.98,-603.36 387.25,-603.36 355.52,-603.36 329.75,-601.89 329.75,-600.08 329.75,-600.08 329.75,-570.63 329.75,-570.63 329.75,-568.82 355.52,-567.36 387.25,-567.36 418.98,-567.36 444.75,-568.82 444.75,-570.63 444.75,-570.63 444.75,-600.08 444.75,-600.08"/>
36
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M444.75,-600.08C444.75,-598.28 418.98,-596.81 387.25,-596.81 355.52,-596.81 329.75,-598.28 329.75,-600.08"/>
37
+ <text xml:space="preserve" text-anchor="middle" x="387.25" y="-581.66" font-family="Helvetica,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="edge3" class="edge">
41
41
  <title>Create&#45;&gt;Jobs</title>
42
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M130.5,-530.92C182.35,-524.49 259.13,-514.98 313.93,-508.19"/>
43
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="314.01,-511.01 321.6,-507.24 313.32,-505.45 314.01,-511.01"/>
44
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-524.28" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">write</text>
42
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M130.44,-616.47C183.6,-610.01 263.18,-600.33 319.44,-593.48"/>
43
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="319.75,-596.27 327.36,-592.52 319.08,-590.71 319.75,-596.27"/>
44
+ <text xml:space="preserve" text-anchor="middle" x="226.88" y="-610.83" font-family="Helvetica,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="M428.25,-589.93C428.25,-589.93 335,-589.93 335,-589.93 329,-589.93 323,-583.93 323,-577.93 323,-577.93 323,-565.93 323,-565.93 323,-559.93 329,-553.93 335,-553.93 335,-553.93 428.25,-553.93 428.25,-553.93 434.25,-553.93 440.25,-559.93 440.25,-565.93 440.25,-565.93 440.25,-577.93 440.25,-577.93 440.25,-583.93 434.25,-589.93 428.25,-589.93"/>
50
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-574.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">per&#45;job crontab</text>
51
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-561.48" 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="M433.88,-675.36C433.88,-675.36 340.62,-675.36 340.62,-675.36 334.62,-675.36 328.62,-669.36 328.62,-663.36 328.62,-663.36 328.62,-651.36 328.62,-651.36 328.62,-645.36 334.62,-639.36 340.62,-639.36 340.62,-639.36 433.88,-639.36 433.88,-639.36 439.88,-639.36 445.88,-645.36 445.88,-651.36 445.88,-651.36 445.88,-663.36 445.88,-663.36 445.88,-669.36 439.88,-675.36 433.88,-675.36"/>
50
+ <text xml:space="preserve" text-anchor="middle" x="387.25" y="-660.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">per&#45;job crontab</text>
51
+ <text xml:space="preserve" text-anchor="middle" x="387.25" y="-646.91" font-family="Helvetica,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="edge5" class="edge">
55
55
  <title>Create&#45;&gt;Crontab</title>
56
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M130.5,-544.21C182.02,-549.92 258.16,-558.36 312.89,-564.42"/>
57
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="312.3,-567.17 320.56,-565.27 312.91,-561.61 312.3,-567.17"/>
58
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-559.93" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">optional per&#45;job</text>
56
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M130.44,-629.51C183.19,-635.25 261.94,-643.83 318.12,-649.94"/>
57
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="317.77,-652.72 326.03,-650.8 318.38,-647.15 317.77,-652.72"/>
58
+ <text xml:space="preserve" text-anchor="middle" x="226.88" y="-645.35" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">optional per&#45;job</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,-464.93C133.75,-464.93 12,-464.93 12,-464.93 6,-464.93 0,-458.93 0,-452.93 0,-452.93 0,-440.93 0,-440.93 0,-434.93 6,-428.93 12,-428.93 12,-428.93 133.75,-428.93 133.75,-428.93 139.75,-428.93 145.75,-434.93 145.75,-440.93 145.75,-440.93 145.75,-452.93 145.75,-452.93 145.75,-458.93 139.75,-464.93 133.75,-464.93"/>
64
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-449.98" 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="-436.48" 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,-550.36C133.75,-550.36 12,-550.36 12,-550.36 6,-550.36 0,-544.36 0,-538.36 0,-538.36 0,-526.36 0,-526.36 0,-520.36 6,-514.36 12,-514.36 12,-514.36 133.75,-514.36 133.75,-514.36 139.75,-514.36 145.75,-520.36 145.75,-526.36 145.75,-526.36 145.75,-538.36 145.75,-538.36 145.75,-544.36 139.75,-550.36 133.75,-550.36"/>
64
+ <text xml:space="preserve" text-anchor="middle" x="72.88" y="-535.41" font-family="Helvetica,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="-521.91" font-family="Helvetica,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="edge4" class="edge">
69
69
  <title>Seed&#45;&gt;Jobs</title>
70
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M146.18,-459.42C197,-468.2 264.47,-479.86 313.98,-488.42"/>
71
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="313.33,-491.15 321.69,-489.75 314.29,-485.63 313.33,-491.15"/>
72
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-480.13" 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,-544.65C198.64,-553.53 268.76,-565.42 319.68,-574.06"/>
71
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="318.98,-576.78 327.33,-575.36 319.91,-571.26 318.98,-576.78"/>
72
+ <text xml:space="preserve" text-anchor="middle" x="226.88" y="-565.55" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">idempotent seed</text>
73
73
  </g>
74
74
  <!-- Worker -->
75
75
  <g id="node5" class="node">
76
76
  <title>Worker</title>
77
- <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M443.25,-445.93C443.25,-445.93 320,-445.93 320,-445.93 314,-445.93 308,-439.93 308,-433.93 308,-433.93 308,-395.93 308,-395.93 308,-389.93 314,-383.93 320,-383.93 320,-383.93 443.25,-383.93 443.25,-383.93 449.25,-383.93 455.25,-389.93 455.25,-395.93 455.25,-395.93 455.25,-433.93 455.25,-433.93 455.25,-439.93 449.25,-445.93 443.25,-445.93"/>
78
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-431.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">background worker</text>
79
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-417.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">pwn setup keep&#45;alive</text>
80
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-404.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">systemd &#45;&#45;user / launchd</text>
81
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-390.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">schtasks / crontab @reboot</text>
77
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.4" d="M454.5,-531.36C454.5,-531.36 320,-531.36 320,-531.36 314,-531.36 308,-525.36 308,-519.36 308,-519.36 308,-481.36 308,-481.36 308,-475.36 314,-469.36 320,-469.36 320,-469.36 454.5,-469.36 454.5,-469.36 460.5,-469.36 466.5,-475.36 466.5,-481.36 466.5,-481.36 466.5,-519.36 466.5,-519.36 466.5,-525.36 460.5,-531.36 454.5,-531.36"/>
78
+ <text xml:space="preserve" text-anchor="middle" x="387.25" y="-516.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">background worker</text>
79
+ <text xml:space="preserve" text-anchor="middle" x="387.25" y="-503.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">pwn setup starts/reuses</text>
80
+ <text xml:space="preserve" text-anchor="middle" x="387.25" y="-489.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">portable internal scheduler</text>
81
+ <text xml:space="preserve" text-anchor="middle" x="387.25" y="-476.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">housekeeping: never systemd</text>
82
82
  </g>
83
83
  <!-- Seed&#45;&gt;Worker -->
84
84
  <g id="edge6" class="edge">
85
85
  <title>Seed&#45;&gt;Worker</title>
86
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M130.08,-428.26C149.68,-422.64 171.97,-417.22 192.75,-414.43 227.03,-409.83 265.14,-409.13 298.03,-409.88"/>
87
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="297.57,-412.67 305.64,-410.09 297.72,-407.07 297.57,-412.67"/>
88
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-416.38" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">pwn setup</text>
86
+ <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M130.08,-513.69C149.68,-508.06 171.97,-502.65 192.75,-499.86 226.84,-495.28 264.62,-494.44 297.68,-495.09"/>
87
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="297.29,-497.88 305.35,-495.27 297.42,-492.28 297.29,-497.88"/>
88
+ <text xml:space="preserve" text-anchor="middle" x="226.88" y="-501.81" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">pwn setup</text>
89
89
  </g>
90
90
  <!-- Runner -->
91
91
  <g id="node6" class="node">
92
92
  <title>Runner</title>
93
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M709.25,-494.93C709.25,-494.93 626.5,-494.93 626.5,-494.93 620.5,-494.93 614.5,-488.93 614.5,-482.93 614.5,-482.93 614.5,-470.93 614.5,-470.93 614.5,-464.93 620.5,-458.93 626.5,-458.93 626.5,-458.93 709.25,-458.93 709.25,-458.93 715.25,-458.93 721.25,-464.93 721.25,-470.93 721.25,-470.93 721.25,-482.93 721.25,-482.93 721.25,-488.93 715.25,-494.93 709.25,-494.93"/>
94
- <text xml:space="preserve" text-anchor="middle" x="667.88" y="-473.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PWN::Cron.run(id)</text>
93
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M720.5,-580.36C720.5,-580.36 637.75,-580.36 637.75,-580.36 631.75,-580.36 625.75,-574.36 625.75,-568.36 625.75,-568.36 625.75,-556.36 625.75,-556.36 625.75,-550.36 631.75,-544.36 637.75,-544.36 637.75,-544.36 720.5,-544.36 720.5,-544.36 726.5,-544.36 732.5,-550.36 732.5,-556.36 732.5,-556.36 732.5,-568.36 732.5,-568.36 732.5,-574.36 726.5,-580.36 720.5,-580.36"/>
94
+ <text xml:space="preserve" text-anchor="middle" x="679.12" y="-558.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">PWN::Cron.run(id)</text>
95
95
  </g>
96
96
  <!-- Jobs&#45;&gt;Runner -->
97
97
  <g id="edge9" class="edge">
98
98
  <title>Jobs&#45;&gt;Runner</title>
99
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M439.81,-495.3C487.43,-491.45 555.15,-485.97 604.24,-482"/>
100
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="604.39,-484.8 612.14,-481.36 603.94,-479.21 604.39,-484.8"/>
101
- <text xml:space="preserve" text-anchor="middle" x="534.88" y="-491.76" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">load job</text>
99
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M445.17,-580.84C494.17,-576.95 564.78,-571.35 615.39,-567.33"/>
100
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="615.52,-570.13 623.28,-566.71 615.08,-564.55 615.52,-570.13"/>
101
+ <text xml:space="preserve" text-anchor="middle" x="546.12" y="-577.18" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">load job</text>
102
102
  </g>
103
103
  <!-- Crontab&#45;&gt;Runner -->
104
104
  <g id="edge7" class="edge">
105
105
  <title>Crontab&#45;&gt;Runner</title>
106
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M440.92,-563.81C477.95,-557.56 526.46,-547.35 567.5,-531.93 589.04,-523.84 611.58,-511.7 629.74,-500.89"/>
107
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="630.84,-503.5 636.23,-496.95 627.93,-498.71 630.84,-503.5"/>
108
- <text xml:space="preserve" text-anchor="middle" x="534.88" y="-553.21" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">fire on schedule</text>
106
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M446.19,-649.79C484.6,-643.67 535.68,-633.38 578.75,-617.36 600.31,-609.33 622.86,-597.2 641.02,-586.37"/>
107
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="642.12,-588.98 647.5,-582.43 639.21,-584.19 642.12,-588.98"/>
108
+ <text xml:space="preserve" text-anchor="middle" x="546.12" y="-637.66" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">fire on schedule</text>
109
109
  </g>
110
110
  <!-- Worker&#45;&gt;Runner -->
111
111
  <g id="edge8" class="edge">
112
112
  <title>Worker&#45;&gt;Runner</title>
113
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M455.83,-430.9C501.57,-440.87 559.88,-453.59 603.61,-463.13"/>
114
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="602.74,-465.81 611.16,-464.78 603.94,-460.34 602.74,-465.81"/>
115
- <text xml:space="preserve" text-anchor="middle" x="534.88" y="-457.06" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">poll jobs.yml</text>
113
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M467.08,-517.22C513.44,-527.13 571.3,-539.51 614.7,-548.79"/>
114
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="614.04,-551.51 622.45,-550.45 615.21,-546.04 614.04,-551.51"/>
115
+ <text xml:space="preserve" text-anchor="middle" x="546.12" y="-542.48" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">poll jobs.yml</text>
116
116
  </g>
117
117
  <!-- Prompt -->
118
118
  <g id="node7" class="node">
119
119
  <title>Prompt</title>
120
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M939.12,-494.93C939.12,-494.93 855.62,-494.93 855.62,-494.93 849.62,-494.93 843.62,-488.93 843.62,-482.93 843.62,-482.93 843.62,-470.93 843.62,-470.93 843.62,-464.93 849.62,-458.93 855.62,-458.93 855.62,-458.93 939.12,-458.93 939.12,-458.93 945.12,-458.93 951.12,-464.93 951.12,-470.93 951.12,-470.93 951.12,-482.93 951.12,-482.93 951.12,-488.93 945.12,-494.93 939.12,-494.93"/>
121
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-479.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:prompt</text>
122
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-466.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ pwn&#45;ai one&#45;shot</text>
120
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M950.38,-580.36C950.38,-580.36 866.88,-580.36 866.88,-580.36 860.88,-580.36 854.88,-574.36 854.88,-568.36 854.88,-568.36 854.88,-556.36 854.88,-556.36 854.88,-550.36 860.88,-544.36 866.88,-544.36 866.88,-544.36 950.38,-544.36 950.38,-544.36 956.38,-544.36 962.38,-550.36 962.38,-556.36 962.38,-556.36 962.38,-568.36 962.38,-568.36 962.38,-574.36 956.38,-580.36 950.38,-580.36"/>
121
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-565.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">:prompt</text>
122
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-551.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">→ pwn&#45;ai one&#45;shot</text>
123
123
  </g>
124
124
  <!-- Runner&#45;&gt;Prompt -->
125
125
  <g id="edge10" class="edge">
126
126
  <title>Runner&#45;&gt;Prompt</title>
127
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M721.93,-476.93C755.29,-476.93 798.51,-476.93 833.58,-476.93"/>
128
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="833.27,-479.73 841.27,-476.93 833.27,-474.13 833.27,-479.73"/>
127
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M733.18,-562.36C766.54,-562.36 809.76,-562.36 844.83,-562.36"/>
128
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="844.52,-565.16 852.52,-562.36 844.52,-559.56 844.52,-565.16"/>
129
129
  </g>
130
130
  <!-- Ruby -->
131
131
  <g id="node8" class="node">
132
132
  <title>Ruby</title>
133
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M966.5,-422.93C966.5,-422.93 828.25,-422.93 828.25,-422.93 822.25,-422.93 816.25,-416.93 816.25,-410.93 816.25,-410.93 816.25,-398.93 816.25,-398.93 816.25,-392.93 822.25,-386.93 828.25,-386.93 828.25,-386.93 966.5,-386.93 966.5,-386.93 972.5,-386.93 978.5,-392.93 978.5,-398.93 978.5,-398.93 978.5,-410.93 978.5,-410.93 978.5,-416.93 972.5,-422.93 966.5,-422.93"/>
134
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-407.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:ruby</text>
135
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-394.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ TOPLEVEL_BINDING.eval</text>
133
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M977.75,-508.36C977.75,-508.36 839.5,-508.36 839.5,-508.36 833.5,-508.36 827.5,-502.36 827.5,-496.36 827.5,-496.36 827.5,-484.36 827.5,-484.36 827.5,-478.36 833.5,-472.36 839.5,-472.36 839.5,-472.36 977.75,-472.36 977.75,-472.36 983.75,-472.36 989.75,-478.36 989.75,-484.36 989.75,-484.36 989.75,-496.36 989.75,-496.36 989.75,-502.36 983.75,-508.36 977.75,-508.36"/>
134
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-493.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">:ruby</text>
135
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-479.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">→ TOPLEVEL_BINDING.eval</text>
136
136
  </g>
137
137
  <!-- Runner&#45;&gt;Ruby -->
138
138
  <g id="edge11" class="edge">
139
139
  <title>Runner&#45;&gt;Ruby</title>
140
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M721.93,-460.14C753.61,-450.11 794.18,-437.27 828.22,-426.5"/>
141
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="828.98,-429.2 835.76,-424.12 827.29,-423.86 828.98,-429.2"/>
140
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M733.18,-545.57C764.86,-535.54 805.43,-522.7 839.47,-511.93"/>
141
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="840.23,-514.62 847.01,-509.54 838.54,-509.28 840.23,-514.62"/>
142
142
  </g>
143
143
  <!-- Script -->
144
144
  <g id="node9" class="node">
145
145
  <title>Script</title>
146
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M940.62,-566.93C940.62,-566.93 854.12,-566.93 854.12,-566.93 848.12,-566.93 842.12,-560.93 842.12,-554.93 842.12,-554.93 842.12,-542.93 842.12,-542.93 842.12,-536.93 848.12,-530.93 854.12,-530.93 854.12,-530.93 940.62,-530.93 940.62,-530.93 946.62,-530.93 952.62,-536.93 952.62,-542.93 952.62,-542.93 952.62,-554.93 952.62,-554.93 952.62,-560.93 946.62,-566.93 940.62,-566.93"/>
147
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-551.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:script</text>
148
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-538.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">→ exec external file</text>
146
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.4" d="M951.88,-652.36C951.88,-652.36 865.38,-652.36 865.38,-652.36 859.38,-652.36 853.38,-646.36 853.38,-640.36 853.38,-640.36 853.38,-628.36 853.38,-628.36 853.38,-622.36 859.38,-616.36 865.38,-616.36 865.38,-616.36 951.88,-616.36 951.88,-616.36 957.88,-616.36 963.88,-622.36 963.88,-628.36 963.88,-628.36 963.88,-640.36 963.88,-640.36 963.88,-646.36 957.88,-652.36 951.88,-652.36"/>
147
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-637.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">:script</text>
148
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-623.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">→ exec external file</text>
149
149
  </g>
150
150
  <!-- Runner&#45;&gt;Script -->
151
151
  <g id="edge12" class="edge">
152
152
  <title>Runner&#45;&gt;Script</title>
153
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M721.93,-493.72C754.95,-504.17 797.63,-517.68 832.51,-528.72"/>
154
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="831.31,-531.28 839.78,-531.02 833,-525.94 831.31,-531.28"/>
153
+ <path fill="none" stroke="#34d399" stroke-width="1.3" d="M733.18,-579.15C766.2,-589.6 808.88,-603.1 843.76,-614.14"/>
154
+ <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="842.56,-616.7 851.03,-616.44 844.25,-611.36 842.56,-616.7"/>
155
155
  </g>
156
156
  <!-- Log -->
157
157
  <g id="node16" class="node">
158
158
  <title>Log</title>
159
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1584.5,-559.62C1584.5,-562.03 1554.86,-563.99 1518.38,-563.99 1481.89,-563.99 1452.25,-562.03 1452.25,-559.62 1452.25,-559.62 1452.25,-520.24 1452.25,-520.24 1452.25,-517.83 1481.89,-515.87 1518.38,-515.87 1554.86,-515.87 1584.5,-517.83 1584.5,-520.24 1584.5,-520.24 1584.5,-559.62 1584.5,-559.62"/>
160
- <path fill="none" stroke="#334155" stroke-width="1.4" d="M1584.5,-559.62C1584.5,-557.2 1554.86,-555.24 1518.38,-555.24 1481.89,-555.24 1452.25,-557.2 1452.25,-559.62"/>
161
- <text xml:space="preserve" text-anchor="middle" x="1518.38" y="-542.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/cron/log/&lt;id&gt;.log</text>
162
- <text xml:space="preserve" text-anchor="middle" x="1518.38" y="-529.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">last_run · last_status</text>
159
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1934,-641.04C1934,-643.46 1904.36,-645.42 1867.88,-645.42 1831.39,-645.42 1801.75,-643.46 1801.75,-641.04 1801.75,-641.04 1801.75,-601.67 1801.75,-601.67 1801.75,-599.25 1831.39,-597.29 1867.88,-597.29 1904.36,-597.29 1934,-599.25 1934,-601.67 1934,-601.67 1934,-641.04 1934,-641.04"/>
160
+ <path fill="none" stroke="#334155" stroke-width="1.4" d="M1934,-641.04C1934,-638.63 1904.36,-636.67 1867.88,-636.67 1831.39,-636.67 1801.75,-638.63 1801.75,-641.04"/>
161
+ <text xml:space="preserve" text-anchor="middle" x="1867.88" y="-624.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">~/.pwn/cron/log/&lt;id&gt;.log</text>
162
+ <text xml:space="preserve" text-anchor="middle" x="1867.88" y="-610.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">last_run · last_status</text>
163
163
  </g>
164
164
  <!-- Prompt&#45;&gt;Log -->
165
165
  <g id="edge18" class="edge">
166
166
  <title>Prompt&#45;&gt;Log</title>
167
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M951.66,-492.58C963.93,-497.78 976.34,-504.47 986.5,-512.93 1041.62,-558.87 1010.56,-614.48 1073.5,-648.93 1184.12,-709.49 1236.73,-686.06 1357.25,-648.93 1406.58,-633.73 1454.32,-597.58 1484.64,-571.06"/>
168
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1486.38,-573.26 1490.5,-565.85 1482.66,-569.07 1486.38,-573.26"/>
167
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M962.91,-578C975.18,-583.2 987.59,-589.89 997.75,-598.36 1052.87,-644.29 1021.81,-699.9 1084.75,-734.36 1206,-800.73 1575,-776.16 1706.75,-734.36 1756.98,-718.42 1805.04,-680.41 1835.17,-652.86"/>
168
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1837.04,-654.94 1840.99,-647.45 1833.23,-650.84 1837.04,-654.94"/>
169
169
  </g>
170
170
  <!-- Practice -->
171
171
  <g id="node10" class="node">
172
172
  <title>Practice</title>
173
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1275.75,-605.18C1275.75,-605.18 1154,-605.18 1154,-605.18 1148,-605.18 1142,-599.18 1142,-593.18 1142,-593.18 1142,-568.68 1142,-568.68 1142,-562.68 1148,-556.68 1154,-556.68 1154,-556.68 1275.75,-556.68 1275.75,-556.68 1281.75,-556.68 1287.75,-562.68 1287.75,-568.68 1287.75,-568.68 1287.75,-593.18 1287.75,-593.18 1287.75,-599.18 1281.75,-605.18 1275.75,-605.18"/>
174
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-590.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_practice_nightly</text>
175
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-577.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 3 * * * &#160;OFF</text>
176
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-563.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.practice(limit:3)</text>
173
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1456.12,-690.61C1456.12,-690.61 1334.38,-690.61 1334.38,-690.61 1328.38,-690.61 1322.38,-684.61 1322.38,-678.61 1322.38,-678.61 1322.38,-654.11 1322.38,-654.11 1322.38,-648.11 1328.38,-642.11 1334.38,-642.11 1334.38,-642.11 1456.12,-642.11 1456.12,-642.11 1462.12,-642.11 1468.12,-648.11 1468.12,-654.11 1468.12,-654.11 1468.12,-678.61 1468.12,-678.61 1468.12,-684.61 1462.12,-690.61 1456.12,-690.61"/>
174
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-676.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">curriculum_practice_nightly</text>
175
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-662.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">0 3 * * * &#160;OFF</text>
176
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-649.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.practice(limit:3)</text>
177
177
  </g>
178
178
  <!-- Ruby&#45;&gt;Practice -->
179
179
  <g id="edge13" class="edge">
180
180
  <title>Ruby&#45;&gt;Practice</title>
181
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M954.9,-423.57C965.86,-428.39 976.91,-434.17 986.5,-440.93 1033.84,-474.28 1024.7,-506.76 1073.5,-537.93 1091.12,-549.18 1111.85,-557.64 1131.9,-563.94"/>
182
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1131.01,-566.59 1139.47,-566.2 1132.61,-561.23 1131.01,-566.59"/>
181
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M966.15,-509C977.11,-513.82 988.16,-519.6 997.75,-526.36 1045.09,-559.71 1033.62,-596.16 1084.75,-623.36 1155.13,-660.8 1246.7,-669.42 1311.94,-669.98"/>
182
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1311.79,-672.78 1319.8,-670 1311.81,-667.18 1311.79,-672.78"/>
183
183
  </g>
184
184
  <!-- Offline -->
185
185
  <g id="node11" class="node">
186
186
  <title>Offline</title>
187
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1269,-520.18C1269,-520.18 1160.75,-520.18 1160.75,-520.18 1154.75,-520.18 1148.75,-514.18 1148.75,-508.18 1148.75,-508.18 1148.75,-483.68 1148.75,-483.68 1148.75,-477.68 1154.75,-471.68 1160.75,-471.68 1160.75,-471.68 1269,-471.68 1269,-471.68 1275,-471.68 1281,-477.68 1281,-483.68 1281,-483.68 1281,-508.18 1281,-508.18 1281,-514.18 1275,-520.18 1269,-520.18"/>
188
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-505.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_offline_judge</text>
189
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-492.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">30 3 * * * &#160;OFF</text>
190
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-478.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.offline_judge</text>
187
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1449.38,-605.61C1449.38,-605.61 1341.12,-605.61 1341.12,-605.61 1335.12,-605.61 1329.12,-599.61 1329.12,-593.61 1329.12,-593.61 1329.12,-569.11 1329.12,-569.11 1329.12,-563.11 1335.12,-557.11 1341.12,-557.11 1341.12,-557.11 1449.38,-557.11 1449.38,-557.11 1455.38,-557.11 1461.38,-563.11 1461.38,-569.11 1461.38,-569.11 1461.38,-593.61 1461.38,-593.61 1461.38,-599.61 1455.38,-605.61 1449.38,-605.61"/>
188
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-591.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">curriculum_offline_judge</text>
189
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-577.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">30 3 * * * &#160;OFF</text>
190
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-564.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.offline_judge</text>
191
191
  </g>
192
192
  <!-- Ruby&#45;&gt;Offline -->
193
193
  <g id="edge14" class="edge">
194
194
  <title>Ruby&#45;&gt;Offline</title>
195
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M962.98,-423.57C1014,-438.28 1085.28,-458.84 1138.82,-474.28"/>
196
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1137.92,-476.94 1146.38,-476.46 1139.47,-471.56 1137.92,-476.94"/>
195
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M968.3,-508.96C1002.08,-519.12 1045.48,-531.24 1084.75,-539.36 1163.89,-555.72 1255.77,-567.26 1318.74,-574.05"/>
196
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1318.39,-576.83 1326.64,-574.89 1318.98,-571.26 1318.39,-576.83"/>
197
197
  </g>
198
198
  <!-- Train -->
199
199
  <g id="node12" class="node">
200
200
  <title>Train</title>
201
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1274.62,-435.93C1274.62,-435.93 1155.12,-435.93 1155.12,-435.93 1149.12,-435.93 1143.12,-429.93 1143.12,-423.93 1143.12,-423.93 1143.12,-385.93 1143.12,-385.93 1143.12,-379.93 1149.12,-373.93 1155.12,-373.93 1155.12,-373.93 1274.62,-373.93 1274.62,-373.93 1280.62,-373.93 1286.62,-379.93 1286.62,-385.93 1286.62,-385.93 1286.62,-423.93 1286.62,-423.93 1286.62,-429.93 1280.62,-435.93 1274.62,-435.93"/>
202
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-421.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_train_weekly</text>
203
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-407.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 4 * * 0 &#160;OFF</text>
204
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-394.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.train_and_gate</text>
205
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-380.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">(dry_run / export_ready)</text>
201
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1455,-521.36C1455,-521.36 1335.5,-521.36 1335.5,-521.36 1329.5,-521.36 1323.5,-515.36 1323.5,-509.36 1323.5,-509.36 1323.5,-471.36 1323.5,-471.36 1323.5,-465.36 1329.5,-459.36 1335.5,-459.36 1335.5,-459.36 1455,-459.36 1455,-459.36 1461,-459.36 1467,-465.36 1467,-471.36 1467,-471.36 1467,-509.36 1467,-509.36 1467,-515.36 1461,-521.36 1455,-521.36"/>
202
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-506.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">curriculum_train_weekly</text>
203
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-493.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">0 4 * * 0 &#160;OFF</text>
204
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-479.91" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.train_and_gate</text>
205
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-466.41" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">(dry_run / export_ready)</text>
206
206
  </g>
207
207
  <!-- Ruby&#45;&gt;Train -->
208
208
  <g id="edge15" class="edge">
209
209
  <title>Ruby&#45;&gt;Train</title>
210
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M978.81,-404.93C1025.93,-404.93 1085.29,-404.93 1132.57,-404.93"/>
211
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1132.5,-407.73 1140.5,-404.93 1132.5,-402.13 1132.5,-407.73"/>
210
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M990.19,-490.36C1079.7,-490.36 1223.38,-490.36 1313.11,-490.36"/>
211
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1313,-493.16 1321,-490.36 1313,-487.56 1313,-493.16"/>
212
212
  </g>
213
213
  <!-- MemGC -->
214
214
  <g id="node13" class="node">
215
215
  <title>MemGC</title>
216
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1278.38,-338.18C1278.38,-338.18 1151.38,-338.18 1151.38,-338.18 1145.38,-338.18 1139.38,-332.18 1139.38,-326.18 1139.38,-326.18 1139.38,-301.68 1139.38,-301.68 1139.38,-295.68 1145.38,-289.68 1151.38,-289.68 1151.38,-289.68 1278.38,-289.68 1278.38,-289.68 1284.38,-289.68 1290.38,-295.68 1290.38,-301.68 1290.38,-301.68 1290.38,-326.18 1290.38,-326.18 1290.38,-332.18 1284.38,-338.18 1278.38,-338.18"/>
217
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-323.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">learning_consolidate_nightly</text>
218
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-310.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 5 * * * &#160;ON</text>
219
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-296.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Learning.consolidate</text>
216
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1458.75,-423.61C1458.75,-423.61 1331.75,-423.61 1331.75,-423.61 1325.75,-423.61 1319.75,-417.61 1319.75,-411.61 1319.75,-411.61 1319.75,-387.11 1319.75,-387.11 1319.75,-381.11 1325.75,-375.11 1331.75,-375.11 1331.75,-375.11 1458.75,-375.11 1458.75,-375.11 1464.75,-375.11 1470.75,-381.11 1470.75,-387.11 1470.75,-387.11 1470.75,-411.61 1470.75,-411.61 1470.75,-417.61 1464.75,-423.61 1458.75,-423.61"/>
217
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-409.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">learning_consolidate_nightly</text>
218
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-395.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">0 5 * * * &#160;ON</text>
219
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-382.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">Learning.consolidate</text>
220
220
  </g>
221
221
  <!-- Ruby&#45;&gt;MemGC -->
222
222
  <g id="edge16" class="edge">
223
223
  <title>Ruby&#45;&gt;MemGC</title>
224
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M962.98,-386.3C1011.11,-372.41 1077.26,-353.33 1129.56,-338.25"/>
225
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1130.02,-341.03 1136.93,-336.12 1128.47,-335.65 1130.02,-341.03"/>
224
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M968.3,-471.75C1002.08,-461.6 1045.48,-449.47 1084.75,-441.36 1160.11,-425.78 1247.02,-414.56 1309.53,-407.66"/>
225
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1309.74,-410.46 1317.39,-406.81 1309.13,-404.89 1309.74,-410.46"/>
226
226
  </g>
227
227
  <!-- Lean -->
228
228
  <g id="node14" class="node">
229
229
  <title>Lean</title>
230
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1270.12,-253.18C1270.12,-253.18 1159.62,-253.18 1159.62,-253.18 1153.62,-253.18 1147.62,-247.18 1147.62,-241.18 1147.62,-241.18 1147.62,-216.68 1147.62,-216.68 1147.62,-210.68 1153.62,-204.68 1159.62,-204.68 1159.62,-204.68 1270.12,-204.68 1270.12,-204.68 1276.12,-204.68 1282.12,-210.68 1282.12,-216.68 1282.12,-216.68 1282.12,-241.18 1282.12,-241.18 1282.12,-247.18 1276.12,-253.18 1270.12,-253.18"/>
231
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-238.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">pwn_stores_lean_nightly</text>
232
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-225.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">15 5 * * * &#160;ON</text>
233
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-211.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Learning.gc_stores!</text>
230
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1450.5,-338.61C1450.5,-338.61 1340,-338.61 1340,-338.61 1334,-338.61 1328,-332.61 1328,-326.61 1328,-326.61 1328,-302.11 1328,-302.11 1328,-296.11 1334,-290.11 1340,-290.11 1340,-290.11 1450.5,-290.11 1450.5,-290.11 1456.5,-290.11 1462.5,-296.11 1462.5,-302.11 1462.5,-302.11 1462.5,-326.61 1462.5,-326.61 1462.5,-332.61 1456.5,-338.61 1450.5,-338.61"/>
231
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-324.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">pwn_stores_lean_nightly</text>
232
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-310.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">15 5 * * * &#160;ON</text>
233
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-297.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">Learning.gc_stores!</text>
234
234
  </g>
235
235
  <!-- Ruby&#45;&gt;Lean -->
236
236
  <g id="edge17" class="edge">
237
237
  <title>Ruby&#45;&gt;Lean</title>
238
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M917.81,-386.42C948.55,-358.06 1011.32,-303.78 1073.5,-271.93 1093.46,-261.71 1116.28,-253.43 1137.64,-246.97"/>
239
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1138.23,-249.72 1145.12,-244.78 1136.65,-244.34 1138.23,-249.72"/>
238
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M927.04,-472.07C956.44,-442.47 1019.17,-384.6 1084.75,-357.36 1159.92,-326.12 1253.3,-316.73 1317.71,-314.31"/>
239
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1317.53,-317.11 1325.43,-314.05 1317.35,-311.52 1317.53,-317.11"/>
240
240
  </g>
241
241
  <!-- Cleanup -->
242
242
  <g id="node15" class="node">
243
243
  <title>Cleanup</title>
244
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1295.25,-168.18C1295.25,-168.18 1134.5,-168.18 1134.5,-168.18 1128.5,-168.18 1122.5,-162.18 1122.5,-156.18 1122.5,-156.18 1122.5,-131.68 1122.5,-131.68 1122.5,-125.68 1128.5,-119.68 1134.5,-119.68 1134.5,-119.68 1295.25,-119.68 1295.25,-119.68 1301.25,-119.68 1307.25,-125.68 1307.25,-131.68 1307.25,-131.68 1307.25,-156.18 1307.25,-156.18 1307.25,-162.18 1301.25,-168.18 1295.25,-168.18"/>
245
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-153.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">session_cleanup</text>
246
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-140.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">45 3 * * * ON</text>
247
- <text xml:space="preserve" text-anchor="middle" x="1214.88" y="-126.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">leases / pins / backup before delete</text>
244
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.4" d="M1488.38,-254.11C1488.38,-254.11 1302.12,-254.11 1302.12,-254.11 1296.12,-254.11 1290.12,-248.11 1290.12,-242.11 1290.12,-242.11 1290.12,-190.61 1290.12,-190.61 1290.12,-184.61 1296.12,-178.61 1302.12,-178.61 1302.12,-178.61 1488.38,-178.61 1488.38,-178.61 1494.38,-178.61 1500.38,-184.61 1500.38,-190.61 1500.38,-190.61 1500.38,-242.11 1500.38,-242.11 1500.38,-248.11 1494.38,-254.11 1488.38,-254.11"/>
245
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-239.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">ONLY fresh default: session_cleanup</text>
246
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-226.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">45 3 * * * ON (first&#45;slot guard)</text>
247
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-212.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">evidence&#45;first maintenance</text>
248
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-199.16" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">then memory consolidation</text>
249
+ <text xml:space="preserve" text-anchor="middle" x="1395.25" y="-185.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#0f172a">then learning / mistakes / policy retention</text>
248
250
  </g>
249
251
  <!-- Ruby&#45;&gt;Cleanup -->
250
252
  <g id="edge1" class="edge">
251
253
  <title>Ruby&#45;&gt;Cleanup</title>
252
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M908.19,-386.46C931.29,-344.73 993.27,-242.56 1073.5,-187.93 1085.45,-179.8 1098.98,-173.11 1112.8,-167.62"/>
253
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1113.57,-170.32 1120.07,-164.88 1111.6,-165.08 1113.57,-170.32"/>
254
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M918.66,-471.82C940.56,-429.04 1000.93,-323.25 1084.75,-273.36 1143.35,-238.47 1218.39,-224.05 1279.9,-218.44"/>
255
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1279.95,-221.24 1287.69,-217.78 1279.48,-215.66 1279.95,-221.24"/>
254
256
  </g>
255
257
  <!-- Ruby&#45;&gt;Log -->
256
258
  <g id="edge19" class="edge">
257
259
  <title>Ruby&#45;&gt;Log</title>
258
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M906.06,-386.62C931.86,-326.11 1016.93,-134.58 1073.5,-101.93 1182.73,-38.9 1253.69,-29.97 1357.25,-101.93 1493.34,-196.5 1514.17,-419.84 1517.06,-505.58"/>
259
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1514.25,-505.45 1517.27,-513.37 1519.85,-505.3 1514.25,-505.45"/>
260
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M916.55,-471.8C940.93,-407.54 1024.58,-196.54 1084.75,-160.36 1203.2,-89.12 1594.11,-80.24 1706.75,-160.36 1848.87,-261.44 1865.97,-498.03 1867.21,-586.85"/>
261
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1864.41,-586.74 1867.27,-594.72 1870.01,-586.7 1864.41,-586.74"/>
260
262
  </g>
261
263
  <!-- Script&#45;&gt;Log -->
262
264
  <g id="edge20" class="edge">
263
265
  <title>Script&#45;&gt;Log</title>
264
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M909.46,-567.5C964.23,-656.99 1211.17,-1033.8 1405.25,-891.93 1457.76,-853.55 1497.45,-655.03 1511.67,-574.22"/>
265
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1514.41,-574.81 1513.02,-566.45 1508.89,-573.86 1514.41,-574.81"/>
266
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M919.89,-652.94C938.67,-685.14 981.76,-751.14 1036.75,-785.36 1315.82,-958.97 1488.52,-1155.07 1754.75,-962.36 1854.35,-890.26 1867.03,-726.75 1867.6,-655.55"/>
267
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1870.4,-655.71 1867.61,-647.71 1864.8,-655.7 1870.4,-655.71"/>
266
268
  </g>
267
269
  <!-- Practice&#45;&gt;Log -->
268
270
  <g id="edge22" class="edge">
269
271
  <title>Practice&#45;&gt;Log</title>
270
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1220.86,-605.77C1238.37,-687.36 1301.6,-937.75 1405.25,-863.93 1500.02,-796.44 1515.44,-643.12 1517.43,-574.39"/>
271
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1520.23,-574.52 1517.6,-566.47 1514.63,-574.4 1520.23,-574.52"/>
272
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1409.88,-691.31C1457.01,-774.35 1617.66,-1030.87 1754.75,-934.36 1846.56,-869.72 1863.58,-722.6 1866.47,-655.66"/>
273
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1869.25,-656.07 1866.74,-647.98 1863.66,-655.87 1869.25,-656.07"/>
272
274
  </g>
273
275
  <!-- Offline&#45;&gt;Log -->
274
276
  <g id="edge23" class="edge">
275
277
  <title>Offline&#45;&gt;Log</title>
276
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1281.39,-500.87C1308.6,-506.31 1338.21,-517.24 1357.25,-538.93 1441.07,-634.43 1307.3,-738.8 1404.25,-820.93 1487.42,-891.39 1510.07,-663.57 1515.68,-574.27"/>
277
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1518.46,-574.7 1516.14,-566.55 1512.87,-574.37 1518.46,-574.7"/>
278
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1461.98,-570.02C1532.34,-561.98 1642.49,-561.84 1706.75,-624.36 1797.83,-712.96 1656.8,-824.23 1753.75,-906.36 1838.04,-977.76 1860.01,-746.16 1865.31,-655.85"/>
279
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1868.09,-656.17 1865.74,-648.03 1862.5,-655.86 1868.09,-656.17"/>
278
280
  </g>
279
281
  <!-- Train&#45;&gt;Log -->
280
282
  <g id="edge24" class="edge">
281
283
  <title>Train&#45;&gt;Log</title>
282
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1287.28,-414.02C1312.97,-420.88 1339.88,-432.91 1357.25,-453.93 1449.94,-566.1 1294.22,-682.71 1404.25,-777.93 1474.5,-838.72 1504.48,-653.32 1513.88,-574.05"/>
283
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1516.62,-574.71 1514.75,-566.44 1511.05,-574.07 1516.62,-574.71"/>
284
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1467.62,-479.74C1538.45,-473.59 1645.11,-476.94 1706.75,-539.36 1809,-642.88 1643.72,-768.14 1753.75,-863.36 1825.05,-925.06 1854.45,-736.13 1863.53,-655.74"/>
285
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1866.29,-656.26 1864.37,-648 1860.72,-655.65 1866.29,-656.26"/>
284
286
  </g>
285
287
  <!-- MemGC&#45;&gt;Log -->
286
288
  <g id="edge25" class="edge">
287
289
  <title>MemGC&#45;&gt;Log</title>
288
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1290.95,-319.95C1315.51,-325.71 1340.7,-336.39 1357.25,-355.93 1466.95,-485.46 1277.06,-622.54 1404.25,-734.93 1462.11,-786.06 1497.98,-642.56 1511.39,-574.06"/>
289
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1514.09,-574.84 1512.83,-566.46 1508.59,-573.79 1514.09,-574.84"/>
290
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1471.35,-386.24C1542.2,-378.57 1646.31,-380.25 1706.75,-441.36 1826.1,-562.04 1626.56,-707.96 1753.75,-820.36 1812.65,-872.4 1848.06,-725.26 1861.12,-655.63"/>
291
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1863.85,-656.27 1862.53,-647.89 1858.34,-655.26 1863.85,-656.27"/>
290
292
  </g>
291
293
  <!-- Lean&#45;&gt;Log -->
292
294
  <g id="edge26" class="edge">
293
295
  <title>Lean&#45;&gt;Log</title>
294
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1282.55,-238.66C1307.91,-244.93 1335.83,-255.18 1357.25,-271.93 1437.36,-334.59 1486.06,-449.38 1506.36,-506.21"/>
295
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1503.66,-506.99 1508.95,-513.62 1508.95,-505.14 1503.66,-506.99"/>
296
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1463.17,-307.81C1530.25,-304.65 1633.77,-309.37 1706.75,-357.36 1791.01,-412.75 1837.9,-529.29 1856.84,-587.2"/>
297
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1854.16,-587.99 1859.25,-594.76 1859.49,-586.29 1854.16,-587.99"/>
296
298
  </g>
297
299
  <!-- Cleanup&#45;&gt;Log -->
298
300
  <g id="edge2" class="edge">
299
301
  <title>Cleanup&#45;&gt;Log</title>
300
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M1307.74,-160.21C1325.63,-166.61 1343.18,-175.52 1357.25,-187.93 1456.11,-275.13 1497.52,-435.63 1511.45,-505.7"/>
301
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1508.67,-506.1 1512.93,-513.43 1514.17,-505.05 1508.67,-506.1"/>
302
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M1500.71,-212.14C1566.09,-214.74 1648.65,-228.21 1706.75,-273.36 1810.11,-353.67 1849.19,-516.19 1861.73,-587.04"/>
303
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1858.96,-587.45 1863.06,-594.87 1864.48,-586.51 1858.96,-587.45"/>
302
304
  </g>
303
305
  <!-- Log&#45;&gt;Jobs -->
304
306
  <g id="edge21" class="edge">
305
307
  <title>Log&#45;&gt;Jobs</title>
306
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1513.67,-515.3C1499.08,-422.14 1442.16,-93.91 1357.25,-41.93 1249.69,23.91 1191.62,2.23 1073.5,-41.93 820.32,-136.59 811.21,-255.55 614.5,-440.93 592.77,-461.41 594.67,-476.55 567.5,-488.93 530.84,-505.64 485.78,-508.63 449.32,-507.32"/>
307
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="449.85,-504.55 441.73,-506.97 449.59,-510.14 449.85,-504.55"/>
308
- <text xml:space="preserve" text-anchor="middle" x="897.38" y="-225.59" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">update status</text>
308
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1863.59,-596.68C1850.17,-500.11 1795.88,-150.44 1706.75,-94.36 1472.77,52.87 1341.72,7.55 1084.75,-94.36 824.34,-197.63 825.79,-330.23 625.75,-526.36 604.43,-547.26 605.93,-562 578.75,-574.36 540.41,-591.79 493.17,-594.62 455.32,-593.05"/>
309
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="455.51,-590.26 447.37,-592.64 455.22,-595.85 455.51,-590.26"/>
310
+ <text xml:space="preserve" text-anchor="middle" x="908.62" y="-293.88" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cbd5e1">update status</text>
309
311
  </g>
310
312
  </g>
311
313
  </svg>