pwn 0.5.621 → 0.5.626

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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -2
  3. data/Gemfile +1 -1
  4. data/README.md +7 -1
  5. data/bin/pwn_gqrx_scanner +78 -9
  6. data/documentation/Agent-Tool-Registry.md +3 -3
  7. data/documentation/Configuration.md +301 -47
  8. data/documentation/Cron.md +5 -3
  9. data/documentation/Diagrams.md +1 -1
  10. data/documentation/Extrospection.md +472 -26
  11. data/documentation/FFI.md +72 -8
  12. data/documentation/Home.md +4 -4
  13. data/documentation/How-PWN-Works.md +7 -3
  14. data/documentation/Mistakes.md +9 -0
  15. data/documentation/SDR.md +83 -10
  16. data/documentation/Skills-Memory-Learning.md +101 -11
  17. data/documentation/diagrams/agent-tool-registry.svg +56 -55
  18. data/documentation/diagrams/ai-integration-tool-calling.svg +24 -24
  19. data/documentation/diagrams/aws-cloud-security.svg +25 -25
  20. data/documentation/diagrams/burp-vs-zap-preference.svg +12 -12
  21. data/documentation/diagrams/code-scanning-sast.svg +25 -25
  22. data/documentation/diagrams/cron-scheduling.svg +23 -23
  23. data/documentation/diagrams/dot/agent-tool-registry.dot +2 -2
  24. data/documentation/diagrams/dot/extrospection-world-awareness.dot +33 -6
  25. data/documentation/diagrams/dot/hardware-hacking.dot +3 -1
  26. data/documentation/diagrams/dot/memory-skills-detailed.dot +4 -2
  27. data/documentation/diagrams/dot/mistakes-negative-feedback.dot +4 -2
  28. data/documentation/diagrams/dot/overall-pwn-architecture.dot +3 -3
  29. data/documentation/diagrams/dot/persistence-filesystem.dot +3 -3
  30. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +10 -4
  31. data/documentation/diagrams/dot/sdr-radio-flow.dot +39 -16
  32. data/documentation/diagrams/driver-framework.svg +13 -13
  33. data/documentation/diagrams/extrospection-world-awareness.svg +383 -177
  34. data/documentation/diagrams/fuzzing-workflow.svg +24 -24
  35. data/documentation/diagrams/hardware-hacking.svg +84 -69
  36. data/documentation/diagrams/history-to-drivers.svg +18 -18
  37. data/documentation/diagrams/memory-skills-detailed.svg +137 -120
  38. data/documentation/diagrams/mistakes-negative-feedback.svg +152 -137
  39. data/documentation/diagrams/network-infra-testing.svg +27 -27
  40. data/documentation/diagrams/overall-pwn-architecture.svg +97 -97
  41. data/documentation/diagrams/penetration-testing-workflow.svg +30 -30
  42. data/documentation/diagrams/persistence-filesystem.svg +100 -94
  43. data/documentation/diagrams/plugin-ecosystem.svg +35 -35
  44. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +254 -207
  45. data/documentation/diagrams/pwn-repl-prototyping.svg +20 -20
  46. data/documentation/diagrams/reporting-pipeline.svg +18 -18
  47. data/documentation/diagrams/reverse-engineering-flow.svg +21 -21
  48. data/documentation/diagrams/sdr-radio-flow.svg +223 -91
  49. data/documentation/diagrams/sessions-cron-automation.svg +18 -18
  50. data/documentation/diagrams/swarm-multi-agent.svg +39 -39
  51. data/documentation/diagrams/web-application-testing.svg +26 -26
  52. data/documentation/diagrams/zero-day-research-flow.svg +25 -25
  53. data/documentation/pwn-ai-Agent.md +16 -10
  54. data/documentation/pwn_silent_help_learn_demo.gif +0 -0
  55. data/lib/pwn/ai/agent/assembly.rb +1 -1
  56. data/lib/pwn/ai/agent/btc.rb +1 -1
  57. data/lib/pwn/ai/agent/burp_suite.rb +1 -1
  58. data/lib/pwn/ai/agent/extrospection.rb +2562 -57
  59. data/lib/pwn/ai/agent/gqrx.rb +2 -2
  60. data/lib/pwn/ai/agent/hacker_one.rb +1 -1
  61. data/lib/pwn/ai/agent/learning.rb +16 -16
  62. data/lib/pwn/ai/agent/loop.rb +1 -1
  63. data/lib/pwn/ai/agent/{introspection.rb → reflect.rb} +12 -12
  64. data/lib/pwn/ai/agent/sast.rb +1 -1
  65. data/lib/pwn/ai/agent/tools/extrospection.rb +311 -8
  66. data/lib/pwn/ai/agent/tools/learning.rb +7 -7
  67. data/lib/pwn/ai/agent/transparent_browser.rb +1 -1
  68. data/lib/pwn/ai/agent/vuln_gen.rb +2 -2
  69. data/lib/pwn/ai/agent.rb +1 -1
  70. data/lib/pwn/ai/open_ai.rb +10 -6
  71. data/lib/pwn/config.rb +5 -4
  72. data/lib/pwn/ffi/adalm_pluto.rb +498 -0
  73. data/lib/pwn/ffi/fftw.rb +192 -0
  74. data/lib/pwn/ffi/hack_rf.rb +193 -0
  75. data/lib/pwn/ffi/liquid.rb +244 -0
  76. data/lib/pwn/ffi/rtl_sdr.rb +210 -0
  77. data/lib/pwn/ffi/soapy_sdr.rb +177 -0
  78. data/lib/pwn/ffi/stdio.rb +9 -1
  79. data/lib/pwn/ffi/volk.rb +241 -0
  80. data/lib/pwn/ffi.rb +45 -2
  81. data/lib/pwn/plugins/burp_suite.rb +2 -2
  82. data/lib/pwn/sast/pom_version.rb +2 -2
  83. data/lib/pwn/sast/test_case_engine.rb +1 -1
  84. data/lib/pwn/sdr/decoder/adsb.rb +201 -12
  85. data/lib/pwn/sdr/decoder/apt.rb +19 -5
  86. data/lib/pwn/sdr/decoder/base.rb +314 -1
  87. data/lib/pwn/sdr/decoder/bluetooth.rb +91 -18
  88. data/lib/pwn/sdr/decoder/dect.rb +81 -23
  89. data/lib/pwn/sdr/decoder/dsp.rb +229 -15
  90. data/lib/pwn/sdr/decoder/flex.rb +23 -6
  91. data/lib/pwn/sdr/decoder/gps.rb +80 -18
  92. data/lib/pwn/sdr/decoder/gsm.rb +83 -28
  93. data/lib/pwn/sdr/decoder/iridium.rb +80 -18
  94. data/lib/pwn/sdr/decoder/lora.rb +84 -28
  95. data/lib/pwn/sdr/decoder/lte.rb +80 -18
  96. data/lib/pwn/sdr/decoder/morse.rb +23 -6
  97. data/lib/pwn/sdr/decoder/p25.rb +90 -31
  98. data/lib/pwn/sdr/decoder/pager.rb +23 -6
  99. data/lib/pwn/sdr/decoder/pocsag.rb +23 -6
  100. data/lib/pwn/sdr/decoder/rds.rb +219 -52
  101. data/lib/pwn/sdr/decoder/rfid.rb +81 -27
  102. data/lib/pwn/sdr/decoder/rtl433.rb +85 -27
  103. data/lib/pwn/sdr/decoder/rtty.rb +23 -6
  104. data/lib/pwn/sdr/decoder/wifi.rb +86 -32
  105. data/lib/pwn/sdr/decoder/zigbee.rb +88 -35
  106. data/lib/pwn/sdr/decoder.rb +6 -5
  107. data/lib/pwn/sdr/frequency_allocation.rb +124 -81
  108. data/lib/pwn/sdr/gqrx.rb +1513 -165
  109. data/lib/pwn/version.rb +1 -1
  110. data/spec/lib/pwn/ai/agent/extrospection_spec.rb +96 -0
  111. data/spec/lib/pwn/ai/agent/{introspection_spec.rb → reflect_spec.rb} +3 -3
  112. data/spec/lib/pwn/ai/agent/tools/extrospection_spec.rb +8 -24
  113. data/spec/lib/pwn/ffi/adalm_pluto_spec.rb +37 -0
  114. data/spec/lib/pwn/ffi/fftw_spec.rb +26 -0
  115. data/spec/lib/pwn/ffi/hack_rf_spec.rb +25 -0
  116. data/spec/lib/pwn/ffi/liquid_spec.rb +42 -0
  117. data/spec/lib/pwn/ffi/rtl_sdr_spec.rb +24 -0
  118. data/spec/lib/pwn/ffi/soapy_sdr_spec.rb +25 -0
  119. data/spec/lib/pwn/ffi/volk_spec.rb +36 -0
  120. data/spec/lib/pwn/sdr/decoder/base_iq_spec.rb +65 -0
  121. data/spec/lib/pwn/sdr/decoder/dsp_spec.rb +50 -4
  122. data/spec/lib/pwn/sdr/decoder/rds_spec.rb +45 -4
  123. data/third_party/pwn_rdoc.jsonl +279 -30
  124. metadata +21 -5
