pwn 0.5.618 → 0.5.620

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/README.md +14 -6
  4. data/bin/pwn_gqrx_scanner +25 -5
  5. data/documentation/Agent-Tool-Registry.md +3 -3
  6. data/documentation/Diagrams.md +6 -2
  7. data/documentation/Extrospection.md +30 -11
  8. data/documentation/Home.md +5 -4
  9. data/documentation/How-PWN-Works.md +7 -4
  10. data/documentation/Mistakes.md +96 -0
  11. data/documentation/Persistence.md +3 -1
  12. data/documentation/SDR.md +23 -5
  13. data/documentation/Skills-Memory-Learning.md +15 -5
  14. data/documentation/diagrams/agent-tool-registry.svg +94 -92
  15. data/documentation/diagrams/dot/agent-tool-registry.dot +2 -2
  16. data/documentation/diagrams/dot/extrospection-world-awareness.dot +9 -7
  17. data/documentation/diagrams/dot/memory-skills-detailed.dot +12 -5
  18. data/documentation/diagrams/dot/mistakes-negative-feedback.dot +93 -0
  19. data/documentation/diagrams/dot/overall-pwn-architecture.dot +7 -5
  20. data/documentation/diagrams/dot/persistence-filesystem.dot +3 -2
  21. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +19 -7
  22. data/documentation/diagrams/dot/sdr-radio-flow.dot +13 -11
  23. data/documentation/diagrams/extrospection-world-awareness.svg +111 -93
  24. data/documentation/diagrams/memory-skills-detailed.svg +146 -97
  25. data/documentation/diagrams/mistakes-negative-feedback.svg +266 -0
  26. data/documentation/diagrams/overall-pwn-architecture.svg +184 -173
  27. data/documentation/diagrams/persistence-filesystem.svg +77 -62
  28. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +217 -149
  29. data/documentation/diagrams/sdr-radio-flow.svg +76 -56
  30. data/documentation/pwn-ai-Agent.md +28 -15
  31. data/lib/pwn/ai/agent/extrospection.rb +65 -6
  32. data/lib/pwn/ai/agent/learning.rb +67 -7
  33. data/lib/pwn/ai/agent/loop.rb +72 -6
  34. data/lib/pwn/ai/agent/mistakes.rb +369 -0
  35. data/lib/pwn/ai/agent/prompt_builder.rb +10 -1
  36. data/lib/pwn/ai/agent/tools/extrospection.rb +2 -2
  37. data/lib/pwn/ai/agent/tools/mistakes.rb +132 -0
  38. data/lib/pwn/ai/agent.rb +1 -0
  39. data/lib/pwn/plugins/jira_data_center.rb +2 -2
  40. data/lib/pwn/sdr/decoder/adsb.rb +101 -0
  41. data/lib/pwn/sdr/decoder/apt.rb +75 -0
  42. data/lib/pwn/sdr/decoder/bluetooth.rb +78 -0
  43. data/lib/pwn/sdr/decoder/dect.rb +84 -0
  44. data/lib/pwn/sdr/decoder/gps.rb +83 -0
  45. data/lib/pwn/sdr/decoder/gsm.rb +50 -29
  46. data/lib/pwn/sdr/decoder/iridium.rb +81 -0
  47. data/lib/pwn/sdr/decoder/lora.rb +87 -0
  48. data/lib/pwn/sdr/decoder/lte.rb +88 -0
  49. data/lib/pwn/sdr/decoder/morse.rb +64 -0
  50. data/lib/pwn/sdr/decoder/p25.rb +71 -0
  51. data/lib/pwn/sdr/decoder/pager.rb +77 -0
  52. data/lib/pwn/sdr/decoder/pocsag.rb +26 -11
  53. data/lib/pwn/sdr/decoder/rfid.rb +88 -0
  54. data/lib/pwn/sdr/decoder/rtl433.rb +95 -0
  55. data/lib/pwn/sdr/decoder/rtty.rb +66 -0
  56. data/lib/pwn/sdr/decoder/wifi.rb +98 -0
  57. data/lib/pwn/sdr/decoder/zigbee.rb +96 -0
  58. data/lib/pwn/sdr/decoder.rb +67 -7
  59. data/lib/pwn/sdr/frequency_allocation.rb +82 -41
  60. data/lib/pwn/sdr/gqrx.rb +186 -95
  61. data/lib/pwn/version.rb +1 -1
  62. data/spec/lib/pwn/ai/agent/mistakes_spec.rb +36 -0
  63. data/spec/lib/pwn/ai/agent/tools/mistakes_spec.rb +12 -0
  64. data/spec/lib/pwn/sdr/decoder/adsb_spec.rb +15 -0
  65. data/spec/lib/pwn/sdr/decoder/apt_spec.rb +15 -0
  66. data/spec/lib/pwn/sdr/decoder/bluetooth_spec.rb +15 -0
  67. data/spec/lib/pwn/sdr/decoder/dect_spec.rb +15 -0
  68. data/spec/lib/pwn/sdr/decoder/gps_spec.rb +15 -0
  69. data/spec/lib/pwn/sdr/decoder/iridium_spec.rb +15 -0
  70. data/spec/lib/pwn/sdr/decoder/lora_spec.rb +15 -0
  71. data/spec/lib/pwn/sdr/decoder/lte_spec.rb +15 -0
  72. data/spec/lib/pwn/sdr/decoder/morse_spec.rb +15 -0
  73. data/spec/lib/pwn/sdr/decoder/p25_spec.rb +15 -0
  74. data/spec/lib/pwn/sdr/decoder/pager_spec.rb +15 -0
  75. data/spec/lib/pwn/sdr/decoder/rfid_spec.rb +15 -0
  76. data/spec/lib/pwn/sdr/decoder/rtl433_spec.rb +15 -0
  77. data/spec/lib/pwn/sdr/decoder/rtty_spec.rb +15 -0
  78. data/spec/lib/pwn/sdr/decoder/wifi_spec.rb +15 -0
  79. data/spec/lib/pwn/sdr/decoder/zigbee_spec.rb +15 -0
  80. data/third_party/pwn_rdoc.jsonl +92 -3
  81. metadata +44 -6
  82. data/README.md.bak +0 -200
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::SDR::Decoder::WiFi do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::SDR::Decoder::WiFi
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::SDR::Decoder::WiFi
13
+ expect(help_response).to respond_to :help
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::SDR::Decoder::ZigBee do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::SDR::Decoder::ZigBee
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::SDR::Decoder::ZigBee
13
+ expect(help_response).to respond_to :help
14
+ end
15
+ end
@@ -32,18 +32,22 @@
32
32
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.intel_nvd Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.intel_nvd`: "}]}
33
33
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.load Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.load`: Supported Method Parameters\n\nstore = PWN::AI::Agent::Extrospection.load\n"}]}
34
34
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.observations Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.observations`: Supported Method Parameters\n\nrows = PWN::AI::Agent::Extrospection.observations(\n\nlimit: 'optional - max entries newest-first (default 50)',\nsource: 'optional - filter by source substring',\ncategory: 'optional - filter by category',\ntarget: 'optional - filter by target substring',\ntag: 'optional - filter by tag substring',\nfresh_only: 'optional - drop entries whose ttl has expired (default false)'\n\n)\n"}]}
35
- {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.observe Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.observe`: Supported Method Parameters\n\nobs = PWN::AI::Agent::Extrospection.observe(\n\nsource: 'required - where the observation came from (nmap, shodan, burp, cve, human, ...)',\ndata: 'required - the observation payload (String or Hash)',\ncategory: 'optional - :recon, :vuln, :intel, :target, :network, :misc (default :misc)',\ntarget: 'optional - host/ip/url/asset the observation is about',\ntags: 'optional - Array of String labels',\nttl: 'optional - seconds until this observation is considered stale (default nil = forever)'\n\n)\n\nRecords a fact about the OUTSIDE world (as opposed to Learning.note_outcome which records a fact about the agent’s own behaviour). Observations are re-injected via .to_context so recon findings and threat-intel persist across sessions.\n"}]}
35
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.observe Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.observe`: Supported Method Parameters\n\nobs = PWN::AI::Agent::Extrospection.observe(\n\nsource: 'required - where the observation came from (nmap, shodan, burp, cve, human, ...)',\ndata: 'required - the observation payload (String or Hash)',\ncategory: 'optional - :recon, :vuln, :intel, :target, :network, :env, :rf, :misc (default :misc)',\ntarget: 'optional - host/ip/url/asset the observation is about',\ntags: 'optional - Array of String labels',\nttl: 'optional - seconds until this observation is considered stale (default nil = forever)'\n\n)\n\nRecords a fact about the OUTSIDE world (as opposed to Learning.note_outcome which records a fact about the agent’s own behaviour). Observations are re-injected via .to_context so recon findings and threat-intel persist across sessions.\n"}]}
36
36
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.probe_env Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.probe_env`: "}]}
37
37
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.probe_host Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.probe_host`: "}]}
38
38
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.probe_net Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.probe_net`: "}]}
39
39
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.probe_repo Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.probe_repo`: "}]}
40
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.probe_rf Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.probe_rf`: "}]}
40
41
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.probe_toolchain Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.probe_toolchain`: "}]}
41
42
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.reset Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.reset`: Supported Method Parameters\n\nPWN::AI::Agent::Extrospection.reset\n"}]}
43
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.rf_band_plan_keys Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.rf_band_plan_keys`: "}]}
44
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.rf_present? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.rf_present?`: "}]}
42
45
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.save Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.save`: Supported Method Parameters\n\nPWN::AI::Agent::Extrospection.save(\n\nstore: 'required - Hash returned by .load / mutated in place'\n\n)\n"}]}
43
46
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.sh Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.sh`: "}]}
44
- {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.snapshot Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.snapshot`: Supported Method Parameters\n\nsnap = PWN::AI::Agent::Extrospection.snapshot(\n\npersist: 'optional - Boolean, write snapshot to disk & rotate previous (default true)',\nsections: 'optional - Array subset of [:host, :net, :toolchain, :repo, :env] (default all)'\n\n)\n\nCaptures a fingerprint of the OUTSIDE world. When persist:true the prior snapshot is rotated into :previous so .drift can diff them.\n"}]}
47
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.snapshot Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.snapshot`: Supported Method Parameters\n\nsnap = PWN::AI::Agent::Extrospection.snapshot(\n\npersist: 'optional - Boolean, write snapshot to disk & rotate previous (default true)',\nsections: 'optional - Array subset of [:host, :net, :toolchain, :repo, :env, :rf] (default all)'\n\n)\n\nCaptures a fingerprint of the OUTSIDE world. When persist:true the prior snapshot is rotated into :previous so .drift can diff them.\n"}]}
45
48
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.stats Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.stats`: Supported Method Parameters\n\nstats = PWN::AI::Agent::Extrospection.stats\n"}]}
46
49
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.summarise_drift Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.summarise_drift`: "}]}
50
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.tcp_open? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.tcp_open?`: "}]}
47
51
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Extrospection.to_context Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Extrospection.to_context`: Supported Method Parameters\n\nctx = PWN::AI::Agent::Extrospection.to_context(\n\ndrift_limit: 'optional - max drift lines (default 4)',\nobs_limit: 'optional - max observation lines (default 4)'\n\n)\n"}]}
48
52
  {"messages":[{"role":"user","content":"PWN::AI::Agent::GQRX.analyze Usage"},{"role":"assistant","content":"`PWN::AI::Agent::GQRX.analyze`: Supported Method Parameters\n\nai_analysis = PWN::AI::Agent::GQRX.analyze(\n\nrequest: 'required - A string containing the signal data captured by GQRX that you want to analyze. This data should be in a format that can be interpreted by the AI for analysis, such as raw signal data, frequency information, or any relevant metadata associated with the capture.',\nlocation: 'required - A string containing a city, state, country, or GPS coordinates where the signal data was captured. This information will be used to provide context for the analysis and to determine if the frequency is licensed or unlicensed based on FCC records.'\n\n)\n"}]}
49
53
  {"messages":[{"role":"user","content":"PWN::AI::Agent::GQRX.authors Usage"},{"role":"assistant","content":"`PWN::AI::Agent::GQRX.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
@@ -60,8 +64,10 @@
60
64
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.build_skill_from_session Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.build_skill_from_session`: "}]}
61
65
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.consolidate Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.consolidate`: Supported Method Parameters\n\nremoved = PWN::AI::Agent::Learning.consolidate(\n\nmax_entries: 'optional - hard cap on PWN::Memory size (default MAX_MEMORY_ENTRIES)'\n\n)\n\nDeduplicates near-identical lesson values and prunes the oldest entries once the cap is exceeded so the injected MEMORY block stays high-signal.\n"}]}
62
66
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.distill_skill Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.distill_skill`: Supported Method Parameters\n\nskill = PWN::AI::Agent::Learning.distill_skill(\n\nname: 'required - snake_case name for the new skill',\nsession_id: 'optional - PWN::Sessions id to mine (uses its transcript)',\ncontent: 'optional - explicit markdown body; overrides transcript mining',\nreferences: 'optional - Array of reference URLs / CWE / CVE / ATT&CK ids'\n\n)\n"}]}
67
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.flip_last_outcome Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.flip_last_outcome`: Supported Method Parameters\n\nPWN::AI::Agent::Learning.flip_last_outcome(\n\nsession_id: 'optional - only flip if the newest outcome belongs to this session',\nreason: 'optional - why it is being flipped (usually the user correction text)'\n\n)\n\nRewrites the most-recently-appended learning.jsonl entry from success:true to success:false. Called by Mistakes.check_user_correction when the user’s next message rejects the previous answer, so the 100 %-success illusion is broken and the failure enters the corpus.\n"}]}
63
68
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.help Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.help`: "}]}
64
69
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.heuristic_lessons Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.heuristic_lessons`: "}]}
70
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.infer_success Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.infer_success`: "}]}
65
71
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.introspective_lessons Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.introspective_lessons`: "}]}
66
72
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.note_outcome Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.note_outcome`: Supported Method Parameters\n\nentry = PWN::AI::Agent::Learning.note_outcome(\n\ntask: 'required - short description of what was attempted',\nsuccess: 'required - Boolean, did the attempt achieve its goal',\ndetails: 'optional - free-form notes / error / evidence',\nsession_id: 'optional - PWN::Sessions id this outcome belongs to',\ntags: 'optional - Array of String labels for later retrieval'\n\n)\n"}]}
67
73
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Learning.outcomes Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Learning.outcomes`: Supported Method Parameters\n\nrows = PWN::AI::Agent::Learning.outcomes(\n\nlimit: 'optional - max entries returned newest-first (default 50)',\nsuccess: 'optional - filter by Boolean outcome',\ntag: 'optional - filter by tag substring'\n\n)\n"}]}
@@ -76,6 +82,7 @@
76
82
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.call_engine Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.call_engine`: Supported Method Parameters\n\nmsg = PWN::AI::Agent::Loop.call_engine(\n\nmessages: 'required - OpenAI-format messages array',\ntools: 'optional - OpenAI tools array'\n\n)\n\nReturns a normalised assistant message hash:\n\n{ role: 'assistant', content: String|nil,\n tool_calls: [ {id:, type:'function', function:{name:, arguments:}} ],\n _native_content: <provider raw> (when adapter needs round-trip) }\n"}]}
77
83
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.degrade_text_only Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.degrade_text_only`: "}]}
78
84
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.expose_current_session Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.expose_current_session`: "}]}
85
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.guard_repeated_failure Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.guard_repeated_failure`: "}]}
79
86
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.help Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.help`: "}]}
80
87
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.max_iters Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.max_iters`: "}]}
81
88
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Loop.normalize_llm Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Loop.normalize_llm`: Supported Method Parameters\n\nmsg = PWN::AI::Agent::Loop.normalize_llm(\n\nresponse: 'required - chat_with_tools response Hash from any provider'\n\n)\n"}]}
@@ -89,6 +96,23 @@
89
96
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Metrics.save Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Metrics.save`: Supported Method Parameters\n\nPWN::AI::Agent::Metrics.save(\n\nmetrics: 'required - Hash returned by .load / mutated in place'\n\n)\n"}]}
90
97
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Metrics.summary Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Metrics.summary`: Supported Method Parameters\n\nrows = PWN::AI::Agent::Metrics.summary(\n\nlimit: 'optional - cap number of tools returned (default 25)'\n\n)\n"}]}
91
98
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Metrics.to_context Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Metrics.to_context`: Supported Method Parameters\n\nctx = PWN::AI::Agent::Metrics.to_context(\n\nlimit: 'optional - cap number of tools included (default 8)'\n\n)\n"}]}
99
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.authors Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
100
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.check_user_correction Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.check_user_correction`: Supported Method Parameters\n\nentry = PWN::AI::Agent::Mistakes.check_user_correction(\n\nrequest: 'required - the incoming user message',\nsession_id: 'optional - session to inspect for the previous answer'\n\n)\n\nWhen the user’s new message reads like a correction of the previous answer, this (a) flips the most recent Learning outcome for that session to success:false, and (b) records a mistake with source :user_correction whose “error” is the user’s own words. This is the strongest available signal that the agent was WRONG.\n"}]}
101
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.correction? Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.correction?`: Supported Method Parameters\n\nbool = PWN::AI::Agent::Mistakes.correction?(request: user_text)\n"}]}
102
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.correction_hint Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.correction_hint`: Supported Method Parameters\n\nstr = PWN::AI::Agent::Mistakes.correction_hint(\n\ntool: 'required - tool that just failed',\nerror: 'required - raw error it failed with'\n\n)\n\nCalled by Loop.run immediately after a failed dispatch. Returns a string to append to the tool result telling the model (a) how many times this exact failure has occurred across ALL sessions, and (b) the recorded fix if one exists — so it can self-correct on the very next iteration instead of re-discovering the fix from scratch.\n"}]}
103
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.find Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.find`: Supported Method Parameters\n\nentry = PWN::AI::Agent::Mistakes.find(\n\nsignature: 'optional - exact signature to fetch',\ntool: 'optional - with error:, compute signature and fetch',\nerror: 'optional - raw error text (used with tool:)'\n\n)\n"}]}
104
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.for_tool Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.for_tool`: Supported Method Parameters\n\nrows = PWN::AI::Agent::Mistakes.for_tool(\n\ntool: 'required - tool name',\nunresolved_only: 'optional - default false'\n\n)\n"}]}
105
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.help Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.help`: "}]}
106
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.load Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.load`: Supported Method Parameters\n\nstore = PWN::AI::Agent::Mistakes.load\n"}]}
107
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.normalize_error Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.normalize_error`: "}]}
108
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.previous_assistant Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.previous_assistant`: "}]}
109
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.record Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.record`: Supported Method Parameters\n\nentry = PWN::AI::Agent::Mistakes.record(\n\ntool: 'required - tool/component that produced the failure',\nerror: 'required - error text / message',\nargs: 'optional - args that triggered it (stored truncated as sample)',\nsession_id: 'optional - PWN::Sessions id',\nsource: 'optional - :tool | :user_correction | :loop | :model | :heuristic (default :tool)'\n\n)\n\nReturns the FULL persisted entry including its cumulative :count so the caller (Loop.run) can drive cross-session repeat detection.\n"}]}
110
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.reset Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.reset`: Supported Method Parameters\n\nPWN::AI::Agent::Mistakes.reset\n"}]}
111
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.resolve Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.resolve`: Supported Method Parameters\n\nentry = PWN::AI::Agent::Mistakes.resolve(\n\nsignature: 'required - mistake signature (from mistakes_list / .top)',\nfix: 'required - what to do INSTEAD next time'\n\n)\n"}]}
112
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.save Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.save`: Supported Method Parameters\n\nPWN::AI::Agent::Mistakes.save(store: hash)\n"}]}
113
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.signature Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.signature`: Supported Method Parameters\n\nsig = PWN::AI::Agent::Mistakes.signature(\n\ntool: 'required - tool/component name that failed',\nerror: 'required - raw error text (will be normalised)'\n\n)\n"}]}
114
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.to_context Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.to_context`: Supported Method Parameters\n\nctx = PWN::AI::Agent::Mistakes.to_context(limit: 6)\n\nInjected by PromptBuilder into every system prompt. Emits TWO blocks so the model sees both what NOT to do AND what to do INSTEAD:\n\nKNOWN MISTAKES — unresolved, count-sorted, [REPEATING]/[REGRESSED]\nKNOWN FIXES — resolved entries with their fix, so the correction\n survives even after dropping out of the first list.\n"}]}
115
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::Mistakes.top Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Mistakes.top`: Supported Method Parameters\n\nrows = PWN::AI::Agent::Mistakes.top(\n\nlimit: 'optional - max rows (default 10)',\nunresolved_only: 'optional - default true'\n\n)\n"}]}
92
116
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.active_engine Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.active_engine`: "}]}
93
117
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.authors Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
94
118
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.build Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.build`: Supported Method Parameters\n\nsystem_prompt = PWN::AI::Agent::PromptBuilder.build(\n\nsession_id: 'optional - PWN::Sessions id to embed in the ENV block'\n\n)\n"}]}
@@ -98,6 +122,7 @@
98
122
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.learning_block Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.learning_block`: "}]}
99
123
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.memory_block Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.memory_block`: "}]}
100
124
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.metrics_block Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.metrics_block`: "}]}
125
+ {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.mistakes_block Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.mistakes_block`: "}]}
101
126
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.pwn_version Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.pwn_version`: "}]}
102
127
  {"messages":[{"role":"user","content":"PWN::AI::Agent::PromptBuilder.skills_block Usage"},{"role":"assistant","content":"`PWN::AI::Agent::PromptBuilder.skills_block`: "}]}
103
128
  {"messages":[{"role":"user","content":"PWN::AI::Agent::Registry.all Usage"},{"role":"assistant","content":"`PWN::AI::Agent::Registry.all`: Supported Method Parameters\n\nentries = PWN::AI::Agent::Registry.all\n"}]}
@@ -1513,25 +1538,89 @@
1513
1538
  {"messages":[{"role":"user","content":"PWN::SDR.hz_to_s Usage"},{"role":"assistant","content":"`PWN::SDR.hz_to_s`: Supported Method Parameters\n\nPWN::SDR.hz_to_s(\n\nfreq: 'required - frequency in Hz (Integer or String)'\n\n)\n"}]}
1514
1539
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1515
1540
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder.help`: "}]}
1541
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder.resolve Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder.resolve`: Supported Method Parameters\n\nmod = PWN::SDR::Decoder.resolve(\n\ndecoder: 'required - Symbol/String key from REGISTRY (e.g. :pocsag)'\n\n)\n"}]}
1542
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ADSB.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ADSB.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1543
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ADSB.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ADSB.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::ADSB.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1544
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ADSB.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ADSB.help`: "}]}
1545
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ADSB.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ADSB.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::ADSB.parse_line(line: ‘MSG,3,1,1,ABCDEF,…’)\n"}]}
1546
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::APT.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::APT.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1547
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::APT.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::APT.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::APT.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1548
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::APT.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::APT.help`: "}]}
1516
1549
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Base.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Base.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1517
1550
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Base.bin_available? Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Base.bin_available?`: Supported Method Parameters\n\nPWN::SDR::Decoder::Base.bin_available?(bin: ‘multimon-ng’)\n"}]}
1518
1551
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Base.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Base.help`: "}]}
1519
1552
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Base.match_line? Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Base.match_line?`: Supported Method Parameters\n\nPWN::SDR::Decoder::Base.match_line?(line: str, matcher: Regexp|String|Array)\n"}]}
1520
1553
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Base.run_pipeline Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Base.run_pipeline`: Supported Method Parameters\n\nPWN::SDR::Decoder::Base.run_pipeline(\n\nfreq_obj: 'required - freq_obj Hash from PWN::SDR::GQRX.init_freq',\nprotocol: 'required - short name used in banner / log filename',\ndecode_cmd: 'optional - shell pipeline reading 22 050 Hz s16le on stdin',\ndirect_cmd: 'optional - stand-alone shell cmd (owns the SDR itself)',\nline_match: 'optional - Regexp/String a stdout line must match',\nparser: 'optional - Proc.new { |line| Hash } to structure a line',\nrequired_bins: 'optional - Array of executables that must exist on PATH',\nresample_hz: 'optional - sox output rate for decode_cmd (default 22050)'\n\n)\n"}]}
1554
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Bluetooth.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Bluetooth.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1555
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Bluetooth.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Bluetooth.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::Bluetooth.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1556
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Bluetooth.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Bluetooth.help`: "}]}
1557
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Bluetooth.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Bluetooth.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::Bluetooth.parse_line(line: ‘systime=… LAP=9e8b33 …’)\n"}]}
1558
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::DECT.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::DECT.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1559
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::DECT.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::DECT.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::DECT.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1560
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::DECT.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::DECT.help`: "}]}
1561
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::DECT.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::DECT.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::DECT.parse_line(line: ‘RFPI: 01 23 45 67 89 slot 4 carrier 3 RSSI -55’)\n"}]}
1521
1562
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Flex.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Flex.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1522
1563
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Flex.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Flex.decode`: Supported Method Parameters\n\npocsag_resp = PWN::SDR::Decoder::Flex.decode(\n\nfreq_obj: 'required - GQRX socket object returned from #connect method'\n\n)\n"}]}
1523
1564
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Flex.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Flex.help`: "}]}
1565
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GPS.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GPS.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1566
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GPS.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GPS.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::GPS.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1567
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GPS.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GPS.help`: "}]}
1568
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GPS.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GPS.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::GPS.parse_line(line: ‘Position at … Lat = 32.7 [deg], Long = -97.1 …’)\n"}]}
1524
1569
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GSM.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GSM.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1525
1570
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GSM.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GSM.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::GSM.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1526
1571
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GSM.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GSM.help`: "}]}
1527
1572
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::GSM.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::GSM.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::GSM.parse_line(line: ‘ts|arfcn|chan|imsi|tmsi|mcc|mnc|lac|ci|rr’)\n"}]}
1573
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Iridium.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Iridium.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1574
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Iridium.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Iridium.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::Iridium.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1575
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Iridium.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Iridium.help`: "}]}
1576
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Iridium.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Iridium.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::Iridium.parse_line(line: ‘IRA: sat:23 beam:14 …’)\n"}]}
1577
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LTE.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LTE.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1578
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LTE.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LTE.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::LTE.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1579
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LTE.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LTE.help`: "}]}
1580
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LTE.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LTE.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::LTE.parse_line(line: ‘Found CELL … PCI: 123 … PRB: 50 … -85.0 dBm’)\n"}]}
1581
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LoRa.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LoRa.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1582
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LoRa.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LoRa.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::LoRa.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1583
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LoRa.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LoRa.help`: "}]}
1584
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::LoRa.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::LoRa.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::LoRa.parse_line(line: ‘{“model”:“LoRa”,…}’)\n"}]}
1585
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Morse.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Morse.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1586
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Morse.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Morse.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::Morse.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1587
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Morse.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Morse.help`: "}]}
1588
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Morse.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Morse.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::Morse.parse_line(line: ‘CQ CQ DE W1AW’)\n"}]}
1589
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::P25.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::P25.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1590
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::P25.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::P25.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::P25.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1591
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::P25.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::P25.help`: "}]}
1592
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::P25.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::P25.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::P25.parse_line(line: ‘Sync: +P25p1 NAC: 293 src: 1234 tg: 5678’)\n"}]}
1528
1593
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::POCSAG.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::POCSAG.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1529
1594
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::POCSAG.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::POCSAG.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::POCSAG.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1530
1595
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::POCSAG.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::POCSAG.help`: "}]}
1531
1596
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::POCSAG.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::POCSAG.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::POCSAG.parse_line(line: ‘POCSAG1200: Address: …’)\n"}]}
1597
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Pager.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Pager.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1598
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Pager.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Pager.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::Pager.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1599
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Pager.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Pager.help`: "}]}
1600
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::Pager.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::Pager.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::Pager.parse_line(line: ‘FLEX|… or POCSAG1200: …’)\n"}]}
1532
1601
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RDS.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RDS.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1533
1602
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RDS.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RDS.decode`: Supported Method Parameters\n\nrds_resp = PWN::SDR::Decoder::RDS.decode(\n\nfreq_obj: 'required - GQRX socket object returned from #connect method'\n\n)\n"}]}
1534
1603
  {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RDS.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RDS.help`: "}]}
1604
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RFID.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RFID.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1605
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RFID.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RFID.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::RFID.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1606
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RFID.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RFID.help`: "}]}
1607
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RFID.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RFID.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::RFID.parse_line(line: ‘UID: 04 A1 B2 C3 D4 E5 F6’)\n"}]}
1608
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTL433.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTL433.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1609
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTL433.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTL433.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::RTL433.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1610
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTL433.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTL433.help`: "}]}
1611
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTL433.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTL433.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::RTL433.parse_line(line: ‘{“time”:“…”,“model”:“…”}’)\n"}]}
1612
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTTY.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTTY.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1613
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTTY.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTTY.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::RTTY.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1614
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTTY.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTTY.help`: "}]}
1615
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::RTTY.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::RTTY.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::RTTY.parse_line(line: ‘RYRYRY DE W1AW’)\n"}]}
1616
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::WiFi.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::WiFi.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1617
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::WiFi.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::WiFi.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::WiFi.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1618
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::WiFi.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::WiFi.help`: "}]}
1619
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::WiFi.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::WiFi.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::WiFi.parse_line(line: ‘t|subtype|bssid|sa|da|ch|rssi|ssid’)\n"}]}
1620
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ZigBee.authors Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ZigBee.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1621
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ZigBee.decode Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ZigBee.decode`: Supported Method Parameters\n\nPWN::SDR::Decoder::ZigBee.decode(\n\nfreq_obj: 'required - freq_obj returned from PWN::SDR::GQRX.init_freq'\n\n)\n"}]}
1622
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ZigBee.help Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ZigBee.help`: "}]}
1623
+ {"messages":[{"role":"user","content":"PWN::SDR::Decoder::ZigBee.parse_line Usage"},{"role":"assistant","content":"`PWN::SDR::Decoder::ZigBee.parse_line`: Supported Method Parameters\n\nPWN::SDR::Decoder::ZigBee.parse_line(line: ‘t|src16|dst16|src64|dst64|pan|type|cmd|seq’)\n"}]}
1535
1624
  {"messages":[{"role":"user","content":"PWN::SDR::FlipperZero.authors Usage"},{"role":"assistant","content":"`PWN::SDR::FlipperZero.authors`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1536
1625
  {"messages":[{"role":"user","content":"PWN::SDR::FlipperZero.connect Usage"},{"role":"assistant","content":"`PWN::SDR::FlipperZero.connect`: Supported Method Parameters\n\nflipper_zero_obj = PWN::SDR::FlipperZero.connect(\n\nblock_dev: 'optional serial block device path (defaults to /dev/ttyACM0)',\nbaud: 'optional (defaults to 9600)',\ndata_bits: 'optional (defaults to 8)',\nstop_bits: 'optional (defaults to 1)',\nparity: 'optional - :even||:odd|:none (defaults to :none)'\n\n)\n"}]}
1537
1626
  {"messages":[{"role":"user","content":"PWN::SDR::FlipperZero.connect_via_screen Usage"},{"role":"assistant","content":"`PWN::SDR::FlipperZero.connect_via_screen`: Supported Method Parameters\n\nPWN::SDR::FlipperZero.connect_via_screen(\n\nblock_dev: 'optional - serial block device path (defaults to /dev/ttyACM0)'\n\n)\n"}]}
@@ -1550,7 +1639,7 @@
1550
1639
  {"messages":[{"role":"user","content":"PWN::SDR::GQRX.disconnect_udp Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.disconnect_udp`: Supported Method Parameters\n\nPWN::SDR::GQRX.disconnect_udp(\n\nudp_listener: 'required - UDP socket object returned from #listen_udp method'\n\n)\n"}]}
1551
1640
  {"messages":[{"role":"user","content":"PWN::SDR::GQRX.duration_between Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.duration_between`: Supported Method Parameters\n\nduration = PWN::SDR::GQRX.duration_between(\n\ntimestamp_start: 'required - Start timestamp',\ntimestamp_end: 'required - End timestamp'\n\n)\n"}]}
1552
1641
  {"messages":[{"role":"user","content":"PWN::SDR::GQRX.edge_detection Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.edge_detection`: Supported Method Parameters\n\ncandidate_signals = PWN::SDR::GQRX.edge_detection(\n\ngqrx_sock: 'required - GQRX socket object returned from #connect method',\nhz: 'required - Frequency to start edge detection from',\nprecision: 'required - Frequency step precision',\nstep_hz: 'required - Frequency step in Hz for edge detection',\nstrength_lock: 'required - Strength lock in dBFS to determine signal edges'\n\n)\n"}]}
1553
- {"messages":[{"role":"user","content":"PWN::SDR::GQRX.fast_scan_range Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.fast_scan_range`: Supported Method Parameters\n\nfast_resp = PWN::SDR::GQRX.fast_scan_range(\n\ngqrx_sock: 'required - GQRX socket object',\nranges: 'required - Array<Hash> of {start_freq:, target_freq: }',\nsample_rate: 'optional - Set this to GQRX visible input sample rate (the span width)',\nnfft: 'optional - FFT size',\navg: 'optional',\ncapture_secs: 'optional',\nstrength_lock: 'optional',\nkeep_spectrum: 'optional - if true return raw spectrum arrays too (large)'\n\n)\n\nUses chunk-wise retuning where chunk = sample_rate so that the *entire visible band* (waterfall width) is captured via a single FFT each time rather than point-by-point hops. This yields near real-time panoramic coverage. Update rate is roughly (retune + capture + fft) per chunk.\n"}]}
1642
+ {"messages":[{"role":"user","content":"PWN::SDR::GQRX.fast_scan_range Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.fast_scan_range`: Supported Method Parameters\n\nfast_resp = PWN::SDR::GQRX.fast_scan_range(\n\ngqrx_sock: 'required - GQRX socket object',\nranges: 'required - Array<Hash> of {start_freq:, target_freq: }',\nsample_rate: 'optional - Set this to GQRX visible input sample rate (the span width)',\nnfft: 'optional - FFT size',\navg: 'optional',\ncapture_secs: 'optional',\nstrength_lock: 'optional',\nmin_snr_db: 'optional - Minimum SNR in dB above per-chunk noise floor to report (defaults to 12.0)',\ndemodulator_mode: 'optional - Demodulator mode to attribute to detections (defaults to WFM)',\nbandwidth: 'optional - Passband bandwidth to attribute to detections (defaults to \"200.000\")',\nsquelch: 'optional - Squelch level (defaults to strength_lock - 3.0)',\ndecoder: 'optional - Decoder key (e.g. :gsm) to attribute to detections',\nlocation: 'optional - Location string for AI analysis',\nkeep_spectrum: 'optional - if true return raw spectrum arrays too (large)'\n\n)\n\nUses chunk-wise retuning where chunk = sample_rate so that the *entire visible band* (waterfall width) is captured via a single FFT each time rather than point-by-point hops. This yields near real-time panoramic coverage. Update rate is roughly (retune + capture + fft) per chunk.\n\nPer-signal output shape is INTENTIONALLY IDENTICAL to scan_range / init_freq (:freq, :demodulator_mode, :bandwidth, :strength_db, :decoder, :squelch, :strength_lock, :iteration, :ai_analysis) so that analyze_scan / analyze_log and downstream decoders behave the same regardless of which scan mode produced the log. FFT-specific extras (:hz, :bw_hz, :snr_db, :prominence_db, :noise_floor_db, :chunk_center, :method) are appended for provenance.\n"}]}
1554
1643
  {"messages":[{"role":"user","content":"PWN::SDR::GQRX.find_best_peak Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.find_best_peak`: Supported Method Parameters\n\nbest_peak = PWN::SDR::GQRX.find_best_peak(\n\ngqrx_sock: 'required - GQRX socket object returned from #connect method',\ncandidate_signals: 'required - Array of candidate signals from edge_detection',\nstep_hz: 'required - Frequency step in Hz for peak finding',\nstrength_lock: 'required - Strength lock in dBFS to determine signal edges'\n\n)\n"}]}
1555
1644
  {"messages":[{"role":"user","content":"PWN::SDR::GQRX.get_spectrum_snapshot Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.get_spectrum_snapshot`: Author(s)\n\n0day Inc. <support@0dayinc.com>\n"}]}
1556
1645
  {"messages":[{"role":"user","content":"PWN::SDR::GQRX.help Usage"},{"role":"assistant","content":"`PWN::SDR::GQRX.help`: "}]}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.618
4
+ version: 0.5.620
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
@@ -547,14 +547,14 @@ dependencies:
547
547
  requirements:
548
548
  - - '='
549
549
  - !ruby/object:Gem::Version
550
- version: 0.0.167
550
+ version: 0.0.169
551
551
  type: :runtime
552
552
  prerelease: false
553
553
  version_requirements: !ruby/object:Gem::Requirement
554
554
  requirements:
555
555
  - - '='
556
556
  - !ruby/object:Gem::Version
557
- version: 0.0.167
557
+ version: 0.0.169
558
558
  - !ruby/object:Gem::Dependency
559
559
  name: metasm
560
560
  requirement: !ruby/object:Gem::Requirement
@@ -981,14 +981,14 @@ dependencies:
981
981
  requirements:
982
982
  - - '='
983
983
  - !ruby/object:Gem::Version
984
- version: 1.88.1
984
+ version: 1.88.2
985
985
  type: :runtime
986
986
  prerelease: false
987
987
  version_requirements: !ruby/object:Gem::Requirement
988
988
  requirements:
989
989
  - - '='
990
990
  - !ruby/object:Gem::Version
991
- version: 1.88.1
991
+ version: 1.88.2
992
992
  - !ruby/object:Gem::Dependency
993
993
  name: rubocop-rake
994
994
  requirement: !ruby/object:Gem::Requirement
@@ -1398,7 +1398,6 @@ files:
1398
1398
  - Gemfile
1399
1399
  - LICENSE.txt
1400
1400
  - README.md
1401
- - README.md.bak
1402
1401
  - Rakefile
1403
1402
  - Vagrantfile
1404
1403
  - bin/pwn
@@ -1476,6 +1475,7 @@ files:
1476
1475
  - documentation/How-PWN-Works.md
1477
1476
  - documentation/Installation.md
1478
1477
  - documentation/Metasploit.md
1478
+ - documentation/Mistakes.md
1479
1479
  - documentation/NmapIt.md
1480
1480
  - documentation/PWN.png
1481
1481
  - documentation/PWN_Contributors_and_Users.png
@@ -1512,6 +1512,7 @@ files:
1512
1512
  - documentation/diagrams/dot/hardware-hacking.dot
1513
1513
  - documentation/diagrams/dot/history-to-drivers.dot
1514
1514
  - documentation/diagrams/dot/memory-skills-detailed.dot
1515
+ - documentation/diagrams/dot/mistakes-negative-feedback.dot
1515
1516
  - documentation/diagrams/dot/network-infra-testing.dot
1516
1517
  - documentation/diagrams/dot/overall-pwn-architecture.dot
1517
1518
  - documentation/diagrams/dot/penetration-testing-workflow.dot
@@ -1532,6 +1533,7 @@ files:
1532
1533
  - documentation/diagrams/hardware-hacking.svg
1533
1534
  - documentation/diagrams/history-to-drivers.svg
1534
1535
  - documentation/diagrams/memory-skills-detailed.svg
1536
+ - documentation/diagrams/mistakes-negative-feedback.svg
1535
1537
  - documentation/diagrams/network-infra-testing.svg
1536
1538
  - documentation/diagrams/overall-pwn-architecture.svg
1537
1539
  - documentation/diagrams/penetration-testing-workflow.svg
@@ -1876,6 +1878,7 @@ files:
1876
1878
  - lib/pwn/ai/agent/learning.rb
1877
1879
  - lib/pwn/ai/agent/loop.rb
1878
1880
  - lib/pwn/ai/agent/metrics.rb
1881
+ - lib/pwn/ai/agent/mistakes.rb
1879
1882
  - lib/pwn/ai/agent/prompt_builder.rb
1880
1883
  - lib/pwn/ai/agent/registry.rb
1881
1884
  - lib/pwn/ai/agent/result.rb
@@ -1886,6 +1889,7 @@ files:
1886
1889
  - lib/pwn/ai/agent/tools/learning.rb
1887
1890
  - lib/pwn/ai/agent/tools/memory.rb
1888
1891
  - lib/pwn/ai/agent/tools/metrics.rb
1892
+ - lib/pwn/ai/agent/tools/mistakes.rb
1889
1893
  - lib/pwn/ai/agent/tools/ruby_eval.rb
1890
1894
  - lib/pwn/ai/agent/tools/sessions.rb
1891
1895
  - lib/pwn/ai/agent/tools/shell.rb
@@ -2141,11 +2145,27 @@ files:
2141
2145
  - lib/pwn/sast/window_location_hash.rb
2142
2146
  - lib/pwn/sdr.rb
2143
2147
  - lib/pwn/sdr/decoder.rb
2148
+ - lib/pwn/sdr/decoder/adsb.rb
2149
+ - lib/pwn/sdr/decoder/apt.rb
2144
2150
  - lib/pwn/sdr/decoder/base.rb
2151
+ - lib/pwn/sdr/decoder/bluetooth.rb
2152
+ - lib/pwn/sdr/decoder/dect.rb
2145
2153
  - lib/pwn/sdr/decoder/flex.rb
2154
+ - lib/pwn/sdr/decoder/gps.rb
2146
2155
  - lib/pwn/sdr/decoder/gsm.rb
2156
+ - lib/pwn/sdr/decoder/iridium.rb
2157
+ - lib/pwn/sdr/decoder/lora.rb
2158
+ - lib/pwn/sdr/decoder/lte.rb
2159
+ - lib/pwn/sdr/decoder/morse.rb
2160
+ - lib/pwn/sdr/decoder/p25.rb
2161
+ - lib/pwn/sdr/decoder/pager.rb
2147
2162
  - lib/pwn/sdr/decoder/pocsag.rb
2148
2163
  - lib/pwn/sdr/decoder/rds.rb
2164
+ - lib/pwn/sdr/decoder/rfid.rb
2165
+ - lib/pwn/sdr/decoder/rtl433.rb
2166
+ - lib/pwn/sdr/decoder/rtty.rb
2167
+ - lib/pwn/sdr/decoder/wifi.rb
2168
+ - lib/pwn/sdr/decoder/zigbee.rb
2149
2169
  - lib/pwn/sdr/flipper_zero.rb
2150
2170
  - lib/pwn/sdr/frequency_allocation.rb
2151
2171
  - lib/pwn/sdr/gqrx.rb
@@ -2272,6 +2292,7 @@ files:
2272
2292
  - spec/lib/pwn/ai/agent/learning_spec.rb
2273
2293
  - spec/lib/pwn/ai/agent/loop_spec.rb
2274
2294
  - spec/lib/pwn/ai/agent/metrics_spec.rb
2295
+ - spec/lib/pwn/ai/agent/mistakes_spec.rb
2275
2296
  - spec/lib/pwn/ai/agent/prompt_builder_spec.rb
2276
2297
  - spec/lib/pwn/ai/agent/registry_spec.rb
2277
2298
  - spec/lib/pwn/ai/agent/result_spec.rb
@@ -2282,6 +2303,7 @@ files:
2282
2303
  - spec/lib/pwn/ai/agent/tools/learning_spec.rb
2283
2304
  - spec/lib/pwn/ai/agent/tools/memory_spec.rb
2284
2305
  - spec/lib/pwn/ai/agent/tools/metrics_spec.rb
2306
+ - spec/lib/pwn/ai/agent/tools/mistakes_spec.rb
2285
2307
  - spec/lib/pwn/ai/agent/tools/ruby_eval_spec.rb
2286
2308
  - spec/lib/pwn/ai/agent/tools/sessions_spec.rb
2287
2309
  - spec/lib/pwn/ai/agent/tools/shell_spec.rb
@@ -2537,11 +2559,27 @@ files:
2537
2559
  - spec/lib/pwn/sast/version_spec.rb
2538
2560
  - spec/lib/pwn/sast/window_location_hash_spec.rb
2539
2561
  - spec/lib/pwn/sast_spec.rb
2562
+ - spec/lib/pwn/sdr/decoder/adsb_spec.rb
2563
+ - spec/lib/pwn/sdr/decoder/apt_spec.rb
2540
2564
  - spec/lib/pwn/sdr/decoder/base_spec.rb
2565
+ - spec/lib/pwn/sdr/decoder/bluetooth_spec.rb
2566
+ - spec/lib/pwn/sdr/decoder/dect_spec.rb
2541
2567
  - spec/lib/pwn/sdr/decoder/flex_spec.rb
2568
+ - spec/lib/pwn/sdr/decoder/gps_spec.rb
2542
2569
  - spec/lib/pwn/sdr/decoder/gsm_spec.rb
2570
+ - spec/lib/pwn/sdr/decoder/iridium_spec.rb
2571
+ - spec/lib/pwn/sdr/decoder/lora_spec.rb
2572
+ - spec/lib/pwn/sdr/decoder/lte_spec.rb
2573
+ - spec/lib/pwn/sdr/decoder/morse_spec.rb
2574
+ - spec/lib/pwn/sdr/decoder/p25_spec.rb
2575
+ - spec/lib/pwn/sdr/decoder/pager_spec.rb
2543
2576
  - spec/lib/pwn/sdr/decoder/pocsag_spec.rb
2544
2577
  - spec/lib/pwn/sdr/decoder/rds_spec.rb
2578
+ - spec/lib/pwn/sdr/decoder/rfid_spec.rb
2579
+ - spec/lib/pwn/sdr/decoder/rtl433_spec.rb
2580
+ - spec/lib/pwn/sdr/decoder/rtty_spec.rb
2581
+ - spec/lib/pwn/sdr/decoder/wifi_spec.rb
2582
+ - spec/lib/pwn/sdr/decoder/zigbee_spec.rb
2545
2583
  - spec/lib/pwn/sdr/decoder_spec.rb
2546
2584
  - spec/lib/pwn/sdr/flipper_zero_spec.rb
2547
2585
  - spec/lib/pwn/sdr/frequency_allocation_spec.rb