pwn 0.5.779 → 0.5.781

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -3
  3. data/documentation/AI-Integration.md +4 -4
  4. data/documentation/AWS.md +10 -9
  5. data/documentation/Agent-Tool-Registry.md +20 -17
  6. data/documentation/Blockchain.md +3 -2
  7. data/documentation/Bounty.md +8 -6
  8. data/documentation/BurpSuite.md +6 -10
  9. data/documentation/CLI-Drivers.md +7 -4
  10. data/documentation/Capability-Broker-Sandbox.md +1 -1
  11. data/documentation/Configuration.md +23 -15
  12. data/documentation/Contributing.md +3 -3
  13. data/documentation/Cron.md +3 -2
  14. data/documentation/Diagrams.md +9 -3
  15. data/documentation/Drivers.md +12 -6
  16. data/documentation/Extrospection.md +25 -5
  17. data/documentation/FFI.md +15 -25
  18. data/documentation/Fuzzing.md +13 -13
  19. data/documentation/General-PWN-Usage.md +7 -4
  20. data/documentation/Harness-Evaluation.md +90 -3
  21. data/documentation/Home.md +6 -5
  22. data/documentation/How-PWN-Works.md +9 -10
  23. data/documentation/Installation.md +12 -11
  24. data/documentation/Metasploit.md +13 -19
  25. data/documentation/Mistakes.md +2 -2
  26. data/documentation/NmapIt.md +6 -3
  27. data/documentation/Operability.md +99 -0
  28. data/documentation/Persistence.md +3 -2
  29. data/documentation/Plugin-Degradation.md +4 -2
  30. data/documentation/Plugins.md +4 -11
  31. data/documentation/Policy-Benchmark.md +4 -0
  32. data/documentation/Reinforcement-Learning.md +19 -3
  33. data/documentation/Reporting.md +6 -5
  34. data/documentation/SAST.md +15 -10
  35. data/documentation/SDR-Decoder-Coverage.md +10 -4
  36. data/documentation/SDR.md +28 -40
  37. data/documentation/Session-Workflow.md +25 -12
  38. data/documentation/Sessions.md +7 -0
  39. data/documentation/Skills-Memory-Learning.md +11 -4
  40. data/documentation/Swarm.md +6 -0
  41. data/documentation/Transparent-Browser.md +1 -1
  42. data/documentation/Troubleshooting.md +6 -3
  43. data/documentation/What-is-PWN.md +4 -4
  44. data/documentation/Why-PWN.md +1 -1
  45. data/documentation/diagrams/agent-tool-registry.svg +219 -180
  46. data/documentation/diagrams/ai-integration-tool-calling.svg +35 -34
  47. data/documentation/diagrams/code-scanning-sast.svg +78 -78
  48. data/documentation/diagrams/cron-scheduling.svg +165 -145
  49. data/documentation/diagrams/dot/_THEME.md +6 -4
  50. data/documentation/diagrams/dot/agent-tool-registry.dot +6 -2
  51. data/documentation/diagrams/dot/ai-integration-tool-calling.dot +1 -1
  52. data/documentation/diagrams/dot/code-scanning-sast.dot +8 -8
  53. data/documentation/diagrams/dot/cron-scheduling.dot +2 -0
  54. data/documentation/diagrams/dot/driver-framework.dot +1 -1
  55. data/documentation/diagrams/dot/extrospection-world-awareness.dot +2 -2
  56. data/documentation/diagrams/dot/fuzzing-workflow.dot +3 -3
  57. data/documentation/diagrams/dot/history-to-drivers.dot +1 -1
  58. data/documentation/diagrams/dot/memory-skills-detailed.dot +3 -3
  59. data/documentation/diagrams/dot/mistakes-negative-feedback.dot +2 -2
  60. data/documentation/diagrams/dot/overall-pwn-architecture.dot +33 -121
  61. data/documentation/diagrams/dot/persistence-filesystem.dot +2 -2
  62. data/documentation/diagrams/dot/plugin-ecosystem.dot +2 -2
  63. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +31 -167
  64. data/documentation/diagrams/dot/pwn-repl-prototyping.dot +1 -1
  65. data/documentation/diagrams/dot/reinforcement-learning.dot +15 -7
  66. data/documentation/diagrams/dot/reporting-pipeline.dot +5 -3
  67. data/documentation/diagrams/dot/reverse-engineering-flow.dot +3 -3
  68. data/documentation/diagrams/dot/sdr-radio-flow.dot +5 -5
  69. data/documentation/diagrams/dot/sessions-cron-automation.dot +1 -1
  70. data/documentation/diagrams/dot/swarm-multi-agent.dot +3 -3
  71. data/documentation/diagrams/dot/task-summarizer.dot +2 -2
  72. data/documentation/diagrams/dot/web-application-testing.dot +4 -3
  73. data/documentation/diagrams/dot/zero-day-research-flow.dot +4 -3
  74. data/documentation/diagrams/driver-framework.svg +1 -1
  75. data/documentation/diagrams/extrospection-world-awareness.svg +178 -178
  76. data/documentation/diagrams/fuzzing-workflow.svg +58 -58
  77. data/documentation/diagrams/history-to-drivers.svg +42 -42
  78. data/documentation/diagrams/memory-skills-detailed.svg +210 -210
  79. data/documentation/diagrams/mistakes-negative-feedback.svg +116 -116
  80. data/documentation/diagrams/overall-pwn-architecture.svg +248 -404
  81. data/documentation/diagrams/persistence-filesystem.svg +143 -143
  82. data/documentation/diagrams/plugin-ecosystem.svg +100 -100
  83. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +233 -752
  84. data/documentation/diagrams/pwn-repl-prototyping.svg +27 -27
  85. data/documentation/diagrams/reinforcement-learning.svg +295 -221
  86. data/documentation/diagrams/reporting-pipeline.svg +94 -80
  87. data/documentation/diagrams/reverse-engineering-flow.svg +31 -31
  88. data/documentation/diagrams/sdr-radio-flow.svg +157 -155
  89. data/documentation/diagrams/sessions-cron-automation.svg +13 -13
  90. data/documentation/diagrams/swarm-multi-agent.svg +86 -86
  91. data/documentation/diagrams/task-summarizer.svg +57 -57
  92. data/documentation/diagrams/web-application-testing.svg +81 -75
  93. data/documentation/diagrams/zero-day-research-flow.svg +101 -92
  94. data/documentation/pwn-REPL.md +5 -3
  95. data/documentation/pwn-ai-Agent.md +18 -14
  96. data/documentation/pwn_silent_help_learn_demo.gif +0 -0
  97. data/etc/default_skills/pwn/ai/agent/learning/SKILL.md +1 -0
  98. data/lib/pwn/ai/agent/learning.rb +46 -1
  99. data/lib/pwn/ai/agent/loop.rb +6 -3
  100. data/lib/pwn/ai/agent/policy_evaluation.rb +5 -1
  101. data/lib/pwn/ai/agent/reward.rb +9 -0
  102. data/lib/pwn/version.rb +1 -1
  103. data/spec/fixtures/harness/completion_regressions.json +10 -0
  104. data/spec/fixtures/harness/completion_regressions.json.sha256 +1 -0
  105. data/spec/integration/harness_evaluation_spec.rb +13 -0
  106. data/spec/lib/pwn/ai/agent/learning_spec.rb +22 -0
  107. data/spec/lib/pwn/ai/agent/loop_spec.rb +39 -0
  108. data/spec/lib/pwn/ai/agent/policy_evaluation_spec.rb +6 -1
  109. data/spec/lib/pwn/ai/agent/reward_spec.rb +21 -0
  110. data/spec/support/harness/evaluate.rb +1 -1
  111. data/third_party/pwn_rdoc.jsonl +2 -1
  112. metadata +10 -7
