pwn 0.5.669 → 0.5.673

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +1 -1
  4. data/README.md +13 -9
  5. data/documentation/AI-Integration.md +1 -1
  6. data/documentation/Agent-Tool-Registry.md +17 -5
  7. data/documentation/Configuration.md +19 -8
  8. data/documentation/Diagrams.md +2 -2
  9. data/documentation/Home.md +2 -2
  10. data/documentation/How-PWN-Works.md +12 -10
  11. data/documentation/Installation.md +3 -1
  12. data/documentation/Mistakes.md +3 -0
  13. data/documentation/Persistence.md +4 -1
  14. data/documentation/Reinforcement-Learning.md +90 -73
  15. data/documentation/Skills-Memory-Learning.md +28 -4
  16. data/documentation/What-is-PWN.md +8 -7
  17. data/documentation/Why-PWN.md +3 -2
  18. data/documentation/diagrams/agent-tool-registry.svg +188 -160
  19. data/documentation/diagrams/dot/agent-tool-registry.dot +7 -4
  20. data/documentation/diagrams/dot/memory-skills-detailed.dot +12 -5
  21. data/documentation/diagrams/dot/overall-pwn-architecture.dot +4 -3
  22. data/documentation/diagrams/dot/persistence-filesystem.dot +2 -1
  23. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +11 -4
  24. data/documentation/diagrams/dot/reinforcement-learning.dot +8 -3
  25. data/documentation/diagrams/dot/task-summarizer.dot +24 -12
  26. data/documentation/diagrams/memory-skills-detailed.svg +252 -210
  27. data/documentation/diagrams/overall-pwn-architecture.svg +21 -12
  28. data/documentation/diagrams/persistence-filesystem.svg +127 -113
  29. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +449 -397
  30. data/documentation/diagrams/reinforcement-learning.svg +276 -239
  31. data/documentation/diagrams/task-summarizer.svg +178 -126
  32. data/documentation/pwn-ai-Agent.md +66 -32
  33. data/lib/pwn/ai/agent/curriculum.rb +13 -4
  34. data/lib/pwn/ai/agent/dispatch.rb +3 -0
  35. data/lib/pwn/ai/agent/learning.rb +100 -14
  36. data/lib/pwn/ai/agent/loop.rb +692 -25
  37. data/lib/pwn/ai/agent/metrics.rb +52 -4
  38. data/lib/pwn/ai/agent/mistakes.rb +158 -1
  39. data/lib/pwn/ai/agent/policy.rb +935 -0
  40. data/lib/pwn/ai/agent/prompt_builder.rb +82 -6
  41. data/lib/pwn/ai/agent/reflect.rb +11 -3
  42. data/lib/pwn/ai/agent/registry.rb +18 -3
  43. data/lib/pwn/ai/agent/reward.rb +360 -48
  44. data/lib/pwn/ai/agent/task_summarizer.rb +415 -33
  45. data/lib/pwn/ai/agent/tool_guard.rb +157 -0
  46. data/lib/pwn/ai/agent/tools/policy.rb +76 -0
  47. data/lib/pwn/ai/agent/tools/ruby_eval.rb +27 -1
  48. data/lib/pwn/ai/agent/tools/shell.rb +28 -32
  49. data/lib/pwn/ai/agent.rb +2 -0
  50. data/lib/pwn/config.rb +14 -2
  51. data/lib/pwn/memory.rb +188 -0
  52. data/lib/pwn/sessions.rb +9 -4
  53. data/lib/pwn/version.rb +1 -1
  54. data/spec/integration/reinforced_feedback_loop_spec.rb +35 -9
  55. data/spec/lib/pwn/ai/agent/learning_spec.rb +119 -3
  56. data/spec/lib/pwn/ai/agent/loop_spec.rb +215 -3
  57. data/spec/lib/pwn/ai/agent/metrics_spec.rb +10 -0
  58. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +33 -0
  59. data/spec/lib/pwn/ai/agent/policy_spec.rb +165 -0
  60. data/spec/lib/pwn/ai/agent/prompt_builder_spec.rb +51 -0
  61. data/spec/lib/pwn/ai/agent/reward_spec.rb +75 -0
  62. data/spec/lib/pwn/ai/agent/signal_hygiene_spec.rb +118 -0
  63. data/spec/lib/pwn/ai/agent/task_summarizer_spec.rb +111 -6
  64. data/spec/lib/pwn/ai/agent/tool_guard_spec.rb +61 -0
  65. data/spec/lib/pwn/ai/agent/tools/policy_spec.rb +18 -0
  66. data/spec/lib/pwn/memory_spec.rb +62 -0
  67. data/spec/support/sandbox.rb +2 -0
  68. data/third_party/pwn_rdoc.jsonl +108 -4
  69. metadata +10 -3
@@ -4,65 +4,65 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_MemorySkills Pages: 1 -->
7
- <svg width="1763pt" height="752pt"
8
- viewBox="0.00 0.00 1763.00 752.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
7
+ <svg width="1882pt" height="752pt"
8
+ viewBox="0.00 0.00 1882.00 752.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
9
  <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 709.2)">
10
10
  <title>PWN_MemorySkills</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-709.2 1719.83,-709.2 1719.83,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="502.31" y="-644" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">Persistent Knowledge &#45; Memory · Skills · Learning · Mistakes · Sessions</text>
13
- <text xml:space="preserve" text-anchor="start" x="713.06" y="-632.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">everything under ~/.pwn/ that shapes future prompts</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-709.2 1838.83,-709.2 1838.83,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="524.69" y="-644" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">Persistent Knowledge &#45; Memory · Skills · Learning · Mistakes · Policy · Sessions</text>
13
+ <text xml:space="preserve" text-anchor="start" x="772.56" y="-632.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">everything under ~/.pwn/ that shapes future prompts</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_write</title>
16
- <path fill="#022c22" stroke="#047857" d="M20,-504.5C20,-504.5 1042,-504.5 1042,-504.5 1048,-504.5 1054,-510.5 1054,-516.5 1054,-516.5 1054,-607 1054,-607 1054,-613 1048,-619 1042,-619 1042,-619 20,-619 20,-619 14,-619 8,-613 8,-607 8,-607 8,-516.5 8,-516.5 8,-510.5 14,-504.5 20,-504.5"/>
17
- <text xml:space="preserve" text-anchor="middle" x="531" y="-596" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Write&#45;Side Tools</text>
16
+ <path fill="#022c22" stroke="#047857" d="M20,-504.5C20,-504.5 1226,-504.5 1226,-504.5 1232,-504.5 1238,-510.5 1238,-516.5 1238,-516.5 1238,-607 1238,-607 1238,-613 1232,-619 1226,-619 1226,-619 20,-619 20,-619 14,-619 8,-613 8,-607 8,-607 8,-516.5 8,-516.5 8,-510.5 14,-504.5 20,-504.5"/>
17
+ <text xml:space="preserve" text-anchor="middle" x="623" y="-596" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Write&#45;Side Tools</text>
18
18
  </g>
19
19
  <g id="clust3" class="cluster">
20
20
  <title>cluster_files</title>
21
- <path fill="#422006" stroke="#a16207" d="M49,-306.5C49,-306.5 1401,-306.5 1401,-306.5 1407,-306.5 1413,-312.5 1413,-318.5 1413,-318.5 1413,-433.5 1413,-433.5 1413,-439.5 1407,-445.5 1401,-445.5 1401,-445.5 49,-445.5 49,-445.5 43,-445.5 37,-439.5 37,-433.5 37,-433.5 37,-318.5 37,-318.5 37,-312.5 43,-306.5 49,-306.5"/>
22
- <text xml:space="preserve" text-anchor="middle" x="725" y="-422.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
21
+ <path fill="#422006" stroke="#a16207" d="M149,-306.5C149,-306.5 1705,-306.5 1705,-306.5 1711,-306.5 1717,-312.5 1717,-318.5 1717,-318.5 1717,-433.5 1717,-433.5 1717,-439.5 1711,-445.5 1705,-445.5 1705,-445.5 149,-445.5 149,-445.5 143,-445.5 137,-439.5 137,-433.5 137,-433.5 137,-318.5 137,-318.5 137,-312.5 143,-306.5 149,-306.5"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="927" y="-422.5" font-family="sans-Serif" font-size="20.00" fill="#fde68a">~/.pwn/</text>
23
23
  </g>
24
24
  <g id="clust5" class="cluster">
25
25
  <title>cluster_read</title>
26
- <path fill="#2e1065" stroke="#6d28d9" d="M68,-149C68,-149 930,-149 930,-149 936,-149 942,-155 942,-161 942,-161 942,-259.5 942,-259.5 942,-265.5 936,-271.5 930,-271.5 930,-271.5 68,-271.5 68,-271.5 62,-271.5 56,-265.5 56,-259.5 56,-259.5 56,-161 56,-161 56,-155 62,-149 68,-149"/>
27
- <text xml:space="preserve" text-anchor="middle" x="499" y="-248.5" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Read&#45;Side / Injection</text>
26
+ <path fill="#2e1065" stroke="#6d28d9" d="M384,-149C384,-149 1400,-149 1400,-149 1406,-149 1412,-155 1412,-161 1412,-161 1412,-259.5 1412,-259.5 1412,-265.5 1406,-271.5 1400,-271.5 1400,-271.5 384,-271.5 384,-271.5 378,-271.5 372,-265.5 372,-259.5 372,-259.5 372,-161 372,-161 372,-155 378,-149 384,-149"/>
27
+ <text xml:space="preserve" text-anchor="middle" x="892" y="-248.5" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Read&#45;Side / Injection</text>
28
28
  </g>
29
29
  <!-- Rem -->
30
30
  <g id="node1" class="node">
31
31
  <title>Rem</title>
32
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M730.5,-548.5C730.5,-548.5 627.5,-548.5 627.5,-548.5 621.5,-548.5 615.5,-542.5 615.5,-536.5 615.5,-536.5 615.5,-524.5 615.5,-524.5 615.5,-518.5 621.5,-512.5 627.5,-512.5 627.5,-512.5 730.5,-512.5 730.5,-512.5 736.5,-512.5 742.5,-518.5 742.5,-524.5 742.5,-524.5 742.5,-536.5 742.5,-536.5 742.5,-542.5 736.5,-548.5 730.5,-548.5"/>
33
- <text xml:space="preserve" text-anchor="middle" x="679" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory_remember · lean</text>
34
- <text xml:space="preserve" text-anchor="middle" x="679" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">key · value · category</text>
32
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1034.5,-548.5C1034.5,-548.5 931.5,-548.5 931.5,-548.5 925.5,-548.5 919.5,-542.5 919.5,-536.5 919.5,-536.5 919.5,-524.5 919.5,-524.5 919.5,-518.5 925.5,-512.5 931.5,-512.5 931.5,-512.5 1034.5,-512.5 1034.5,-512.5 1040.5,-512.5 1046.5,-518.5 1046.5,-524.5 1046.5,-524.5 1046.5,-536.5 1046.5,-536.5 1046.5,-542.5 1040.5,-548.5 1034.5,-548.5"/>
33
+ <text xml:space="preserve" text-anchor="middle" x="983" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory_remember · lean</text>
34
+ <text xml:space="preserve" text-anchor="middle" x="983" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">key · value · category</text>
35
35
  </g>
36
36
  <!-- Fmem -->