@@ -1,6 +1,6 @@
1
1
  digraph "PWN_Extrospection" {
2
2
  graph [
3
- label=<<B>PWN::AI::Agent::Extrospection — World Awareness</B><BR/><FONT POINT-SIZE="11" COLOR="#94a3b8">snapshot · drift · observe · intel · watch · verify · correlate — host · net · toolchain · repo · env · rf · web</FONT>>,
3
+ label=<<B>PWN::AI::Agent::Extrospection — On-demand sensing + ambient baseline</B><BR/><FONT POINT-SIZE="11" COLOR="#94a3b8">PRIMARY: intel · verify · watch · rf_tune · osint · serial · telecomm · packet · vision · voice · observe · SECONDARY: snapshot/drift (AUTO_SECTIONS=host/repo/env)</FONT>>,
4
4
  labelloc=t, fontsize=20, fontname="Helvetica",
5
5
  rankdir=LR, splines=spline, nodesep=0.5, ranksep=1.3,
6
6
  bgcolor="#0f172a", fontcolor="#e2e8f0", pad=0.6, newrank=true
@@ -16,13 +16,19 @@ digraph "PWN_Extrospection" {
16
16
  color="#b91c1c"; bgcolor="#450a0a";
17
17
  Host [label="host\nuname · distro · arch", fillcolor="#fda4af"];
18
18
  Net [label="net\ninterfaces · listening ports", fillcolor="#fda4af"];
19
- Tool [label="toolchain\nnmap · burp · msf · git", fillcolor="#fda4af"];
19
+ Tool [label="toolchain (presence)\nnmap/git (safe --ver)\nburp/msf/gqrx PATH only", fillcolor="#fda4af"];
20
20
  Repo [label="repo · env\nHEAD · dirty · ruby/gem", fillcolor="#fda4af"];
21
21
  RFhw [label="rf 📡\nrtl-sdr · hackrf · flipper\ngqrx sock · serial devs", fillcolor="#fda4af"];
22
22
  Web [label="web 🌐\nanchors · targets\nrendered DOM · TLS cert", fillcolor="#fda4af"];
23
23
  Feeds [label="intel feeds\nNVD · CIRCL · Exploit-DB", fillcolor="#fda4af"];
24
+ OSINT [label="osint 🕵️\nphone · FCC · patent\nIP/ASN · CT · person", fillcolor="#fda4af"];
25
+ Serial[label="serial 🔌\nttyUSB/ACM · by-id\nUART / AT modem", fillcolor="#fda4af"];
26
+ Telco [label="telecomm ☎️\nBareSIP · SIP ports\nPSTN / VoIP", fillcolor="#fda4af"];
27
+ Pkt [label="packet 📦\ntshark · tcpdump\npcap summarise", fillcolor="#fda4af"];
28
+ Vis [label="vision 👁\ntesseract OCR\nzbar QR/barcode", fillcolor="#fda4af"];
29
+ Voice [label="voice 🔊\nespeak TTS · whisper STT\nsox / festival", fillcolor="#fda4af"];
24
30
  }
25
- {rank=same; Host; Net; Tool; Repo; RFhw; Web; Feeds}
31
+ {rank=same; Host; Net; Tool; Repo; RFhw; Web; Feeds; OSINT; Serial; Telco; Pkt; Vis; Voice}
26
32
 
27
33
  /* col 0.5 ─ transport */
28
34
  TB [label="PWN::Plugins::\nTransparentBrowser\n:headless (→ :rest fallback)",
@@ -32,15 +38,22 @@ digraph "PWN_Extrospection" {
32
38
  subgraph cluster_eng {
33
39
  label="Extrospection Engine"; fontcolor="#fde68a"; style=rounded;
34
40
  color="#a16207"; bgcolor="#422006"; penwidth=2;
35
- Snap [label="extro_snapshot\nprobe_host/net/toolchain\nprobe_repo/env/rf/web", fillcolor="#fcd34d"];
41
+ Snap [label="extro_snapshot\nprobe_host/net/toolchain/repo/env\nrf/web/osint/serial/telecomm\npacket/vision/voice\n(auto = host/repo/env only)", fillcolor="#fcd34d"];
36
42
  Drift [label="extro_drift\ndelta vs baseline", fillcolor="#fcd34d"];
37
- Obs [label="extro_observe\nrecon · vuln · intel\ntarget · network · env · rf · web", fillcolor="#fcd34d"];
43
+ Obs [label="extro_observe\nrecon · vuln · intel · target\nnetwork · env · rf · web\nosint · serial · telecomm\npacket · vision · voice", fillcolor="#fcd34d"];
38
44
  Intel [label="extro_intel\nCVE / exploit lookup", fillcolor="#fcd34d"];
39
45
  Watch [label="extro_watch\nrender → DOM SHA-256\nscreenshot · TLS fp", fillcolor="#fcd34d"];
40
46
  Verify[label="extro_verify\n:cve · :version · :doc · :generic\n→ :confirmed | :refuted | :unknown", fillcolor="#fcd34d", penwidth=2];
47
+ RFTune[label="extro_rf_tune 📡\ntune GQRX · demod · strength\nRDS PI/PS/RadioText → now_playing", fillcolor="#fcd34d", penwidth=2];
48
+ OsintT[label="extro_osint 🕵️\npublic APIs aggregate\nphone · FCC · patent · person", fillcolor="#fcd34d", penwidth=2];
49
+ SerT [label="extro_serial 🔌\nopen · payload · drain\nPWN::Plugins::Serial", fillcolor="#fcd34d", penwidth=2];
50
+ TelT [label="extro_telecomm ☎️\nBareSIP status/dial\ninventory SIP", fillcolor="#fcd34d", penwidth=2];
51
+ PktT [label="extro_packet 📦\ncapture · summarise pcap\ntshark/PacketFu", fillcolor="#fcd34d", penwidth=2];
52
+ VisT [label="extro_vision 👁\nOCR · barcode/QR", fillcolor="#fcd34d", penwidth=2];
53
+ VoxT [label="extro_voice 🔊\nTTS · STT · inventory", fillcolor="#fcd34d", penwidth=2];
41
54
  Corr [label="extro_correlate\njoin with Learning\n+ Mistakes + Memory", fillcolor="#fcd34d", penwidth=2];
42
55
  }
43
- {rank=same; Snap; Drift; Obs; Intel; Watch; Verify; Corr}
56
+ {rank=same; Snap; Drift; Obs; Intel; Watch; Verify; RFTune; OsintT; SerT; TelT; PktT; VisT; VoxT; Corr}
44
57
 
45
58
  /* col 2 ─ store + prompt + feedback sinks */
46
59
  Store [label="~/.pwn/\nextrospection.json", shape=cylinder, fillcolor="#fcd34d"];
@@ -55,6 +68,7 @@ digraph "PWN_Extrospection" {
55
68
  Tool -> Drift [color="#fb7185"];
56
69
  Repo -> Drift [color="#fb7185"];
57
70
  RFhw -> Obs [label="probe_rf", color="#fb7185"];
71
+ RFhw -> RFTune[label="tune · RDS", color="#fb7185", penwidth=2];
58
72
  Feeds -> Intel [color="#fb7185"];
59
73
 
60
74
  Web -> TB [color="#fb7185"];
@@ -68,6 +82,19 @@ digraph "PWN_Extrospection" {
68
82
  Intel -> Store [label="record:true", color="#f59e0b"];
69
83
  Watch -> Store [label="category::web", color="#f59e0b"];
70
84
  Watch -> Shots [color="#f59e0b"];
85
+ RFTune-> Store [label="category::rf\nnow_playing", color="#f59e0b", penwidth=2];
86
+ OSINT -> OsintT[label="public APIs", color="#fb7185", penwidth=2];
87
+ Serial-> SerT [label="UART I/O", color="#fb7185", penwidth=2];
88
+ Telco -> TelT [label="SIP/HTTP", color="#fb7185", penwidth=2];
89
+ Pkt -> PktT [label="capture", color="#fb7185", penwidth=2];
90
+ Vis -> VisT [label="OCR", color="#fb7185", penwidth=2];
91
+ Voice -> VoxT [label="TTS/STT", color="#fb7185", penwidth=2];
92
+ OsintT-> Store [label="category::osint", color="#f59e0b", penwidth=2];
93
+ SerT -> Store [label="category::serial", color="#f59e0b"];
94
+ TelT -> Store [label="category::telecomm", color="#f59e0b"];
95
+ PktT -> Store [label="category::packet", color="#f59e0b"];
96
+ VisT -> Store [label="category::vision", color="#f59e0b"];
97
+ VoxT -> Store [label="category::voice", color="#f59e0b"];
71
98
  Verify-> Mist [label=":refuted", color="#fb7185", penwidth=2];
72
99
  Verify-> Store [label=":confirmed\n:intel obs (ttl 30d)", color="#f59e0b"];
73
100
  Verify-> Mem [label="revalidate_memory\nmark stale :fact", color="#a78bfa", style=dashed];
@@ -26,7 +26,9 @@ digraph "PWN_Hardware" {
26
26
  MSR [label="MSR206", fillcolor="#6ee7b7"];
27
27
  Adb [label="Android (adb)", fillcolor="#6ee7b7"];
28
28
  Sip [label="BareSIP · Voice", fillcolor="#6ee7b7"];
29
- Sdr [label="SDR::GQRX · Flipper",fillcolor="#6ee7b7"];
29
+ Sdr [label="SDR::GQRX · Flipper\nDecoder::* (run_iq)",fillcolor="#6ee7b7"];
30
+ FfiSdr [label="FFI::RTLSdr · HackRF\nAdalmPluto · SoapySDR\nVolk · Liquid · FFTW",fillcolor="#34d399"];
31
+ Sdr -> FfiSdr;
30
32
  }
31
33
  subgraph cluster_out {
32
34
  label="Analysis"; fontcolor="#ddd6fe"; style=rounded;
@@ -29,8 +29,9 @@ digraph "PWN_MemorySkills" {
29
29
  Flrn [label="learning.jsonl\noutcome log", shape=cylinder, fillcolor="#fcd34d"];
30
30
  Fses [label="sessions/*.jsonl\ntranscripts", shape=cylinder, fillcolor="#fcd34d"];
31
31
  Fmis [label="mistakes.json\nsig → count · fix · regressed", shape=cylinder, fillcolor="#fcd34d"];
32
+ Fext [label="extrospection.json\nsnapshot · rf · web · obs", shape=cylinder, fillcolor="#fcd34d"];
32
33
  }
33
- {rank=same; Fmem; Fskl; Flrn; Fses; Fmis}
34
+ {rank=same; Fmem; Fskl; Flrn; Fses; Fmis; Fext}
34
35
 
35
36
  subgraph cluster_read {
36
37
  label="Read-Side / Injection"; fontcolor="#ddd6fe"; style=rounded;
@@ -43,7 +44,7 @@ digraph "PWN_MemorySkills" {
43
44
  }
44
45
  {rank=same; Rec; Skv; Out; Sesv; Mlst}
45
46
 
46
- Prompt [label="PromptBuilder\nMEMORY + SKILLS + LEARNING\n+ KNOWN MISTAKES / KNOWN FIXES", fillcolor="#7dd3fc", penwidth=2];
47
+ Prompt [label="PromptBuilder\nMEMORY + SKILLS + LEARNING\n+ KNOWN MISTAKES / FIXES\n+ METRICS + EXTROSPECTION", fillcolor="#7dd3fc", penwidth=2];
47
48
 
48
49
  Rem -> Fmem [color="#f59e0b"];
49
50
  Skc -> Fskl [color="#f59e0b"];
@@ -67,5 +68,6 @@ digraph "PWN_MemorySkills" {
67
68
 
68
69
  ReVal [label="Extrospection.verify\nrevalidate_memory (cron)\nbrowser-backed GC", fillcolor="#fcd34d"];
69
70
  ReVal -> Fmem [label="[UNVERIFIED yyyy-mm-dd]\nprefix stale :fact", color="#fb7185", style=dashed, penwidth=2];
71
+ ReVal -> Fext [label=":confirmed → :intel obs\n:refuted → observe stale", color="#f59e0b", style=dashed];
70
72
  Fmem -> ReVal [label=":fact w/ CVE|ver|URL", style=dashed, color="#94a3b8", constraint=false];
71
73
  }
@@ -12,14 +12,15 @@ digraph "PWN_Mistakes_Negative_Feedback" {
12
12
 
13
13
  /* L0 ─ ingest sources */
14
14
  subgraph cluster_in {
15
- label="Four ingest paths"; fontcolor="#fecaca"; style="rounded,dashed";
15
+ label="Five ingest paths"; fontcolor="#fecaca"; style="rounded,dashed";
16
16
  color="#b91c1c"; bgcolor="#450a0a";
17
17
  ToolFail [label=":tool\nDispatch → success:false", fillcolor="#fda4af"];
18
18
  LoopFail [label=":loop\niteration budget exhausted", fillcolor="#fda4af"];
19
19
  UserCorr [label=":user_correction\n\"no that's wrong\" / \"still broken\"", fillcolor="#fda4af"];
20
20
  ModelRec [label=":model\nmistakes_record(tool, error)", fillcolor="#fda4af"];
21
+ Verify [label=":model (proactive)\nextro_verify → :refuted\n(browser-caught assumption)", fillcolor="#fda4af", penwidth=2];
21
22
  }
22
- {rank=same; ToolFail; LoopFail; UserCorr; ModelRec}
23
+ {rank=same; ToolFail; LoopFail; UserCorr; ModelRec; Verify}
23
24
 
24
25
  /* L1 ─ fingerprint */
25
26
  subgraph cluster_fp {
@@ -61,6 +62,7 @@ digraph "PWN_Mistakes_Negative_Feedback" {
61
62
  LoopFail -> Norm [color="#fb7185"];
62
63
  UserCorr -> Sig [label="+ flip_last_outcome", color="#fb7185"];
63
64
  ModelRec -> Sig [color="#fb7185"];
65
+ Verify -> Sig [label="assumption", color="#fb7185", penwidth=2];
64
66
  Norm -> Sig [color="#34d399"];
65
67
 
66
68
  /* L1 → L2 */
@@ -37,9 +37,9 @@ digraph "PWN_Overall_Architecture" {
37
37
  label="PWN::AI::Agent"; fontcolor="#ddd6fe";
38
38
  style=rounded; color="#6d28d9"; bgcolor="#2e1065"; penwidth=2;
39
39
  Loop [label="Loop\nplan → dispatch → observe", fillcolor="#c4b5fd"];
40
- Registry [label="Registry\n10 toolsets · 54 tools", fillcolor="#c4b5fd"];
40
+ Registry [label="Registry\n10 toolsets · 55 tools", fillcolor="#c4b5fd"];
41
41
  Swarm [label="Swarm\npersonas · debate · bus", fillcolor="#c4b5fd"];
42
- Prompt [label="PromptBuilder\nMEMORY · SKILLS\nMISTAKES · EXTRO",fillcolor="#c4b5fd"];
42
+ Prompt [label="PromptBuilder\nMEMORY · SKILLS · LEARNING\nMISTAKES · METRICS · EXTRO",fillcolor="#c4b5fd"];
43
43
  }
44
44
  {rank=same; Loop; Registry; Swarm; Prompt}
45
45
 
@@ -67,7 +67,7 @@ digraph "PWN_Overall_Architecture" {
67
67
  Learn [label="learning.jsonl", shape=cylinder, fillcolor="#fcd34d"];
68
68
  Metrics [label="metrics.json", shape=cylinder, fillcolor="#fcd34d"];
69
69
  MistF [label="mistakes.json", shape=cylinder, fillcolor="#fcd34d"];
70
- Extro [label="extrospection.json\n+ rf + web snapshot", shape=cylinder, fillcolor="#fcd34d"];
70
+ Extro [label="extrospection.json\nrf · web · observations", shape=cylinder, fillcolor="#fcd34d"];
71
71
  Sessions [label="sessions/*.jsonl", shape=cylinder, fillcolor="#fcd34d"];
72
72
  SwarmB [label="swarm/*/bus.jsonl", shape=cylinder, fillcolor="#fcd34d"];
73
73
  CronF [label="cron/jobs.yml", shape=cylinder, fillcolor="#fcd34d"];
@@ -18,8 +18,8 @@ digraph "PWN_Persistence" {
18
18
  lrn [label="learning.jsonl\ntask outcomes"];
19
19
  mis [label="mistakes.json\nfailure fingerprints · fixes\n[REPEATING] · [REGRESSED]"];
20
20
  met [label="metrics.json\nper-tool telemetry"];
21
- ext [label="extrospection.json\nhost snapshot + rf + web\n+ observations"];
22
- ews [label="extrospection/web/*.png\nheadless screenshots"];
21
+ ext [label="extrospection.json\nsnapshot (host/net/tc/repo/env/rf/web)\n+ previous + observations[]"];
22
+ ews [label="extrospection/web/*.png\nprobe_web / extro_watch shots"];
23
23
  ses [label="sessions/*.jsonl\ntranscripts"];
24
24
  crn [label="cron/jobs.yml\nscheduled jobs + logs"];
25
25
  agt [label="agents.yml\npersona registry"];
@@ -27,5 +27,5 @@ digraph "PWN_Persistence" {
27
27
  hist [label="~/.pwn_history\nREPL history"];
28
28
 
29
29
  Root->cfg; Root->mem; Root->skl; Root->lrn; Root->mis; Root->met; Root->ext;
30
- Root->ses; Root->crn; Root->agt; Root->swm; Root->hist;
30
+ Root->ews; Root->ses; Root->crn; Root->agt; Root->swm; Root->hist;
31
31
  }
@@ -37,11 +37,12 @@ digraph "PWN_AI_Feedback_Learning_Loop" {
37
37
  subgraph cluster_extro {
38
38
  label="EXTROSPECTION (world)"; fontcolor="#fde68a";
39
39
  style=rounded; color="#a16207"; bgcolor="#422006"; penwidth=2;
40
- Snapshot [label="snapshot · drift\nhost/net/toolchain\nrepo/env/rf/web", fillcolor="#fcd34d"];
40
+ Snapshot [label="snapshot · drift\nhost/net/toolchain\nrepo/env/rf/web\n(AUTO_SECTIONS=host/repo/env)", fillcolor="#fcd34d"];
41
41
  Observe [label="observe · intel · watch\nrecon · CVE · web DOM", fillcolor="#fcd34d"];
42
42
  Verify [label="verify (browser)\nfact-check own claims\nrevalidate_memory", fillcolor="#fcd34d", penwidth=2];
43
+ RFTune [label="rf_tune 📡\ntune GQRX · demod\nRDS → now_playing", fillcolor="#fcd34d", penwidth=2];
43
44
  }
44
- {rank=same; Metrics; Learning; Mistakes; Snapshot; Observe; Verify}
45
+ {rank=same; Metrics; Learning; Mistakes; Snapshot; Observe; Verify; RFTune}
45
46
 
46
47
  /* L3 ─ correlate */
47
48
  Correlate [label="extro_correlate()\n\"I did it wrong\" vs \"the world changed\"",
@@ -71,15 +72,17 @@ digraph "PWN_AI_Feedback_Learning_Loop" {
71
72
 
72
73
  /* L1 → L2 */
73
74
  Dispatch -> Metrics [label="record()", color="#34d399"];
74
- Result -> Learning [label="auto_reflect", color="#34d399"];
75
+ Result -> Learning [label="auto_introspect", color="#34d399"];
75
76
  Dispatch -> Mistakes [label="on failure\nrecord()", color="#fb7185", penwidth=2];
76
77
  User -> Mistakes [label="\"that's wrong\"\ncheck_user_correction", color="#fb7185",
77
78
  style=dashed, constraint=false];
78
79
  Dispatch -> Snapshot [label="probe", color="#f59e0b"];
79
- Result -> Observe [label="auto_extrospect", color="#f59e0b"];
80
+ Result -> Observe [label="auto_extrospect\n(AUTO_SECTIONS only)", color="#f59e0b"];
80
81
  World -> Snapshot [color="#fb7185", constraint=false];
81
82
  World -> Observe [color="#fb7185", constraint=false];
82
83
  World -> Verify [label="TransparentBrowser\n:headless", color="#38bdf8", constraint=false, penwidth=2];
84
+ World -> RFTune [label="GQRX remote\n:7356 + SDR", color="#fb7185", constraint=false, penwidth=2];
85
+ Dispatch -> Observe [label="sense tools\nverify/watch/rf_tune/intel", color="#f59e0b", style=dashed, constraint=false];
83
86
 
84
87
  /* L2 → L3 */
85
88
  Metrics -> Correlate [color="#34d399"];
@@ -88,6 +91,7 @@ digraph "PWN_AI_Feedback_Learning_Loop" {
88
91
  Snapshot -> Correlate [color="#f59e0b"];
89
92
  Observe -> Correlate [color="#f59e0b"];
90
93
  Verify -> Correlate [color="#f59e0b"];
94
+ RFTune -> Correlate [color="#f59e0b"];
91
95
 
92
96
  /* L3 → L4 */
93
97
  Correlate -> Fmet [style=invis];
@@ -98,7 +102,9 @@ digraph "PWN_AI_Feedback_Learning_Loop" {
98
102
  Learning -> Fmem [label="lesson", color="#94a3b8"];
99
103
  Learning -> Fskl [label="skill", color="#94a3b8"];
100
104
  Observe -> Fext [color="#94a3b8"];
105
+ RFTune -> Fext [label=":rf obs\nttl 300s", color="#94a3b8"];
101
106
  Verify -> Fmis [label=":refuted →\nassumption mistake", color="#fb7185", penwidth=2];
107
+ Verify -> Mistakes [label=":refuted", color="#fb7185", style=dashed, constraint=false];
102
108
  Verify -> Fmem [label="mark stale\n[UNVERIFIED]", color="#a78bfa", style=dashed];
103
109
  Verify -> Fext [label=":confirmed\n:intel obs", color="#94a3b8"];
104
110
 
@@ -1,8 +1,8 @@
1
1
  digraph "PWN_SDR" {
2
2
  graph [
3
- label=<<B>PWN::SDR — Software-Defined Radio &amp; RF Hacking</B><BR/><FONT POINT-SIZE="11" COLOR="#94a3b8">GQRX · FlipperZero · RFIDler · SonMicro · FrequencyAllocation · Decoder::* (20 protocols)</FONT>>,
3
+ label=<<B>PWN::SDR — Software-Defined Radio &amp; RF Hacking</B><BR/><FONT POINT-SIZE="11" COLOR="#94a3b8">GQRX · FlipperZero · RFIDler · FrequencyAllocation · Decoder::* (20) · FFI::{Volk,Liquid,FFTW,HackRF,RTLSdr,SoapySDR}</FONT>>,
4
4
  labelloc=t, fontsize=20, fontname="Helvetica",
5
- rankdir=LR, splines=spline, nodesep=0.45, ranksep=1.2,
5
+ rankdir=LR, splines=spline, nodesep=0.45, ranksep=1.1,
6
6
  bgcolor="#0f172a", fontcolor="#e2e8f0", pad=0.6, newrank=true
7
7
  ];
8
8
  node [fontname="Helvetica", fontsize=10, style="filled,rounded",
@@ -15,33 +15,56 @@ digraph "PWN_SDR" {
15
15
  subgraph cluster_hw {
16
16
  label="Hardware"; fontcolor="#a7f3d0"; style=rounded;
17
17
  color="#047857"; bgcolor="#022c22";
18
- SDRhw [label="RTL-SDR / HackRF\n(via GQRX / SoapySDR)", fillcolor="#6ee7b7"];
19
- Flipper [label="SDR::FlipperZero", fillcolor="#6ee7b7"];
20
- RFID [label="SDR::RFIDler\nSonMicroRFID", fillcolor="#6ee7b7"];
18
+ SDRhw [label="RTL-SDR / HackRF / Airspy\n(via GQRX / SoapySDR / FFI)", fillcolor="#6ee7b7"];
19
+ Flipper [label="SDR::FlipperZero", fillcolor="#6ee7b7"];
20
+ RFID [label="SDR::RFIDler\nSonMicroRFID", fillcolor="#6ee7b7"];
21
+ }
22
+ subgraph cluster_ffi {
23
+ label="PWN::FFI native backends"; fontcolor="#bae6fd"; style=rounded;
24
+ color="#0369a1"; bgcolor="#0c4a6e";
25
+ Volk [label="FFI::Volk\nSIMD s16→f32 · accumulate", fillcolor="#7dd3fc"];
26
+ Liquid [label="FFI::Liquid\nfreqdem · msresamp · FIR", fillcolor="#7dd3fc"];
27
+ FFTW [label="FFI::FFTW\nrfft · cfft · power-dB", fillcolor="#7dd3fc"];
28
+ Front [label="FFI::{HackRF,RTLSdr,SoapySDR}\ninventory · raw I/Q", fillcolor="#7dd3fc"];
21
29
  }
22
30
  subgraph cluster_ctrl {
23
31
  label="Control · Scan"; fontcolor="#fde68a"; style=rounded;
24
32
  color="#a16207"; bgcolor="#422006";
25
- GQRX [label="SDR::GQRX\nremote control\nspectrum snapshot\n(median floor · DC null)", fillcolor="#fcd34d"];
26
- Freq [label="SDR::FrequencyAllocation\nband lookup", fillcolor="#fcd34d"];
27
- Scan [label="bin/pwn_gqrx_scanner\n--fft-scan · iterative\n--min-snr-db · --avg", fillcolor="#fcd34d"];
33
+ GQRX [label="SDR::GQRX\nremote control\nspectrum + FFT geometry\n(RAW panorama · plan-param refine)", fillcolor="#fcd34d"];
34
+ Freq [label="SDR::FrequencyAllocation\nband lookup\nplan_bw · precision", fillcolor="#fcd34d"];
35
+ Scan [label="bin/pwn_gqrx_scanner\n--fft-scan · iterative\n--min-snr-db · --no-refine", fillcolor="#fcd34d"];
28
36
  }
29
37
  subgraph cluster_dec {
30
- label="Decode · Record"; fontcolor="#ddd6fe"; style=rounded;
38
+ label="Decode · Sense · Record"; fontcolor="#ddd6fe"; style=rounded;
31
39
  color="#6d28d9"; bgcolor="#2e1065";
40
+ DSP [label="Decoder::DSP\npure-Ruby + FFI accel\n(unpack · resample · FSK)", fillcolor="#c4b5fd"];
32
41
  Dec [label="SDR::Decoder::*\nADSB · APT · BT · DECT · GPS\nGSM · Iridium · LoRa · LTE\nMorse · P25 · POCSAG/FLEX\nRDS · RFID · rtl_433 · RTTY\nWiFi · ZigBee", fillcolor="#c4b5fd"];
33
- Obs [label="extro_observe\ncategory: :rf\nrecord signal intel", fillcolor="#c4b5fd"];
42
+ Obs [label="extro_observe\ncategory: :rf", fillcolor="#c4b5fd"];
34
43
  Xrf [label="extro_snapshot :rf\nprobe_rf → hw inventory", fillcolor="#c4b5fd"];
44
+ Tune[label="extro_rf_tune 📡\ntune · demod · strength\nRDS.sample → now_playing", fillcolor="#c4b5fd", penwidth=2];
35
45
  }
36
46
 
37
47
  RF -> SDRhw [color="#fb7185"];
38
48
  RF -> Flipper [color="#fb7185"];
39
49
  RF -> RFID [color="#fb7185"];
40
- SDRhw -> GQRX [color="#f59e0b"];
41
- Flipper -> Freq [color="#f59e0b"];
42
- RFID -> Scan [color="#f59e0b"];
43
- GQRX -> Dec [color="#a78bfa"];
50
+ SDRhw -> Front [color="#38bdf8"];
51
+ SDRhw -> GQRX [color="#f59e0b"];
52
+ Front -> Volk [style=dashed, color="#38bdf8"];
53
+ Front -> Liquid [style=dashed, color="#38bdf8"];
54
+ Front -> FFTW [style=dashed, color="#38bdf8"];
55
+ Volk -> DSP [color="#a78bfa"];
56
+ Liquid -> DSP [color="#a78bfa"];
57
+ FFTW -> DSP [color="#a78bfa"];
58
+ GQRX -> DSP [color="#a78bfa"];
59
+ GQRX -> Tune [label="remote :7356", color="#f59e0b", penwidth=2];
60
+ DSP -> Dec [color="#a78bfa"];
44
61
  Freq -> Dec [color="#a78bfa"];
45
- Scan -> Obs [color="#a78bfa"];
46
- SDRhw -> Xrf [style=dashed, color="#fbbf24", constraint=false];
62
+ Flipper -> Freq [color="#f59e0b"];
63
+ RFID -> Scan [color="#f59e0b"];
64
+ Freq -> Scan [label="plan_bw/step", color="#f59e0b"];
65
+ Scan -> Obs [color="#a78bfa"];
66
+ Front -> Xrf [style=dashed, color="#fbbf24", constraint=false];
67
+ Dec -> Obs [style=dashed, color="#c4b5fd"];
68
+ Tune -> Obs [label="category::rf\nttl 300s", color="#a78bfa", penwidth=2];
69
+ Tune -> Dec [label="RDS.sample", style=dashed, color="#c4b5fd"];
47
70
  }
@@ -9,31 +9,31 @@
9
9
  <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 397.2)">
10
10
  <title>PWN_Driver</title>
11
11
  <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-397.2 684.45,-397.2 684.45,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="184.88" y="-332" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">Driver Anatomy — bin/pwn_*</text>
13
- <text xml:space="preserve" text-anchor="start" x="206.25" y="-320.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#94a3b8">52 shipped drivers · thin CLI over PWN::Plugins</text>
12
+ <text xml:space="preserve" text-anchor="start" x="184.88" y="-332" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">Driver Anatomy — bin/pwn_*</text>
13
+ <text xml:space="preserve" text-anchor="start" x="206.25" y="-320.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">52 shipped drivers · thin CLI over PWN::Plugins</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_d</title>
16
16
  <path fill="#022c22" stroke="#047857" d="M276,-8C276,-8 419,-8 419,-8 425,-8 431,-14 431,-20 431,-20 431,-223 431,-223 431,-229 425,-235 419,-235 419,-235 276,-235 276,-235 270,-235 264,-229 264,-223 264,-223 264,-20 264,-20 264,-14 270,-8 276,-8"/>
17
- <text xml:space="preserve" text-anchor="middle" x="347.5" y="-212" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#a7f3d0">Driver Body</text>
17
+ <text xml:space="preserve" text-anchor="middle" x="347.5" y="-212" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Driver Body</text>
18
18
  </g>
19
19
  <g id="clust3" class="cluster">
20
20
  <title>cluster_o</title>
21
21
  <path fill="#2e1065" stroke="#6d28d9" d="M521,-80C521,-80 621.25,-80 621.25,-80 627.25,-80 633.25,-86 633.25,-92 633.25,-92 633.25,-295 633.25,-295 633.25,-301 627.25,-307 621.25,-307 621.25,-307 521,-307 521,-307 515,-307 509,-301 509,-295 509,-295 509,-92 509,-92 509,-86 515,-80 521,-80"/>
22
- <text xml:space="preserve" text-anchor="middle" x="571.12" y="-284" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#ddd6fe">Output</text>
22
+ <text xml:space="preserve" text-anchor="middle" x="571.12" y="-284" font-family="sans-Serif" font-size="20.00" fill="#ddd6fe">Output</text>
23
23
  </g>
24
24
  <!-- Sh -->
25
25
  <g id="node1" class="node">
26
26
  <title>Sh</title>
27
27
  <path fill="#7dd3fc" stroke="#334155" stroke-width="1.3" d="M166,-88C166,-88 12,-88 12,-88 6,-88 0,-82 0,-76 0,-76 0,-64 0,-64 0,-58 6,-52 12,-52 12,-52 166,-52 166,-52 172,-52 178,-58 178,-64 178,-64 178,-76 178,-76 178,-82 172,-88 166,-88"/>
28
- <text xml:space="preserve" text-anchor="middle" x="89" y="-72.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">$ pwn_burp_suite_pro_active_scan \ </text>
29
- <text xml:space="preserve" text-anchor="middle" x="89" y="-60.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a"> &#160;&#160;&#160;&#45;t https://target &#45;o out/</text>
28
+ <text xml:space="preserve" text-anchor="middle" x="89" y="-72.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">$ pwn_burp_suite_pro_active_scan \ </text>
29
+ <text xml:space="preserve" text-anchor="middle" x="89" y="-60.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a"> &#160;&#160;&#160;&#45;t https://target &#45;o out/</text>
30
30
  </g>
31
31
  <!-- Opt -->
32
32
  <g id="node2" class="node">
33
33
  <title>Opt</title>
34
34
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M378,-52C378,-52 317,-52 317,-52 311,-52 305,-46 305,-40 305,-40 305,-28 305,-28 305,-22 311,-16 317,-16 317,-16 378,-16 378,-16 384,-16 390,-22 390,-28 390,-28 390,-40 390,-40 390,-46 384,-52 378,-52"/>
35
- <text xml:space="preserve" text-anchor="middle" x="347.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">OptionParser</text>
36
- <text xml:space="preserve" text-anchor="middle" x="347.5" y="-24.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">ARGV → opts{}</text>
35
+ <text xml:space="preserve" text-anchor="middle" x="347.5" y="-36.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">OptionParser</text>
36
+ <text xml:space="preserve" text-anchor="middle" x="347.5" y="-24.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">ARGV → opts{}</text>
37
37
  </g>
38
38
  <!-- Sh&#45;&gt;Opt -->
39
39
  <g id="edge1" class="edge">
@@ -45,7 +45,7 @@
45
45
  <g id="node3" class="node">
46
46
  <title>Req</title>
47
47
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M370.88,-124C370.88,-124 324.12,-124 324.12,-124 318.12,-124 312.12,-118 312.12,-112 312.12,-112 312.12,-100 312.12,-100 312.12,-94 318.12,-88 324.12,-88 324.12,-88 370.88,-88 370.88,-88 376.88,-88 382.88,-94 382.88,-100 382.88,-100 382.88,-112 382.88,-112 382.88,-118 376.88,-124 370.88,-124"/>
48
- <text xml:space="preserve" text-anchor="middle" x="347.5" y="-102.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">require &#39;pwn&#39;</text>
48
+ <text xml:space="preserve" text-anchor="middle" x="347.5" y="-102.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">require &#39;pwn&#39;</text>
49
49
  </g>
50
50
  <!-- Sh&#45;&gt;Req -->
51
51
  <g id="edge2" class="edge">
@@ -57,7 +57,7 @@
57
57
  <g id="node4" class="node">
58
58
  <title>Call</title>
59
59
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M411,-196C411,-196 284,-196 284,-196 278,-196 272,-190 272,-184 272,-184 272,-172 272,-172 272,-166 278,-160 284,-160 284,-160 411,-160 411,-160 417,-160 423,-166 423,-172 423,-172 423,-184 423,-184 423,-190 417,-196 411,-196"/>
60
- <text xml:space="preserve" text-anchor="middle" x="347.5" y="-174.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">PWN::Plugins::X.method(opts)</text>
60
+ <text xml:space="preserve" text-anchor="middle" x="347.5" y="-174.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PWN::Plugins::X.method(opts)</text>
61
61
  </g>
62
62
  <!-- Opt&#45;&gt;Call -->
63
63
  <g id="edge3" class="edge">
@@ -75,7 +75,7 @@
75
75
  <g id="node5" class="node">
76
76
  <title>Std</title>
77
77
  <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M613.25,-124C613.25,-124 529,-124 529,-124 523,-124 517,-118 517,-112 517,-112 517,-100 517,-100 517,-94 523,-88 529,-88 529,-88 613.25,-88 613.25,-88 619.25,-88 625.25,-94 625.25,-100 625.25,-100 625.25,-112 625.25,-112 625.25,-118 619.25,-124 613.25,-124"/>
78
- <text xml:space="preserve" text-anchor="middle" x="571.12" y="-102.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">STDOUT / STDERR</text>
78
+ <text xml:space="preserve" text-anchor="middle" x="571.12" y="-102.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">STDOUT / STDERR</text>
79
79
  </g>
80
80
  <!-- Call&#45;&gt;Std -->
81
81
  <g id="edge5" class="edge">
@@ -87,7 +87,7 @@
87
87
  <g id="node6" class="node">
88
88
  <title>Rep</title>
89
89
  <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M599.38,-196C599.38,-196 542.88,-196 542.88,-196 536.88,-196 530.88,-190 530.88,-184 530.88,-184 530.88,-172 530.88,-172 530.88,-166 536.88,-160 542.88,-160 542.88,-160 599.38,-160 599.38,-160 605.38,-160 611.38,-166 611.38,-172 611.38,-172 611.38,-184 611.38,-184 611.38,-190 605.38,-196 599.38,-196"/>
90
- <text xml:space="preserve" text-anchor="middle" x="571.12" y="-174.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">PWN::Reports</text>
90
+ <text xml:space="preserve" text-anchor="middle" x="571.12" y="-174.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">PWN::Reports</text>
91
91
  </g>
92
92
  <!-- Call&#45;&gt;Rep -->
93
93
  <g id="edge6" class="edge">
@@ -99,7 +99,7 @@
99
99
  <g id="node7" class="node">
100
100
  <title>Ex</title>
101
101
  <path fill="#c4b5fd" stroke="#334155" stroke-width="1.3" d="M587,-268C587,-268 555.25,-268 555.25,-268 549.25,-268 543.25,-262 543.25,-256 543.25,-256 543.25,-244 543.25,-244 543.25,-238 549.25,-232 555.25,-232 555.25,-232 587,-232 587,-232 593,-232 599,-238 599,-244 599,-244 599,-256 599,-256 599,-262 593,-268 587,-268"/>
102
- <text xml:space="preserve" text-anchor="middle" x="571.12" y="-246.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">exit code</text>
102
+ <text xml:space="preserve" text-anchor="middle" x="571.12" y="-246.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">exit code</text>
103
103
  </g>
104
104
  <!-- Call&#45;&gt;Ex -->
105
105
  <g id="edge7" class="edge">