@@ -4,288 +4,308 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Cron Pages: 1 -->
7
- <svg width="1489pt" height="667pt"
8
- viewBox="0.00 0.00 1489.00 667.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 624.2)">
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)">
10
10
  <title>PWN_Cron</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-624.2 1446.2,-624.2 1446.2,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="500.12" y="-559" 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="496.38" y="-547.55" 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,-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>
14
14
  <g id="clust2" class="cluster">
15
15
  <title>cluster_kinds</title>
16
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M874,-307C874,-307 1028.25,-307 1028.25,-307 1034.25,-307 1040.25,-313 1040.25,-319 1040.25,-319 1040.25,-522 1040.25,-522 1040.25,-528 1034.25,-534 1028.25,-534 1028.25,-534 874,-534 874,-534 868,-534 862,-528 862,-522 862,-522 862,-319 862,-319 862,-313 868,-307 874,-307"/>
17
- <text xml:space="preserve" text-anchor="middle" x="951.12" y="-511" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Job Kinds</text>
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>
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="M1131.25,-8C1131.25,-8 1391,-8 1391,-8 1397,-8 1403,-14 1403,-20 1403,-20 1403,-444 1403,-444 1403,-450 1397,-456 1391,-456 1391,-456 1131.25,-456 1131.25,-456 1125.25,-456 1119.25,-450 1119.25,-444 1119.25,-444 1119.25,-20 1119.25,-20 1119.25,-14 1125.25,-8 1131.25,-8"/>
22
- <text xml:space="preserve" text-anchor="middle" x="1261.12" y="-433" 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="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>
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,-490.25C118,-490.25 27.75,-490.25 27.75,-490.25 21.75,-490.25 15.75,-484.25 15.75,-478.25 15.75,-478.25 15.75,-453.75 15.75,-453.75 15.75,-447.75 21.75,-441.75 27.75,-441.75 27.75,-441.75 118,-441.75 118,-441.75 124,-441.75 130,-447.75 130,-453.75 130,-453.75 130,-478.25 130,-478.25 130,-484.25 124,-490.25 118,-490.25"/>
28
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-475.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="-462.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="-448.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,-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>
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,-442.73C439.12,-444.53 413.35,-446 381.62,-446 349.9,-446 324.12,-444.53 324.12,-442.73 324.12,-442.73 324.12,-413.27 324.12,-413.27 324.12,-411.47 349.9,-410 381.62,-410 413.35,-410 439.12,-411.47 439.12,-413.27 439.12,-413.27 439.12,-442.73 439.12,-442.73"/>
36
- <path fill="none" stroke="#334155" stroke-width="1.4" d="M439.12,-442.73C439.12,-440.92 413.35,-439.45 381.62,-439.45 349.9,-439.45 324.12,-440.92 324.12,-442.73"/>
37
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-424.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="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>
38
38
  </g>