37
- <g id="node8" class="node">
37
+ <g id="node9" class="node">
38
38
  <title>Fmem</title>
39
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1243.12,-362.75C1243.12,-364.96 1216.18,-366.75 1183,-366.75 1149.82,-366.75 1122.88,-364.96 1122.88,-362.75 1122.88,-362.75 1122.88,-326.75 1122.88,-326.75 1122.88,-324.54 1149.82,-322.75 1183,-322.75 1216.18,-322.75 1243.12,-324.54 1243.12,-326.75 1243.12,-326.75 1243.12,-362.75 1243.12,-362.75"/>
40
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M1243.12,-362.75C1243.12,-360.54 1216.18,-358.75 1183,-358.75 1149.82,-358.75 1122.88,-360.54 1122.88,-362.75"/>
41
- <text xml:space="preserve" text-anchor="middle" x="1183" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory.json</text>
42
- <text xml:space="preserve" text-anchor="middle" x="1183" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">fact · pref · lesson · env</text>
39
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1343.12,-362.75C1343.12,-364.96 1316.18,-366.75 1283,-366.75 1249.82,-366.75 1222.88,-364.96 1222.88,-362.75 1222.88,-362.75 1222.88,-326.75 1222.88,-326.75 1222.88,-324.54 1249.82,-322.75 1283,-322.75 1316.18,-322.75 1343.12,-324.54 1343.12,-326.75 1343.12,-326.75 1343.12,-362.75 1343.12,-362.75"/>
40
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1343.12,-362.75C1343.12,-360.54 1316.18,-358.75 1283,-358.75 1249.82,-358.75 1222.88,-360.54 1222.88,-362.75"/>
41
+ <text xml:space="preserve" text-anchor="middle" x="1283" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory.json</text>
42
+ <text xml:space="preserve" text-anchor="middle" x="1283" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">fact · pref · lesson · env</text>
43
43
  </g>
44
44
  <!-- Rem&#45;&gt;Fmem -->
45
45
  <g id="edge1" class="edge">
46
46
  <title>Rem&#45;&gt;Fmem</title>
47
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M679.29,-512.03C680.64,-494.09 685.79,-466.96 704,-453.5 721.78,-440.35 1082.13,-455.21 1102,-445.5 1131.86,-430.91 1154.4,-399.53 1168.02,-375.83"/>
48
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1170.43,-377.25 1171.85,-368.9 1165.53,-374.55 1170.43,-377.25"/>
47
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1014.36,-511.95C1050.88,-491.8 1109.23,-460.63 1133,-453.5 1162.99,-444.5 1175.58,-460.63 1203,-445.5 1231.78,-429.62 1254.03,-398.73 1267.68,-375.52"/>
48
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1270,-377.09 1271.51,-368.75 1265.13,-374.33 1270,-377.09"/>
49
49
  </g>
50
50
  <!-- Fidx -->
51
- <g id="node9" class="node">
51
+ <g id="node10" class="node">
52
52
  <title>Fidx</title>
53
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M713.75,-369.5C713.75,-372.53 693.69,-375 669,-375 644.31,-375 624.25,-372.53 624.25,-369.5 624.25,-369.5 624.25,-320 624.25,-320 624.25,-316.97 644.31,-314.5 669,-314.5 693.69,-314.5 713.75,-316.97 713.75,-320 713.75,-320 713.75,-369.5 713.75,-369.5"/>
54
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M713.75,-369.5C713.75,-366.47 693.69,-364 669,-364 644.31,-364 624.25,-366.47 624.25,-369.5"/>
55
- <text xml:space="preserve" text-anchor="middle" x="669" y="-353.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory.idx</text>
56
- <text xml:space="preserve" text-anchor="middle" x="669" y="-341.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">embedding index</text>
57
- <text xml:space="preserve" text-anchor="middle" x="669" y="-329.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(sha → vec)</text>
53
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1182.75,-369.5C1182.75,-372.53 1162.69,-375 1138,-375 1113.31,-375 1093.25,-372.53 1093.25,-369.5 1093.25,-369.5 1093.25,-320 1093.25,-320 1093.25,-316.97 1113.31,-314.5 1138,-314.5 1162.69,-314.5 1182.75,-316.97 1182.75,-320 1182.75,-320 1182.75,-369.5 1182.75,-369.5"/>
54
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1182.75,-369.5C1182.75,-366.47 1162.69,-364 1138,-364 1113.31,-364 1093.25,-366.47 1093.25,-369.5"/>
55
+ <text xml:space="preserve" text-anchor="middle" x="1138" y="-353.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory.idx</text>
56
+ <text xml:space="preserve" text-anchor="middle" x="1138" y="-341.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">embedding index</text>
57
+ <text xml:space="preserve" text-anchor="middle" x="1138" y="-329.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(sha → vec)</text>
58
58
  </g>
59
59
  <!-- Rem&#45;&gt;Fidx -->
60
60
  <g id="edge18" class="edge">
61
61
  <title>Rem&#45;&gt;Fidx</title>
62
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M639.11,-511.89C624.01,-503.01 608.43,-490.65 600,-474.5 595.68,-466.23 597.38,-462.46 600,-453.5 601.17,-449.49 624.77,-413.02 644.05,-383.6"/>
63
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="646.22,-385.4 648.27,-377.17 641.54,-382.32 646.22,-385.4"/>
64
- <text xml:space="preserve" text-anchor="middle" x="624" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">incremental</text>
65
- <text xml:space="preserve" text-anchor="middle" x="624" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">re&#45;embed</text>
62
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M988.73,-512.02C995.47,-494.34 1008.42,-467.67 1029,-453.5 1045.37,-442.22 1056.45,-456.5 1073,-445.5 1095.14,-430.78 1111.44,-405.67 1122.18,-384.33"/>
63
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1124.65,-385.65 1125.59,-377.23 1119.61,-383.23 1124.65,-385.65"/>
64
+ <text xml:space="preserve" text-anchor="middle" x="1053" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">incremental</text>
65
+ <text xml:space="preserve" text-anchor="middle" x="1053" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">re&#45;embed</text>
66
66
  </g>
67
67
  <!-- Skc -->
68
68
  <g id="node2" class="node">
@@ -72,39 +72,39 @@
72
72
  <text xml:space="preserve" text-anchor="middle" x="66" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skill_add_reference</text>
73
73
  </g>
74
74
  <!-- Fskl -->
75
- <g id="node10" class="node">
75
+ <g id="node11" class="node">
76
76
  <title>Fskl</title>
77
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M158.75,-362.75C158.75,-364.96 133.31,-366.75 102,-366.75 70.69,-366.75 45.25,-364.96 45.25,-362.75 45.25,-362.75 45.25,-326.75 45.25,-326.75 45.25,-324.54 70.69,-322.75 102,-322.75 133.31,-322.75 158.75,-324.54 158.75,-326.75 158.75,-326.75 158.75,-362.75 158.75,-362.75"/>
78
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M158.75,-362.75C158.75,-360.54 133.31,-358.75 102,-358.75 70.69,-358.75 45.25,-360.54 45.25,-362.75"/>
79
- <text xml:space="preserve" text-anchor="middle" x="102" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skills/&lt;n&gt;/SKILL.md</text>
80
- <text xml:space="preserve" text-anchor="middle" x="102" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">YAML front&#45;matter refs</text>
77
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M258.75,-362.75C258.75,-364.96 233.31,-366.75 202,-366.75 170.69,-366.75 145.25,-364.96 145.25,-362.75 145.25,-362.75 145.25,-326.75 145.25,-326.75 145.25,-324.54 170.69,-322.75 202,-322.75 233.31,-322.75 258.75,-324.54 258.75,-326.75 258.75,-326.75 258.75,-362.75 258.75,-362.75"/>
78
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M258.75,-362.75C258.75,-360.54 233.31,-358.75 202,-358.75 170.69,-358.75 145.25,-360.54 145.25,-362.75"/>
79
+ <text xml:space="preserve" text-anchor="middle" x="202" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skills/&lt;n&gt;/SKILL.md</text>
80
+ <text xml:space="preserve" text-anchor="middle" x="202" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">YAML front&#45;matter refs</text>
81
81
  </g>
82
82
  <!-- Skc&#45;&gt;Fskl -->
83
83
  <g id="edge2" class="edge">
84
84
  <title>Skc&#45;&gt;Fskl</title>
85
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M69.45,-511.88C75.54,-480.79 88.27,-415.83 95.88,-376.99"/>
86
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="98.62,-377.57 97.41,-369.18 93.12,-376.49 98.62,-377.57"/>
85
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M79.04,-511.88C102.44,-480.27 151.77,-413.61 180.33,-375.03"/>
86
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="182.41,-376.92 184.92,-368.83 177.91,-373.59 182.41,-376.92"/>
87
87
  </g>
88
88
  <!-- Note -->
89
89
  <g id="node3" class="node">
90
90
  <title>Note</title>
91
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M400.25,-548.5C400.25,-548.5 307.75,-548.5 307.75,-548.5 301.75,-548.5 295.75,-542.5 295.75,-536.5 295.75,-536.5 295.75,-524.5 295.75,-524.5 295.75,-518.5 301.75,-512.5 307.75,-512.5 307.75,-512.5 400.25,-512.5 400.25,-512.5 406.25,-512.5 412.25,-518.5 412.25,-524.5 412.25,-524.5 412.25,-536.5 412.25,-536.5 412.25,-542.5 406.25,-548.5 400.25,-548.5"/>
92
- <text xml:space="preserve" text-anchor="middle" x="354" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_note_outcome</text>
93
- <text xml:space="preserve" text-anchor="middle" x="354" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_reflect</text>
91
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M563.25,-548.5C563.25,-548.5 470.75,-548.5 470.75,-548.5 464.75,-548.5 458.75,-542.5 458.75,-536.5 458.75,-536.5 458.75,-524.5 458.75,-524.5 458.75,-518.5 464.75,-512.5 470.75,-512.5 470.75,-512.5 563.25,-512.5 563.25,-512.5 569.25,-512.5 575.25,-518.5 575.25,-524.5 575.25,-524.5 575.25,-536.5 575.25,-536.5 575.25,-542.5 569.25,-548.5 563.25,-548.5"/>
92
+ <text xml:space="preserve" text-anchor="middle" x="517" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_note_outcome</text>
93
+ <text xml:space="preserve" text-anchor="middle" x="517" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_reflect</text>
94
94
  </g>
95
95
  <!-- Flrn -->
96
- <g id="node11" class="node">
96
+ <g id="node12" class="node">
97
97
  <title>Flrn</title>
98
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M409.5,-362.75C409.5,-364.96 393.14,-366.75 373,-366.75 352.86,-366.75 336.5,-364.96 336.5,-362.75 336.5,-362.75 336.5,-326.75 336.5,-326.75 336.5,-324.54 352.86,-322.75 373,-322.75 393.14,-322.75 409.5,-324.54 409.5,-326.75 409.5,-326.75 409.5,-362.75 409.5,-362.75"/>
99
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M409.5,-362.75C409.5,-360.54 393.14,-358.75 373,-358.75 352.86,-358.75 336.5,-360.54 336.5,-362.75"/>
100
- <text xml:space="preserve" text-anchor="middle" x="373" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning.jsonl</text>
101
- <text xml:space="preserve" text-anchor="middle" x="373" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">outcome log</text>
98
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M684.5,-362.75C684.5,-364.96 668.14,-366.75 648,-366.75 627.86,-366.75 611.5,-364.96 611.5,-362.75 611.5,-362.75 611.5,-326.75 611.5,-326.75 611.5,-324.54 627.86,-322.75 648,-322.75 668.14,-322.75 684.5,-324.54 684.5,-326.75 684.5,-326.75 684.5,-362.75 684.5,-362.75"/>
99
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M684.5,-362.75C684.5,-360.54 668.14,-358.75 648,-358.75 627.86,-358.75 611.5,-360.54 611.5,-362.75"/>
100
+ <text xml:space="preserve" text-anchor="middle" x="648" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning.jsonl</text>
101
+ <text xml:space="preserve" text-anchor="middle" x="648" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">outcome log</text>
102
102
  </g>
