pwn 0.5.781 → 0.5.783

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/Installation.md +33 -9
  3. data/documentation/diagrams/dot/extrospection-world-awareness.dot +37 -92
  4. data/documentation/diagrams/dot/memory-skills-detailed.dot +33 -98
  5. data/documentation/diagrams/dot/overall-pwn-architecture.dot +54 -32
  6. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +53 -30
  7. data/documentation/diagrams/dot/reinforcement-learning.dot +46 -111
  8. data/documentation/diagrams/dot/swarm-multi-agent.dot +36 -61
  9. data/documentation/diagrams/extrospection-world-awareness.svg +139 -510
  10. data/documentation/diagrams/memory-skills-detailed.svg +126 -475
  11. data/documentation/diagrams/overall-pwn-architecture.svg +116 -266
  12. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +158 -244
  13. data/documentation/diagrams/reinforcement-learning.svg +238 -529
  14. data/documentation/diagrams/swarm-multi-agent.svg +104 -233
  15. data/documentation/pwn-REPL.md +31 -3
  16. data/documentation/pwn-ai-Agent.md +62 -2
  17. data/etc/default_cron/session_cleanup.rb +335 -42
  18. data/lib/pwn/ai/agent/curriculum.rb +2 -2
  19. data/lib/pwn/ai/agent/learning.rb +11 -4
  20. data/lib/pwn/ai/agent/mistakes.rb +22 -3
  21. data/lib/pwn/ai/agent/tools/sessions.rb +6 -6
  22. data/lib/pwn/ai/http_retry.rb +3 -0
  23. data/lib/pwn/ai/router.rb +3 -1
  24. data/lib/pwn/cron.rb +1 -1
  25. data/lib/pwn/memory.rb +62 -6
  26. data/lib/pwn/plugins/repl/ai.rb +13 -3
  27. data/lib/pwn/plugins/repl/ai_console.rb +37 -21
  28. data/lib/pwn/session_trace.rb +1 -1
  29. data/lib/pwn/sessions.rb +305 -80
  30. data/lib/pwn/version.rb +1 -1
  31. data/spec/lib/pwn/ai/agent/learning_spec.rb +65 -2
  32. data/spec/lib/pwn/ai/agent/swarm_spec.rb +3 -3
  33. data/spec/lib/pwn/memory_spec.rb +58 -1
  34. data/spec/lib/pwn/plugins/repl/ai_console_spec.rb +191 -6
  35. data/spec/lib/pwn/plugins/repl/ai_result_chronology_spec.rb +2 -2
  36. data/spec/lib/pwn/plugins/repl/ai_spec.rb +28 -11
  37. data/spec/lib/pwn/session_cleanup_default_spec.rb +2 -2
  38. data/spec/lib/pwn/session_cleanup_payload_spec.rb +467 -36
  39. data/spec/lib/pwn/sessions_spec.rb +116 -16
  40. data/third_party/pwn_rdoc.jsonl +12 -0
  41. metadata +1 -1
@@ -4,562 +4,271 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Reinforcement_Learning Pages: 1 -->
7
- <svg width="2862pt" height="1032pt"
8
- viewBox="0.00 0.00 2862.00 1032.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 988.45)">
7
+ <svg width="978pt" height="901pt"
8
+ viewBox="0.00 0.00 978.00 901.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(28.8 872.29)">
10
10
  <title>PWN_Reinforcement_Learning</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-988.45 2818.82,-988.45 2818.82,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="1105.81" y="-923.25" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent &#45; Reward + Curriculum Reinforcement Loop</text>
13
- <text xml:space="preserve" text-anchor="start" x="1190.56" y="-911.8" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">reward signal · credit assignment · memory · self&#45;play · weight loop · intro/extro join</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-28.8,28.8 -28.8,-872.29 948.8,-872.29 948.8,28.8 -28.8,28.8"/>
12
+ <text xml:space="preserve" text-anchor="start" x="178" y="-821.49" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent &#45; Reward + Curriculum Reinforcement Loop</text>
13
+ <text xml:space="preserve" text-anchor="start" x="272.5" y="-810.04" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">live accounting · optional curriculum / weights · explicit routing&#45;policy evaluation</text>
14
+ <g id="clust1" class="cluster">
15
+ <title>cluster_live</title>
16
+ <path fill="#1e293b" stroke="#334155" d="M20,-8C20,-8 286,-8 286,-8 292,-8 298,-14 298,-20 298,-20 298,-777.74 298,-777.74 298,-783.74 292,-789.74 286,-789.74 286,-789.74 20,-789.74 20,-789.74 14,-789.74 8,-783.74 8,-777.74 8,-777.74 8,-20 8,-20 8,-14 14,-8 20,-8"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-774.34" font-family="sans-Serif" font-size="12.00" fill="#e2e8f0">LIVE REQUEST &#160;· &#160;Loop / Reward / Policy</text>
18
+ </g>
14
19
  <g id="clust2" class="cluster">
15
- <title>cluster_reward</title>
16
- <path fill="#2e1065" stroke="#6d28d9" stroke-width="2" d="M1125,-600C1125,-600 2083,-600 2083,-600 2089,-600 2095,-606 2095,-612 2095,-612 2095,-710.5 2095,-710.5 2095,-716.5 2089,-722.5 2083,-722.5 2083,-722.5 1125,-722.5 1125,-722.5 1119,-722.5 1113,-716.5 1113,-710.5 1113,-710.5 1113,-612 1113,-612 1113,-606 1119,-600 1125,-600"/>
17
- <text xml:space="preserve" text-anchor="middle" x="1604" y="-699.5" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Tier 1 · Reward &#160;(PWN::AI::Agent::Reward)</text>
18
- </g>
19
- <g id="clust4" class="cluster">
20
- <title>cluster_curr</title>
21
- <path fill="#022c22" stroke="#047857" stroke-width="2" d="M245,-600C245,-600 1077,-600 1077,-600 1083,-600 1089,-606 1089,-612 1089,-612 1089,-710.5 1089,-710.5 1089,-716.5 1083,-722.5 1077,-722.5 1077,-722.5 245,-722.5 245,-722.5 239,-722.5 233,-716.5 233,-710.5 233,-710.5 233,-612 233,-612 233,-606 239,-600 245,-600"/>
22
- <text xml:space="preserve" text-anchor="middle" x="661" y="-699.5" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Tier 4 · Curriculum &#160;(PWN::AI::Agent::Curriculum)</text>
23
- </g>
24
- <g id="clust6" class="cluster">
25
- <title>cluster_weight</title>
26
- <path fill="#450a0a" stroke="#b91c1c" stroke-width="2" d="M20,-406.5C20,-406.5 762,-406.5 762,-406.5 768,-406.5 774,-412.5 774,-418.5 774,-418.5 774,-529 774,-529 774,-535 768,-541 762,-541 762,-541 20,-541 20,-541 14,-541 8,-535 8,-529 8,-529 8,-418.5 8,-418.5 8,-412.5 14,-406.5 20,-406.5"/>
27
- <text xml:space="preserve" text-anchor="middle" x="391" y="-518" font-family="sans-Serif" font-size="20.00" fill="#fecaca">Tier 5 · Weight Loop</text>
28
- </g>
29
- <g id="clust8" class="cluster">
30
- <title>cluster_files</title>
31
- <path fill="#422006" stroke="#a16207" stroke-dasharray="5,2" d="M553,-235.5C553,-235.5 1370,-235.5 1370,-235.5 1376,-235.5 1382,-241.5 1382,-247.5 1382,-247.5 1382,-346 1382,-346 1382,-352 1376,-358 1370,-358 1370,-358 553,-358 553,-358 547,-358 541,-352 541,-346 541,-346 541,-247.5 541,-247.5 541,-241.5 547,-235.5 553,-235.5"/>
32
- <text xml:space="preserve" text-anchor="middle" x="961.5" y="-335" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
33
- </g>
34
- <!-- Req -->
35
- <g id="node1" class="node">
36
- <title>Req</title>
37
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M1066.5,-825C1066.5,-825 1023.5,-825 1023.5,-825 1017.5,-825 1011.5,-819 1011.5,-813 1011.5,-813 1011.5,-801 1011.5,-801 1011.5,-795 1017.5,-789 1023.5,-789 1023.5,-789 1066.5,-789 1066.5,-789 1072.5,-789 1078.5,-795 1078.5,-801 1078.5,-801 1078.5,-813 1078.5,-813 1078.5,-819 1072.5,-825 1066.5,-825"/>
38
- <text xml:space="preserve" text-anchor="middle" x="1045" y="-803.88" font-family="sans-Serif" font-size="10.00" fill="#0f172a">👤 &#160;request</text>
20
+ <title>cluster_curriculum</title>
21
+ <path fill="#1e293b" stroke="#94a3b8" stroke-dasharray="5,2" d="M324,-8C324,-8 602,-8 602,-8 608,-8 614,-14 614,-20 614,-20 614,-784.49 614,-784.49 614,-790.49 608,-796.49 602,-796.49 602,-796.49 324,-796.49 324,-796.49 318,-796.49 312,-790.49 312,-784.49 312,-784.49 312,-20 312,-20 312,-14 318,-8 324,-8"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="463" y="-781.09" font-family="sans-Serif" font-size="12.00" fill="#e2e8f0">OPTIONAL CURRICULUM &#160;· &#160;independent invocation</text>
23
+ </g>
24
+ <g id="clust3" class="cluster">
25
+ <title>cluster_policy</title>
26
+ <path fill="#1e293b" stroke="#94a3b8" stroke-dasharray="5,2" d="M634,-142.29C634,-142.29 900,-142.29 900,-142.29 906,-142.29 912,-148.29 912,-154.29 912,-154.29 912,-777.74 912,-777.74 912,-783.74 906,-789.74 900,-789.74 900,-789.74 634,-789.74 634,-789.74 628,-789.74 622,-783.74 622,-777.74 622,-777.74 622,-154.29 622,-154.29 622,-148.29 628,-142.29 634,-142.29"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-774.34" font-family="sans-Serif" font-size="12.00" fill="#e2e8f0">FROZEN POLICY &#160;· &#160;explicit operator workflow</text>
39
28
  </g>
40
- <!-- Loop -->
29
+ <!-- Run -->
30
+ <g id="node1" class="node">
31
+ <title>Run</title>
32
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M277.8,-759.49C277.8,-759.49 28.2,-759.49 28.2,-759.49 22.2,-759.49 16.2,-753.49 16.2,-747.49 16.2,-747.49 16.2,-694.45 16.2,-694.45 16.2,-688.45 22.2,-682.45 28.2,-682.45 28.2,-682.45 277.8,-682.45 277.8,-682.45 283.8,-682.45 289.8,-688.45 289.8,-694.45 289.8,-694.45 289.8,-747.49 289.8,-747.49 289.8,-753.49 283.8,-759.49 277.8,-759.49"/>
33
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-737.52" font-family="sans-Serif" font-size="11.00" fill="#0f172a">1 &#160;ACT + OBSERVE</text>
34
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-724.02" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Loop: plan, Dispatch, guard, final answer</text>
35
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-710.52" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Policy: begin_episode / observe_step</text>
36
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-697.02" font-family="sans-Serif" font-size="11.00" fill="#0f172a">semantic_ok: grep exit 1 need not be failure</text>
37
+ </g>
38
+ <!-- Diagnose -->
41
39
  <g id="node2" class="node">