39
39
  <!-- Create&#45;&gt;Jobs -->
40
- <g id="edge1" class="edge">
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,-458.99C182.35,-452.56 259.13,-443.05 313.93,-436.26"/>
43
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="314.01,-439.07 321.6,-435.31 313.32,-433.52 314.01,-439.07"/>
44
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-452.35" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">write</text>
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>
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,-518C428.25,-518 335,-518 335,-518 329,-518 323,-512 323,-506 323,-506 323,-494 323,-494 323,-488 329,-482 335,-482 335,-482 428.25,-482 428.25,-482 434.25,-482 440.25,-488 440.25,-494 440.25,-494 440.25,-506 440.25,-506 440.25,-512 434.25,-518 428.25,-518"/>
50
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-503.05" 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="-489.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="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>
52
52
  </g>
53
53
  <!-- Create&#45;&gt;Crontab -->
54
- <g id="edge3" class="edge">
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,-472.28C182.02,-477.99 258.16,-486.43 312.89,-492.49"/>
57
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="312.3,-495.24 320.56,-493.34 312.91,-489.68 312.3,-495.24"/>
58
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-488" 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.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>
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,-393C133.75,-393 12,-393 12,-393 6,-393 0,-387 0,-381 0,-381 0,-369 0,-369 0,-363 6,-357 12,-357 12,-357 133.75,-357 133.75,-357 139.75,-357 145.75,-363 145.75,-369 145.75,-369 145.75,-381 145.75,-381 145.75,-387 139.75,-393 133.75,-393"/>
64
- <text xml:space="preserve" text-anchor="middle" x="72.88" y="-378.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="-364.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,-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>
66
66
  </g>