103
103
  <!-- Note&#45;&gt;Flrn -->
104
104
  <g id="edge3" class="edge">
105
105
  <title>Note&#45;&gt;Flrn</title>
106
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M349.65,-512.29C347.15,-501.51 344.27,-487.29 343,-474.5 339.63,-440.48 350.34,-402.45 359.89,-376.61"/>
107
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="362.49,-377.64 362.75,-369.17 357.26,-375.63 362.49,-377.64"/>
106
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M517.24,-511.89C518.48,-494.38 523.26,-468.07 540,-453.5 557.31,-438.44 572.11,-458.52 591,-445.5 614.85,-429.06 629.99,-399.16 638.62,-376.37"/>
107
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="641.21,-377.43 641.26,-368.95 635.94,-375.55 641.21,-377.43"/>
108
108
  </g>
109
109
  <!-- Dist -->
110
110
  <g id="node4" class="node">
@@ -116,342 +116,384 @@
116
116
  <!-- Dist&#45;&gt;Fskl -->
117
117
  <g id="edge4" class="edge">
118
118
  <title>Dist&#45;&gt;Fskl</title>
119
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M196.03,-511.88C178.21,-480.4 140.72,-414.17 118.85,-375.52"/>
120
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="121.51,-374.54 115.14,-368.96 116.64,-377.3 121.51,-374.54"/>
119
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M188.25,-511.89C179.41,-501.86 169.65,-488.52 165,-474.5 153.88,-440.98 168.97,-401.93 183.09,-375.7"/>
120
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="185.35,-377.39 186.83,-369.04 180.47,-374.64 185.35,-377.39"/>
121
121
  </g>
122
122
  <!-- Fses -->
123
- <g id="node12" class="node">
123
+ <g id="node13" class="node">
124
124
  <title>Fses</title>