42
- <title>Loop</title>
43
- <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M1314.12,-835C1314.12,-835 1169.88,-835 1169.88,-835 1163.88,-835 1157.88,-829 1157.88,-823 1157.88,-823 1157.88,-791 1157.88,-791 1157.88,-785 1163.88,-779 1169.88,-779 1169.88,-779 1314.12,-779 1314.12,-779 1320.12,-779 1326.12,-785 1326.12,-791 1326.12,-791 1326.12,-823 1326.12,-823 1326.12,-829 1320.12,-835 1314.12,-835"/>
44
- <text xml:space="preserve" text-anchor="middle" x="1242" y="-821.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Loop.run</text>
45
- <text xml:space="preserve" text-anchor="middle" x="1242" y="-809.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">TaskSummarizer · budget pressure</text>
46
- <text xml:space="preserve" text-anchor="middle" x="1242" y="-797.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan_first · Dispatch · guard</text>
47
- <text xml:space="preserve" text-anchor="middle" x="1242" y="-785.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">final answer</text>
48
- </g>
49
- <!-- Req&#45;&gt;Loop -->
40
+ <title>Diagnose</title>
41
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M277.8,-620.95C277.8,-620.95 28.2,-620.95 28.2,-620.95 22.2,-620.95 16.2,-614.95 16.2,-608.95 16.2,-608.95 16.2,-555.91 16.2,-555.91 16.2,-549.91 22.2,-543.91 28.2,-543.91 28.2,-543.91 277.8,-543.91 277.8,-543.91 283.8,-543.91 289.8,-549.91 289.8,-555.91 289.8,-555.91 289.8,-608.95 289.8,-608.95 289.8,-614.95 283.8,-620.95 277.8,-620.95"/>
42
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-598.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">2 &#160;DIAGNOSE WHEN APPLICABLE</text>
43
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-585.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Curriculum: red_team_plan / critic</text>
44
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-571.98" font-family="sans-Serif" font-size="11.00" fill="#0f172a">counterfactual: real vs imagined dispatch</text>
45
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-558.48" font-family="sans-Serif" font-size="11.00" fill="#0f172a">hindsight: achieved&#45;goal relabel, not proof</text>
46
+ </g>
47
+ <!-- Run&#45;&gt;Diagnose -->
50
48
  <g id="edge1" class="edge">
51
- <title>Req&#45;&gt;Loop</title>
52
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1078.86,-807C1101.22,-807 1123.58,-807 1145.95,-807"/>
53
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="1145.9,-809.8 1153.9,-807 1145.9,-804.2 1145.9,-809.8"/>
49
+ <title>Run&#45;&gt;Diagnose</title>
50
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M153,-681.94C153,-666.11 153,-647.56 153,-630.85"/>
51
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="155.8,-631.23 153,-623.23 150.2,-631.23 155.8,-631.23"/>
54
52
  </g>
55
- <!-- R1 -->
53
+ <!-- Evidence -->
56
54
  <g id="node3" class="node">
57
- <title>R1</title>
58
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1833.25,-652C1833.25,-652 1734.75,-652 1734.75,-652 1728.75,-652 1722.75,-646 1722.75,-640 1722.75,-640 1722.75,-620 1722.75,-620 1722.75,-614 1728.75,-608 1734.75,-608 1734.75,-608 1833.25,-608 1833.25,-608 1839.25,-608 1845.25,-614 1845.25,-620 1845.25,-620 1845.25,-640 1845.25,-640 1845.25,-646 1839.25,-652 1833.25,-652"/>
59
- <text xml:space="preserve" text-anchor="middle" x="1784" y="-638.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">judge (cheap LLM ORM)</text>
60
- <text xml:space="preserve" text-anchor="middle" x="1784" y="-626.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">score · verdict · source</text>
61
- <text xml:space="preserve" text-anchor="middle" x="1784" y="-614.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">evidence&#45;prior fallback</text>
62
- </g>
63
- <!-- Loop&#45;&gt;R1 -->
64
- <g id="edge4" class="edge">
65
- <title>Loop&#45;&gt;R1</title>
66
- <path fill="none" stroke="#a78bfa" stroke-width="2" d="M1327.01,-797.23C1441.74,-784.28 1639.04,-757.7 1702,-722.5 1727.83,-708.06 1749.75,-682.39 1764.41,-661.91"/>
67
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="2" points="1766.65,-663.59 1768.9,-655.41 1762.05,-660.4 1766.65,-663.59"/>
68
- <text xml:space="preserve" text-anchor="middle" x="1691.43" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
55
+ <title>Evidence</title>
56
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M277.8,-489.16C277.8,-489.16 28.2,-489.16 28.2,-489.16 22.2,-489.16 16.2,-483.16 16.2,-477.16 16.2,-477.16 16.2,-410.62 16.2,-410.62 16.2,-404.62 22.2,-398.62 28.2,-398.62 28.2,-398.62 277.8,-398.62 277.8,-398.62 283.8,-398.62 289.8,-404.62 289.8,-410.62 289.8,-410.62 289.8,-477.16 289.8,-477.16 289.8,-483.16 283.8,-489.16 277.8,-489.16"/>
57
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-467.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">3 &#160;RESOLVE OUTCOME</text>
58
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-453.69" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Host Verification: pass / fail / unknown</text>
59
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-440.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Reward.judge remains a fallible claim</text>
60
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-426.69" font-family="sans-Serif" font-size="11.00" fill="#0f172a">verify_as_reward: claim diagnostics / caps</text>
61
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-413.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">False rate = refuted / checked claims</text>
62
+ </g>
63
+ <!-- Diagnose&#45;&gt;Evidence -->
64
+ <g id="edge2" class="edge">
65
+ <title>Diagnose&#45;&gt;Evidence</title>
66
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M153,-543.4C153,-529.67 153,-513.91 153,-499.07"/>
67
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="155.8,-499.45 153,-491.45 150.2,-499.45 155.8,-499.45"/>
69
68
  </g>
70
- <!-- R2 -->
69
+ <!-- Credit -->
71
70
  <g id="node4" class="node">
72
- <title>R2</title>
73
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1358.88,-652C1358.88,-652 1297.12,-652 1297.12,-652 1291.12,-652 1285.12,-646 1285.12,-640 1285.12,-640 1285.12,-620 1285.12,-620 1285.12,-614 1291.12,-608 1297.12,-608 1297.12,-608 1358.88,-608 1358.88,-608 1364.88,-608 1370.88,-614 1370.88,-620 1370.88,-620 1370.88,-640 1370.88,-640 1370.88,-646 1364.88,-652 1358.88,-652"/>
74
- <text xml:space="preserve" text-anchor="middle" x="1328" y="-638.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">prm (process)</text>
75
- <text xml:space="preserve" text-anchor="middle" x="1328" y="-626.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">per&#45;step +1/0/&#45;1</text>
76
- <text xml:space="preserve" text-anchor="middle" x="1328" y="-614.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">→ Registry.rank</text>
77
- </g>
78
- <!-- Loop&#45;&gt;R2 -->
79
- <g id="edge5" class="edge">
80
- <title>Loop&#45;&gt;R2</title>
81
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1255.63,-778.27C1271.3,-746.38 1296.94,-694.2 1313.12,-661.27"/>
82
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1315.54,-662.71 1316.55,-654.3 1310.51,-660.24 1315.54,-662.71"/>
83
- <text xml:space="preserve" text-anchor="middle" x="1293.05" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">session</text>
71
+ <title>Credit</title>
72
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M277.8,-361.62C277.8,-361.62 28.2,-361.62 28.2,-361.62 22.2,-361.62 16.2,-355.62 16.2,-349.62 16.2,-349.62 16.2,-283.08 16.2,-283.08 16.2,-277.08 22.2,-271.08 28.2,-271.08 28.2,-271.08 277.8,-271.08 277.8,-271.08 283.8,-271.08 289.8,-277.08 289.8,-283.08 289.8,-283.08 289.8,-349.62 289.8,-349.62 289.8,-355.62 283.8,-361.62 277.8,-361.62"/>
73
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-339.65" font-family="sans-Serif" font-size="11.00" fill="#0f172a">4 &#160;ACCOUNT FOR ELIGIBLE CREDIT</text>
74
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-326.15" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Policy: Q&#45;learning + REINFORCE</text>
75
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-312.65" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Positive credit needs independent attribution</text>
76
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-299.15" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PRM: step rewards; sentinel: proxy distrust</text>
77
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-285.65" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Calibration: predicted vs actual (Brier)</text>
78
+ </g>
79
+ <!-- Evidence&#45;&gt;Credit -->
80
+ <g id="edge3" class="edge">
81
+ <title>Evidence&#45;&gt;Credit</title>
82
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M153,-398.28C153,-389.78 153,-380.79 153,-372.02"/>
83
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="155.8,-372.21 153,-364.21 150.2,-372.21 155.8,-372.21"/>
84
84
  </g>
85
- <!-- R3 -->
85
+ <!-- Retain -->
86
86
  <g id="node5" class="node">