67
67
  <!-- Seed&#45;&gt;Jobs -->
68
- <g id="edge2" class="edge">
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,-387.49C197,-396.27 264.47,-407.93 313.98,-416.48"/>
71
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="313.33,-419.21 321.69,-417.82 314.29,-413.7 313.33,-419.21"/>
72
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-408.2" 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.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>
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,-374C443.25,-374 320,-374 320,-374 314,-374 308,-368 308,-362 308,-362 308,-324 308,-324 308,-318 314,-312 320,-312 320,-312 443.25,-312 443.25,-312 449.25,-312 455.25,-318 455.25,-324 455.25,-324 455.25,-362 455.25,-362 455.25,-368 449.25,-374 443.25,-374"/>
78
- <text xml:space="preserve" text-anchor="middle" x="381.62" y="-359.55" 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="-346.05" 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="-332.55" 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="-319.05" 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="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>
82
82
  </g>
83
83
  <!-- Seed&#45;&gt;Worker -->
84
- <g id="edge4" class="edge">
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,-356.33C149.68,-350.71 171.97,-345.29 192.75,-342.5 227.03,-337.9 265.14,-337.19 298.03,-337.95"/>
87
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="297.57,-340.74 305.64,-338.16 297.72,-335.14 297.57,-340.74"/>
88
- <text xml:space="preserve" text-anchor="middle" x="226.88" y="-344.45" 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,-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>
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,-423C709.25,-423 626.5,-423 626.5,-423 620.5,-423 614.5,-417 614.5,-411 614.5,-411 614.5,-399 614.5,-399 614.5,-393 620.5,-387 626.5,-387 626.5,-387 709.25,-387 709.25,-387 715.25,-387 721.25,-393 721.25,-399 721.25,-399 721.25,-411 721.25,-411 721.25,-417 715.25,-423 709.25,-423"/>
94
- <text xml:space="preserve" text-anchor="middle" x="667.88" y="-401.3" 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="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>
95
95
  </g>
96
96
  <!-- Jobs&#45;&gt;Runner -->
97
- <g id="edge7" class="edge">
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,-423.37C487.43,-419.52 555.15,-414.04 604.24,-410.07"/>
100
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="604.39,-412.86 612.14,-409.43 603.94,-407.28 604.39,-412.86"/>
101
- <text xml:space="preserve" text-anchor="middle" x="534.88" y="-419.83" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">load job</text>
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>
102
102
  </g>
103
103
  <!-- Crontab&#45;&gt;Runner -->
104
- <g id="edge5" class="edge">
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,-491.88C477.95,-485.63 526.46,-475.41 567.5,-460 589.04,-451.91 611.58,-439.77 629.74,-428.96"/>
107
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="630.84,-431.56 636.23,-425.02 627.93,-426.78 630.84,-431.56"/>
108
- <text xml:space="preserve" text-anchor="middle" x="534.88" y="-481.28" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">fire on schedule</text>
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>
109
109
  </g>
110
110
  <!-- Worker&#45;&gt;Runner -->
111
- <g id="edge6" class="edge">
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,-358.97C501.57,-368.94 559.88,-381.66 603.61,-391.2"/>
114
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="602.74,-393.88 611.16,-392.85 603.94,-388.41 602.74,-393.88"/>
115
- <text xml:space="preserve" text-anchor="middle" x="534.88" y="-385.13" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">poll jobs.yml</text>
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>
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="M992.88,-423C992.88,-423 909.38,-423 909.38,-423 903.38,-423 897.38,-417 897.38,-411 897.38,-411 897.38,-399 897.38,-399 897.38,-393 903.38,-387 909.38,-387 909.38,-387 992.88,-387 992.88,-387 998.88,-387 1004.88,-393 1004.88,-399 1004.88,-399 1004.88,-411 1004.88,-411 1004.88,-417 998.88,-423 992.88,-423"/>
121
- <text xml:space="preserve" text-anchor="middle" x="951.12" y="-408.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:prompt</text>
122
- <text xml:space="preserve" text-anchor="middle" x="951.12" y="-394.55" 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="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>
123
123
  </g>