125
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M296.88,-362.75C296.88,-364.96 274.97,-366.75 248,-366.75 221.03,-366.75 199.12,-364.96 199.12,-362.75 199.12,-362.75 199.12,-326.75 199.12,-326.75 199.12,-324.54 221.03,-322.75 248,-322.75 274.97,-322.75 296.88,-324.54 296.88,-326.75 296.88,-326.75 296.88,-362.75 296.88,-362.75"/>
126
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M296.88,-362.75C296.88,-360.54 274.97,-358.75 248,-358.75 221.03,-358.75 199.12,-360.54 199.12,-362.75"/>
127
- <text xml:space="preserve" text-anchor="middle" x="248" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions/*.jsonl</text>
128
- <text xml:space="preserve" text-anchor="middle" x="248" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">transcripts (+ lean)</text>
125
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M396.88,-362.75C396.88,-364.96 374.97,-366.75 348,-366.75 321.03,-366.75 299.12,-364.96 299.12,-362.75 299.12,-362.75 299.12,-326.75 299.12,-326.75 299.12,-324.54 321.03,-322.75 348,-322.75 374.97,-322.75 396.88,-324.54 396.88,-326.75 396.88,-326.75 396.88,-362.75 396.88,-362.75"/>
126
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M396.88,-362.75C396.88,-360.54 374.97,-358.75 348,-358.75 321.03,-358.75 299.12,-360.54 299.12,-362.75"/>
127
+ <text xml:space="preserve" text-anchor="middle" x="348" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions/*.jsonl</text>
128
+ <text xml:space="preserve" text-anchor="middle" x="348" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">transcripts (+ lean)</text>
129
129
  </g>
130
130
  <!-- Dist&#45;&gt;Fses -->
131
131
  <g id="edge5" class="edge">
132
132
  <title>Dist&#45;&gt;Fses</title>
133
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M212.22,-502.31C220.61,-465.56 235.42,-400.8 243.09,-367.25"/>
134
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="209.52,-501.54 210.47,-509.96 214.98,-502.79 209.52,-501.54"/>
135
- <text xml:space="preserve" text-anchor="middle" x="233.36" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">mine</text>
133
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M208.33,-502.17C211.22,-485.66 217.61,-465.55 231.75,-453.5 247.96,-439.68 261.03,-456.93 279,-445.5 308.49,-426.73 328.75,-390.36 339.35,-367.11"/>
134
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="205.58,-501.62 207.23,-509.93 211.13,-502.41 205.58,-501.62"/>
135
+ <text xml:space="preserve" text-anchor="middle" x="241.88" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">mine</text>
136
136
  </g>
137
137
  <!-- Mrec -->
138
138
  <g id="node5" class="node">
139
139
  <title>Mrec</title>
140
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M863.25,-548.5C863.25,-548.5 794.75,-548.5 794.75,-548.5 788.75,-548.5 782.75,-542.5 782.75,-536.5 782.75,-536.5 782.75,-524.5 782.75,-524.5 782.75,-518.5 788.75,-512.5 794.75,-512.5 794.75,-512.5 863.25,-512.5 863.25,-512.5 869.25,-512.5 875.25,-518.5 875.25,-524.5 875.25,-524.5 875.25,-536.5 875.25,-536.5 875.25,-542.5 869.25,-548.5 863.25,-548.5"/>
141
- <text xml:space="preserve" text-anchor="middle" x="829" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_record</text>
142
- <text xml:space="preserve" text-anchor="middle" x="829" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_resolve</text>
140
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M867.25,-548.5C867.25,-548.5 798.75,-548.5 798.75,-548.5 792.75,-548.5 786.75,-542.5 786.75,-536.5 786.75,-536.5 786.75,-524.5 786.75,-524.5 786.75,-518.5 792.75,-512.5 798.75,-512.5 798.75,-512.5 867.25,-512.5 867.25,-512.5 873.25,-512.5 879.25,-518.5 879.25,-524.5 879.25,-524.5 879.25,-536.5 879.25,-536.5 879.25,-542.5 873.25,-548.5 867.25,-548.5"/>
141
+ <text xml:space="preserve" text-anchor="middle" x="833" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_record</text>
142
+ <text xml:space="preserve" text-anchor="middle" x="833" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_resolve</text>
143
143
  </g>
144
144
  <!-- Mrec&#45;&gt;Fmem -->
145
145
  <g id="edge7" class="edge">
146
146
  <title>Mrec&#45;&gt;Fmem</title>
147
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M875.85,-511.98C882.61,-509.47 889.48,-506.91 896,-504.5 957.72,-481.66 971.01,-468.84 1035,-453.5 1064.16,-446.51 1075.74,-459.98 1102,-445.5 1130.93,-429.55 1153.49,-398.68 1167.38,-375.48"/>
148
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1169.71,-377.05 1171.28,-368.72 1164.86,-374.25 1169.71,-377.05"/>
149
- <text xml:space="preserve" text-anchor="middle" x="1068" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">resolve→lesson</text>
147
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M849.06,-512.06C867.34,-493.6 899.08,-465.49 933,-453.5 961.3,-443.5 1176.14,-458.88 1203,-445.5 1232.6,-430.75 1254.84,-399.39 1268.26,-375.75"/>
148
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="1270.66,-377.2 1272.03,-368.84 1265.74,-374.52 1270.66,-377.2"/>
149
+ <text xml:space="preserve" text-anchor="middle" x="966" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">resolve→lesson</text>
150
150
  </g>
151
151
  <!-- Fmis -->
152
- <g id="node13" class="node">
152
+ <g id="node14" class="node">
153
153
  <title>Fmis</title>
154
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M893.88,-362.75C893.88,-364.96 862.56,-366.75 824,-366.75 785.44,-366.75 754.12,-364.96 754.12,-362.75 754.12,-362.75 754.12,-326.75 754.12,-326.75 754.12,-324.54 785.44,-322.75 824,-322.75 862.56,-322.75 893.88,-324.54 893.88,-326.75 893.88,-326.75 893.88,-362.75 893.88,-362.75"/>
155
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M893.88,-362.75C893.88,-360.54 862.56,-358.75 824,-358.75 785.44,-358.75 754.12,-360.54 754.12,-362.75"/>
156
- <text xml:space="preserve" text-anchor="middle" x="824" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes.json</text>
157
- <text xml:space="preserve" text-anchor="middle" x="824" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sig → count · fix · regressed</text>
154
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1052.88,-362.75C1052.88,-364.96 1021.56,-366.75 983,-366.75 944.44,-366.75 913.12,-364.96 913.12,-362.75 913.12,-362.75 913.12,-326.75 913.12,-326.75 913.12,-324.54 944.44,-322.75 983,-322.75 1021.56,-322.75 1052.88,-324.54 1052.88,-326.75 1052.88,-326.75 1052.88,-362.75 1052.88,-362.75"/>
155
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1052.88,-362.75C1052.88,-360.54 1021.56,-358.75 983,-358.75 944.44,-358.75 913.12,-360.54 913.12,-362.75"/>
156
+ <text xml:space="preserve" text-anchor="middle" x="983" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes.json</text>
157
+ <text xml:space="preserve" text-anchor="middle" x="983" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sig → count · fix · regressed</text>
158
158
  </g>
159
159
  <!-- Mrec&#45;&gt;Fmis -->
160
160
  <g id="edge6" class="edge">
161
161
  <title>Mrec&#45;&gt;Fmis</title>
162
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M817.81,-511.95C811.83,-501.51 805.08,-487.76 802,-474.5 794.31,-441.4 803.16,-402.93 811.83,-376.73"/>
163
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="814.47,-377.65 814.45,-369.18 809.18,-375.81 814.47,-377.65"/>
162
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M834.48,-512.11C836.89,-494.76 843.26,-468.59 860,-453.5 871.21,-443.4 880.03,-453.22 893,-445.5 922.45,-427.96 947.74,-397.69 963.95,-375.08"/>
163
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="966.09,-376.91 968.37,-368.75 961.5,-373.7 966.09,-376.91"/>
164
164
  </g>
165
165
  <!-- Fprf -->
166
- <g id="node16" class="node">
166
+ <g id="node17" class="node">
167
167
  <title>Fprf</title>
168
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1082.38,-362.75C1082.38,-364.96 1049.04,-366.75 1008,-366.75 966.96,-366.75 933.62,-364.96 933.62,-362.75 933.62,-362.75 933.62,-326.75 933.62,-326.75 933.62,-324.54 966.96,-322.75 1008,-322.75 1049.04,-322.75 1082.38,-324.54 1082.38,-326.75 1082.38,-326.75 1082.38,-362.75 1082.38,-362.75"/>
169
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M1082.38,-362.75C1082.38,-360.54 1049.04,-358.75 1008,-358.75 966.96,-358.75 933.62,-360.54 933.62,-362.75"/>
170
- <text xml:space="preserve" text-anchor="middle" x="1008" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preferences.jsonl</text>
171
- <text xml:space="preserve" text-anchor="middle" x="1008" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">DPO (prompt,rejected,chosen)</text>
168
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M873.38,-362.75C873.38,-364.96 840.04,-366.75 799,-366.75 757.96,-366.75 724.62,-364.96 724.62,-362.75 724.62,-362.75 724.62,-326.75 724.62,-326.75 724.62,-324.54 757.96,-322.75 799,-322.75 840.04,-322.75 873.38,-324.54 873.38,-326.75 873.38,-326.75 873.38,-362.75 873.38,-362.75"/>
169
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M873.38,-362.75C873.38,-360.54 840.04,-358.75 799,-358.75 757.96,-358.75 724.62,-360.54 724.62,-362.75"/>
170
+ <text xml:space="preserve" text-anchor="middle" x="799" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">preferences.jsonl</text>
171
+ <text xml:space="preserve" text-anchor="middle" x="799" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">DPO (prompt,rejected,chosen)</text>
172
172
  </g>
173
173
  <!-- Mrec&#45;&gt;Fprf -->
174
- <g id="edge34" class="edge">
174
+ <g id="edge37" class="edge">
175
175
  <title>Mrec&#45;&gt;Fprf</title>
176
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M825.44,-512.08C823.01,-494.73 822.55,-468.54 837.75,-453.5 849.86,-441.51 898.73,-453.06 914,-445.5 945.86,-429.73 972.54,-398.39 989.24,-375.03"/>
177
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="991.34,-376.92 993.61,-368.76 986.74,-373.73 991.34,-376.92"/>
178
- <text xml:space="preserve" text-anchor="middle" x="867.38" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">resolve → pair</text>
176
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M789.81,-511.9C781.97,-509.14 773.81,-506.53 766,-504.5 723.09,-493.36 597.65,-508.13 568.75,-474.5 562.67,-467.42 562.35,-460.29 568.75,-453.5 579.15,-442.47 691.26,-451.92 705,-445.5 737.4,-430.37 764.16,-398.63 780.73,-374.99"/>
177
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="782.86,-376.83 785.05,-368.64 778.23,-373.68 782.86,-376.83"/>
178
+ <text xml:space="preserve" text-anchor="middle" x="598.38" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">resolve → pair</text>
179
179
  </g>
180
180
  <!-- Xft -->
181
181
  <g id="node6" class="node">
182
182
  <title>Xft</title>
183
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M563.25,-548.5C563.25,-548.5 464.75,-548.5 464.75,-548.5 458.75,-548.5 452.75,-542.5 452.75,-536.5 452.75,-536.5 452.75,-524.5 452.75,-524.5 452.75,-518.5 458.75,-512.5 464.75,-512.5 464.75,-512.5 563.25,-512.5 563.25,-512.5 569.25,-512.5 575.25,-518.5 575.25,-524.5 575.25,-524.5 575.25,-536.5 575.25,-536.5 575.25,-542.5 569.25,-548.5 563.25,-548.5"/>
184
- <text xml:space="preserve" text-anchor="middle" x="514" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.export_finetune</text>
185
- <text xml:space="preserve" text-anchor="middle" x="514" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(sessions → dataset)</text>
183
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M406.25,-548.5C406.25,-548.5 307.75,-548.5 307.75,-548.5 301.75,-548.5 295.75,-542.5 295.75,-536.5 295.75,-536.5 295.75,-524.5 295.75,-524.5 295.75,-518.5 301.75,-512.5 307.75,-512.5 307.75,-512.5 406.25,-512.5 406.25,-512.5 412.25,-512.5 418.25,-518.5 418.25,-524.5 418.25,-524.5 418.25,-536.5 418.25,-536.5 418.25,-542.5 412.25,-548.5 406.25,-548.5"/>
184
+ <text xml:space="preserve" text-anchor="middle" x="357" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.export_finetune</text>
185
+ <text xml:space="preserve" text-anchor="middle" x="357" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(sessions → dataset)</text>
186
186
  </g>
187
187
  <!-- Xft&#45;&gt;Flrn -->
188
188
  <g id="edge21" class="edge">
189
189
  <title>Xft&#45;&gt;Flrn</title>
190
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M486.31,-505.57C475.88,-496.18 464.11,-485.13 454,-474.5 422.52,-441.39 396.6,-394.23 383.1,-367.13"/>
191
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="484.32,-507.54 492.15,-510.77 488.04,-503.36 484.32,-507.54"/>
192
- <text xml:space="preserve" text-anchor="middle" x="479.5" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">success:true</text>
190
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M382.44,-505.4C402.98,-487.58 433.55,-464.57 465,-453.5 491.47,-444.19 567.19,-460.34 591,-445.5 619.27,-427.88 634.91,-390.8 642.37,-367.15"/>
191
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="380.67,-503.23 376.55,-510.64 384.39,-507.42 380.67,-503.23"/>
192
+ <text xml:space="preserve" text-anchor="middle" x="490.5" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">success:true</text>
193
193
  </g>
194
194
  <!-- Xft&#45;&gt;Fses -->
195
195
  <g id="edge20" class="edge">
196
196
  <title>Xft&#45;&gt;Fses</title>
197
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M455.13,-508.54C405.49,-490.13 339.1,-463.53 317,-445.5 290.41,-423.8 269.7,-389.3 258.17,-367.09"/>
198
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="453.87,-511.06 462.34,-511.2 455.81,-505.81 453.87,-511.06"/>
199
- <text xml:space="preserve" text-anchor="middle" x="375.9" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">mine</text>
197
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M300.13,-507.31C286.48,-499.13 273.59,-488.37 265.75,-474.5 261.16,-466.37 261.16,-461.63 265.75,-453.5 269.13,-447.51 273.99,-450.21 279,-445.5 303.7,-422.28 324.63,-388.81 336.75,-367.17"/>
198
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="298.63,-509.68 306.98,-511.11 301.35,-504.78 298.63,-509.68"/>
199
+ <text xml:space="preserve" text-anchor="middle" x="275.88" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">mine</text>
200
200
  </g>
201
201
  <!-- Fftn -->
202
- <g id="node15" class="node">
202
+ <g id="node16" class="node">
203
203
  <title>Fftn</title>
204
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M584.25,-362.75C584.25,-364.96 554.11,-366.75 517,-366.75 479.89,-366.75 449.75,-364.96 449.75,-362.75 449.75,-362.75 449.75,-326.75 449.75,-326.75 449.75,-324.54 479.89,-322.75 517,-322.75 554.11,-322.75 584.25,-324.54 584.25,-326.75 584.25,-326.75 584.25,-362.75 584.25,-362.75"/>
205
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M584.25,-362.75C584.25,-360.54 554.11,-358.75 517,-358.75 479.89,-358.75 449.75,-360.54 449.75,-362.75"/>
206
- <text xml:space="preserve" text-anchor="middle" x="517" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">finetune/*.jsonl</text>
207
- <text xml:space="preserve" text-anchor="middle" x="517" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ShareGPT / OpenAI / DPO</text>
204
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M571.25,-362.75C571.25,-364.96 541.11,-366.75 504,-366.75 466.89,-366.75 436.75,-364.96 436.75,-362.75 436.75,-362.75 436.75,-326.75 436.75,-326.75 436.75,-324.54 466.89,-322.75 504,-322.75 541.11,-322.75 571.25,-324.54 571.25,-326.75 571.25,-326.75 571.25,-362.75 571.25,-362.75"/>
205
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M571.25,-362.75C571.25,-360.54 541.11,-358.75 504,-358.75 466.89,-358.75 436.75,-360.54 436.75,-362.75"/>
206
+ <text xml:space="preserve" text-anchor="middle" x="504" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">finetune/*.jsonl</text>
207
+ <text xml:space="preserve" text-anchor="middle" x="504" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ShareGPT / OpenAI / DPO</text>
208
208
  </g>
209
209
  <!-- Xft&#45;&gt;Fftn -->
210
210
  <g id="edge19" class="edge">
211
211
  <title>Xft&#45;&gt;Fftn</title>
212
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M514.29,-511.88C514.8,-480.79 515.86,-415.83 516.49,-376.99"/>
213
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="519.29,-377.26 516.62,-369.21 513.69,-377.17 519.29,-377.26"/>
212
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M346.01,-511.88C336.95,-494.87 327.7,-469.4 342,-453.5 353.21,-441.04 402.13,-453.24 417,-445.5 447.32,-429.72 471.77,-398.61 486.95,-375.3"/>
213
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="489.16,-377.04 491.06,-368.78 484.42,-374.05 489.16,-377.04"/>
214
214
  </g>
215
215
  <!-- Rdpo -->
216
216
  <g id="node7" class="node">
217
217
  <title>Rdpo</title>
218
- <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1034.38,-548.5C1034.38,-548.5 927.62,-548.5 927.62,-548.5 921.62,-548.5 915.62,-542.5 915.62,-536.5 915.62,-536.5 915.62,-524.5 915.62,-524.5 915.62,-518.5 921.62,-512.5 927.62,-512.5 927.62,-512.5 1034.38,-512.5 1034.38,-512.5 1040.38,-512.5 1046.38,-518.5 1046.38,-524.5 1046.38,-524.5 1046.38,-536.5 1046.38,-536.5 1046.38,-542.5 1040.38,-548.5 1034.38,-548.5"/>
219
- <text xml:space="preserve" text-anchor="middle" x="981" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Reward.record_preference</text>
220
- <text xml:space="preserve" text-anchor="middle" x="981" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">export_dpo</text>
218
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M734.38,-548.5C734.38,-548.5 627.62,-548.5 627.62,-548.5 621.62,-548.5 615.62,-542.5 615.62,-536.5 615.62,-536.5 615.62,-524.5 615.62,-524.5 615.62,-518.5 621.62,-512.5 627.62,-512.5 627.62,-512.5 734.38,-512.5 734.38,-512.5 740.38,-512.5 746.38,-518.5 746.38,-524.5 746.38,-524.5 746.38,-536.5 746.38,-536.5 746.38,-542.5 740.38,-548.5 734.38,-548.5"/>
219
+ <text xml:space="preserve" text-anchor="middle" x="681" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Reward.record_preference</text>
220
+ <text xml:space="preserve" text-anchor="middle" x="681" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">export_dpo</text>
221
221
  </g>
222
222
  <!-- Rdpo&#45;&gt;Fprf -->
223
- <g id="edge33" class="edge">
223
+ <g id="edge36" class="edge">
224
224
  <title>Rdpo&#45;&gt;Fprf</title>
225
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M994.65,-512.3C1001.95,-501.99 1010.2,-488.24 1014,-474.5 1023,-441.99 1019.32,-403.13 1014.78,-376.66"/>
226
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1017.58,-376.46 1013.37,-369.1 1012.08,-377.48 1017.58,-376.46"/>
225
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M624.52,-511.89C594.69,-501.32 562.51,-487.45 554,-474.5 548.88,-466.7 547.58,-460.27 554,-453.5 565.56,-441.31 689.76,-452.56 705,-445.5 737.44,-430.46 764.19,-398.71 780.75,-375.04"/>
226
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="782.89,-376.87 785.07,-368.68 778.26,-373.72 782.89,-376.87"/>
227
+ </g>
228
+ <!-- PolW -->
229
+ <g id="node8" class="node">
230
+ <title>PolW</title>
231
+ <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M1217.75,-548.5C1217.75,-548.5 1098.25,-548.5 1098.25,-548.5 1092.25,-548.5 1086.25,-542.5 1086.25,-536.5 1086.25,-536.5 1086.25,-524.5 1086.25,-524.5 1086.25,-518.5 1092.25,-512.5 1098.25,-512.5 1098.25,-512.5 1217.75,-512.5 1217.75,-512.5 1223.75,-512.5 1229.75,-518.5 1229.75,-524.5 1229.75,-524.5 1229.75,-536.5 1229.75,-536.5 1229.75,-542.5 1223.75,-548.5 1217.75,-548.5"/>
232
+ <text xml:space="preserve" text-anchor="middle" x="1158" y="-533" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Policy.begin / observe / finish</text>
233
+ <text xml:space="preserve" text-anchor="middle" x="1158" y="-521" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(Q + REINFORCE)</text>
234
+ </g>
235
+ <!-- Fpol -->
236
+ <g id="node18" class="node">
237
+ <title>Fpol</title>
238
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1546.88,-362.75C1546.88,-364.96 1510.18,-366.75 1465,-366.75 1419.82,-366.75 1383.12,-364.96 1383.12,-362.75 1383.12,-362.75 1383.12,-326.75 1383.12,-326.75 1383.12,-324.54 1419.82,-322.75 1465,-322.75 1510.18,-322.75 1546.88,-324.54 1546.88,-326.75 1546.88,-326.75 1546.88,-362.75 1546.88,-362.75"/>
239
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1546.88,-362.75C1546.88,-360.54 1510.18,-358.75 1465,-358.75 1419.82,-358.75 1383.12,-360.54 1383.12,-362.75"/>
240
+ <text xml:space="preserve" text-anchor="middle" x="1465" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy.json + policy_traj.jsonl</text>
241
+ <text xml:space="preserve" text-anchor="middle" x="1465" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Q table · REINFORCE · MDP log</text>
242
+ </g>
243
+ <!-- PolW&#45;&gt;Fpol -->
244
+ <g id="edge33" class="edge">
245
+ <title>PolW&#45;&gt;Fpol</title>
246
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" d="M1166.84,-512.02C1177.11,-493.79 1195.91,-466.17 1221,-453.5 1249.21,-439.26 1334.08,-458.25 1363,-445.5 1397.21,-430.42 1426.54,-398.44 1444.85,-374.74"/>
247
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1446.87,-376.71 1449.44,-368.63 1442.4,-373.34 1446.87,-376.71"/>
227
248
  </g>
228
249
  <!-- Rec -->
229
- <g id="node17" class="node">
250
+ <g id="node19" class="node">
230
251
  <title>Rec</title>
231
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M921.88,-197C921.88,-197 866.12,-197 866.12,-197 860.12,-197 854.12,-191 854.12,-185 854.12,-185 854.12,-173 854.12,-173 854.12,-167 860.12,-161 866.12,-161 866.12,-161 921.88,-161 921.88,-161 927.88,-161 933.88,-167 933.88,-173 933.88,-173 933.88,-185 933.88,-185 933.88,-191 927.88,-197 921.88,-197"/>
232
- <text xml:space="preserve" text-anchor="middle" x="894" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory_recall</text>
252
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1237.88,-197C1237.88,-197 1182.12,-197 1182.12,-197 1176.12,-197 1170.12,-191 1170.12,-185 1170.12,-185 1170.12,-173 1170.12,-173 1170.12,-167 1176.12,-161 1182.12,-161 1182.12,-161 1237.88,-161 1237.88,-161 1243.88,-161 1249.88,-167 1249.88,-173 1249.88,-173 1249.88,-185 1249.88,-185 1249.88,-191 1243.88,-197 1237.88,-197"/>
253
+ <text xml:space="preserve" text-anchor="middle" x="1210" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory_recall</text>
233
254
  </g>
234
255
  <!-- Fmem&#45;&gt;Rec -->
235
256
  <g id="edge8" class="edge">
236
257
  <title>Fmem&#45;&gt;Rec</title>
237
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1145.51,-322.51C1090.72,-291.46 989.2,-233.94 933.36,-202.3"/>
238
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="934.86,-199.93 926.51,-198.42 932.09,-204.8 934.86,-199.93"/>
258
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1273.46,-322.34C1260.16,-292.52 1236.08,-238.5 1221.71,-206.28"/>
259
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1224.38,-205.38 1218.56,-199.21 1219.26,-207.66 1224.38,-205.38"/>
239
260
  </g>
240
261
  <!-- Midx -->
241
- <g id="node18" class="node">
262
+ <g id="node20" class="node">
242
263
  <title>Midx</title>
243
- <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M802.12,-201C802.12,-201 741.88,-201 741.88,-201 735.88,-201 729.88,-195 729.88,-189 729.88,-189 729.88,-169 729.88,-169 729.88,-163 735.88,-157 741.88,-157 741.88,-157 802.12,-157 802.12,-157 808.12,-157 814.12,-163 814.12,-169 814.12,-169 814.12,-189 814.12,-189 814.12,-195 808.12,-201 802.12,-201"/>
244
- <text xml:space="preserve" text-anchor="middle" x="772" y="-187.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MemoryIndex</text>
245
- <text xml:space="preserve" text-anchor="middle" x="772" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">recall_semantic</text>
246
- <text xml:space="preserve" text-anchor="middle" x="772" y="-163.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(cosine top&#45;K)</text>
264
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M1118.12,-201C1118.12,-201 1057.88,-201 1057.88,-201 1051.88,-201 1045.88,-195 1045.88,-189 1045.88,-189 1045.88,-169 1045.88,-169 1045.88,-163 1051.88,-157 1057.88,-157 1057.88,-157 1118.12,-157 1118.12,-157 1124.12,-157 1130.12,-163 1130.12,-169 1130.12,-169 1130.12,-189 1130.12,-189 1130.12,-195 1124.12,-201 1118.12,-201"/>
265
+ <text xml:space="preserve" text-anchor="middle" x="1088" y="-187.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MemoryIndex</text>
266
+ <text xml:space="preserve" text-anchor="middle" x="1088" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">recall_semantic</text>
267
+ <text xml:space="preserve" text-anchor="middle" x="1088" y="-163.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(cosine top&#45;K)</text>
247
268
  </g>
248
269
  <!-- Fmem&#45;&gt;Midx -->
249
270
  <g id="edge23" class="edge">
250
271
  <title>Fmem&#45;&gt;Midx</title>
251
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M1143.54,-322.72C1130.62,-316.62 1115.98,-310.53 1102,-306.5 986.57,-273.25 936.25,-334.55 834,-271.5 811.09,-257.37 794.68,-231.26 784.51,-210.54"/>
252
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="787.17,-209.6 781.25,-203.53 782.09,-211.97 787.17,-209.6"/>
272
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M1239.32,-322.83C1206.32,-306.52 1164.36,-284.52 1150,-271.5 1130.85,-254.14 1114.69,-229.73 1103.68,-210.48"/>
273
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1106.13,-209.13 1099.79,-203.49 1101.23,-211.85 1106.13,-209.13"/>
253
274
  </g>
254
275
  <!-- ReVal -->
255
- <g id="node25" class="node">
276
+ <g id="node28" class="node">
256
277
  <title>ReVal</title>
257
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1364.12,-552.5C1364.12,-552.5 1261.88,-552.5 1261.88,-552.5 1255.88,-552.5 1249.88,-546.5 1249.88,-540.5 1249.88,-540.5 1249.88,-520.5 1249.88,-520.5 1249.88,-514.5 1255.88,-508.5 1261.88,-508.5 1261.88,-508.5 1364.12,-508.5 1364.12,-508.5 1370.12,-508.5 1376.12,-514.5 1376.12,-520.5 1376.12,-520.5 1376.12,-540.5 1376.12,-540.5 1376.12,-546.5 1370.12,-552.5 1364.12,-552.5"/>
258
- <text xml:space="preserve" text-anchor="middle" x="1313" y="-539" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Extrospection.verify</text>
259
- <text xml:space="preserve" text-anchor="middle" x="1313" y="-527" font-family="sans-Serif" font-size="10.00" fill="#0f172a">revalidate_memory (cron)</text>
260
- <text xml:space="preserve" text-anchor="middle" x="1313" y="-515" font-family="sans-Serif" font-size="10.00" fill="#0f172a">browser&#45;backed GC</text>
278
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1483.12,-552.5C1483.12,-552.5 1380.88,-552.5 1380.88,-552.5 1374.88,-552.5 1368.88,-546.5 1368.88,-540.5 1368.88,-540.5 1368.88,-520.5 1368.88,-520.5 1368.88,-514.5 1374.88,-508.5 1380.88,-508.5 1380.88,-508.5 1483.12,-508.5 1483.12,-508.5 1489.12,-508.5 1495.12,-514.5 1495.12,-520.5 1495.12,-520.5 1495.12,-540.5 1495.12,-540.5 1495.12,-546.5 1489.12,-552.5 1483.12,-552.5"/>
279
+ <text xml:space="preserve" text-anchor="middle" x="1432" y="-539" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Extrospection.verify</text>
280
+ <text xml:space="preserve" text-anchor="middle" x="1432" y="-527" font-family="sans-Serif" font-size="10.00" fill="#0f172a">revalidate_memory (cron)</text>
281
+ <text xml:space="preserve" text-anchor="middle" x="1432" y="-515" font-family="sans-Serif" font-size="10.00" fill="#0f172a">browser&#45;backed GC</text>
261
282
  </g>
262
283
  <!-- Fmem&#45;&gt;ReVal -->
263
284
  <g id="edge30" class="edge">
264
285
  <title>Fmem&#45;&gt;ReVal</title>
265
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M1158.56,-367.18C1131.05,-393.92 1093.39,-440.27 1119.25,-474.5 1134.12,-494.18 1191.45,-508.87 1239.93,-518.1"/>
266
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1239.18,-520.81 1247.55,-519.51 1240.2,-515.3 1239.18,-520.81"/>
267
- <text xml:space="preserve" text-anchor="middle" x="1161.62" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:fact w/ CVE|ver|URL</text>
286
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M1264.43,-367.29C1243.28,-394.56 1214.65,-441.9 1239.25,-474.5 1253.96,-493.99 1310.46,-508.64 1358.52,-517.9"/>
287
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1358,-520.65 1366.38,-519.37 1359.03,-515.15 1358,-520.65"/>
288
+ <text xml:space="preserve" text-anchor="middle" x="1281.62" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:fact w/ CVE|ver|URL</text>
268
289
  </g>
269
290
  <!-- Fidx&#45;&gt;Midx -->
270
291
  <g id="edge22" class="edge">
271
292
  <title>Fidx&#45;&gt;Midx</title>
272
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M687.65,-314.1C706.23,-284.57 734.58,-239.49 753.2,-209.88"/>
273
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="755.48,-211.53 757.37,-203.26 750.74,-208.54 755.48,-211.53"/>
293
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1128.95,-314.1C1120.05,-284.95 1106.52,-240.65 1097.48,-211.03"/>
294
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1100.18,-210.31 1095.17,-203.48 1094.83,-211.95 1100.18,-210.31"/>
274
295
  </g>
275
296
  <!-- Skv -->
276
- <g id="node19" class="node">
297
+ <g id="node21" class="node">
277
298
  <title>Skv</title>
278
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M132.25,-197C132.25,-197 75.75,-197 75.75,-197 69.75,-197 63.75,-191 63.75,-185 63.75,-185 63.75,-173 63.75,-173 63.75,-167 69.75,-161 75.75,-161 75.75,-161 132.25,-161 132.25,-161 138.25,-161 144.25,-167 144.25,-173 144.25,-173 144.25,-185 144.25,-185 144.25,-191 138.25,-197 132.25,-197"/>
279
- <text xml:space="preserve" text-anchor="middle" x="104" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skill_list · view</text>
299
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M448.25,-197C448.25,-197 391.75,-197 391.75,-197 385.75,-197 379.75,-191 379.75,-185 379.75,-185 379.75,-173 379.75,-173 379.75,-167 385.75,-161 391.75,-161 391.75,-161 448.25,-161 448.25,-161 454.25,-161 460.25,-167 460.25,-173 460.25,-173 460.25,-185 460.25,-185 460.25,-191 454.25,-197 448.25,-197"/>
300
+ <text xml:space="preserve" text-anchor="middle" x="420" y="-175.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skill_list · view</text>
280
301
  </g>
281
302
  <!-- Fskl&#45;&gt;Skv -->
282
303
  <g id="edge9" class="edge">
283
304
  <title>Fskl&#45;&gt;Skv</title>
284
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M102.26,-322.34C102.62,-292.77 103.27,-239.43 103.67,-207.11"/>
285
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="106.47,-207.41 103.76,-199.38 100.87,-207.35 106.47,-207.41"/>
305
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M230.5,-322.34C271.48,-291.56 346.78,-235 389.07,-203.23"/>
306
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="390.53,-205.64 395.25,-198.59 387.17,-201.16 390.53,-205.64"/>
286
307
  </g>
287
308
  <!-- Out -->
288
- <g id="node20" class="node">
309
+ <g id="node22" class="node">
289
310
  <title>Out</title>
290
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M557.88,-197C557.88,-197 484.12,-197 484.12,-197 478.12,-197 472.12,-191 472.12,-185 472.12,-185 472.12,-173 472.12,-173 472.12,-167 478.12,-161 484.12,-161 484.12,-161 557.88,-161 557.88,-161 563.88,-161 569.88,-167 569.88,-173 569.88,-173 569.88,-185 569.88,-185 569.88,-191 563.88,-197 557.88,-197"/>
291
- <text xml:space="preserve" text-anchor="middle" x="521" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_outcomes</text>
292
- <text xml:space="preserve" text-anchor="middle" x="521" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_stats</text>
311
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M873.88,-197C873.88,-197 800.12,-197 800.12,-197 794.12,-197 788.12,-191 788.12,-185 788.12,-185 788.12,-173 788.12,-173 788.12,-167 794.12,-161 800.12,-161 800.12,-161 873.88,-161 873.88,-161 879.88,-161 885.88,-167 885.88,-173 885.88,-173 885.88,-185 885.88,-185 885.88,-191 879.88,-197 873.88,-197"/>
312
+ <text xml:space="preserve" text-anchor="middle" x="837" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_outcomes</text>
313
+ <text xml:space="preserve" text-anchor="middle" x="837" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning_stats</text>
293
314
  </g>
294
315
  <!-- Flrn&#45;&gt;Out -->
295
316
  <g id="edge10" class="edge">
296
317
  <title>Flrn&#45;&gt;Out</title>
297
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M398.31,-322.72C414.38,-308.86 435.24,-289.92 452,-271.5 471.04,-250.57 490.22,-224.65 503.51,-205.75"/>
298
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="505.78,-207.39 508.05,-199.22 501.19,-204.19 505.78,-207.39"/>
318
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M678.51,-323.24C687.01,-317.68 696.3,-311.75 705,-306.5 732.42,-289.95 743.83,-292.52 768,-271.5 789.84,-252.51 809.14,-225.55 821.73,-205.82"/>
319
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="823.97,-207.52 825.83,-199.25 819.22,-204.56 823.97,-207.52"/>
299
320
  </g>
300
321
  <!-- Exem -->
301
- <g id="node23" class="node">
322
+ <g id="node25" class="node">
302
323
  <title>Exem</title>
303
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M419.62,-197C419.62,-197 326.38,-197 326.38,-197 320.38,-197 314.38,-191 314.38,-185 314.38,-185 314.38,-173 314.38,-173 314.38,-167 320.38,-161 326.38,-161 326.38,-161 419.62,-161 419.62,-161 425.62,-161 431.62,-167 431.62,-173 431.62,-173 431.62,-185 431.62,-185 431.62,-191 425.62,-197 419.62,-197"/>
304
- <text xml:space="preserve" text-anchor="middle" x="373" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.exemplars_for</text>
305
- <text xml:space="preserve" text-anchor="middle" x="373" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(few&#45;shot trace)</text>
324
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M735.62,-197C735.62,-197 642.38,-197 642.38,-197 636.38,-197 630.38,-191 630.38,-185 630.38,-185 630.38,-173 630.38,-173 630.38,-167 636.38,-161 642.38,-161 642.38,-161 735.62,-161 735.62,-161 741.62,-161 747.62,-167 747.62,-173 747.62,-173 747.62,-185 747.62,-185 747.62,-191 741.62,-197 735.62,-197"/>
325
+ <text xml:space="preserve" text-anchor="middle" x="689" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Learning.exemplars_for</text>
326
+ <text xml:space="preserve" text-anchor="middle" x="689" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(few&#45;shot trace)</text>
306
327
  </g>
307
328
  <!-- Flrn&#45;&gt;Exem -->
308
329
  <g id="edge24" class="edge">
309
330
  <title>Flrn&#45;&gt;Exem</title>
310
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M373,-322.34C373,-292.77 373,-239.43 373,-207.11"/>
311
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="375.8,-207.38 373,-199.38 370.2,-207.38 375.8,-207.38"/>
331
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M653.36,-322.34C660.8,-292.65 674.24,-238.97 682.32,-206.69"/>
332
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="684.94,-207.76 684.16,-199.32 679.5,-206.4 684.94,-207.76"/>
312
333
  </g>
313
334
  <!-- Sesv -->
314
- <g id="node21" class="node">
335
+ <g id="node23" class="node">
315
336
  <title>Sesv</title>
316
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M262.12,-197C262.12,-197 195.88,-197 195.88,-197 189.88,-197 183.88,-191 183.88,-185 183.88,-185 183.88,-173 183.88,-173 183.88,-167 189.88,-161 195.88,-161 195.88,-161 262.12,-161 262.12,-161 268.12,-161 274.12,-167 274.12,-173 274.12,-173 274.12,-185 274.12,-185 274.12,-191 268.12,-197 262.12,-197"/>
317
- <text xml:space="preserve" text-anchor="middle" x="229" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_view</text>
318
- <text xml:space="preserve" text-anchor="middle" x="229" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_current</text>
337
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M578.12,-197C578.12,-197 511.88,-197 511.88,-197 505.88,-197 499.88,-191 499.88,-185 499.88,-185 499.88,-173 499.88,-173 499.88,-167 505.88,-161 511.88,-161 511.88,-161 578.12,-161 578.12,-161 584.12,-161 590.12,-167 590.12,-173 590.12,-173 590.12,-185 590.12,-185 590.12,-191 584.12,-197 578.12,-197"/>
338
+ <text xml:space="preserve" text-anchor="middle" x="545" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_view</text>
339
+ <text xml:space="preserve" text-anchor="middle" x="545" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions_current</text>
319
340
  </g>
320
341
  <!-- Fses&#45;&gt;Sesv -->
321
342
  <g id="edge11" class="edge">
322
343
  <title>Fses&#45;&gt;Sesv</title>
323
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M245.52,-322.34C242.09,-292.77 235.9,-239.43 232.15,-207.11"/>
324
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="234.95,-206.99 231.25,-199.37 229.39,-207.64 234.95,-206.99"/>
344
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M386.12,-323.15C424.39,-302.43 478,-273.28 480,-271.5 501.09,-252.75 519.12,-225.93 530.8,-206.17"/>
345
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="533.16,-207.68 534.73,-199.35 528.31,-204.89 533.16,-207.68"/>
325
346
  </g>
326
347
  <!-- Fses&#45;&gt;Exem -->
327
348
  <g id="edge25" class="edge">
328
349
  <title>Fses&#45;&gt;Exem</title>
329
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M264.34,-322.34C287.4,-292.13 329.41,-237.11 353.88,-205.04"/>
330
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="355.89,-207.03 358.51,-198.98 351.43,-203.64 355.89,-207.03"/>
350
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" stroke-dasharray="5,2" d="M381.77,-322.77C392.68,-316.75 405.05,-310.69 417,-306.5 499.27,-277.66 534.3,-314.74 610,-271.5 637.55,-255.76 660.11,-226.71 673.97,-205.55"/>
351
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="676.22,-207.22 678.14,-198.97 671.49,-204.23 676.22,-207.22"/>
331
352
  </g>
332
353
  <!-- Teach -->
333
- <g id="node26" class="node">
354
+ <g id="node29" class="node">
334
355
  <title>Teach</title>
335
- <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M1664.62,-552.5C1664.62,-552.5 1571.38,-552.5 1571.38,-552.5 1565.38,-552.5 1559.38,-546.5 1559.38,-540.5 1559.38,-540.5 1559.38,-520.5 1559.38,-520.5 1559.38,-514.5 1565.38,-508.5 1571.38,-508.5 1571.38,-508.5 1664.62,-508.5 1664.62,-508.5 1670.62,-508.5 1676.62,-514.5 1676.62,-520.5 1676.62,-520.5 1676.62,-540.5 1676.62,-540.5 1676.62,-546.5 1670.62,-552.5 1664.62,-552.5"/>
336
- <text xml:space="preserve" text-anchor="middle" x="1618" y="-539" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Reflect.on</text>
337
- <text xml:space="preserve" text-anchor="middle" x="1618" y="-527" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(engine: reflect_engine)</text>
338
- <text xml:space="preserve" text-anchor="middle" x="1618" y="-515" font-family="sans-Serif" font-size="10.00" fill="#0f172a">teacher&#45;student</text>
356
+ <path fill="#fda4af" stroke="#334155" stroke-width="2" d="M1783.62,-552.5C1783.62,-552.5 1690.38,-552.5 1690.38,-552.5 1684.38,-552.5 1678.38,-546.5 1678.38,-540.5 1678.38,-540.5 1678.38,-520.5 1678.38,-520.5 1678.38,-514.5 1684.38,-508.5 1690.38,-508.5 1690.38,-508.5 1783.62,-508.5 1783.62,-508.5 1789.62,-508.5 1795.62,-514.5 1795.62,-520.5 1795.62,-520.5 1795.62,-540.5 1795.62,-540.5 1795.62,-546.5 1789.62,-552.5 1783.62,-552.5"/>
357
+ <text xml:space="preserve" text-anchor="middle" x="1737" y="-539" font-family="sans-Serif" font-size="10.00" fill="#0f172a">Reflect.on</text>
358
+ <text xml:space="preserve" text-anchor="middle" x="1737" y="-527" font-family="sans-Serif" font-size="10.00" fill="#0f172a">(engine: reflect_engine)</text>
359
+ <text xml:space="preserve" text-anchor="middle" x="1737" y="-515" font-family="sans-Serif" font-size="10.00" fill="#0f172a">teacher&#45;student</text>
339
360
  </g>
340
361
  <!-- Fses&#45;&gt;Teach -->
341
362
  <g id="edge31" class="edge">
342
363
  <title>Fses&#45;&gt;Teach</title>
343
- <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M255.77,-367.15C265.78,-391.17 285.73,-428.97 317,-445.5 345.07,-460.34 1429.07,-446.33 1460,-453.5 1501.47,-463.11 1544.78,-484.9 1575.55,-502.7"/>
344
- <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1573.87,-504.96 1582.19,-506.6 1576.71,-500.13 1573.87,-504.96"/>
345
- <text xml:space="preserve" text-anchor="middle" x="1537.66" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">transcript</text>
364
+ <path fill="none" stroke="#94a3b8" stroke-width="1.3" stroke-dasharray="5,2" d="M355.77,-367.15C365.78,-391.18 385.72,-428.97 417,-445.5 446.3,-460.98 1578.09,-444.57 1610,-453.5 1610.59,-453.67 1655.69,-480.69 1691.98,-502.47"/>
365
+ <polygon fill="#94a3b8" stroke="#94a3b8" stroke-width="1.3" points="1690.52,-504.86 1698.82,-506.57 1693.4,-500.06 1690.52,-504.86"/>
366
+ <text xml:space="preserve" text-anchor="middle" x="1663.25" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">transcript</text>
346
367
  </g>
347
368
  <!-- Mlst -->
348
- <g id="node22" class="node">
369
+ <g id="node24" class="node">
349
370
  <title>Mlst</title>
350
- <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M677.88,-197C677.88,-197 622.12,-197 622.12,-197 616.12,-197 610.12,-191 610.12,-185 610.12,-185 610.12,-173 610.12,-173 610.12,-167 616.12,-161 622.12,-161 622.12,-161 677.88,-161 677.88,-161 683.88,-161 689.88,-167 689.88,-173 689.88,-173 689.88,-185 689.88,-185 689.88,-191 683.88,-197 677.88,-197"/>
351
- <text xml:space="preserve" text-anchor="middle" x="650" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_list</text>
352
- <text xml:space="preserve" text-anchor="middle" x="650" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">correction_hint</text>
371
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M993.88,-197C993.88,-197 938.12,-197 938.12,-197 932.12,-197 926.12,-191 926.12,-185 926.12,-185 926.12,-173 926.12,-173 926.12,-167 932.12,-161 938.12,-161 938.12,-161 993.88,-161 993.88,-161 999.88,-161 1005.88,-167 1005.88,-173 1005.88,-173 1005.88,-185 1005.88,-185 1005.88,-191 999.88,-197 993.88,-197"/>
372
+ <text xml:space="preserve" text-anchor="middle" x="966" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">mistakes_list</text>
373
+ <text xml:space="preserve" text-anchor="middle" x="966" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">correction_hint</text>
353
374
  </g>
354
375
  <!-- Fmis&#45;&gt;Mlst -->
355
376
  <g id="edge12" class="edge">
356
377
  <title>Fmis&#45;&gt;Mlst</title>
357
- <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M781.39,-322.5C758.54,-309.76 730.87,-292.05 710,-271.5 690.49,-252.29 673.92,-225.69 663.17,-206.13"/>
358
- <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="665.69,-204.89 659.44,-199.15 660.75,-207.53 665.69,-204.89"/>
378
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M980.78,-322.34C977.71,-292.77 972.17,-239.43 968.81,-207.11"/>
379
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="971.62,-207.04 968.01,-199.37 966.05,-207.62 971.62,-207.04"/>
359
380
  </g>
360
381
  <!-- Fext -->
361
- <g id="node14" class="node">
382
+ <g id="node15" class="node">
362
383
  <title>Fext</title>
363
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1405.25,-362.75C1405.25,-364.96 1377.8,-366.75 1344,-366.75 1310.2,-366.75 1282.75,-364.96 1282.75,-362.75 1282.75,-362.75 1282.75,-326.75 1282.75,-326.75 1282.75,-324.54 1310.2,-322.75 1344,-322.75 1377.8,-322.75 1405.25,-324.54 1405.25,-326.75 1405.25,-326.75 1405.25,-362.75 1405.25,-362.75"/>
364
- <path fill="none" stroke="#334155" stroke-width="1.3" d="M1405.25,-362.75C1405.25,-360.54 1377.8,-358.75 1344,-358.75 1310.2,-358.75 1282.75,-360.54 1282.75,-362.75"/>
365
- <text xml:space="preserve" text-anchor="middle" x="1344" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extrospection.json</text>
366
- <text xml:space="preserve" text-anchor="middle" x="1344" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">snapshot · rf · web · obs</text>
384
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M1709.25,-362.75C1709.25,-364.96 1681.8,-366.75 1648,-366.75 1614.2,-366.75 1586.75,-364.96 1586.75,-362.75 1586.75,-362.75 1586.75,-326.75 1586.75,-326.75 1586.75,-324.54 1614.2,-322.75 1648,-322.75 1681.8,-322.75 1709.25,-324.54 1709.25,-326.75 1709.25,-326.75 1709.25,-362.75 1709.25,-362.75"/>
385
+ <path fill="none" stroke="#334155" stroke-width="1.3" d="M1709.25,-362.75C1709.25,-360.54 1681.8,-358.75 1648,-358.75 1614.2,-358.75 1586.75,-360.54 1586.75,-362.75"/>
386
+ <text xml:space="preserve" text-anchor="middle" x="1648" y="-347.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extrospection.json</text>
387
+ <text xml:space="preserve" text-anchor="middle" x="1648" y="-335.25" font-family="sans-Serif" font-size="10.00" fill="#0f172a">snapshot · rf · web · obs</text>
367
388
  </g>
368
389
  <!-- Fprf&#45;&gt;Fftn -->
369
- <g id="edge35" class="edge">
390
+ <g id="edge38" class="edge">
370
391
  <title>Fprf&#45;&gt;Fftn</title>
371
- <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M993.57,-367.3C977.38,-390.28 948.79,-424.53 914,-438.96 850.37,-465.36 667.11,-466.58 604,-438.96 574.52,-426.06 550.6,-397.69 535.35,-375.44"/>
372
- <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="537.77,-374.02 531.03,-368.9 533.1,-377.11 537.77,-374.02"/>
373
- <text xml:space="preserve" text-anchor="middle" x="728" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_dpo</text>
392
+ <path fill="none" stroke="#fbbf24" stroke-width="1.3" stroke-dasharray="5,2" d="M784.57,-367.3C768.38,-390.28 739.79,-424.53 705,-438.96 658.61,-458.2 638.07,-458.96 592,-438.96 562.33,-426.07 538.11,-397.71 522.65,-375.45"/>
393
+ <polygon fill="#fbbf24" stroke="#fbbf24" stroke-width="1.3" points="525.03,-373.98 518.25,-368.9 520.38,-377.1 525.03,-373.98"/>
394
+ <text xml:space="preserve" text-anchor="middle" x="661" y="-460.7" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">export_dpo</text>
395
+ </g>
396
+ <!-- PolR -->
397
+ <g id="node26" class="node">
398
+ <title>PolR</title>
399
+ <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M1392.12,-197C1392.12,-197 1301.88,-197 1301.88,-197 1295.88,-197 1289.88,-191 1289.88,-185 1289.88,-185 1289.88,-173 1289.88,-173 1289.88,-167 1295.88,-161 1301.88,-161 1301.88,-161 1392.12,-161 1392.12,-161 1398.12,-161 1404.12,-167 1404.12,-173 1404.12,-173 1404.12,-185 1404.12,-185 1404.12,-191 1398.12,-197 1392.12,-197"/>
400
+ <text xml:space="preserve" text-anchor="middle" x="1347" y="-181.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_stats · evaluate</text>
401
+ <text xml:space="preserve" text-anchor="middle" x="1347" y="-169.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">policy_recommend</text>
402
+ </g>
403
+ <!-- Fpol&#45;&gt;PolR -->
404
+ <g id="edge34" class="edge">
405
+ <title>Fpol&#45;&gt;PolR</title>
406
+ <path fill="none" stroke="#a78bfa" stroke-width="1.3" d="M1449.57,-322.34C1427.9,-292.26 1388.49,-237.57 1365.34,-205.45"/>
407
+ <polygon fill="#a78bfa" stroke="#a78bfa" stroke-width="1.3" points="1367.65,-203.86 1360.7,-199.01 1363.1,-207.14 1367.65,-203.86"/>
374
408
  </g>
375
409
  <!-- Prompt -->
376
- <g id="node24" class="node">
410
+ <g id="node27" class="node">
377
411
  <title>Prompt</title>
378
- <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M615.62,-68C615.62,-68 426.38,-68 426.38,-68 420.38,-68 414.38,-62 414.38,-56 414.38,-56 414.38,-12 414.38,-12 414.38,-6 420.38,0 426.38,0 426.38,0 615.62,0 615.62,0 621.62,0 627.62,-6 627.62,-12 627.62,-12 627.62,-56 627.62,-56 627.62,-62 621.62,-68 615.62,-68"/>
379
- <text xml:space="preserve" text-anchor="middle" x="521" y="-54.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PromptBuilder.build(request:)</text>
380
- <text xml:space="preserve" text-anchor="middle" x="521" y="-42.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">engine&#45;aware .budget</text>
381
- <text xml:space="preserve" text-anchor="middle" x="521" y="-30.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MEMORY (relevance&#45;ranked) + SKILLS</text>
382
- <text xml:space="preserve" text-anchor="middle" x="521" y="-18.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ LEARNING + KNOWN MISTAKES/FIXES</text>
383
- <text xml:space="preserve" text-anchor="middle" x="521" y="-6.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ METRICS (per&#45;engine) + EXTRO</text>
412
+ <path fill="#7dd3fc" stroke="#334155" stroke-width="2" d="M995,-68C995,-68 799,-68 799,-68 793,-68 787,-62 787,-56 787,-56 787,-12 787,-12 787,-6 793,0 799,0 799,0 995,0 995,0 1001,0 1007,-6 1007,-12 1007,-12 1007,-56 1007,-56 1007,-62 1001,-68 995,-68"/>
413
+ <text xml:space="preserve" text-anchor="middle" x="897" y="-54.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PromptBuilder.build(request:)</text>
414
+ <text xml:space="preserve" text-anchor="middle" x="897" y="-42.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">engine&#45;aware .budget</text>
415
+ <text xml:space="preserve" text-anchor="middle" x="897" y="-30.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">MEMORY (relevance&#45;ranked) + SKILLS</text>
416
+ <text xml:space="preserve" text-anchor="middle" x="897" y="-18.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ LEARNING + KNOWN MISTAKES/FIXES</text>
417
+ <text xml:space="preserve" text-anchor="middle" x="897" y="-6.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">+ METRICS (per&#45;engine) + POLICY + EXTRO</text>
384
418
  </g>
385
419
  <!-- Rec&#45;&gt;Prompt -->
386
420
  <g id="edge13" class="edge">
387
421
  <title>Rec&#45;&gt;Prompt</title>
388
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M871.72,-160.58C848.86,-143.47 811.69,-117.7 776,-102 732.48,-82.85 682.29,-68.21 638.01,-57.57"/>
389
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="638.71,-54.86 630.28,-55.74 637.42,-60.31 638.71,-54.86"/>
422
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1191.07,-160.4C1171.91,-143.39 1140.8,-117.93 1110,-102 1081.09,-87.05 1048.23,-74.7 1017.12,-64.85"/>
423
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1018.32,-62.29 1009.85,-62.59 1016.66,-67.64 1018.32,-62.29"/>
390
424
  </g>
391
425
  <!-- Midx&#45;&gt;Prompt -->
392
426
  <g id="edge26" class="edge">
393
427
  <title>Midx&#45;&gt;Prompt</title>
394
- <path fill="none" stroke="#38bdf8" stroke-width="2" d="M744.93,-156.13C724.3,-140.04 694.79,-118.22 667,-102 649.75,-91.93 630.72,-82.25 612.26,-73.53"/>
395
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="613.56,-71.04 605.12,-70.2 611.19,-76.12 613.56,-71.04"/>
396
- <text xml:space="preserve" text-anchor="middle" x="731.52" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">MEMORY block</text>
397
- <text xml:space="preserve" text-anchor="middle" x="731.52" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(top&#45;K by cosine)</text>
428
+ <path fill="none" stroke="#38bdf8" stroke-width="2" d="M1067.41,-156.02C1051.88,-140.07 1029.63,-118.49 1008,-102 995.49,-92.46 981.54,-83.14 967.87,-74.63"/>
429
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="2" points="969.34,-72.24 961.05,-70.45 966.41,-77.02 969.34,-72.24"/>
430
+ <text xml:space="preserve" text-anchor="middle" x="1065.8" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">MEMORY block</text>
431
+ <text xml:space="preserve" text-anchor="middle" x="1065.8" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(top&#45;K by cosine)</text>
398
432
  </g>
399
433
  <!-- Skv&#45;&gt;Prompt -->
400
434
  <g id="edge14" class="edge">
401
435
  <title>Skv&#45;&gt;Prompt</title>
402
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M138.21,-160.44C146.55,-156.45 155.51,-152.39 164,-149 242.65,-117.62 333.61,-88.68 404.03,-67.81"/>
403
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="404.62,-70.55 411.5,-65.6 403.03,-65.18 404.62,-70.55"/>
436
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M453.48,-160.48C462,-156.4 471.22,-152.29 480,-149 577.79,-112.36 692.46,-81.87 776.78,-61.67"/>
437
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="777.34,-64.41 784.47,-59.84 776.04,-58.97 777.34,-64.41"/>
404
438
  </g>
405
439
  <!-- Out&#45;&gt;Prompt -->
406
440
  <g id="edge15" class="edge">
407
441
  <title>Out&#45;&gt;Prompt</title>
408
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M521,-160.47C521,-140.21 521,-106.13 521,-78.6"/>
409
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="523.8,-78.75 521,-70.75 518.2,-78.75 523.8,-78.75"/>
442
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M844.36,-160.47C852.93,-140.03 867.41,-105.53 879.01,-77.87"/>
443
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="881.55,-79.06 882.06,-70.6 876.39,-76.9 881.55,-79.06"/>
410
444
  </g>
411
445
  <!-- Sesv&#45;&gt;Prompt -->
412
446
  <g id="edge16" class="edge">
413
447
  <title>Sesv&#45;&gt;Prompt</title>
414
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M264.8,-160.47C308.91,-138.86 385.1,-101.55 442.96,-73.22"/>
415
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="444,-75.83 449.95,-69.79 441.54,-70.8 444,-75.83"/>
448
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M583.72,-160.41C592.34,-156.58 601.46,-152.6 610,-149 672.71,-122.57 743.79,-94.32 799.53,-72.56"/>
449
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="800.42,-75.22 806.86,-69.7 798.38,-70 800.42,-75.22"/>
416
450
  </g>
417
451
  <!-- Mlst&#45;&gt;Prompt -->
418
452
  <g id="edge17" class="edge">
419
453
  <title>Mlst&#45;&gt;Prompt</title>
420
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M634.18,-160.47C615.51,-139.76 583.81,-104.63 558.7,-76.79"/>
421
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="560.94,-75.1 553.51,-71.03 556.79,-78.85 560.94,-75.1"/>
422
- <text xml:space="preserve" text-anchor="middle" x="627.05" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">do NOT repeat</text>
454
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M957.54,-160.47C947.76,-140.21 931.32,-106.13 918.04,-78.6"/>
455
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="920.62,-77.5 914.62,-71.51 915.57,-79.94 920.62,-77.5"/>
456
+ <text xml:space="preserve" text-anchor="middle" x="967.68" y="-109.2" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">do NOT repeat</text>
423
457
  </g>
424
458
  <!-- Exem&#45;&gt;Prompt -->
425
459
  <g id="edge27" class="edge">
426
460
  <title>Exem&#45;&gt;Prompt</title>
427
- <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M391.15,-160.47C412.94,-139.41 450.19,-103.42 479.22,-75.37"/>
428
- <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="480.81,-77.73 484.62,-70.15 476.92,-73.7 480.81,-77.73"/>
429
- <text xml:space="preserve" text-anchor="middle" x="480.69" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">few&#45;shot msgs</text>
430
- <text xml:space="preserve" text-anchor="middle" x="480.69" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(local only)</text>
461
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M712.4,-160.43C733.4,-144.78 765.2,-121.43 793.5,-102 806.92,-92.78 821.51,-83.13 835.38,-74.11"/>
462
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="836.61,-76.65 841.8,-69.95 833.56,-71.95 836.61,-76.65"/>
463
+ <text xml:space="preserve" text-anchor="middle" x="822.75" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">few&#45;shot msgs</text>
464
+ <text xml:space="preserve" text-anchor="middle" x="822.75" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">(local only)</text>
465
+ </g>
466
+ <!-- PolR&#45;&gt;Prompt -->
467
+ <g id="edge35" class="edge">
468
+ <title>PolR&#45;&gt;Prompt</title>
469
+ <path fill="none" stroke="#38bdf8" stroke-width="1.3" d="M1307.52,-160.48C1269.46,-144.01 1210.01,-119.35 1157,-102 1112.01,-87.27 1061.81,-73.69 1017.6,-62.66"/>
470
+ <polygon fill="#38bdf8" stroke="#38bdf8" stroke-width="1.3" points="1018.32,-59.95 1009.88,-60.74 1016.97,-65.38 1018.32,-59.95"/>
471
+ <text xml:space="preserve" text-anchor="middle" x="1243.75" y="-114.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">POLICY block</text>
472
+ <text xml:space="preserve" text-anchor="middle" x="1243.75" y="-103.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">advisory only</text>
431
473
  </g>
432
474
  <!-- ReVal&#45;&gt;Fmem -->
433
475
  <g id="edge28" class="edge">
434
476
  <title>ReVal&#45;&gt;Fmem</title>
435
- <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M1266.38,-507.99C1251.77,-499.34 1236.69,-488.14 1226,-474.5 1203.77,-446.13 1192.75,-405.71 1187.49,-377.76"/>
436
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1190.26,-377.37 1186.14,-369.97 1184.74,-378.33 1190.26,-377.37"/>
437
- <text xml:space="preserve" text-anchor="middle" x="1281.5" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">[UNVERIFIED yyyy&#45;mm&#45;dd]</text>
438
- <text xml:space="preserve" text-anchor="middle" x="1281.5" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">prefix stale :fact</text>
477
+ <path fill="none" stroke="#fb7185" stroke-width="2" stroke-dasharray="5,2" d="M1390.79,-508.01C1376.32,-499.04 1360.75,-487.64 1349,-474.5 1323.31,-445.78 1304.71,-405.25 1293.93,-377.37"/>
478
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1296.67,-376.71 1291.24,-370.2 1291.42,-378.67 1296.67,-376.71"/>
479
+ <text xml:space="preserve" text-anchor="middle" x="1404.5" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">[UNVERIFIED yyyy&#45;mm&#45;dd]</text>
480
+ <text xml:space="preserve" text-anchor="middle" x="1404.5" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">prefix stale :fact</text>
439
481
  </g>
440
482
  <!-- ReVal&#45;&gt;Fext -->
441
483
  <g id="edge29" class="edge">
442
484
  <title>ReVal&#45;&gt;Fext</title>
443
- <path fill="none" stroke="#f59e0b" stroke-width="1.3" stroke-dasharray="5,2" d="M1330.09,-508.09C1336.75,-498.42 1343.59,-486.49 1347,-474.5 1356.21,-442.08 1353.53,-403.2 1349.78,-376.71"/>
444
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1352.6,-376.62 1348.61,-369.14 1347.06,-377.48 1352.6,-376.62"/>
445
- <text xml:space="preserve" text-anchor="middle" x="1400.74" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:confirmed → :intel obs</text>
446
- <text xml:space="preserve" text-anchor="middle" x="1400.74" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:refuted → observe stale</text>
485
+ <path fill="none" stroke="#f59e0b" stroke-width="1.3" stroke-dasharray="5,2" d="M1446.32,-507.91C1459.37,-490.14 1480.33,-465.94 1505,-453.5 1529.81,-440.99 1542.73,-459.03 1567,-445.5 1595.68,-429.51 1618.16,-398.93 1632.09,-375.83"/>
486
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.3" points="1634.41,-377.41 1636.01,-369.08 1629.57,-374.59 1634.41,-377.41"/>
487
+ <text xml:space="preserve" text-anchor="middle" x="1554.5" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:confirmed → :intel obs</text>
488
+ <text xml:space="preserve" text-anchor="middle" x="1554.5" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:refuted → observe stale</text>
447
489
  </g>
448
490
  <!-- Teach&#45;&gt;Fmem -->
449
491
  <g id="edge32" class="edge">
450
492
  <title>Teach&#45;&gt;Fmem</title>
451
- <path fill="none" stroke="#fb7185" stroke-width="2" d="M1611.86,-507.56C1605.55,-489.58 1593.79,-465.25 1574,-453.5 1544.28,-435.85 1293.97,-460.85 1263,-445.5 1233.76,-431 1211.72,-400.27 1198.26,-376.72"/>
452
- <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1200.76,-375.46 1194.47,-369.79 1195.85,-378.15 1200.76,-375.46"/>
453
- <text xml:space="preserve" text-anchor="middle" x="1628.47" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">frontier&#45;authored</text>
454
- <text xml:space="preserve" text-anchor="middle" x="1628.47" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:lesson</text>
493
+ <path fill="none" stroke="#fb7185" stroke-width="2" d="M1730.86,-507.56C1724.55,-489.57 1712.8,-465.24 1693,-453.5 1661.45,-434.8 1395.87,-461.77 1363,-445.5 1333.75,-431.03 1311.72,-400.28 1298.25,-376.73"/>
494
+ <polygon fill="#fb7185" stroke="#fb7185" stroke-width="2" points="1300.76,-375.48 1294.46,-369.8 1295.84,-378.16 1300.76,-375.48"/>
495
+ <text xml:space="preserve" text-anchor="middle" x="1747.47" y="-465.95" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">frontier&#45;authored</text>
496
+ <text xml:space="preserve" text-anchor="middle" x="1747.47" y="-455.45" font-family="sans-Serif" font-size="9.00" fill="#cbd5e1">:lesson</text>
455
497
  </g>
456
498
  </g>
457
499
  </svg>