87
- <title>R3</title>
88
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1233,-652C1233,-652 1133,-652 1133,-652 1127,-652 1121,-646 1121,-640 1121,-640 1121,-620 1121,-620 1121,-614 1127,-608 1133,-608 1133,-608 1233,-608 1233,-608 1239,-608 1245,-614 1245,-620 1245,-620 1245,-640 1245,-640 1245,-646 1239,-652 1233,-652"/>
89
- <text xml:space="preserve" text-anchor="middle" x="1183" y="-638.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sentinel (ring N=40)</text>
90
- <text xml:space="preserve" text-anchor="middle" x="1183" y="-626.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">proxy != judge != (1&#45;corr)</text>
91
- <text xml:space="preserve" text-anchor="middle" x="1183" y="-614.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">warm + proxy distrust</text>
92
- </g>
93
- <!-- Loop&#45;&gt;R3 -->
94
- <g id="edge6" class="edge">
95
- <title>Loop&#45;&gt;R3</title>
96
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1232.65,-778.27C1221.95,-746.52 1204.46,-694.65 1193.35,-661.7"/>
97
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1196.1,-661.08 1190.89,-654.4 1190.79,-662.87 1196.1,-661.08"/>
87
+ <title>Retain</title>
88
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M277.8,-234.08C277.8,-234.08 28.2,-234.08 28.2,-234.08 22.2,-234.08 16.2,-228.08 16.2,-222.08 16.2,-222.08 16.2,-155.54 16.2,-155.54 16.2,-149.54 22.2,-143.54 28.2,-143.54 28.2,-143.54 277.8,-143.54 277.8,-143.54 283.8,-143.54 289.8,-149.54 289.8,-155.54 289.8,-155.54 289.8,-222.08 289.8,-222.08 289.8,-228.08 283.8,-234.08 277.8,-234.08"/>
89
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-212.11" font-family="sans-Serif" font-size="11.00" fill="#0f172a">5 &#160;RETAIN UNDER ~/.pwn/</text>
90
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-198.61" font-family="sans-Serif" font-size="11.00" fill="#0f172a">policy.json + policy_traj.jsonl</text>
91
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-185.11" font-family="sans-Serif" font-size="11.00" fill="#0f172a">sessions/*.jsonl: step_reward</text>
92
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-171.61" font-family="sans-Serif" font-size="11.00" fill="#0f172a">reward_sentinel.json + mistakes.json</text>
93
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-158.11" font-family="sans-Serif" font-size="11.00" fill="#0f172a">preferences.jsonl: scrubbed trajectory pairs</text>
94
+ </g>
95
+ <!-- Credit&#45;&gt;Retain -->
96
+ <g id="edge4" class="edge">
97
+ <title>Credit&#45;&gt;Retain</title>
98
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M153,-270.74C153,-262.24 153,-253.25 153,-244.48"/>
99
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="155.8,-244.67 153,-236.67 150.2,-244.67 155.8,-244.67"/>
98
100
  </g>
99
- <!-- R4 -->
101
+ <!-- Later -->
100
102
  <g id="node6" class="node">
101
- <title>R4</title>
102
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1501.5,-648C1501.5,-648 1422.5,-648 1422.5,-648 1416.5,-648 1410.5,-642 1410.5,-636 1410.5,-636 1410.5,-624 1410.5,-624 1410.5,-618 1416.5,-612 1422.5,-612 1422.5,-612 1501.5,-612 1501.5,-612 1507.5,-612 1513.5,-618 1513.5,-624 1513.5,-624 1513.5,-636 1513.5,-636 1513.5,-642 1507.5,-648 1501.5,-648"/>
103
- <text xml:space="preserve" text-anchor="middle" x="1462" y="-632.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">semantic_ok</text>
104
- <text xml:space="preserve" text-anchor="middle" x="1462" y="-620.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">grep exit 1 != failure</text>
105
- </g>
106
- <!-- Loop&#45;&gt;R4 -->
107
- <g id="edge2" class="edge">
108
- <title>Loop&#45;&gt;R4</title>
109
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1304.29,-778.16C1332.47,-763.86 1365.16,-744.75 1391,-722.5 1413.17,-703.42 1433.07,-676.47 1446.12,-656.77"/>
110
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1448.38,-658.43 1450.38,-650.19 1443.68,-655.39 1448.38,-658.43"/>
111
- <text xml:space="preserve" text-anchor="middle" x="1398.31" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">Dispatch</text>
103
+ <title>Later</title>
104
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M277.8,-106.54C277.8,-106.54 28.2,-106.54 28.2,-106.54 22.2,-106.54 16.2,-100.54 16.2,-94.54 16.2,-94.54 16.2,-28 16.2,-28 16.2,-22 22.2,-16 28.2,-16 28.2,-16 277.8,-16 277.8,-16 283.8,-16 289.8,-22 289.8,-28 289.8,-28 289.8,-94.54 289.8,-94.54 289.8,-100.54 283.8,-106.54 277.8,-106.54"/>
105
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-84.57" font-family="sans-Serif" font-size="11.00" fill="#0f172a">6 &#160;INFORM LATER TURNS</text>
106
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-71.07" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Registry ranking + advisory policy context</text>
107
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-57.57" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Warmup and episode budget apply</text>
108
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-44.07" font-family="sans-Serif" font-size="11.00" fill="#0f172a">RSI records ESR / ASR; ESR drop → lesson</text>
109
+ <text xml:space="preserve" text-anchor="middle" x="153" y="-30.57" font-family="sans-Serif" font-size="11.00" fill="#0f172a">No automatic policy&#45;candidate promotion</text>
110
+ </g>
111
+ <!-- Retain&#45;&gt;Later -->
112
+ <g id="edge5" class="edge">
113
+ <title>Retain&#45;&gt;Later</title>
114
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M153,-143.2C153,-134.7 153,-125.71 153,-116.94"/>
115
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="155.8,-117.13 153,-109.13 150.2,-117.13 155.8,-117.13"/>
112
116
  </g>
113
- <!-- R5 -->
117
+ <!-- Schedule -->
114
118
  <g id="node7" class="node">
115
- <title>R5</title>
116
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1670.25,-652C1670.25,-652 1565.75,-652 1565.75,-652 1559.75,-652 1553.75,-646 1553.75,-640 1553.75,-640 1553.75,-620 1553.75,-620 1553.75,-614 1559.75,-608 1565.75,-608 1565.75,-608 1670.25,-608 1670.25,-608 1676.25,-608 1682.25,-614 1682.25,-620 1682.25,-620 1682.25,-640 1682.25,-640 1682.25,-646 1676.25,-652 1670.25,-652"/>
117
- <text xml:space="preserve" text-anchor="middle" x="1618" y="-638.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Policy (live MDP)</text>
118
- <text xml:space="preserve" text-anchor="middle" x="1618" y="-626.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">plan · complete · usable</text>
119
- <text xml:space="preserve" text-anchor="middle" x="1618" y="-614.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">warm Q + episode budget</text>
119
+ <title>Schedule</title>
120
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M583.8,-766.24C583.8,-766.24 334.2,-766.24 334.2,-766.24 328.2,-766.24 322.2,-760.24 322.2,-754.24 322.2,-754.24 322.2,-687.7 322.2,-687.7 322.2,-681.7 328.2,-675.7 334.2,-675.7 334.2,-675.7 583.8,-675.7 583.8,-675.7 589.8,-675.7 595.8,-681.7 595.8,-687.7 595.8,-687.7 595.8,-754.24 595.8,-754.24 595.8,-760.24 589.8,-766.24 583.8,-766.24"/>
121
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-744.27" font-family="sans-Serif" font-size="11.00" fill="#0f172a">A &#160;OPT IN / INVOKE EXPLICITLY</text>
122
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-730.77" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Cron seeds disabled by default:</text>
123
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-717.27" font-family="sans-Serif" font-size="11.00" fill="#0f172a">practice 03:00; offline_judge 03:30 daily</text>
124
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-703.77" font-family="sans-Serif" font-size="11.00" fill="#0f172a">train dry_run 04:00 Sunday</text>
125
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-690.27" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Seeding jobs does not install system crontab</text>
126
+ </g>
127
+ <!-- Practice -->
128
+ <g id="node8" class="node">
129
+ <title>Practice</title>
130
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M583.8,-627.7C583.8,-627.7 334.2,-627.7 334.2,-627.7 328.2,-627.7 322.2,-621.7 322.2,-615.7 322.2,-615.7 322.2,-549.16 322.2,-549.16 322.2,-543.16 328.2,-537.16 334.2,-537.16 334.2,-537.16 583.8,-537.16 583.8,-537.16 589.8,-537.16 595.8,-543.16 595.8,-549.16 595.8,-549.16 595.8,-615.7 595.8,-615.7 595.8,-621.7 589.8,-627.7 583.8,-627.7"/>
131
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-605.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">B &#160;PRACTICE / OFFLINE JUDGING</text>
132
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-592.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Practice: budget&#45;first; real tools may run</text>
133
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-578.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Judge&#45;qualified resolution + winning traces</text>
134
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-565.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Offline judge: backfill, calibrate, warm sentinel</text>
135
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-551.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Records: curriculum/ + mistakes / preferences</text>
136
+ </g>
137
+ <!-- Schedule&#45;&gt;Practice -->
138
+ <g id="edge6" class="edge">
139
+ <title>Schedule&#45;&gt;Practice</title>
140
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M459,-675.26C459,-663.36 459,-650.36 459,-637.99"/>
141
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="461.8,-638.21 459,-630.21 456.2,-638.21 461.8,-638.21"/>
142
+ <text xml:space="preserve" text-anchor="middle" x="530.62" y="-648.2" font-family="sans-Serif" font-size="10.00" fill="#cbd5e1">independent jobs; not a job chain</text>
120
143
  </g>
121
- <!-- Loop&#45;&gt;R5 -->
122
- <g id="edge3" class="edge">
123
- <title>Loop&#45;&gt;R5</title>
124
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1326.89,-794.36C1388.01,-783.08 1470.52,-761.71 1534,-722.5 1559.3,-706.87 1581.71,-681.54 1597.01,-661.48"/>
125
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="1599.21,-663.22 1601.72,-655.13 1594.71,-659.89 1599.21,-663.22"/>
126
- <text xml:space="preserve" text-anchor="middle" x="1535.69" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(s,a,r,s&#39;)</text>
144
+ <!-- Export -->
145
+ <g id="node9" class="node">
146
+ <title>Export</title>
147
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M583.8,-489.16C583.8,-489.16 334.2,-489.16 334.2,-489.16 328.2,-489.16 322.2,-483.16 322.2,-477.16 322.2,-477.16 322.2,-410.62 322.2,-410.62 322.2,-404.62 328.2,-398.62 334.2,-398.62 334.2,-398.62 583.8,-398.62 583.8,-398.62 589.8,-398.62 595.8,-404.62 595.8,-410.62 595.8,-410.62 595.8,-477.16 595.8,-477.16 595.8,-483.16 589.8,-489.16 583.8,-489.16"/>
148
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-467.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">C &#160;EXPORT TRAINING DATA</text>
149
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-453.69" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Learning.export_finetune + Reward.export_dpo</text>
150
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-440.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Eligible sessions / outcomes + preference pairs</text>
151
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-426.69" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Scrub, geometry and source&#45;balance filters</text>
152
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-413.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Output: finetune/*.jsonl + evaluation set</text>
153
+ </g>
154
+ <!-- Practice&#45;&gt;Export -->
155
+ <g id="edge7" class="edge">
156
+ <title>Practice&#45;&gt;Export</title>
157
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M459,-536.72C459,-524.82 459,-511.82 459,-499.45"/>
158
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="461.8,-499.67 459,-491.67 456.2,-499.67 461.8,-499.67"/>
159
+ <text xml:space="preserve" text-anchor="middle" x="503.62" y="-509.66" font-family="sans-Serif" font-size="10.00" fill="#cbd5e1">eligible retained data</text>
127
160
  </g>
128
- <!-- S2 -->
161
+ <!-- Train -->
129
162
  <g id="node10" class="node">
130
- <title>S2</title>
131
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M562.62,-648C562.62,-648 457.38,-648 457.38,-648 451.38,-648 445.38,-642 445.38,-636 445.38,-636 445.38,-624 445.38,-624 445.38,-618 451.38,-612 457.38,-612 457.38,-612 562.62,-612 562.62,-612 568.62,-612 574.62,-618 574.62,-624 574.62,-624 574.62,-636 574.62,-636 574.62,-642 568.62,-648 562.62,-648"/>
132
- <text xml:space="preserve" text-anchor="middle" x="510" y="-632.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">counterfactual</text>
133
- <text xml:space="preserve" text-anchor="middle" x="510" y="-620.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">real_dispatch vs imagined</text>
134
- </g>
135
- <!-- Loop&#45;&gt;S2 -->
136
- <g id="edge12" class="edge">
137
- <title>Loop&#45;&gt;S2</title>
138
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1157.14,-788.65C1138.07,-785.13 1117.89,-781.68 1099,-779 987.41,-763.18 694.03,-776.3 595,-722.5 566.07,-706.78 541.56,-677.52 526.4,-656.31"/>
139
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="528.85,-654.93 521.99,-649.96 524.25,-658.12 528.85,-654.93"/>
140
- <text xml:space="preserve" text-anchor="middle" x="666.52" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">[REPEATING]</text>
163
+ <title>Train</title>
164
+ <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M583.8,-361.62C583.8,-361.62 334.2,-361.62 334.2,-361.62 328.2,-361.62 322.2,-355.62 322.2,-349.62 322.2,-349.62 322.2,-283.08 322.2,-283.08 322.2,-277.08 328.2,-271.08 334.2,-271.08 334.2,-271.08 583.8,-271.08 583.8,-271.08 589.8,-271.08 595.8,-277.08 595.8,-283.08 595.8,-283.08 595.8,-349.62 595.8,-349.62 595.8,-355.62 589.8,-361.62 583.8,-361.62"/>
165
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-339.65" font-family="sans-Serif" font-size="11.00" fill="#0f172a">D &#160;train_and_gate</text>
166
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-326.15" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Dry run or no trainer → export_ready only</text>
167
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-312.65" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Otherwise: configured trainer → LoRA adapter</text>
168
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-299.15" font-family="sans-Serif" font-size="11.00" fill="#0f172a">ollama create → candidate vs baseline gate</text>
169
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-285.65" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Preference&#45;diet gate also required</text>
170
+ </g>
171
+ <!-- Export&#45;&gt;Train -->
172
+ <g id="edge8" class="edge">
173
+ <title>Export&#45;&gt;Train</title>
174
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M459,-398.28C459,-389.78 459,-380.79 459,-372.02"/>
175
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="461.8,-372.21 459,-364.21 456.2,-372.21 461.8,-372.21"/>
141
176
  </g>
142
- <!-- S3 -->
177
+ <!-- Model -->
143
178
  <g id="node11" class="node">
144
- <title>S3</title>
145
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M392.88,-648C392.88,-648 253.12,-648 253.12,-648 247.12,-648 241.12,-642 241.12,-636 241.12,-636 241.12,-624 241.12,-624 241.12,-618 247.12,-612 253.12,-612 253.12,-612 392.88,-612 392.88,-612 398.88,-612 404.88,-618 404.88,-624 404.88,-624 404.88,-636 404.88,-636 404.88,-642 398.88,-648 392.88,-648"/>
146
- <text xml:space="preserve" text-anchor="middle" x="323" y="-632.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">critic</text>
147
- <text xml:space="preserve" text-anchor="middle" x="323" y="-620.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">tool&#45;armed · revised_answer DPO</text>
148
- </g>
149
- <!-- Loop&#45;&gt;S3 -->
150
- <g id="edge11" class="edge">
151
- <title>Loop&#45;&gt;S3</title>
152
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M1157.18,-788.36C1138.11,-784.85 1117.91,-781.48 1099,-779 949.97,-759.46 562.11,-784.09 425,-722.5 391.56,-707.48 361.43,-677.4 342.73,-655.82"/>
153
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="344.95,-654.11 337.64,-649.8 340.67,-657.72 344.95,-654.11"/>
154
- <text xml:space="preserve" text-anchor="middle" x="481.79" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">final</text>
179
+ <title>Model</title>
180
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M583.8,-227.33C583.8,-227.33 334.2,-227.33 334.2,-227.33 328.2,-227.33 322.2,-221.33 322.2,-215.33 322.2,-215.33 322.2,-162.29 322.2,-162.29 322.2,-156.29 328.2,-150.29 334.2,-150.29 334.2,-150.29 583.8,-150.29 583.8,-150.29 589.8,-150.29 595.8,-156.29 595.8,-162.29 595.8,-162.29 595.8,-215.33 595.8,-215.33 595.8,-221.33 589.8,-227.33 583.8,-227.33"/>
181
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-205.36" font-family="sans-Serif" font-size="11.00" fill="#0f172a">E &#160;RETAIN GATED ADAPTER VERSION</text>
182
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-191.86" font-family="sans-Serif" font-size="11.00" fill="#0f172a">On passing gates: update curriculum model state</text>
183
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-178.36" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Optional local weight path, not routing policy</text>
184
+ <text xml:space="preserve" text-anchor="middle" x="459" y="-164.86" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Export alone is not training or improvement</text>
185
+ </g>
186
+ <!-- Train&#45;&gt;Model -->
187
+ <g id="edge9" class="edge">
188
+ <title>Train&#45;&gt;Model</title>
189
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M459,-270.74C459,-259.94 459,-248.37 459,-237.44"/>
190
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="461.8,-237.6 459,-229.6 456.2,-237.6 461.8,-237.6"/>
155
191
  </g>
156
- <!-- S4 -->
192
+ <!-- Hygiene -->
157
193
  <g id="node12" class="node">
158
- <title>S4</title>
159
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M718.88,-648C718.88,-648 627.12,-648 627.12,-648 621.12,-648 615.12,-642 615.12,-636 615.12,-636 615.12,-624 615.12,-624 615.12,-618 621.12,-612 627.12,-612 627.12,-612 718.88,-612 718.88,-612 724.88,-612 730.88,-618 730.88,-624 730.88,-624 730.88,-636 730.88,-636 730.88,-642 724.88,-648 718.88,-648"/>
160
- <text xml:space="preserve" text-anchor="middle" x="673" y="-632.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">red_team_plan</text>
161
- <text xml:space="preserve" text-anchor="middle" x="673" y="-620.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">adversarial plan review</text>
162
- </g>
163
- <!-- Loop&#45;&gt;S4 -->
194
+ <title>Hygiene</title>
195
+ <path fill="#1e293b" stroke="#334155" stroke-width="1.3" stroke-dasharray="5,2" d="M587.8,-106.54C587.8,-106.54 338.2,-106.54 338.2,-106.54 332.2,-106.54 326.2,-100.54 326.2,-94.54 326.2,-94.54 326.2,-28 326.2,-28 326.2,-22 332.2,-16 338.2,-16 338.2,-16 587.8,-16 587.8,-16 593.8,-16 599.8,-22 599.8,-28 599.8,-28 599.8,-94.54 599.8,-94.54 599.8,-100.54 593.8,-106.54 587.8,-106.54"/>
196
+ <text xml:space="preserve" text-anchor="middle" x="463" y="-84.57" font-family="sans-Serif" font-size="11.00" fill="#cbd5e1">SEPARATE ENABLED HYGIENE SEED</text>
197
+ <text xml:space="preserve" text-anchor="middle" x="463" y="-71.07" font-family="sans-Serif" font-size="11.00" fill="#cbd5e1">Learning.consolidate at 05:00 daily</text>
198
+ <text xml:space="preserve" text-anchor="middle" x="463" y="-57.57" font-family="sans-Serif" font-size="11.00" fill="#cbd5e1">Memory maintenance, not model training</text>
199
+ <text xml:space="preserve" text-anchor="middle" x="463" y="-44.07" font-family="sans-Serif" font-size="11.00" fill="#cbd5e1">ESR = verified_exploit_tools / vulnerable_tools</text>
200
+ <text xml:space="preserve" text-anchor="middle" x="463" y="-30.57" font-family="sans-Serif" font-size="11.00" fill="#cbd5e1">ASR = successful_attacks / total_attack_attempts</text>
201
+ </g>
202
+ <!-- Select -->
203
+ <g id="node13" class="node">
204
+ <title>Select</title>
205
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M891.8,-759.49C891.8,-759.49 642.2,-759.49 642.2,-759.49 636.2,-759.49 630.2,-753.49 630.2,-747.49 630.2,-747.49 630.2,-694.45 630.2,-694.45 630.2,-688.45 636.2,-682.45 642.2,-682.45 642.2,-682.45 891.8,-682.45 891.8,-682.45 897.8,-682.45 903.8,-688.45 903.8,-694.45 903.8,-694.45 903.8,-747.49 903.8,-747.49 903.8,-753.49 897.8,-759.49 891.8,-759.49"/>
206
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-737.52" font-family="sans-Serif" font-size="11.00" fill="#0f172a">I &#160;SELECT SNAPSHOTS</text>
207
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-724.02" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Explicit baseline + candidate policy bytes</text>
208
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-710.52" font-family="sans-Serif" font-size="11.00" fill="#0f172a">PolicyEvaluation; not live online writers</text>
209
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-697.02" font-family="sans-Serif" font-size="11.00" fill="#0f172a">No automatic handoff from RSI or training</text>
210
+ </g>
211
+ <!-- Eval -->
212
+ <g id="node14" class="node">
213
+ <title>Eval</title>
214
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M891.8,-627.7C891.8,-627.7 642.2,-627.7 642.2,-627.7 636.2,-627.7 630.2,-621.7 630.2,-615.7 630.2,-615.7 630.2,-549.16 630.2,-549.16 630.2,-543.16 636.2,-537.16 642.2,-537.16 642.2,-537.16 891.8,-537.16 891.8,-537.16 897.8,-537.16 903.8,-543.16 903.8,-549.16 903.8,-549.16 903.8,-615.7 903.8,-615.7 903.8,-621.7 897.8,-627.7 891.8,-627.7"/>
215
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-605.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">II &#160;EVALUATE LOCALLY</text>
216
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-592.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Public fixed held&#45;out tasks</text>
217
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-578.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Off / baseline / candidate comparisons</text>
218
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-565.23" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Two disposable filesystem environments</text>
219
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-551.73" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Regression replay is a separate split</text>
220
+ </g>
221
+ <!-- Select&#45;&gt;Eval -->
164
222
  <g id="edge10" class="edge">
165
- <title>Loop&#45;&gt;S4</title>
166
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M1157,-789.58C1137.93,-786 1117.79,-782.3 1099,-779 944.67,-751.91 887.53,-799.39 751,-722.5 723.51,-707.02 701.28,-677.91 687.69,-656.67"/>
167
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="690.2,-655.4 683.61,-650.07 685.44,-658.35 690.2,-655.4"/>
168
- <text xml:space="preserve" text-anchor="middle" x="801.08" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">plan_first</text>
223
+ <title>Select&#45;&gt;Eval</title>
224
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M767,-681.94C767,-668.21 767,-652.45 767,-637.61"/>
225
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="769.8,-637.99 767,-629.99 764.2,-637.99 769.8,-637.99"/>
169
226
  </g>
170
- <!-- C3 -->
171
- <g id="node13" class="node">
172
- <title>C3</title>
173
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M866.75,-648C866.75,-648 783.25,-648 783.25,-648 777.25,-648 771.25,-642 771.25,-636 771.25,-636 771.25,-624 771.25,-624 771.25,-618 777.25,-612 783.25,-612 783.25,-612 866.75,-612 866.75,-612 872.75,-612 878.75,-618 878.75,-624 878.75,-624 878.75,-636 878.75,-636 878.75,-642 872.75,-648 866.75,-648"/>
174
- <text xml:space="preserve" text-anchor="middle" x="825" y="-632.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">hindsight (HER)</text>
175
- <text xml:space="preserve" text-anchor="middle" x="825" y="-620.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">relabel achieved&#45;goal</text>
227
+ <!-- Gate -->
228
+ <g id="node15" class="node">
229
+ <title>Gate</title>
230
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M891.8,-489.16C891.8,-489.16 642.2,-489.16 642.2,-489.16 636.2,-489.16 630.2,-483.16 630.2,-477.16 630.2,-477.16 630.2,-410.62 630.2,-410.62 630.2,-404.62 636.2,-398.62 642.2,-398.62 642.2,-398.62 891.8,-398.62 891.8,-398.62 897.8,-398.62 903.8,-404.62 903.8,-410.62 903.8,-410.62 903.8,-477.16 903.8,-477.16 903.8,-483.16 897.8,-489.16 891.8,-489.16"/>
231
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-467.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">III &#160;REPLAY ACCEPTANCE</text>
232
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-453.69" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Fresh replay + aggregate nonregression</text>
233
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-440.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Per&#45;task nonregression + held&#45;out gain</text>
234
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-426.69" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Local controller evidence only</text>
235
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-413.19" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Not proof of general live LLM gains</text>
236
+ </g>
237
+ <!-- Eval&#45;&gt;Gate -->
238
+ <g id="edge11" class="edge">
239
+ <title>Eval&#45;&gt;Gate</title>
240
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M767,-536.72C767,-524.82 767,-511.82 767,-499.45"/>
241
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="769.8,-499.67 767,-491.67 764.2,-499.67 769.8,-499.67"/>
176
242
  </g>
177
- <!-- Loop&#45;&gt;C3 -->
178
- <g id="edge13" class="edge">
179
- <title>Loop&#45;&gt;C3</title>
180
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M1161.34,-778.08C1110.96,-761.73 1044.39,-742.07 984,-730.5 965.37,-726.93 915.72,-731.47 899,-722.5 871.75,-707.88 850.85,-678.56 838.32,-657.03"/>
181
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="840.78,-655.69 834.43,-650.07 835.89,-658.42 840.78,-655.69"/>
182
- <text xml:space="preserve" text-anchor="middle" x="1048.34" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">failed goal</text>
243
+ <!-- Approve -->
244
+ <g id="node16" class="node">
245
+ <title>Approve</title>
246
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M891.8,-354.87C891.8,-354.87 642.2,-354.87 642.2,-354.87 636.2,-354.87 630.2,-348.87 630.2,-342.87 630.2,-342.87 630.2,-289.83 630.2,-289.83 630.2,-283.83 636.2,-277.83 642.2,-277.83 642.2,-277.83 891.8,-277.83 891.8,-277.83 897.8,-277.83 903.8,-283.83 903.8,-289.83 903.8,-289.83 903.8,-342.87 903.8,-342.87 903.8,-348.87 897.8,-354.87 891.8,-354.87"/>
247
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-332.9" font-family="sans-Serif" font-size="11.00" fill="#0f172a">IV &#160;OPERATOR APPROVAL</text>
248
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-319.4" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Explicit live policy target</text>
249
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-305.9" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Approval + stopped writers required</text>
250
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-292.4" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Replace routing policy, not model weights</text>
251
+ </g>
252
+ <!-- Gate&#45;&gt;Approve -->
253
+ <g id="edge12" class="edge">
254
+ <title>Gate&#45;&gt;Approve</title>
255
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M767,-398.28C767,-387.48 767,-375.91 767,-364.98"/>
256
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="769.8,-365.14 767,-357.14 764.2,-365.14 769.8,-365.14"/>
183
257
  </g>
184
- <!-- Rates -->
258
+ <!-- Receipt -->
185
259
  <g id="node17" class="node">
186
- <title>Rates</title>
187
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M754.12,-464.5C754.12,-464.5 549.88,-464.5 549.88,-464.5 543.88,-464.5 537.88,-458.5 537.88,-452.5 537.88,-452.5 537.88,-432.5 537.88,-432.5 537.88,-426.5 543.88,-420.5 549.88,-420.5 549.88,-420.5 754.12,-420.5 754.12,-420.5 760.12,-420.5 766.12,-426.5 766.12,-432.5 766.12,-432.5 766.12,-452.5 766.12,-452.5 766.12,-458.5 760.12,-464.5 754.12,-464.5"/>
188
- <text xml:space="preserve" text-anchor="middle" x="652" y="-451" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ESR verified_exploit_tools / vulnerable_tools</text>
189
- <text xml:space="preserve" text-anchor="middle" x="652" y="-439" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ASR successful_attacks / total_attack_attempts</text>
190
- <text xml:space="preserve" text-anchor="middle" x="652" y="-427" font-family="sans-Serif" font-size="10.00" fill="#0f172a">rsi_tick on an ESR drop</text>
191
- </g>
192
- <!-- Loop&#45;&gt;Rates -->
193
- <g id="edge29" class="edge">
194
- <title>Loop&#45;&gt;Rates</title>
195
- <path fill="none" stroke="#34d399" stroke-width="1.3" stroke-dasharray="5,2" d="M1326.82,-804.13C1534.12,-798.68 2053.3,-779.44 2105,-722.5 2141.6,-682.19 2139.44,-642.17 2105,-600 2069.14,-556.08 1911.39,-554.91 1855,-549 1797.76,-543 874.5,-556.25 819,-541 769.01,-527.27 718.57,-494.63 686.41,-470.89"/>
196
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="688.29,-468.8 680.21,-466.24 684.93,-473.28 688.29,-468.8"/>
197
- <text xml:space="preserve" text-anchor="middle" x="2145.89" y="-626.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">rsi_tick</text>
198
- </g>
199
- <!-- Checks -->
200
- <g id="node30" class="node">
201
- <title>Checks</title>
202
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M2372.75,-648C2372.75,-648 2247.25,-648 2247.25,-648 2241.25,-648 2235.25,-642 2235.25,-636 2235.25,-636 2235.25,-624 2235.25,-624 2235.25,-618 2241.25,-612 2247.25,-612 2247.25,-612 2372.75,-612 2372.75,-612 2378.75,-612 2384.75,-618 2384.75,-624 2384.75,-624 2384.75,-636 2384.75,-636 2384.75,-642 2378.75,-648 2372.75,-648"/>
203
- <text xml:space="preserve" text-anchor="middle" x="2310" y="-632.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Host Verification</text>
204
- <text xml:space="preserve" text-anchor="middle" x="2310" y="-620.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">complete pass / fail / unknown</text>
205
- </g>
206
- <!-- Loop&#45;&gt;Checks -->
207
- <g id="edge37" class="edge">
208
- <title>Loop&#45;&gt;Checks</title>
209
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M1326.85,-801.69C1547.23,-790.08 2126.24,-756.68 2206,-722.5 2240.21,-707.84 2271.06,-677.47 2290.12,-655.74"/>
210
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="2292,-657.84 2295.07,-649.94 2287.74,-654.2 2292,-657.84"/>
211
- </g>
212
- <!-- E3 -->
213
- <g id="node8" class="node">
214
- <title>E3</title>
215
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M2075.12,-648C2075.12,-648 1936.88,-648 1936.88,-648 1930.88,-648 1924.88,-642 1924.88,-636 1924.88,-636 1924.88,-624 1924.88,-624 1924.88,-618 1930.88,-612 1936.88,-612 1936.88,-612 2075.12,-612 2075.12,-612 2081.12,-612 2087.12,-618 2087.12,-624 2087.12,-624 2087.12,-636 2087.12,-636 2087.12,-642 2081.12,-648 2075.12,-648"/>
216
- <text xml:space="preserve" text-anchor="middle" x="2006" y="-632.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">verify_as_reward</text>
217
- <text xml:space="preserve" text-anchor="middle" x="2006" y="-620.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">claim diagnostics; refutation caps</text>
218
- </g>
219
- <!-- R1&#45;&gt;E3 -->
220
- <g id="edge7" class="edge">
221
- <title>R1&#45;&gt;E3</title>
222
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1846.13,-630C1867.35,-630 1891.54,-630 1914.56,-630"/>
223
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1914.38,-632.8 1922.38,-630 1914.38,-627.2 1914.38,-632.8"/>
224
- <text xml:space="preserve" text-anchor="middle" x="1885.06" y="-634.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">ground</text>
225
- </g>
226
- <!-- Claims -->
227
- <g id="node26" class="node">
228
- <title>Claims</title>
229
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1904.88,-460.5C1904.88,-460.5 1753.12,-460.5 1753.12,-460.5 1747.12,-460.5 1741.12,-454.5 1741.12,-448.5 1741.12,-448.5 1741.12,-436.5 1741.12,-436.5 1741.12,-430.5 1747.12,-424.5 1753.12,-424.5 1753.12,-424.5 1904.88,-424.5 1904.88,-424.5 1910.88,-424.5 1916.88,-430.5 1916.88,-436.5 1916.88,-436.5 1916.88,-448.5 1916.88,-448.5 1916.88,-454.5 1910.88,-460.5 1904.88,-460.5"/>
230
- <text xml:space="preserve" text-anchor="middle" x="1829" y="-445" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Judge claim != verified completion</text>
231
- <text xml:space="preserve" text-anchor="middle" x="1829" y="-433" font-family="sans-Serif" font-size="10.00" fill="#0f172a">false rate = refuted / checked claims</text>
232
- </g>
233
- <!-- R1&#45;&gt;Claims -->
234
- <g id="edge8" class="edge">
235
- <title>R1&#45;&gt;Claims</title>
236
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1778.63,-607.01C1775.53,-590.78 1773.05,-568.28 1777.5,-549 1784.2,-519.98 1800.03,-489.72 1812.39,-469.08"/>
237
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1814.61,-470.82 1816.4,-462.54 1809.83,-467.89 1814.61,-470.82"/>
238
- <text xml:space="preserve" text-anchor="middle" x="1811.25" y="-556.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">fallible judgment</text>
239
- </g>
240
- <!-- R1&#45;&gt;Claims -->
241
- <g id="edge39" class="edge">
242
- <title>R1&#45;&gt;Claims</title>
243
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M1819.44,-607.11C1831.82,-597.42 1844.3,-584.83 1851,-570 1865.63,-537.62 1853.51,-496.51 1842.28,-470.1"/>
244
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1844.87,-469.03 1839.04,-462.88 1839.76,-471.32 1844.87,-469.03"/>
245
- </g>
246
- <!-- Fses -->
247
- <g id="node19" class="node">
248
- <title>Fses</title>
249
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M884.5,-283.5C884.5,-285.71 865.45,-287.5 842,-287.5 818.55,-287.5 799.5,-285.71 799.5,-283.5 799.5,-283.5 799.5,-247.5 799.5,-247.5 799.5,-245.29 818.55,-243.5 842,-243.5 865.45,-243.5 884.5,-245.29 884.5,-247.5 884.5,-247.5 884.5,-283.5 884.5,-283.5"/>
250
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M884.5,-283.5C884.5,-281.29 865.45,-279.5 842,-279.5 818.55,-279.5 799.5,-281.29 799.5,-283.5"/>
251
- <text xml:space="preserve" text-anchor="middle" x="842" y="-268" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions/*.jsonl</text>
252
- <text xml:space="preserve" text-anchor="middle" x="842" y="-256" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(step_reward)</text>
253
- </g>
254
- <!-- R2&#45;&gt;Fses -->
255
- <g id="edge14" class="edge">
256
- <title>R2&#45;&gt;Fses</title>
257
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1324.52,-607.66C1316.02,-562.88 1289.92,-458.91 1224,-406.5 1156.42,-352.76 1119.54,-377.7 1034,-366 1005.54,-362.11 930,-372.14 905,-358 881.17,-344.52 864.39,-317.84 854.17,-296.76"/>
258
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="856.78,-295.71 850.89,-289.61 851.69,-298.05 856.78,-295.71"/>
259
- <text xml:space="preserve" text-anchor="middle" x="1332.5" y="-439.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">step_reward</text>
260
- </g>
261
- <!-- Fmis -->
262
- <g id="node18" class="node">
263
- <title>Fmis</title>
264
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1105.38,-280.23C1105.38,-282.03 1088.17,-283.5 1067,-283.5 1045.83,-283.5 1028.62,-282.03 1028.62,-280.23 1028.62,-280.23 1028.62,-250.77 1028.62,-250.77 1028.62,-248.97 1045.83,-247.5 1067,-247.5 1088.17,-247.5 1105.38,-248.97 1105.38,-250.77 1105.38,-250.77 1105.38,-280.23 1105.38,-280.23"/>
265
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M1105.38,-280.23C1105.38,-278.42 1088.17,-276.95 1067,-276.95 1045.83,-276.95 1028.62,-278.42 1028.62,-280.23"/>
266
- <text xml:space="preserve" text-anchor="middle" x="1067" y="-262" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes.json</text>
267
- </g>
268
- <!-- R3&#45;&gt;Fmis -->
269
- <g id="edge16" class="edge">
270
- <title>R3&#45;&gt;Fmis</title>
271
- <path fill="none" stroke="#fb7185" stroke-width="1.3" stroke-dasharray="5,2" d="M1176.5,-607.47C1164.46,-567.69 1137.73,-480.01 1114,-406.5 1101.25,-367 1085.82,-321.46 1076.21,-293.32"/>
272
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="1078.94,-292.66 1073.7,-286 1073.65,-294.47 1078.94,-292.66"/>
273
- <text xml:space="preserve" text-anchor="middle" x="1185.11" y="-439.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">reward_signal</text>
274
- </g>
275
- <!-- Frws -->
276
- <g id="node24" class="node">
277
- <title>Frws</title>
278
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1250.62,-280.23C1250.62,-282.03 1227.04,-283.5 1198,-283.5 1168.96,-283.5 1145.38,-282.03 1145.38,-280.23 1145.38,-280.23 1145.38,-250.77 1145.38,-250.77 1145.38,-248.97 1168.96,-247.5 1198,-247.5 1227.04,-247.5 1250.62,-248.97 1250.62,-250.77 1250.62,-250.77 1250.62,-280.23 1250.62,-280.23"/>
279
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M1250.62,-280.23C1250.62,-278.42 1227.04,-276.95 1198,-276.95 1168.96,-276.95 1145.38,-278.42 1145.38,-280.23"/>
280
- <text xml:space="preserve" text-anchor="middle" x="1198" y="-262" font-family="sans-Serif" font-size="10.00" fill="#0f172a">reward_sentinel.json</text>
281
- </g>
282
- <!-- R3&#45;&gt;Frws -->
283
- <g id="edge15" class="edge">
284
- <title>R3&#45;&gt;Frws</title>
285
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1242.42,-607.44C1300.13,-585.89 1380.32,-554.14 1389,-541 1421.94,-491.11 1422.35,-456.11 1389,-406.5 1357.13,-359.1 1315.62,-392.36 1270,-358 1246.23,-340.1 1225.99,-312.53 1213.08,-292.33"/>
286
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1215.48,-290.89 1208.88,-285.57 1210.72,-293.84 1215.48,-290.89"/>
287
- </g>
288
- <!-- Fpol -->
289
- <g id="node20" class="node">
290
- <title>Fpol</title>
291
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1373.75,-283.5C1373.75,-285.71 1355.04,-287.5 1332,-287.5 1308.96,-287.5 1290.25,-285.71 1290.25,-283.5 1290.25,-283.5 1290.25,-247.5 1290.25,-247.5 1290.25,-245.29 1308.96,-243.5 1332,-243.5 1355.04,-243.5 1373.75,-245.29 1373.75,-247.5 1373.75,-247.5 1373.75,-283.5 1373.75,-283.5"/>
292
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M1373.75,-283.5C1373.75,-281.29 1355.04,-279.5 1332,-279.5 1308.96,-279.5 1290.25,-281.29 1290.25,-283.5"/>
293
- <text xml:space="preserve" text-anchor="middle" x="1332" y="-268" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy.json +</text>
294
- <text xml:space="preserve" text-anchor="middle" x="1332" y="-256" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_traj.jsonl</text>
295
- </g>
296
- <!-- R5&#45;&gt;Fpol -->
297
- <g id="edge9" class="edge">
298
- <title>R5&#45;&gt;Fpol</title>
299
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1600.75,-607.14C1551.56,-544.79 1410.56,-366.07 1354.95,-295.59"/>
300
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1357.28,-294.02 1350.13,-289.48 1352.88,-297.49 1357.28,-294.02"/>
301
- </g>
302
- <!-- S1 -->
303
- <g id="node9" class="node">
304
- <title>S1</title>
305
- <path fill="#6ee7b7" stroke="#334155" stroke-width="2" d="M1068.75,-652C1068.75,-652 931.25,-652 931.25,-652 925.25,-652 919.25,-646 919.25,-640 919.25,-640 919.25,-620 919.25,-620 919.25,-614 925.25,-608 931.25,-608 931.25,-608 1068.75,-608 1068.75,-608 1074.75,-608 1080.75,-614 1080.75,-620 1080.75,-620 1080.75,-640 1080.75,-640 1080.75,-646 1074.75,-652 1068.75,-652"/>
306
- <text xml:space="preserve" text-anchor="middle" x="1000" y="-638.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">practice</text>
307
- <text xml:space="preserve" text-anchor="middle" x="1000" y="-626.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">budget&#45;first + winning_trace DPO</text>
308
- <text xml:space="preserve" text-anchor="middle" x="1000" y="-614.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">auto&#45;resolve on judge&gt;=0.7</text>
309
- </g>
310
- <!-- S1&#45;&gt;Fmis -->
311
- <g id="edge17" class="edge">
312
- <title>S1&#45;&gt;Fmis</title>
313
- <path fill="none" stroke="#34d399" stroke-width="1.3" d="M1013.49,-598.31C1017.02,-589.32 1020.52,-579.39 1023,-570 1049.35,-470.09 1061.03,-347.25 1065.15,-293.66"/>
314
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="1011.01,-596.97 1010.59,-605.44 1016.2,-599.09 1011.01,-596.97"/>
315
- <polygon fill="#34d399" stroke="#34d399" stroke-width="1.3" points="1067.93,-294.04 1065.72,-285.85 1062.34,-293.62 1067.93,-294.04"/>
316
- <text xml:space="preserve" text-anchor="middle" x="1078.43" y="-439.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">auto&#45;resolve</text>
317
- </g>
318
- <!-- Fcur -->
319
- <g id="node22" class="node">
320
- <title>Fcur</title>
321
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M989,-280.23C989,-282.03 974.66,-283.5 957,-283.5 939.34,-283.5 925,-282.03 925,-280.23 925,-280.23 925,-250.77 925,-250.77 925,-248.97 939.34,-247.5 957,-247.5 974.66,-247.5 989,-248.97 989,-250.77 989,-250.77 989,-280.23 989,-280.23"/>
322
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M989,-280.23C989,-278.42 974.66,-276.95 957,-276.95 939.34,-276.95 925,-278.42 925,-280.23"/>
323
- <text xml:space="preserve" text-anchor="middle" x="957" y="-262" font-family="sans-Serif" font-size="10.00" fill="#0f172a">curriculum/</text>
324
- </g>
325
- <!-- S1&#45;&gt;Fcur -->
326
- <g id="edge18" class="edge">
327
- <title>S1&#45;&gt;Fcur</title>
328
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M997.41,-607.14C989.95,-544.24 968.43,-362.9 960.23,-293.74"/>
329
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="963.03,-293.58 959.31,-285.96 957.47,-294.24 963.03,-293.58"/>
330
- </g>
331
- <!-- W1 -->
332
- <g id="node14" class="node">
333
- <title>W1</title>
334
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M125.5,-470.5C125.5,-470.5 28.5,-470.5 28.5,-470.5 22.5,-470.5 16.5,-464.5 16.5,-458.5 16.5,-458.5 16.5,-426.5 16.5,-426.5 16.5,-420.5 22.5,-414.5 28.5,-414.5 28.5,-414.5 125.5,-414.5 125.5,-414.5 131.5,-414.5 137.5,-420.5 137.5,-426.5 137.5,-426.5 137.5,-458.5 137.5,-458.5 137.5,-464.5 131.5,-470.5 125.5,-470.5"/>
335
- <text xml:space="preserve" text-anchor="middle" x="77" y="-457" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preference ledger</text>
336
- <text xml:space="preserve" text-anchor="middle" x="77" y="-445" font-family="sans-Serif" font-size="10.00" fill="#0f172a">trajectory pairs</text>
337
- <text xml:space="preserve" text-anchor="middle" x="77" y="-433" font-family="sans-Serif" font-size="10.00" fill="#0f172a">scrub + geometry filter</text>
338
- <text xml:space="preserve" text-anchor="middle" x="77" y="-421" font-family="sans-Serif" font-size="10.00" fill="#0f172a">write+export &lt;=40%/src</text>
339
- </g>
340
- <!-- S2&#45;&gt;W1 -->
341
- <g id="edge19" class="edge">
342
- <title>S2&#45;&gt;W1</title>
343
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M460.8,-611.36C449.13,-607.41 436.68,-603.4 425,-600 332.36,-573.06 308.75,-567.18 214,-549 189.31,-544.26 179.95,-553.27 158,-541 132.39,-526.69 111.49,-500.84 97.34,-479.36"/>
344
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="99.78,-477.97 93.12,-472.73 95.05,-480.98 99.78,-477.97"/>
345
- <text xml:space="preserve" text-anchor="middle" x="341.36" y="-556.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(loser,winner)</text>
346
- </g>
347
- <!-- S3&#45;&gt;W1 -->
348
- <g id="edge20" class="edge">
349
- <title>S3&#45;&gt;W1</title>
350
- <path fill="none" stroke="#fb7185" stroke-width="1.3" d="M279.57,-611.44C244.58,-596.02 195.25,-571.35 158,-541 136.11,-523.16 115.81,-498.71 101.01,-478.75"/>
351
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="1.3" points="103.35,-477.2 96.38,-472.38 98.82,-480.5 103.35,-477.2"/>
352
- </g>
353
- <!-- C3&#45;&gt;Fses -->
354
- <g id="edge21" class="edge">
355
- <title>C3&#45;&gt;Fses</title>
356
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M825.82,-611.52C828.51,-554.11 837.11,-370.88 840.55,-297.41"/>
357
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="843.33,-297.88 840.91,-289.76 837.74,-297.62 843.33,-297.88"/>
358
- <text xml:space="preserve" text-anchor="middle" x="859.94" y="-439.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">success:soft</text>
359
- </g>
360
- <!-- Fprf -->
361
- <g id="node21" class="node">
362
- <title>Fprf</title>
363
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M639.12,-280.23C639.12,-282.03 618.9,-283.5 594,-283.5 569.1,-283.5 548.88,-282.03 548.88,-280.23 548.88,-280.23 548.88,-250.77 548.88,-250.77 548.88,-248.97 569.1,-247.5 594,-247.5 618.9,-247.5 639.12,-248.97 639.12,-250.77 639.12,-250.77 639.12,-280.23 639.12,-280.23"/>
364
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M639.12,-280.23C639.12,-278.42 618.9,-276.95 594,-276.95 569.1,-276.95 548.88,-278.42 548.88,-280.23"/>
365
- <text xml:space="preserve" text-anchor="middle" x="594" y="-262" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preferences.jsonl</text>
366
- </g>
367
- <!-- W1&#45;&gt;Fprf -->
368
- <g id="edge22" class="edge">
369
- <title>W1&#45;&gt;Fprf</title>
370
- <path fill="none" stroke="#f59e0b" stroke-width="2" d="M123.65,-413.91C154.46,-397.08 196.34,-376.78 236,-366 275.18,-355.35 287.28,-366.42 327,-358 405.42,-341.37 492.65,-308.63 545.4,-287.16"/>
371
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="2" points="546.34,-289.8 552.68,-284.17 544.22,-284.62 546.34,-289.8"/>
372
- </g>
373
- <!-- W2 -->
374
- <g id="node15" class="node">
375
- <title>W2</title>
376
- <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M302.38,-470.5C302.38,-470.5 189.62,-470.5 189.62,-470.5 183.62,-470.5 177.62,-464.5 177.62,-458.5 177.62,-458.5 177.62,-426.5 177.62,-426.5 177.62,-420.5 183.62,-414.5 189.62,-414.5 189.62,-414.5 302.38,-414.5 302.38,-414.5 308.38,-414.5 314.38,-420.5 314.38,-426.5 314.38,-426.5 314.38,-458.5 314.38,-458.5 314.38,-464.5 308.38,-470.5 302.38,-470.5"/>
377
- <text xml:space="preserve" text-anchor="middle" x="246" y="-457" font-family="sans-Serif" font-size="10.00" fill="#0f172a">train_and_gate</text>
378
- <text xml:space="preserve" text-anchor="middle" x="246" y="-445" font-family="sans-Serif" font-size="10.00" fill="#0f172a">SFT+DPO → LoRA vN+1</text>
379
- <text xml:space="preserve" text-anchor="middle" x="246" y="-433" font-family="sans-Serif" font-size="10.00" fill="#0f172a">gate + preference diet</text>
380
- <text xml:space="preserve" text-anchor="middle" x="246" y="-421" font-family="sans-Serif" font-size="10.00" fill="#0f172a">export_ready without trainer</text>
381
- </g>
382
- <!-- Fftn -->
383
- <g id="node23" class="node">
384
- <title>Fftn</title>
385
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M759.25,-280.23C759.25,-282.03 741.21,-283.5 719,-283.5 696.79,-283.5 678.75,-282.03 678.75,-280.23 678.75,-280.23 678.75,-250.77 678.75,-250.77 678.75,-248.97 696.79,-247.5 719,-247.5 741.21,-247.5 759.25,-248.97 759.25,-250.77 759.25,-250.77 759.25,-280.23 759.25,-280.23"/>
386
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M759.25,-280.23C759.25,-278.42 741.21,-276.95 719,-276.95 696.79,-276.95 678.75,-278.42 678.75,-280.23"/>
387
- <text xml:space="preserve" text-anchor="middle" x="719" y="-262" font-family="sans-Serif" font-size="10.00" fill="#0f172a">finetune/*.jsonl</text>
388
- </g>
389
- <!-- W2&#45;&gt;Fftn -->
390
- <g id="edge25" class="edge">
391
- <title>W2&#45;&gt;Fftn</title>
392
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M312.03,-413.64C319.69,-410.98 327.46,-408.52 335,-406.5 475.65,-368.84 536.38,-436.51 659,-358 682.86,-342.72 699.29,-314.19 708.84,-293.03"/>
393
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="711.4,-294.16 711.97,-285.71 706.25,-291.96 711.4,-294.16"/>
394
- </g>
395
- <!-- Ollama -->
396
- <g id="node25" class="node">
397
- <title>Ollama</title>
398
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M295.25,-283.5C295.25,-283.5 196.75,-283.5 196.75,-283.5 190.75,-283.5 184.75,-277.5 184.75,-271.5 184.75,-271.5 184.75,-259.5 184.75,-259.5 184.75,-253.5 190.75,-247.5 196.75,-247.5 196.75,-247.5 295.25,-247.5 295.25,-247.5 301.25,-247.5 307.25,-253.5 307.25,-259.5 307.25,-259.5 307.25,-271.5 307.25,-271.5 307.25,-277.5 301.25,-283.5 295.25,-283.5"/>
399
- <text xml:space="preserve" text-anchor="middle" x="246" y="-268" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ollama create pwn&#45;vN+1</text>
400
- <text xml:space="preserve" text-anchor="middle" x="246" y="-256" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(local LoRA adapter)</text>
401
- </g>
402
- <!-- W2&#45;&gt;Ollama -->
403
- <g id="edge26" class="edge">
404
- <title>W2&#45;&gt;Ollama</title>
405
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M246,-413.77C246,-381.18 246,-327.41 246,-294.64"/>
406
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="248.8,-295.02 246,-287.02 243.2,-295.02 248.8,-295.02"/>
407
- <text xml:space="preserve" text-anchor="middle" x="299.62" y="-367.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">optional configured trainer</text>
408
- </g>
409
- <!-- W3 -->
410
- <g id="node16" class="node">
411
- <title>W3</title>
412
- <path fill="#fda4af" stroke="#334155" stroke-width="1.3" d="M485.38,-460.5C485.38,-460.5 366.62,-460.5 366.62,-460.5 360.62,-460.5 354.62,-454.5 354.62,-448.5 354.62,-448.5 354.62,-436.5 354.62,-436.5 354.62,-430.5 360.62,-424.5 366.62,-424.5 366.62,-424.5 485.38,-424.5 485.38,-424.5 491.38,-424.5 497.38,-430.5 497.38,-436.5 497.38,-436.5 497.38,-448.5 497.38,-448.5 497.38,-454.5 491.38,-460.5 485.38,-460.5"/>
413
- <text xml:space="preserve" text-anchor="middle" x="426" y="-445" font-family="sans-Serif" font-size="10.00" fill="#0f172a">calibrate</text>
414
- <text xml:space="preserve" text-anchor="middle" x="426" y="-433" font-family="sans-Serif" font-size="10.00" fill="#0f172a">p(success) vs actual → Brier</text>
415
- </g>
416
- <!-- W3&#45;&gt;Loop -->
417
- <g id="edge28" class="edge">
418
- <title>W3&#45;&gt;Loop</title>
419
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M436.08,-460.93C450.71,-484.25 480.22,-524.57 518,-541 535.03,-548.41 1836.45,-548.09 1855,-549 1977.6,-555.04 2322.31,-509.29 2405,-600 2441.68,-640.24 2441.91,-682.48 2405,-722.5 2368.93,-761.62 1607.46,-792.81 1336.6,-802.7"/>
420
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1336.64,-799.9 1328.75,-802.99 1336.84,-805.5 1336.64,-799.9"/>
421
- <text xml:space="preserve" text-anchor="middle" x="2453.97" y="-626.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">calibration</text>
422
- </g>
423
- <!-- Fmis&#45;&gt;W2 -->
424
- <g id="edge27" class="edge">
425
- <title>Fmis&#45;&gt;W2</title>
426
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M1061.26,-284.11C1053.26,-305.57 1036.55,-341.05 1009,-358 881.09,-436.67 481.6,-373.98 335,-406.5 329.83,-407.65 324.57,-409.05 319.32,-410.63"/>
427
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="318.55,-407.94 311.78,-413.04 320.25,-413.27 318.55,-407.94"/>
428
- <text xml:space="preserve" text-anchor="middle" x="1008.13" y="-367.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">eval set</text>
429
- </g>
430
- <!-- Fses&#45;&gt;W2 -->
431
- <g id="edge24" class="edge">
432
- <title>Fses&#45;&gt;W2</title>
433
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M833.23,-288.06C823.35,-309.43 805.19,-341.32 779,-358 768.55,-364.66 681.29,-374.92 669,-376.5 521.18,-395.54 480.04,-372.21 335,-406.5 330.18,-407.64 325.27,-408.99 320.36,-410.49"/>
434
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="319.56,-407.8 312.81,-412.92 321.28,-413.13 319.56,-407.8"/>
435
- <text xml:space="preserve" text-anchor="middle" x="776.81" y="-367.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_finetune</text>
436
- </g>
437
- <!-- Frozen -->
438
- <g id="node31" class="node">
439
- <title>Frozen</title>
440
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1316.12,-157C1316.12,-157 1135.88,-157 1135.88,-157 1129.88,-157 1123.88,-151 1123.88,-145 1123.88,-145 1123.88,-133 1123.88,-133 1123.88,-127 1129.88,-121 1135.88,-121 1135.88,-121 1316.12,-121 1316.12,-121 1322.12,-121 1328.12,-127 1328.12,-133 1328.12,-133 1328.12,-145 1328.12,-145 1328.12,-151 1322.12,-157 1316.12,-157"/>
441
- <text xml:space="preserve" text-anchor="middle" x="1226" y="-141.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Explicit frozen PolicyEvaluation</text>
442
- <text xml:space="preserve" text-anchor="middle" x="1226" y="-129.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">public local held&#45;out / two filesystem suites</text>
443
- </g>
444
- <!-- Fpol&#45;&gt;Frozen -->
445
- <g id="edge41" class="edge">
446
- <title>Fpol&#45;&gt;Frozen</title>
447
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M1312.58,-243.11C1302.58,-232 1290.26,-218.12 1279.5,-205.5 1268.25,-192.3 1255.99,-177.34 1246.05,-165.05"/>
448
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1248.32,-163.41 1241.12,-158.93 1243.96,-166.92 1248.32,-163.41"/>
449
- <text xml:space="preserve" text-anchor="middle" x="1328.25" y="-196.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">snapshot, not live writes</text>
450
- </g>
451
- <!-- Fprf&#45;&gt;W2 -->
452
- <g id="edge23" class="edge">
453
- <title>Fprf&#45;&gt;W2</title>
454
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M560.24,-283.47C502.58,-312.47 384.17,-372.02 310.31,-409.16"/>
455
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="309.17,-406.6 303.28,-412.69 311.69,-411.6 309.17,-406.6"/>
456
- <text xml:space="preserve" text-anchor="middle" x="412.08" y="-367.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_dpo</text>
457
- </g>
458
- <!-- Ollama&#45;&gt;Loop -->
459
- <g id="edge36" class="edge">
460
- <title>Ollama&#45;&gt;Loop</title>
461
- <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M287.53,-284.13C342.18,-306.31 441.78,-343.3 531,-358 586.15,-367.09 978.13,-364.3 1034,-366 1435.55,-378.2 1542.66,-329.79 1937,-406.5 2190.54,-455.82 2335.83,-389.13 2485,-600 2516.44,-644.45 2519.62,-680.48 2485,-722.5 2481.58,-726.65 2395.34,-740.33 2390,-741 2187.36,-766.35 1575.31,-792.7 1337.73,-802.26"/>
462
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1337.95,-799.45 1330.07,-802.56 1338.17,-805.04 1337.95,-799.45"/>
463
- <text xml:space="preserve" text-anchor="middle" x="2492.42" y="-561.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">promoted vN+1</text>
464
- <text xml:space="preserve" text-anchor="middle" x="2492.42" y="-550.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(next session)</text>
465
- </g>
466
- <!-- Claims&#45;&gt;R5 -->
467
- <g id="edge40" class="edge">
468
- <title>Claims&#45;&gt;R5</title>
469
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M1782.15,-461.03C1742.29,-478.07 1685.97,-507.48 1650.25,-549 1638.28,-562.91 1630.38,-581.84 1625.4,-597.79"/>
470
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1622.74,-596.92 1623.21,-605.38 1628.12,-598.47 1622.74,-596.92"/>
471
- <text xml:space="preserve" text-anchor="middle" x="1707.62" y="-556.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">attributed eligible credit only</text>
472
- </g>
473
- <!-- Cron -->
474
- <g id="node27" class="node">
475
- <title>Cron</title>
476
- <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M2044,-829.38C2044,-829.38 1914,-829.38 1914,-829.38 1908,-829.38 1902,-823.38 1902,-817.38 1902,-817.38 1902,-796.62 1902,-796.62 1902,-790.62 1908,-784.62 1914,-784.62 1914,-784.62 2044,-784.62 2044,-784.62 2050,-784.62 2056,-790.62 2056,-796.62 2056,-796.62 2056,-817.38 2056,-817.38 2056,-823.38 2050,-829.38 2044,-829.38"/>
477
- <text xml:space="preserve" text-anchor="middle" x="1979" y="-815.88" font-family="sans-Serif" font-size="10.00" fill="#0f172a">⏱ &#160;PWN::Cron.install_defaults</text>
478
- <text xml:space="preserve" text-anchor="middle" x="1979" y="-803.12" font-family="sans-Serif" font-size="10.00" fill="#0f172a">practice · offline_judge</text>
479
- <text xml:space="preserve" text-anchor="middle" x="1979" y="-791.12" font-family="sans-Serif" font-size="10.00" fill="#0f172a">train dry_run · consolidate</text>
480
- </g>
481
- <!-- Cron&#45;&gt;S1 -->
482
- <g id="edge30" class="edge">
483
- <title>Cron&#45;&gt;S1</title>
484
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1918.28,-784.05C1864.39,-765.76 1783.09,-741.05 1710,-730.5 1676.62,-725.68 1134.45,-734.69 1103,-722.5 1070.48,-709.9 1041.59,-681.97 1022.75,-660.26"/>
485
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1025.08,-658.68 1017.78,-654.38 1020.8,-662.3 1025.08,-658.68"/>
486
- <text xml:space="preserve" text-anchor="middle" x="1809.77" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">OFF by default: 0 3 * * *</text>
487
- </g>
488
- <!-- Cron&#45;&gt;W2 -->
489
- <g id="edge32" class="edge">
490
- <title>Cron&#45;&gt;W2</title>
491
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M2056.64,-801.41C2180.91,-792.72 2417.39,-770.3 2485,-722.5 2554.95,-673.04 2629.47,-609.69 2569,-549 2558.05,-538.01 349.18,-547.29 335,-541 306.45,-528.34 283.08,-501.54 267.46,-479.23"/>
492
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="269.96,-477.94 263.16,-472.88 265.33,-481.07 269.96,-477.94"/>
493
- <text xml:space="preserve" text-anchor="middle" x="2638.98" y="-626.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">OFF by default: 0 4 * * 0</text>
494
- </g>
495
- <!-- OJ -->
496
- <g id="node28" class="node">
497
- <title>OJ</title>
498
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M2618,-825C2618,-825 2476,-825 2476,-825 2470,-825 2464,-819 2464,-813 2464,-813 2464,-801 2464,-801 2464,-795 2470,-789 2476,-789 2476,-789 2618,-789 2618,-789 2624,-789 2630,-795 2630,-801 2630,-801 2630,-813 2630,-813 2630,-819 2624,-825 2618,-825"/>
499
- <text xml:space="preserve" text-anchor="middle" x="2547" y="-809.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">offline_judge</text>
500
- <text xml:space="preserve" text-anchor="middle" x="2547" y="-797.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">judges + calibrate + warm sentinel</text>
501
- </g>
502
- <!-- Cron&#45;&gt;OJ -->
503
- <g id="edge31" class="edge">
504
- <title>Cron&#45;&gt;OJ</title>
505
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M2056.49,-807C2159.92,-807 2342.91,-807 2453.77,-807"/>
506
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="2453.64,-809.8 2461.64,-807 2453.64,-804.2 2453.64,-809.8"/>
507
- <text xml:space="preserve" text-anchor="middle" x="2260" y="-811.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">OFF by default: 30 3 * * *</text>
508
- </g>
509
- <!-- MemGC -->
510
- <g id="node29" class="node">
511
- <title>MemGC</title>
512
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M2763.62,-825C2763.62,-825 2682.38,-825 2682.38,-825 2676.38,-825 2670.38,-819 2670.38,-813 2670.38,-813 2670.38,-801 2670.38,-801 2670.38,-795 2676.38,-789 2682.38,-789 2682.38,-789 2763.62,-789 2763.62,-789 2769.62,-789 2775.62,-795 2775.62,-801 2775.62,-801 2775.62,-813 2775.62,-813 2775.62,-819 2769.62,-825 2763.62,-825"/>
513
- <text xml:space="preserve" text-anchor="middle" x="2723" y="-809.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.consolidate</text>
514
- <text xml:space="preserve" text-anchor="middle" x="2723" y="-797.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">nightly memory GC</text>
515
- </g>
516
- <!-- Cron&#45;&gt;MemGC -->
517
- <g id="edge33" class="edge">
518
- <title>Cron&#45;&gt;MemGC</title>
519
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M2044.01,-829.98C2090.56,-845.18 2155.11,-863.71 2213.62,-871.62 2310.06,-884.66 2555.21,-857.01 2650,-835 2656.91,-833.4 2664.04,-831.28 2671.01,-828.93"/>
520
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="2671.93,-831.57 2678.53,-826.26 2670.06,-826.3 2671.93,-831.57"/>
521
- <text xml:space="preserve" text-anchor="middle" x="2229" y="-874.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">0 5 * * *</text>
522
- </g>
523
- <!-- OJ&#45;&gt;R1 -->
524
- <g id="edge34" class="edge">
525
- <title>OJ&#45;&gt;R1</title>
526
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M2589.97,-788.42C2620.49,-773.56 2652.68,-751.41 2632,-730.5 2617.8,-716.14 1924.11,-729.03 1905,-722.5 1868.34,-709.98 1833.87,-681.64 1811.17,-659.79"/>
527
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1813.29,-657.95 1805.62,-654.34 1809.36,-661.95 1813.29,-657.95"/>
528
- <text xml:space="preserve" text-anchor="middle" x="2651.92" y="-732.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">backfill</text>
529
- </g>
530
- <!-- OJ&#45;&gt;W3 -->
531
- <g id="edge35" class="edge">
532
- <title>OJ&#45;&gt;W3</title>
533
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M2615.36,-788.4C2647.55,-775.99 2682.09,-755.5 2697,-722.5 2719.41,-672.88 2724.3,-647.11 2697,-600 2674.14,-560.56 2652.03,-560.81 2608,-549 2579.96,-541.48 544.63,-552.55 518,-541 484.34,-526.41 457.25,-492.81 441.4,-469.16"/>
534
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="443.85,-467.79 437.15,-462.59 439.15,-470.83 443.85,-467.79"/>
535
- <text xml:space="preserve" text-anchor="middle" x="2737.81" y="-626.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">p(success)</text>
536
- </g>
537
- <!-- Checks&#45;&gt;Claims -->
538
- <g id="edge38" class="edge">
539
- <title>Checks&#45;&gt;Claims</title>
540
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M2266.28,-611.41C2219.79,-593.33 2143.77,-565.56 2076,-549 2052.86,-543.35 2045.7,-548.22 2023,-541 1964.89,-522.53 1902.75,-488.47 1864.89,-465.9"/>
541
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1866.71,-463.73 1858.41,-462 1863.82,-468.52 1866.71,-463.73"/>
542
- </g>
543
- <!-- Promotion -->
544
- <g id="node32" class="node">
545
- <title>Promotion</title>
546
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1414.62,-44C1414.62,-44 1219.38,-44 1219.38,-44 1213.38,-44 1207.38,-38 1207.38,-32 1207.38,-32 1207.38,-12 1207.38,-12 1207.38,-6 1213.38,0 1219.38,0 1219.38,0 1414.62,0 1414.62,0 1420.62,0 1426.62,-6 1426.62,-12 1426.62,-12 1426.62,-32 1426.62,-32 1426.62,-38 1420.62,-44 1414.62,-44"/>
547
- <text xml:space="preserve" text-anchor="middle" x="1317" y="-30.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Fresh replay + per&#45;task nonregression</text>
548
- <text xml:space="preserve" text-anchor="middle" x="1317" y="-18.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">operator approval / stopped writers</text>
549
- <text xml:space="preserve" text-anchor="middle" x="1317" y="-6.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">receipt v1 + rollback refuses intervening writes</text>
550
- </g>
551
- <!-- Frozen&#45;&gt;Promotion -->
552
- <g id="edge42" class="edge">
553
- <title>Frozen&#45;&gt;Promotion</title>
554
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M1239.82,-120.53C1254.17,-102.4 1276.86,-73.73 1293.93,-52.15"/>
555
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1295.95,-54.11 1298.72,-46.1 1291.56,-50.64 1295.95,-54.11"/>
556
- </g>
557
- <!-- Promotion&#45;&gt;Fpol -->
558
- <g id="edge43" class="edge">
559
- <title>Promotion&#45;&gt;Fpol</title>
560
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M1328.22,-44.51C1344.14,-76.35 1372.51,-138.39 1383,-195 1385.87,-210.48 1377.77,-224.97 1367.24,-236.67"/>
561
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1365.43,-234.51 1361.82,-242.18 1369.42,-238.44 1365.43,-234.51"/>
562
- <text xml:space="preserve" text-anchor="middle" x="1400.34" y="-135.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">explicit target</text>
260
+ <title>Receipt</title>
261
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M891.8,-227.33C891.8,-227.33 642.2,-227.33 642.2,-227.33 636.2,-227.33 630.2,-221.33 630.2,-215.33 630.2,-215.33 630.2,-162.29 630.2,-162.29 630.2,-156.29 636.2,-150.29 642.2,-150.29 642.2,-150.29 891.8,-150.29 891.8,-150.29 897.8,-150.29 903.8,-156.29 903.8,-162.29 903.8,-162.29 903.8,-215.33 903.8,-215.33 903.8,-221.33 897.8,-227.33 891.8,-227.33"/>
262
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-205.36" font-family="sans-Serif" font-size="11.00" fill="#0f172a">V &#160;RETAIN RECEIPT / ROLLBACK</text>
263
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-191.86" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Versioned receipt v1 + byte digests</text>
264
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-178.36" font-family="sans-Serif" font-size="11.00" fill="#0f172a">Rollback refuses intervening live writes</text>
265
+ <text xml:space="preserve" text-anchor="middle" x="767" y="-164.86" font-family="sans-Serif" font-size="11.00" fill="#0f172a">No silent overwrite of newer policy state</text>
266
+ </g>
267
+ <!-- Approve&#45;&gt;Receipt -->
268
+ <g id="edge13" class="edge">
269
+ <title>Approve&#45;&gt;Receipt</title>
270
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" d="M767,-277.34C767,-264.81 767,-250.7 767,-237.53"/>
271
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="769.8,-237.66 767,-229.66 764.2,-237.66 769.8,-237.66"/>
563
272
  </g>
564
273
  </g>
565
274
  </svg>