124
124
  <!-- Runner&#45;&gt;Prompt -->
125
- <g id="edge8" class="edge">
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.78,-405C768.77,-405 837.52,-405 887.29,-405"/>
128
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="887.02,-407.8 895.02,-405 887.02,-402.2 887.02,-407.8"/>
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"/>
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="M1020.25,-351C1020.25,-351 882,-351 882,-351 876,-351 870,-345 870,-339 870,-339 870,-327 870,-327 870,-321 876,-315 882,-315 882,-315 1020.25,-315 1020.25,-315 1026.25,-315 1032.25,-321 1032.25,-327 1032.25,-327 1032.25,-339 1032.25,-339 1032.25,-345 1026.25,-351 1020.25,-351"/>
134
- <text xml:space="preserve" text-anchor="middle" x="951.12" y="-336.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:ruby</text>
135
- <text xml:space="preserve" text-anchor="middle" x="951.12" y="-322.55" 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="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>
136
136
  </g>
137
137
  <!-- Runner&#45;&gt;Ruby -->
138
- <g id="edge9" class="edge">
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.78,-391.46C762.86,-380.94 820.59,-366.16 867.72,-354.1"/>
141
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="868.33,-356.83 875.39,-352.13 866.95,-351.4 868.33,-356.83"/>
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"/>
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="M994.38,-495C994.38,-495 907.88,-495 907.88,-495 901.88,-495 895.88,-489 895.88,-483 895.88,-483 895.88,-471 895.88,-471 895.88,-465 901.88,-459 907.88,-459 907.88,-459 994.38,-459 994.38,-459 1000.38,-459 1006.38,-465 1006.38,-471 1006.38,-471 1006.38,-483 1006.38,-483 1006.38,-489 1000.38,-495 994.38,-495"/>
147
- <text xml:space="preserve" text-anchor="middle" x="951.12" y="-480.05" font-family="sans-Serif" font-size="11.00" fill="#0f172a">:script</text>
148
- <text xml:space="preserve" text-anchor="middle" x="951.12" y="-466.55" 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="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>
149
149
  </g>
150
150
  <!-- Runner&#45;&gt;Script -->
151
- <g id="edge10" class="edge">
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.9,-420.33C736.85,-424.55 753.16,-429.05 768.25,-433 807.17,-443.19 851.01,-453.82 885.89,-462.08"/>
154
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="885.13,-464.77 893.56,-463.89 886.42,-459.32 885.13,-464.77"/>
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"/>
155
155
  </g>
156
156
  <!-- Log -->
157
- <g id="node15" class="node">
157
+ <g id="node16" class="node">
158
158
  <title>Log</title>
159
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.4" d="M1326.75,-531.69C1326.75,-534.1 1297.11,-536.06 1260.62,-536.06 1224.14,-536.06 1194.5,-534.1 1194.5,-531.69 1194.5,-531.69 1194.5,-492.31 1194.5,-492.31 1194.5,-489.9 1224.14,-487.94 1260.62,-487.94 1297.11,-487.94 1326.75,-489.9 1326.75,-492.31 1326.75,-492.31 1326.75,-531.69 1326.75,-531.69"/>
160
- <path fill="none" stroke="#334155" stroke-width="1.4" d="M1326.75,-531.69C1326.75,-529.27 1297.11,-527.31 1260.62,-527.31 1224.14,-527.31 1194.5,-529.27 1194.5,-531.69"/>
161
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-515.05" 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="1260.62" y="-501.55" 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="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>
163
163
  </g>
164
164
  <!-- Prompt&#45;&gt;Log -->
165
- <g id="edge16" class="edge">
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="M1003.23,-423.67C1036.26,-435.66 1080.22,-451.46 1119.25,-465 1140.4,-472.34 1163.41,-480.12 1184.57,-487.2"/>
168
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1183.48,-489.79 1191.96,-489.67 1185.26,-484.48 1183.48,-489.79"/>
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"/>
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="M1321.5,-64.25C1321.5,-64.25 1199.75,-64.25 1199.75,-64.25 1193.75,-64.25 1187.75,-58.25 1187.75,-52.25 1187.75,-52.25 1187.75,-27.75 1187.75,-27.75 1187.75,-21.75 1193.75,-15.75 1199.75,-15.75 1199.75,-15.75 1321.5,-15.75 1321.5,-15.75 1327.5,-15.75 1333.5,-21.75 1333.5,-27.75 1333.5,-27.75 1333.5,-52.25 1333.5,-52.25 1333.5,-58.25 1327.5,-64.25 1321.5,-64.25"/>
174
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-49.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_practice_nightly</text>
175
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-36.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 3 * * * &#160;OFF</text>
176
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-22.8" 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="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>
177
177
  </g>
178
178
  <!-- Ruby&#45;&gt;Practice -->
179
- <g id="edge11" class="edge">
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="M959.29,-314.45C978.13,-268.16 1033.58,-146.71 1119.25,-83 1136.45,-70.21 1157.51,-61.18 1178.03,-54.82"/>
182
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1178.61,-57.57 1185.51,-52.64 1177.05,-52.19 1178.61,-57.57"/>
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"/>
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="M1314.75,-416.25C1314.75,-416.25 1206.5,-416.25 1206.5,-416.25 1200.5,-416.25 1194.5,-410.25 1194.5,-404.25 1194.5,-404.25 1194.5,-379.75 1194.5,-379.75 1194.5,-373.75 1200.5,-367.75 1206.5,-367.75 1206.5,-367.75 1314.75,-367.75 1314.75,-367.75 1320.75,-367.75 1326.75,-373.75 1326.75,-379.75 1326.75,-379.75 1326.75,-404.25 1326.75,-404.25 1326.75,-410.25 1320.75,-416.25 1314.75,-416.25"/>
188
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-401.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_offline_judge</text>
189
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-388.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">30 3 * * * &#160;OFF</text>
190
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-374.8" 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="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>
191
191
  </g>
192
192
  <!-- Ruby&#45;&gt;Offline -->
193
- <g id="edge12" class="edge">
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="M1032.92,-348.5C1079.76,-357.49 1138.38,-368.74 1184.27,-377.54"/>
196
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1183.54,-380.25 1191.93,-379.01 1184.6,-374.75 1183.54,-380.25"/>
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"/>
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="M1320.38,-332C1320.38,-332 1200.88,-332 1200.88,-332 1194.88,-332 1188.88,-326 1188.88,-320 1188.88,-320 1188.88,-282 1188.88,-282 1188.88,-276 1194.88,-270 1200.88,-270 1200.88,-270 1320.38,-270 1320.38,-270 1326.38,-270 1332.38,-276 1332.38,-282 1332.38,-282 1332.38,-320 1332.38,-320 1332.38,-326 1326.38,-332 1320.38,-332"/>
202
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-317.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">curriculum_train_weekly</text>
203
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-304.05" 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="1260.62" y="-290.55" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum.train_and_gate</text>
205
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-277.05" 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="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>
206
206
  </g>
207
207
  <!-- Ruby&#45;&gt;Train -->
208
- <g id="edge13" class="edge">
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="M1032.92,-324.59C1077.84,-319.92 1133.59,-314.12 1178.56,-309.44"/>
211
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1178.65,-312.24 1186.32,-308.63 1178.07,-306.67 1178.65,-312.24"/>
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"/>
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="M1324.12,-234.25C1324.12,-234.25 1197.12,-234.25 1197.12,-234.25 1191.12,-234.25 1185.12,-228.25 1185.12,-222.25 1185.12,-222.25 1185.12,-197.75 1185.12,-197.75 1185.12,-191.75 1191.12,-185.75 1197.12,-185.75 1197.12,-185.75 1324.12,-185.75 1324.12,-185.75 1330.12,-185.75 1336.12,-191.75 1336.12,-197.75 1336.12,-197.75 1336.12,-222.25 1336.12,-222.25 1336.12,-228.25 1330.12,-234.25 1324.12,-234.25"/>
217
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-219.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">learning_consolidate_nightly</text>
218
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-206.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">0 5 * * * &#160;ON</text>
219
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-192.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Learning.consolidate</text>
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>
220
220
  </g>
221
221
  <!-- Ruby&#45;&gt;MemGC -->
222
- <g id="edge14" class="edge">
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="M986.29,-314.43C1019.57,-296.83 1071.92,-270.41 1119.25,-252 1137.1,-245.06 1156.59,-238.57 1175.21,-232.86"/>
225
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1175.83,-235.6 1182.68,-230.61 1174.21,-230.24 1175.83,-235.6"/>
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"/>
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="M1315.88,-149.25C1315.88,-149.25 1205.38,-149.25 1205.38,-149.25 1199.38,-149.25 1193.38,-143.25 1193.38,-137.25 1193.38,-137.25 1193.38,-112.75 1193.38,-112.75 1193.38,-106.75 1199.38,-100.75 1205.38,-100.75 1205.38,-100.75 1315.88,-100.75 1315.88,-100.75 1321.88,-100.75 1327.88,-106.75 1327.88,-112.75 1327.88,-112.75 1327.88,-137.25 1327.88,-137.25 1327.88,-143.25 1321.88,-149.25 1315.88,-149.25"/>
231
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-134.8" font-family="sans-Serif" font-size="11.00" fill="#0f172a">pwn_stores_lean_nightly</text>
232
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-121.3" font-family="sans-Serif" font-size="11.00" fill="#0f172a">15 5 * * * &#160;ON</text>
233
- <text xml:space="preserve" text-anchor="middle" x="1260.62" y="-107.8" 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="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>
234
234
  </g>
235
235
  <!-- Ruby&#45;&gt;Lean -->
236
- <g id="edge15" class="edge">
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="M965.84,-314.48C991.95,-280.5 1052.2,-208.02 1119.25,-168 1138.79,-156.34 1161.78,-147.58 1183.43,-141.12"/>
239
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1184.12,-143.83 1191.05,-138.94 1182.58,-138.45 1184.12,-143.83"/>
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"/>
240
+ </g>
241
+ <!-- Cleanup -->
242
+ <g id="node15" class="node">
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>
248
+ </g>
249
+ <!-- Ruby&#45;&gt;Cleanup -->
250
+ <g id="edge1" class="edge">
251
+ <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"/>
240
254
  </g>
241
255
  <!-- Ruby&#45;&gt;Log -->
242
- <g id="edge17" class="edge">
256
+ <g id="edge19" class="edge">
243
257
  <title>Ruby&#45;&gt;Log</title>
244
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1009.34,-351.53C1020.13,-356.34 1030.94,-362.14 1040.25,-369 1084.73,-401.78 1073.73,-433.68 1119.25,-465 1138.7,-478.38 1162.27,-488.22 1184.5,-495.32"/>
245
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1183.58,-497.97 1192.05,-497.62 1185.21,-492.61 1183.58,-497.97"/>
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"/>
246
260
  </g>
247
261
  <!-- Script&#45;&gt;Log -->
248
- <g id="edge18" class="edge">
262
+ <g id="edge20" class="edge">
249
263
  <title>Script&#45;&gt;Log</title>
250
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1006.75,-483.22C1056.16,-488.84 1129.38,-497.18 1184.34,-503.43"/>
251
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1183.81,-506.19 1192.08,-504.31 1184.44,-500.62 1183.81,-506.19"/>
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"/>
252
266
  </g>
253
267
  <!-- Practice&#45;&gt;Log -->
254
- <g id="edge20" class="edge">
268
+ <g id="edge22" class="edge">
255
269
  <title>Practice&#45;&gt;Log</title>
256
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1187.4,-43.74C1147.92,-50.07 1102.7,-65.32 1079.75,-101 1038.15,-165.67 1038.15,-382.33 1079.75,-447 1102.22,-481.93 1145.59,-498.26 1184.23,-505.82"/>
257
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1183.63,-508.55 1191.99,-507.21 1184.61,-503.04 1183.63,-508.55"/>
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"/>
258
272
  </g>
259
273
  <!-- Offline&#45;&gt;Log -->
260
- <g id="edge21" class="edge">
274
+ <g id="edge23" class="edge">
261
275
  <title>Offline&#45;&gt;Log</title>
262
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1260.62,-416.84C1260.62,-437.07 1260.62,-457.31 1260.62,-477.54"/>
263
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1257.83,-477.5 1260.63,-485.5 1263.43,-477.5 1257.83,-477.5"/>
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"/>
264
278
  </g>
265
279
  <!-- Train&#45;&gt;Log -->
266
- <g id="edge22" class="edge">
280
+ <g id="edge24" class="edge">
267
281
  <title>Train&#45;&gt;Log</title>
268
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1188.5,-307.28C1148.87,-314.94 1103.12,-331.67 1079.75,-368 1060.76,-397.53 1060.76,-417.47 1079.75,-447 1102.22,-481.93 1145.59,-498.26 1184.23,-505.82"/>
269
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1183.63,-508.55 1191.99,-507.21 1184.61,-503.04 1183.63,-508.55"/>
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"/>
270
284
  </g>
271
285
  <!-- MemGC&#45;&gt;Log -->
272
- <g id="edge23" class="edge">
286
+ <g id="edge25" class="edge">
273
287
  <title>MemGC&#45;&gt;Log</title>
274
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1184.58,-213.73C1145.77,-220.1 1102.12,-235.22 1079.75,-270 1037.19,-336.16 1037.19,-380.84 1079.75,-447 1102.22,-481.93 1145.59,-498.26 1184.23,-505.82"/>
275
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1183.63,-508.55 1191.99,-507.21 1184.61,-503.04 1183.63,-508.55"/>
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"/>
276
290
  </g>
277
291
  <!-- Lean&#45;&gt;Log -->
278
- <g id="edge24" class="edge">
292
+ <g id="edge26" class="edge">
279
293
  <title>Lean&#45;&gt;Log</title>
280
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1192.91,-127.91C1152.2,-133.69 1103.77,-148.65 1079.75,-186 1048.37,-234.78 1048.37,-398.22 1079.75,-447 1102.22,-481.93 1145.59,-498.26 1184.23,-505.82"/>
281
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1183.63,-508.55 1191.99,-507.21 1184.61,-503.04 1183.63,-508.55"/>
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
+ </g>
297
+ <!-- Cleanup&#45;&gt;Log -->
298
+ <g id="edge2" class="edge">
299
+ <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"/>
282
302
  </g>
283
303
  <!-- Log&#45;&gt;Jobs -->
284
- <g id="edge19" class="edge">
304
+ <g id="edge21" class="edge">
285
305
  <title>Log&#45;&gt;Jobs</title>
286
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1193.93,-501.51C1168.23,-494.67 1140.01,-483.43 1119.25,-465 1057.85,-410.49 1109.62,-341.93 1040.25,-298 973.32,-255.62 940.45,-286.97 862,-298 748.68,-313.93 712.79,-310.4 614.5,-369 588.86,-384.29 594.67,-404.62 567.5,-417 530.84,-433.71 485.78,-436.7 449.32,-435.39"/>
287
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="449.85,-432.61 441.73,-435.04 449.59,-438.21 449.85,-432.61"/>
288
- <text xml:space="preserve" text-anchor="middle" x="795.62" y="-312.32" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">update status</text>
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>
289
309
  </g>
290
310
  </g>
291
311
  </svg>