pwn 0.5.780 → 0.5.781

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -2
  3. data/documentation/AI-Integration.md +4 -4
  4. data/documentation/AWS.md +10 -9
  5. data/documentation/Agent-Tool-Registry.md +20 -17
  6. data/documentation/Blockchain.md +3 -2
  7. data/documentation/Bounty.md +8 -6
  8. data/documentation/BurpSuite.md +6 -10
  9. data/documentation/CLI-Drivers.md +7 -4
  10. data/documentation/Capability-Broker-Sandbox.md +1 -1
  11. data/documentation/Configuration.md +23 -15
  12. data/documentation/Contributing.md +3 -3
  13. data/documentation/Cron.md +3 -2
  14. data/documentation/Diagrams.md +9 -3
  15. data/documentation/Drivers.md +12 -6
  16. data/documentation/Extrospection.md +25 -5
  17. data/documentation/FFI.md +15 -25
  18. data/documentation/Fuzzing.md +13 -13
  19. data/documentation/General-PWN-Usage.md +7 -4
  20. data/documentation/Harness-Evaluation.md +90 -3
  21. data/documentation/Home.md +6 -5
  22. data/documentation/How-PWN-Works.md +9 -10
  23. data/documentation/Installation.md +12 -11
  24. data/documentation/Metasploit.md +13 -19
  25. data/documentation/Mistakes.md +2 -2
  26. data/documentation/NmapIt.md +6 -3
  27. data/documentation/Operability.md +99 -0
  28. data/documentation/Persistence.md +3 -2
  29. data/documentation/Plugin-Degradation.md +4 -2
  30. data/documentation/Plugins.md +4 -11
  31. data/documentation/Policy-Benchmark.md +4 -0
  32. data/documentation/Reinforcement-Learning.md +19 -3
  33. data/documentation/Reporting.md +6 -5
  34. data/documentation/SAST.md +15 -10
  35. data/documentation/SDR-Decoder-Coverage.md +10 -4
  36. data/documentation/SDR.md +28 -40
  37. data/documentation/Session-Workflow.md +25 -12
  38. data/documentation/Sessions.md +7 -0
  39. data/documentation/Skills-Memory-Learning.md +11 -4
  40. data/documentation/Swarm.md +6 -0
  41. data/documentation/Transparent-Browser.md +1 -1
  42. data/documentation/Troubleshooting.md +6 -3
  43. data/documentation/What-is-PWN.md +4 -4
  44. data/documentation/Why-PWN.md +1 -1
  45. data/documentation/diagrams/agent-tool-registry.svg +219 -180
  46. data/documentation/diagrams/ai-integration-tool-calling.svg +35 -34
  47. data/documentation/diagrams/code-scanning-sast.svg +78 -78
  48. data/documentation/diagrams/cron-scheduling.svg +165 -145
  49. data/documentation/diagrams/dot/_THEME.md +6 -4
  50. data/documentation/diagrams/dot/agent-tool-registry.dot +6 -2
  51. data/documentation/diagrams/dot/ai-integration-tool-calling.dot +1 -1
  52. data/documentation/diagrams/dot/code-scanning-sast.dot +8 -8
  53. data/documentation/diagrams/dot/cron-scheduling.dot +2 -0
  54. data/documentation/diagrams/dot/driver-framework.dot +1 -1
  55. data/documentation/diagrams/dot/extrospection-world-awareness.dot +2 -2
  56. data/documentation/diagrams/dot/fuzzing-workflow.dot +3 -3
  57. data/documentation/diagrams/dot/history-to-drivers.dot +1 -1
  58. data/documentation/diagrams/dot/memory-skills-detailed.dot +3 -3
  59. data/documentation/diagrams/dot/mistakes-negative-feedback.dot +2 -2
  60. data/documentation/diagrams/dot/overall-pwn-architecture.dot +33 -121
  61. data/documentation/diagrams/dot/persistence-filesystem.dot +2 -2
  62. data/documentation/diagrams/dot/plugin-ecosystem.dot +2 -2
  63. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +31 -167
  64. data/documentation/diagrams/dot/pwn-repl-prototyping.dot +1 -1
  65. data/documentation/diagrams/dot/reinforcement-learning.dot +15 -7
  66. data/documentation/diagrams/dot/reporting-pipeline.dot +5 -3
  67. data/documentation/diagrams/dot/reverse-engineering-flow.dot +3 -3
  68. data/documentation/diagrams/dot/sdr-radio-flow.dot +5 -5
  69. data/documentation/diagrams/dot/sessions-cron-automation.dot +1 -1
  70. data/documentation/diagrams/dot/swarm-multi-agent.dot +3 -3
  71. data/documentation/diagrams/dot/task-summarizer.dot +2 -2
  72. data/documentation/diagrams/dot/web-application-testing.dot +4 -3
  73. data/documentation/diagrams/dot/zero-day-research-flow.dot +4 -3
  74. data/documentation/diagrams/driver-framework.svg +1 -1
  75. data/documentation/diagrams/extrospection-world-awareness.svg +178 -178
  76. data/documentation/diagrams/fuzzing-workflow.svg +58 -58
  77. data/documentation/diagrams/history-to-drivers.svg +42 -42
  78. data/documentation/diagrams/memory-skills-detailed.svg +210 -210
  79. data/documentation/diagrams/mistakes-negative-feedback.svg +116 -116
  80. data/documentation/diagrams/overall-pwn-architecture.svg +248 -404
  81. data/documentation/diagrams/persistence-filesystem.svg +143 -143
  82. data/documentation/diagrams/plugin-ecosystem.svg +100 -100
  83. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +233 -752
  84. data/documentation/diagrams/pwn-repl-prototyping.svg +27 -27
  85. data/documentation/diagrams/reinforcement-learning.svg +295 -221
  86. data/documentation/diagrams/reporting-pipeline.svg +94 -80
  87. data/documentation/diagrams/reverse-engineering-flow.svg +31 -31
  88. data/documentation/diagrams/sdr-radio-flow.svg +157 -155
  89. data/documentation/diagrams/sessions-cron-automation.svg +13 -13
  90. data/documentation/diagrams/swarm-multi-agent.svg +86 -86
  91. data/documentation/diagrams/task-summarizer.svg +57 -57
  92. data/documentation/diagrams/web-application-testing.svg +81 -75
  93. data/documentation/diagrams/zero-day-research-flow.svg +101 -92
  94. data/documentation/pwn-REPL.md +5 -3
  95. data/documentation/pwn-ai-Agent.md +18 -14
  96. data/documentation/pwn_silent_help_learn_demo.gif +0 -0
  97. data/etc/default_skills/pwn/ai/agent/learning/SKILL.md +1 -0
  98. data/lib/pwn/ai/agent/learning.rb +46 -1
  99. data/lib/pwn/ai/agent/policy_evaluation.rb +5 -1
  100. data/lib/pwn/ai/agent/reward.rb +9 -0
  101. data/lib/pwn/version.rb +1 -1
  102. data/spec/fixtures/harness/completion_regressions.json +10 -0
  103. data/spec/fixtures/harness/completion_regressions.json.sha256 +1 -0
  104. data/spec/integration/harness_evaluation_spec.rb +13 -0
  105. data/spec/lib/pwn/ai/agent/learning_spec.rb +22 -0
  106. data/spec/lib/pwn/ai/agent/policy_evaluation_spec.rb +6 -1
  107. data/spec/lib/pwn/ai/agent/reward_spec.rb +21 -0
  108. data/spec/support/harness/evaluate.rb +1 -1
  109. data/third_party/pwn_rdoc.jsonl +2 -1
  110. metadata +8 -5
@@ -1,6 +1,7 @@
1
1
  # `~/.pwn/` - Persistence Map
2
2
 
3
- Every byte PWN remembers between processes lives here.
3
+ Default user state lives here. Explicit artifact/output paths, worktrees,
4
+ external services and environment overrides can place evidence elsewhere.
4
5
 
5
6
  ![~/.pwn map](diagrams/persistence-filesystem.svg)
6
7
 
@@ -35,7 +36,7 @@ Every byte PWN remembers between processes lives here.
35
36
  | `finetune/*.jsonl` | `Learning.export_finetune` · `Reward.export_dpo` | ShareGPT / OpenAI / DPO JSONL | `rm` | supervised + preference datasets - feed to a LoRA over the local model |
36
37
  | `backup/<ts>/` | `PWN::Migrate` | tree copy | rm -rf | timestamped snapshot taken before every `--migrate --fix` |
37
38
  | `quarantine/` | `PWN::Migrate` | quarantined originals | rm -rf | corrupt/incompatible state files moved aside so the owner re-seeds |
38
- | `~/.pwn_history` | Pry | text | rm | REPL input history |
39
+ | `pwn_history` | Pry / pwn-ai | text | operator-managed | Shared durable input history at `~/.pwn/pwn_history` |
39
40
 
40
41
 
41
42
  ## `memory.json` safety
@@ -54,8 +54,10 @@ Required: `zaproxy`. Fallback: `nuclei`, `httpx`, `TransparentBrowser`, `PWN::Pl
54
54
  ## pwn-plugins-packet
55
55
 
56
56
  Required: `CAP_NET_RAW` **or** the capability broker helper. Install the helper
57
- from `documentation/Capability-Broker-Sandbox.md` (setcap the helper binary, not
58
- the Ruby interpreter). Fallback: `Packet.tcp_connect_scan` / `PWN::Plugins::Sock`.
57
+ from [Capability-Broker-Sandbox](Capability-Broker-Sandbox.md) using its dedicated
58
+ service capability boundary. Do not setcap the Ruby interpreter or Ruby script
59
+ (Linux ignores script file capabilities). Fallback: `Packet.tcp_connect_scan` /
60
+ `PWN::Plugins::Sock`.
59
61
 
60
62
  ## pwn-plugins-k8s
61
63
 
@@ -1,4 +1,4 @@
1
- # `PWN::Plugins` - All 67 Modules
1
+ # `PWN::Plugins` - All 107 Modules
2
2
 
3
3
  Every plugin is a plain Ruby module of `public_class_method def self.x(opts = {})`
4
4
  methods with self-documenting `.help`. Source: `lib/pwn/plugins/*.rb`.
@@ -11,7 +11,7 @@ methods with self-documenting `.help`. Source: `lib/pwn/plugins/*.rb`.
11
11
  PWN::Plugins.constants.sort
12
12
  PWN::Plugins::BurpSuite.help
13
13
  ls PWN::Plugins::NmapIt
14
- show-source PWN::Plugins::Fuzz.generate
14
+ show-source PWN::Plugins::Fuzz.http
15
15
  ```
16
16
 
17
17
  ## By category
@@ -63,7 +63,7 @@ show-source PWN::Plugins::Fuzz.generate
63
63
  | Module | Purpose |
64
64
  |---|---|
65
65
  | `OAuth2` · `BasicAuth` · `AuthenticationHelper` | credential flows |
66
- | `Vault` | HashiCorp Vault |
66
+ | `Vault` | Local encrypted configuration and engagement loot helpers; not a HashiCorp Vault client |
67
67
 
68
68
  ### Hardware / Physical
69
69
  | Module | Purpose | Doc |
@@ -97,13 +97,6 @@ show-source PWN::Plugins::Fuzz.generate
97
97
 
98
98
  ## Full alphabetical list
99
99
 
100
- `Android Assembly AuthenticationHelper BareSIP BasicAuth BeEF
101
- BlackDuckBinaryAnalysis BurpSuite BusPirate Char CreditCard DAOLDAP DAOMongo
102
- DAOPostgres DAOSQLite3 DefectDojo DetectOS EIN FileFu Fuzz Git Github
103
- HackerOne Hunter IPInfo IRC Jenkins JiraDataCenter JSONPathify Log MailAgent
104
- Metasploit MonkeyPatch MSR206 NessusCloud NexposeVulnScan NmapIt OAuth2 OCR
105
- OpenAPI OpenVAS Packet PDFParse Pony PS PWNLogger RabbitMQ REPL ScannableCodes
106
- Serial Shodan SlackClient Sock Spider SSN ThreadPool Tor TransparentBrowser
107
- TTYSpinner TwitterAPI URIScheme Vault VIN Voice Vsphere XXD Zaproxy`
100
+ `AFLplusplus AISandbox Android ArtifactRegistry Assembly AuthenticationHelper BareSIP BasicAuth BeEF BinaryAnalysis BinaryParser BinWorkspace BlackDuckBinaryAnalysis BurpSuite BusPirate Capability CapabilityBroker Char CredentialAttack CreditCard DAOLDAP DAOMongo DAOPostgres DAOSQLite3 Debugger DefectDojo DetectOS Detonate EIN Emulator ExploitDB ExploitDev FileFu Findings Frida Fuzz GDB GDBMI GDBMi Ghidra GhidraHeadless Git Github GoogleWorkspace HackerOne Handler Httpx Hunter IPInfo IRC Jenkins JiraDataCenter Jobs JSONPathify K8s Log MailAgent Metasploit MethodCatalog MitmProxy MonkeyPatch MSR206 NessusCloud NexposeVulnScan NmapIt Nuclei OAuth2 OCR OpenAPI OpenVAS Packet PDFParse Pony PreflightChecker ProcessTube PS PWNLogger RabbitMQ Radare2 Recon REDB REPL ROP Sandbox SBOM ScannableCodes Semgrep Serial Shodan SlackClient Sock Spider Sqlmap SSN ThreadPool Tor TransparentBrowser TTYSpinner TwitterAPI URIScheme Vault VIN Voice Volatility Vsphere XXD Zaproxy`
108
101
 
109
102
  [← Home](Home.md) · [Diagrams](Diagrams.md)
@@ -356,6 +356,10 @@ raise restored.inspect unless restored[:rolled_back]
356
356
  ```
357
357
 
358
358
  Rollback verifies the receipt's explicit target, backup path and prior digest,
359
+ and requires `receipt_version: 1`, `change_kind: routing_policy` and the
360
+ `acceptance_sha256` of freshly re-executed deterministic reports. Old unversioned
361
+ receipts are rejected rather than silently upgraded. The receipt is a local audit
362
+ record, not hostile-writer attestation. Rollback also
359
363
  validates the backup schema, and refuses if the live file no longer matches the
360
364
  promoted candidate digest. Missing, altered or symlink backups/targets fail
361
365
  closed. Both methods default to a disabled result; rejected operations return
@@ -1,5 +1,21 @@
1
1
  # Reinforcement Learning in pwn-ai
2
2
 
3
+ ## Verified completion versus learning scores
4
+
5
+ Use `verified_completion` (pass/fail/unknown), not legacy judge `success`, to
6
+ measure delivered work. `claimed_completion` preserves the judge claim and
7
+ `false_completion_rate` divides refuted claims by checked claims, remaining null
8
+ when none were checked. Executable harness false-success instead compares a
9
+ released marker against the entire run outcome, including exit status and caps.
10
+
11
+ `Learning.regression_task` exports an inert file/JSON recipe from an exact
12
+ persisted verifier failure and request digest; expected bytes are independently
13
+ authored and its split remains `regression`. Frozen policy promotion reruns
14
+ acceptance, checks per-task regressions and requires explicit approval/stopped
15
+ writers; rollback needs its versioned receipt and unchanged promoted target.
16
+ See [Harness Evaluation](Harness-Evaluation.md) and [Policy Benchmark](Policy-Benchmark.md).
17
+
18
+
3
19
  ## Retained learning evidence and session cleanup
4
20
 
5
21
  Learning outcomes can retain a versioned `evidence_ref` (`version`, `id`,
@@ -90,7 +106,7 @@ local adapter.
90
106
  That path can promote a new local adapter when the candidate beats the current
91
107
  one. Without a trainer it still **exports** the datasets and a manual CLI. Live improvement does not wait on weights.
92
108
 
93
- ESR and ASR are the rates RSI actually compares. ESR is `verified_exploit_tools / vulnerable_tools`. ASR is `successful_attacks / total_attack_attempts`. `Learning.rsi_tick` stores the pair and writes an `rsi` lesson when ESR falls. Tool telemetry and the judge score are separate. A passing suite is not either rate.
109
+ ESR and ASR are the rates RSI records; only an ESR drop triggers its regression lesson. ESR is `verified_exploit_tools / vulnerable_tools`. ASR is `successful_attacks / total_attack_attempts`. `Learning.rsi_tick` stores the pair and writes an `rsi` lesson when ESR falls. Tool telemetry and the judge score are separate. A passing suite is not either rate.
94
110
 
95
111
  RSI's rate tick does not generate or promote policy candidates. For the separate
96
112
  **offline operator evaluation** path, use `pwn-ai --policy evaluate` and review
@@ -275,7 +291,7 @@ that a live language model performs better.
275
291
  | **W1** `.record_preference` | Preference ledger from corrections, resolve, counterfactual, critic, and practice. |
276
292
  | `.practice_kpi` | Week-over-week trend of repeating mistakes (outer curriculum health). |
277
293
 
278
- ## Budget pressure (iteration ceiling)
294
+ ## Budget pressure (side-work control)
279
295
 
280
296
  When unresolved `agent_loop` / `assistant_answer` budget-exhaustion fingerprints
281
297
  dominate, the loop marks the budget path hot and tightens *side work* only:
@@ -332,7 +348,7 @@ This is the live control list. Track the outcomes, not source comments.
332
348
  :reward_llm_timeout: 12 # cheap ORM chat timeout seconds (clamped 2..30)
333
349
  :local_introspect: :failure_only # ollama cost rule; remote always introspects
334
350
  :introspect_every_n: 3
335
- :max_iters: 777 # hard cap for this request; scars do not lower it
351
+ :max_iters: 777 # advisory counter; not a hard completion cap
336
352
  :defer_introspect: true # post-answer Learning after the user-visible reply
337
353
  :prompt_cache: true # engine-native prefix cache (not ollama / openwebui)
338
354
  :tool_preference: [memory_recall, session_recall, skills_recall, pwn_eval, shell, mistakes_record, mistakes_resolve, learning_note_outcome, memory_remember, skills_update]
@@ -35,13 +35,14 @@ Nuclei and SBOM leads stay recon observations until a later `verify` reproduces
35
35
  ## Example
36
36
 
37
37
  ```ruby
38
- findings = PWN::SAST::Factory.start(dir_path: './src')
38
+ require 'fileutils'
39
+ rows = PWN::SAST::Factory.scan(dir_path: './src')
40
+ FileUtils.mkdir_p('./out')
39
41
  PWN::Reports::SAST.generate(
40
- dir_path: './src', results_hash: findings, output_dir: './out'
41
- )
42
- PWN::Plugins::DefectDojo.importscan(
43
- engagement_id: 42, file: './out/report.json', scan_type: 'PWN SAST'
42
+ dir_path: './out', results_hash: { data: rows }, report_name: 'report'
44
43
  )
44
+ # Importing is a separate authenticated operation; use DefectDojo.help and
45
+ # pwn_defectdojo_importscan --help for the installed integration's contract.
45
46
  ```
46
47
 
47
48
  [← Home](Home.md) · [SAST](SAST.md) · [Fuzzing](Fuzzing.md)
@@ -1,6 +1,8 @@
1
1
  # `PWN::SAST` - Static Application Security Testing
2
2
 
3
- 48 modules in `PWN::SAST`: 45 language-aware scan rules plus `Factory`, `TestCaseEngine`, and `Version`.
3
+ 48 top-level modules in `PWN::SAST`. `Factory` is the Java XML-factory/XXE
4
+ pattern rule, not the rule loader; `TestCaseEngine` executes rules.
5
+ The `pwn_sast` driver orchestrates the selected rules.
4
6
  Source: `lib/pwn/sast/*.rb`. CLI: `bin/pwn_sast`.
5
7
 
6
8
  ![SAST pipeline](diagrams/code-scanning-sast.svg)
@@ -9,15 +11,17 @@ Source: `lib/pwn/sast/*.rb`. CLI: `bin/pwn_sast`.
9
11
 
10
12
  ```bash
11
13
  # CLI driver
12
- pwn_sast -d /path/to/src -o /tmp/sast_out
14
+ pwn_sast --help # inspect the installed driver's source/output options
13
15
  ```
14
16
 
15
17
  ```ruby
16
18
  # REPL / pwn_eval
17
- findings = PWN::SAST::Factory.start(dir_path: '/path/to/src')
18
- PWN::Reports::SAST.generate(dir_path: '/path/to/src',
19
- results_hash: findings,
20
- output_dir: '/tmp/sast_out')
19
+ require 'fileutils'
20
+ rows = PWN::SAST::Factory.scan(dir_path: '/path/to/src')
21
+ FileUtils.mkdir_p('/tmp/sast_out')
22
+ PWN::Reports::SAST.generate(dir_path: '/tmp/sast_out',
23
+ results_hash: { data: rows },
24
+ report_name: 'report')
21
25
  ```
22
26
 
23
27
  ## Rule families (48 modules)
@@ -30,14 +34,15 @@ PWN::Reports::SAST.generate(dir_path: '/path/to/src',
30
34
  | **Crypto / secrets** | `MD5` · `SSL` · `Keystore` · `PaddingOracle` · `PrivateKey` · `Signature` · `Token` · `Password` · `Base64` · `HTTPAuthorizationHeader` |
31
35
  | **Memory / native** | `BannedFunctionCallsC` · `UseAfterFree` |
32
36
  | **Infra / meta** | `AWS` · `AMQPConnectAsGuest` · `ApacheFileSystemUtilAPI` · `PomVersion` · `Version` · `Port` · `Logger` · `ThrowErrors` · `TaskTag` · `Emoticon` |
33
- | **Engine** | `Factory` (loader) · `TestCaseEngine` (probe generator) |
37
+ | **Engine** | `Factory` (Java XML-factory/XXE rule) · `TestCaseEngine` (probe generator) |
34
38
 
35
39
  ## Write a rule
36
40
 
37
41
  Each rule implements `self.scan(opts = {})` taking `dir_path:` and returning an
38
- array of `{file:, line:, match:, cwe:, severity:}` hashes. Copy any existing
39
- rule in `lib/pwn/sast/`, add your regex/AST logic, and it's auto-loaded by
40
- `Factory`.
42
+ array of TestCaseEngine result rows (including timestamp, security references,
43
+ filename/line and raw/test-case content). Inspect an existing rule and the
44
+ report renderer rather than inventing a findings schema. Add its namespace
45
+ autoload, paired spec and generated module skill; the driver selects rules.
41
46
 
42
47
  ## Downstream
43
48
 
@@ -3,7 +3,13 @@
3
3
  **Verdict: the “full protocol decode in all modules” requirement is not complete.**
4
4
  A valid frame in one mode is useful implementation, not full coverage of the named protocol family.
5
5
 
6
- Audit snapshot: **2026-09-09T20:20:02.204954+00:00**. This is a working-tree audit, not a release or a claim about HEAD. Other workers were changing decoders during review; the exact reviewed bytes are identified by SHA-256 in `/tmp/pwn-decoder-completion-matrix.json`, with retained text in `/tmp/pwn-decoder-audit-snapshot.json`. Later edits require delta review. The audit itself changes documentation only; it does not stage, commit, alter decoder code, or endorse unrelated pre-existing staged files.
6
+ Historical protocol audit snapshot: **2026-09-09T20:20:02.204954+00:00**.
7
+ The current documentation review reconfirmed 24 registry aliases / 21 modules
8
+ and the GQRX forwarding correction below. Other mode-level acceptance rows retain
9
+ their historical evidence boundaries; no live RF or new conformance run is implied.
10
+ Temporary audit files cited below are not shipped evidence and may expire.
11
+
12
+ Original audit context: This is a working-tree audit, not a release or a claim about HEAD. Other workers were changing decoders during review; the exact reviewed bytes are identified by SHA-256 in `/tmp/pwn-decoder-completion-matrix.json`, with retained text in `/tmp/pwn-decoder-audit-snapshot.json`. Later edits require delta review. The audit itself changes documentation only; it does not stage, commit, alter decoder code, or endorse unrelated pre-existing staged files.
7
13
 
8
14
  ## Inventory and evidence contract
9
15
 
@@ -51,7 +57,7 @@ Local evidence: `lib/pwn/sdr/decoder.rb`, `base.rb`, `dsp.rb`; `spec/lib/pwn/sdr
51
57
  | BASE-3 | Overrun/dropped-byte source status checked, discontinuity raises; unknown counts stay nil | Queue backpressure is not hardware-loss telemetry. Validate adapters on actual devices; UDP audio sequence/loss remains unmeasured. Do not report unknown loss as zero. |
52
58
  | DSP-1 | Ruby fallback and optional DSPNative packed unpack/magnitude/FM, radix-2 FFT; FFTW/VOLK/Liquid helpers elsewhere | Numeric precision/scale, N versus N-1 FM samples, prior IQ and byte remainder must match across backends/chunks. Generic resampling/timing helpers do not establish continuous protocol tracking. |
53
59
  | DSP-2 | Native kernel benchmark artifacts in `ext/pwn_dsp/` | Record selected backend and benchmark entire decode pipeline at each row's rate. Existing README explicitly says kernel-only rates omit acquisition/channelizer/protocol/queueing. |
54
- | GQRX-1 | `init_freq` resolves registry and forwards common streaming controls; RDS `.sample` avoided when streaming requested | Current allowlist forwards source/file/sample_rate/chunk_bytes but drops protocol `mode`, `iq_format`, `backend`, native executable, modulation, channel/key/context options. Direct `.decode` successes are not GQRX end-to-end acceptance. Implement explicit validated per-decoder option forwarding and test every unique target. |
60
+ | GQRX-1 | `init_freq` resolves registry and forwards common streaming controls; RDS `.sample` avoided when streaming requested | Current `init_freq` strips only GQRX-owned controls and forwards remaining decoder context, including mode/backend/format and callbacks; resolved `freq_obj` stays authoritative. Any explicit decoder context prevents the legacy RDS `.sample` shortcut. `gqrx_spec.rb` covers forwarding. This fixes the historical allowlist defect, not all decoder conformance. |
55
61
  | NATIVE-1 | Optional native DSP/SCH and required native LTE bridge; custom native GPS/RDS/RTL433/RFID processes | Namespace comment “100% ruby-native / no external binary” is stale. State accurately: first-party Ruby coordination plus named C/C++ libraries/processes; external fixture generators are not runtime dependencies. If “native” means exclusively Ruby, these backends need an explicit requirement decision. |
56
62
 
57
63
  ### RF and performance requirements
@@ -516,14 +522,14 @@ Priority orders risk and integration value; it is not a claim that later rows ar
516
522
  - Executed `bundle exec rspec spec/lib/pwn/sdr/decoder_spec.rb spec/lib/pwn/sdr/decoder/base_spec.rb spec/lib/pwn/sdr/decoder/dsp_spec.rb` in `/opt/pwn`: **44 examples, 0 failures**. This verifies only that focused run; it is not a protocol-completeness metric.
517
523
  - An earlier process launched from the research interpreter had a different gem environment and failed Bundler dependency materialization. The actual terminal environment ran the focused specs successfully. No package installation or lockfile changes were made by this audit.
518
524
  - All module/spec inventory and acceptance-ID coverage are checked programmatically against `REGISTRY.values.uniq`; source/spec hashes identify what was read. No fabricated decoded frames or measurements are used.
519
- - No full `rake`, complete optional-native matrix, sensitivity test or live RF test was run by this documentation audit. Full gates can regenerate module skills and concurrent implementation was active; run them after integration settles. Neither this limitation nor a future green suite resolves the OPEN acceptance rows.
525
+ - No full `rake`, complete optional-native matrix, sensitivity test or live RF test was run by this documentation audit. Concurrent implementation was active; run full gates after integration settles. Current normal rake/spec does not regenerate tracked module skills; `rake module_skills` is explicit. Neither this limitation nor a future green suite resolves the OPEN acceptance rows.
520
526
  - Citation retrieval used direct HTTP and PDF text extraction because the configured web extractor was search-only. NOAA's old APT host failed DNS; the NOAA KLM guide was retrieved instead. Semtech's product page timed out; LoRa mode/synchronization context uses the retrieved independent implementation reference, not an unread manufacturer datasheet. The RDS commercial catalogue page was insufficient for clause-level claims; use the actual redsea reference and a pinned licensed standard for final conformance.
521
527
 
522
528
  ### Required completion artifacts
523
529
 
524
530
  For every acceptance ID, attach a pinned standard clause/profile, supported-mode list, public entry-point command, source/fixture hash, independent expected decoded fields, negative/ciphertext outcomes, actual execution result, and end-to-end rate/latency evidence. Preserve unsupported variants and unavailable sources as OPEN. A finite catalogue row needs every pinned device ID, including disabled-by-default entries; a finite standard row needs every declared message/PHY combination, not an illustrative subset.
525
531
 
526
- This document is exhaustive over the current registry and reviewed files, **not a declaration of exhaustive protocol conformance**. It intentionally does not claim completion from a test count.
532
+ The historical matrix covers its enumerated registry and reviewed files, **not a declaration of exhaustive protocol conformance**. It intentionally does not claim completion from a test count.
527
533
 
528
534
  ## Sources
529
535
 
data/documentation/SDR.md CHANGED
@@ -15,7 +15,7 @@
15
15
  | `RFIDler` | 125 kHz RFID reader/emulator |
16
16
  | `SonMicroRFID` | SM130 13.56 MHz reader |
17
17
  | `FrequencyAllocation` | ITU/FCC band-plan lookup - "what lives at 433.92 MHz?" |
18
- | **`Decoder::*`** | 20 protocol demodulators/decoders (+ Base/DSP helpers) - `ADSB APT Bluetooth DECT FLEX GPS GSM Iridium LoRa LTE Morse P25 Pager POCSAG RDS RFID RTL433 RTTY WiFi ZigBee` |
18
+ | **`Decoder::*`** | 21 protocol demodulators/decoders (+ Base/DSP helpers) - `ADSB APT Bluetooth DECT FLEX GPS GSM Iridium LoRa LTE Morse P25 Pager POCSAG RDS RFID RTL433 RTTY Tempest WiFi ZigBee` |
19
19
 
20
20
  ## CLI
21
21
 
@@ -57,14 +57,15 @@ See skill `pwn_gqrx_scanner_fast_vs_iterative_scanning` for the full trade-off.
57
57
  ## REPL example
58
58
 
59
59
  ```ruby
60
- g = PWN::SDR::GQRX.connect(host: '127.0.0.1', port: 7356)
61
- PWN::SDR::GQRX.set_freq(gqrx_sock: g, freq: 433_920_000)
62
- PWN::SDR::GQRX.set_demod(gqrx_sock: g, demod: 'AM')
63
- snap = PWN::SDR::GQRX.get_spectrum_snapshot(gqrx_sock: g)
64
- PWN::SDR::FrequencyAllocation.lookup(freq: 433_920_000)
65
- # => { band: 'ISM 433', typical: ['garage doors', 'weather stations', ...] }
60
+ g = PWN::SDR::GQRX.connect(target: '127.0.0.1', port: 7356)
61
+ PWN::SDR::GQRX.init_freq(gqrx_sock: g, freq: '433.920.000',
62
+ demodulator_mode: :AM, keep_alive: true)
63
+ snap = PWN::SDR::GQRX.get_spectrum_snapshot(gqrx_sock: g, nfft: 2048)
64
+ plans = PWN::SDR::FrequencyAllocation.band_plans
65
+ PWN::SDR::GQRX.disconnect(gqrx_sock: g)
66
66
  ```
67
67
 
68
+ This is active tuning of an already running GQRX instance, not an offline test.
68
69
 
69
70
  ## Native DSP acceleration (`PWN::FFI`)
70
71
 
@@ -100,39 +101,26 @@ iq = PWN::FFI::HackRF.capture(freq_hz: 433_920_000, rate_hz: 10e6, samples: 262_
100
101
 
101
102
  See [FFI](FFI.md) for the full binding surface and design rules.
102
103
 
103
- ## True-air I/Q decode (`Base.run_iq`)
104
-
105
- Every `PWN::SDR::Decoder::*` module can decode straight from hardware I/Q
106
- without GQRX in the loop. `Base.run_iq` auto-selects the first working
107
- front-end (`:file` -> `:rtlsdr` -> `:adalm_pluto` -> `:hackrf` -> `:soapy`),
108
- streams, unpacks, and feeds the module's demodulator. If no hardware or
109
- capture file is present it degrades gracefully to `Base.run_detector`
110
- (energy/burst characterizer) so you still get structured JSONL output.
111
-
112
- ```ruby
113
- # Force a specific radio, sample rate, or replay a capture file:
114
- fo = PWN::SDR::GQRX.init_freq(freq: '929.612.500', decoder: :flex)
115
- fo[:iq_source] = :hackrf # or :rtlsdr / :adalm_pluto / :soapy / :file
116
- fo[:iq_rate] = 2_048_000
117
- fo[:iq_file] = '/tmp/flex.cu8' # replay instead of live air
118
- PWN::SDR::Decoder::Flex.decode(freq_obj: fo)
119
-
120
- # Or drive the pipeline directly:
121
- PWN::SDR::Decoder::Base.run_iq(
122
- freq_obj: fo,
123
- protocol: 'ADSB',
124
- demod: PWN::SDR::Decoder::ADSB::Demod.new,
125
- sample_rate: 2_000_000,
126
- source: :auto # :rtlsdr|:hackrf|:adalm_pluto|:soapy|:file
127
- )
128
- ```
129
-
130
- | Decoder | Air path | I/Q entry point |
131
- |---|---|---|
132
- | ADSB, Bluetooth, DECT, GPS, GSM, Iridium, LoRa, LTE, P25, RFID, RTL433, WiFi, ZigBee | `run_iq` (wideband) | `#feed_iq(iq, rate:)` |
133
- | APT, FLEX, Morse, Pager, POCSAG, RTTY | `run_iq(fm_demod: true)` or `run_native` | `#feed(audio)` |
134
- | RDS | GQRX built-in RDS (`RDS.sample`) | n/a |
135
-
104
+ ## Decode input boundaries
105
+
106
+ The current registry has 24 aliases mapping to 21 protocol modules, including
107
+ `Tempest`; `Flex` is the Ruby constant behind `:flex`. It is not a claim of full
108
+ protocol or live-air coverage. See the mode-by-mode
109
+ [SDR Decoder Coverage](SDR-Decoder-Coverage.md) matrix before choosing a source.
110
+
111
+ Use each public decoder's `.help` and explicit `source: :file`, `file:`,
112
+ `sample_rate:` and `iq_format:` controls for an offline replay. Do not call
113
+ `GQRX.init_freq(decoder: ...)` merely to construct a fixture: it can start decoding
114
+ and perform live I/O. Audio, MPX, amplitude traces, synchronized symbols and raw
115
+ IQ are different inputs; a parser success does not prove RF acquisition.
116
+
117
+ `Base.run_iq` streams supported integer IQ sources through DSP to a supplied
118
+ demodulator. Its low-level default permits an energy-detector fallback, but
119
+ protocol `.decode` methods can require `fallback: :raise`. An energy observation
120
+ is never payload decoding. Explicit `.detect` exposes detection separately.
121
+ RDS's default GQRX polling is station metadata, while its native `redsea` backend
122
+ accepts MPX. GPS, LTE, RTL433 and RFID have mode-specific native boundaries;
123
+ missing executables/libraries and unsupported modes must remain visible.
136
124
 
137
125
  ## RF ↔ Extrospection
138
126
 
@@ -12,20 +12,24 @@ operator cheat sheet.
12
12
 
13
13
  ## Life of a line
14
14
 
15
- 1. Entering `pwn-ai` always creates a **new** `~/.pwn/sessions/<timestamp>_<hex>.jsonl`.
15
+ 1. A new activation creates a session; explicit session-picker or CLI resume
16
+ selects an existing stable session ID instead.
16
17
  2. Cheap intents (greeting, how-to, recall) never open a host-work goal.
17
18
  3. Everything else is an autonomous goal. `Loop.run` keeps CORE_TOOLS until
18
19
  the original request is done or a tool returned failure evidence.
19
20
  pwn-ai does not decide authorization.
20
- 4. An unfinished host-work request is written to `~/.pwn/open_goal.json`.
21
- 5. An accepted final answer deletes that file. Budget exhaust leaves it.
21
+ 4. RequestRuntime retains the original objective, amendments, tool evidence and
22
+ verification contract in request/session-bound checkpoints. OpenGoal keeps the
23
+ matching resume pointer; `~/.pwn/open_goal.json` is the legacy global form.
24
+ 5. Verified completion can clear the matching open goal. Cancellation, failed
25
+ checks or uncertain side effects do not turn unfinished work into success.
22
26
 
23
27
  ```
24
28
  you type a line
25
29
  |
26
30
  +-- greeting / how-to / recall -----> short answer, no tools
27
31
  |
28
- +-- continue / resume / keep going --> reload open_goal.json
32
+ +-- continue / resume / keep going --> restore this session's open request
29
33
  |
30
34
  +-- last / previous session ---------> prior JSONL, not this line
31
35
  |
@@ -38,7 +42,8 @@ you type a line
38
42
 
39
43
  ## Unfinished goals
40
44
 
41
- File: `~/.pwn/open_goal.json` (`PWN::AI::Agent::OpenGoal`).
45
+ Owner: `PWN::AI::Agent::OpenGoal`, with request-bound persistence and a per-session
46
+ pointer. Legacy `~/.pwn/open_goal.json` is accepted only for its matching session.
42
47
 
43
48
  | You type (whole line) | Effect |
44
49
  |---|---|
@@ -51,18 +56,22 @@ File: `~/.pwn/open_goal.json` (`PWN::AI::Agent::OpenGoal`).
51
56
  | `resume the goal` / `resume the task` / `resume work` | same |
52
57
 
53
58
  The line must be **only** that phrase (optional `please` / `the goal|task|work`
54
- and a trailing `.` / `!`). A new sentence is a new goal and **replaces** the
55
- saved request.
59
+ and a trailing `.` / `!`). A new sentence is not a bare resume. Replacing a
60
+ checkpointed CLI objective requires `--replace-session ID`, a new prompt/contract
61
+ and `--approve-replacement`; the old checkpoint remains unchanged.
56
62
 
57
63
  `continue scanning the lab` is a new ask, not a resume.
58
64
 
59
- Delete `~/.pwn/open_goal.json` to drop a stuck checkpoint.
65
+ Use `pwn-ai --resume-session EXACT_SESSION_ID` after a process restart. Do not
66
+ delete checkpoint files as a recovery shortcut: retain evidence and inspect
67
+ uncertain mutations before deciding whether any action is safe to repeat.
68
+ `--resume RUN_ID` is TaskDAG resume, not session resume.
60
69
 
61
70
  ---
62
71
 
63
72
  ## This session vs last session
64
73
 
65
- Entering `pwn-ai` is a new transcript. "Last session" is the newest other
74
+ Without explicit resume, entering `pwn-ai` starts a new transcript. "Last session" is the newest other
66
75
  `~/.pwn/sessions/*.jsonl`.
67
76
 
68
77
  | Phrase | Where it reads |
@@ -94,7 +103,7 @@ Whole-line greetings only, so `hi, scan this host` stays a goal:
94
103
 
95
104
  | Need | Done only when |
96
105
  |---|---|
97
- | Write / update / regenerate / docs / fix | A **write** effect, then a later **read** (`cat`, `ruby -c`, eval read) |
106
+ | Write / update / regenerate / docs / fix | Current-turn exact-target host write/readback evidence, matching current bytes and every applicable authored check; an unrelated read or test is insufficient |
98
107
  | Browser / navigate / `TransparentBrowser` | A **browse** effect (goto / dump_links / close) |
99
108
  | Hostname / uname / cwd / whoami | Any live **read** |
100
109
  | Other long goals (bounty, scrape, recon) | **write**, **browse**, or **eval** (`ls` alone is not enough) |
@@ -103,7 +112,11 @@ These do **not** count as finishing a write: `memory_remember`,
103
112
  `learning_note_outcome`, `mistakes_*`, rspec/rubocop green, a README listing,
104
113
  or "I will do that next time."
105
114
 
106
- After you mutate a file, read it back before a final.
115
+ After mutation, verify the actual requested target. Literal/artifact checks and
116
+ host-authored contracts are stronger than effect categories. Browser activity or
117
+ an eval is not by itself proof of arbitrary semantic task completion. Child-agent
118
+ prose is not evidence; the parent must accept current exact-target receipts and
119
+ rerun its own integration checks. See [Harness Evaluation](Harness-Evaluation.md).
107
120
 
108
121
  ---
109
122
 
@@ -127,7 +140,7 @@ going.
127
140
  | Path | Role |
128
141
  |---|---|
129
142
  | `~/.pwn/sessions/<id>.jsonl` | This activation's transcript |
130
- | `~/.pwn/open_goal.json` | Unfinished host-work request |
143
+ | OpenGoal request/session records (legacy `~/.pwn/open_goal.json`) | Unfinished request and matching-session resume pointer |
131
144
  | `~/.pwn/memory.json` | Durable facts (not "last line") |
132
145
 
133
146
  [← Home](Home.md)
@@ -29,6 +29,13 @@ appended as JSON-per-line to `~/.pwn/sessions/<id>.jsonl`.
29
29
  | `sessions_stats` | totals across the whole directory |
30
30
  | `sessions_lean` | prune stubs and aged unreferenced transcripts; compact oversized tool/assistant content (pins gold outcomes and open-mistake refs) |
31
31
 
32
+ Session titles, dependency pins and shared activity leases are described in
33
+ [Installation](Installation.md). Scheduled cleanup is not equivalent to deleting
34
+ all old transcripts. Verified retained learning evidence can release some source
35
+ pins only after migration/readback; see [Reinforcement Learning](Reinforcement-Learning.md).
36
+ Exact unfinished requests resume through `pwn-ai --resume-session ID`, not a new
37
+ one-shot session.
38
+
32
39
  ## File format
33
40
 
34
41
  ```json
@@ -1,9 +1,15 @@
1
1
  # Memory · Skills · Learning · Mistakes · Metrics · Policy - Introspection
2
2
 
3
- The inward half of the pwn-ai feedback loop: the agent writes what it did, and the next prompt can see it. Wins become skills. Failures become fingerprinted mistakes.
3
+ The inward half of the pwn-ai feedback loop: the agent writes what it did, and the next prompt can see it. Verified procedures may support reviewed skill updates; routine wins do not create skills. Failures become fingerprinted mistakes.
4
4
 
5
5
  ![Memory / Skills detail](diagrams/memory-skills-detailed.svg)
6
6
 
7
+ Completion metrics distinguish checked host completion from judge claims and
8
+ legacy quality scores. Failure-derived recipes stay regression data; frozen
9
+ held-out evaluation never feeds back into the source snapshot. Skill review and
10
+ routing-policy promotion are separate guarded operations, not automatic proof
11
+ of general improvement. See [Operability](Operability.md).
12
+
7
13
  ## The six stores
8
14
 
9
15
  | Store | File | Write tool | Read tool | Injected as |
@@ -19,7 +25,7 @@ The inward half of the pwn-ai feedback loop: the agent writes what it did, and t
19
25
 
20
26
  `PWN::AI::Agent::Metrics` keeps two rates that RSI can compare across turns.
21
27
 
22
- ESR is `verified_exploit_tools / vulnerable_tools`. A tool enters `verified_exploit_tools` only when an exploit attempt for that tool name succeeds. A tool enters `vulnerable_tools` when the caller marks it vulnerable, or when a successful exploit names that target. Repeating the same tool does not change the counts. The rate stays nil until at least one vulnerable tool exists.
28
+ ESR is `verified_exploit_tools / vulnerable_tools`. The numerator uses distinct tool/CWE names while the denominator uses distinct vulnerable assets: this can exceed 1 and is not a comparable success percentage. A tool enters `verified_exploit_tools` only when an exploit attempt for that tool name succeeds. A tool enters `vulnerable_tools` when the caller marks it vulnerable, or when a successful exploit names that target. Repeating the same tool does not change the counts. The rate stays nil until at least one vulnerable tool exists.
23
29
 
24
30
  ASR is `successful_attacks / total_attack_attempts`. Every attack attempt increments the denominator. A reproduced impact, a still-open retest, or an accepted `chain_impact` increments the numerator. This one is an attempt ratio, not a set of tool names.
25
31
 
@@ -55,7 +61,7 @@ wiping durable facts, preferences, and lessons. Clearing is still available via
55
61
  ↳ if auto_extrospect enabled → Extrospection.auto_extrospect # AUTO_SECTIONS only
56
62
  7. Reflect.on(engine: reflect_engine)→ Memory.remember(lesson_xxxx, ...) # teacher-student: a
57
63
  frontier engine may WRITE the lesson a local engine READS
58
- 8. A whole workflow succeeded → Learning.distill_skill(name, session_id, references:)
64
+ 8. Explicit distillation / SkillReview → reviewed reusable procedure (not every success)
59
65
  9. Found a fix for a mistake → mistakes_resolve(sig, fix) → Memory :lesson "AVOID X - FIX: Y"
60
66
  10. (weekly, cron) Learning.export_finetune (min judge score + process-reward compress) +
61
67
  Reward.export_dpo (per-source cap + trajectory geometry scrub) → ~/.pwn/finetune/*.jsonl → LoRA over the local
@@ -250,7 +256,8 @@ episode:
250
256
  1. `begin_episode` opens before the first tool rank.
251
257
  2. `observe_step` writes a hygiene reward after each tool (`semantic_ok`).
252
258
  3. `finish` (from `Learning.auto_introspect`, or Loop if introspect is skipped)
253
- adds the `Reward.judge` terminal score and updates Q and REINFORCE.
259
+ records the resolved outcome. Unknown outcomes do not train; positive terminal
260
+ credit requires independently attributed action IDs, not judge prose alone.
254
261
 
255
262
  State is a short key: request kind, a hash of the active English task, last
256
263
  action, fail count bin, and engine. Files:
@@ -131,6 +131,12 @@ arbitrary natural-language goal; the saved commands, outputs, requirements and
131
131
  revisions make that judgment inspectable. No live-provider reliability or automatic
132
132
  security isolation is implied by the deterministic offline integration tests.
133
133
 
134
+ Parent completion does not trust a child's success prose. Current child receipts
135
+ can satisfy only parent-required exact targets with matching request/turn/action
136
+ provenance and current readback; the parent reruns its integration checks. The
137
+ offline Swarm fault lanes in [Harness Evaluation](Harness-Evaluation.md) exercise
138
+ missing, stale, lying and tampered artifacts without live providers.
139
+
134
140
  ## Define personas
135
141
 
136
142
  Each persona accepts optional `engine` and `model` keys. `model` is the exact
@@ -15,7 +15,7 @@ JS-heavy.
15
15
  b = PWN::Plugins::TransparentBrowser.open(
16
16
  browser_type: :headless, # :chrome | :firefox | :headless | :rest
17
17
  proxy: 'http://127.0.0.1:8080',
18
- with_devtools: true
18
+ devtools: true
19
19
  )
20
20
  b[:browser].goto 'https://target'
21
21
  b[:browser].text_field(name: 'q').set 'pwn'
@@ -100,10 +100,13 @@ fix the port via `pwn-vault` (`~/.pwn/pwn.yaml`).
100
100
  Fixed in current `PWN::Cron` / `Swarm` - both loaders now pass
101
101
  `permitted_classes: [Symbol]`. If you see it, `gem update pwn`.
102
102
 
103
- ## Agent stops early ("max iterations")
103
+ ## Agent stops before verified completion
104
104
 
105
- Raise `ai.agent.max_iters` in `~/.pwn/pwn.yaml` (edit via `pwn-vault`), or
106
- split the request.
105
+ Inspect the request log under `~/.pwn/logs/` (or `PWN_DEBUG_DIR`) and the
106
+ persisted request/verification checkpoint. Increasing `max_iters` is not a
107
+ completion fix: current Loop does not finalize merely because that count was
108
+ reached. Preserve failure evidence and resume the unfinished objective; see
109
+ [Session Workflow](Session-Workflow.md) and [Harness Evaluation](Harness-Evaluation.md).
107
110
 
108
111
  ## A tool is stuck at 0 % success
109
112
 
@@ -12,14 +12,14 @@ with a **tool-calling AI agent** on top that can run the same methods.
12
12
 
13
13
  | Namespace | Count | What it is |
14
14
  |---|---|---|
15
- | `PWN::Plugins::*` | **67** | Wrappers for external and native tooling (Burp, Nmap, Metasploit, Shodan, browsers, serial, ...) |
15
+ | `PWN::Plugins::*` | **107** | Wrappers for external and native tooling (Burp, Nmap, Metasploit, Shodan, browsers, serial, ...) |
16
16
  | `PWN::SAST::*` | **48** | Static-analysis rules across C/Java/Go/Python/Ruby/Scala/PHP/TS |
17
17
  | `PWN::AWS::*` | **90** | One module per AWS service for cloud enumeration |
18
18
  | `PWN::WWW::*` | **22** | Site-specific browser automations (HackerOne, BugCrowd, GitHub, Google, LinkedIn, ...) |
19
- | `PWN::SDR::*` | **6** (+ **20** protocol decoders + Base/DSP) | GQRX, FlipperZero, RFIDler, SonMicro, band tables, `Decoder::{ADSB,POCSAG,RDS,LoRa,...}` |
20
- | `PWN::FFI::*` | **8** | Native DSP/RF backends: Volk · Liquid · FFTW · RTLSdr · HackRF · AdalmPluto · SoapySDR · Stdio |
19
+ | `PWN::SDR::*` | **6** (+ **21** protocol decoders + Base/DSP) | GQRX, FlipperZero, RFIDler, SonMicro, band tables, `Decoder::{ADSB,POCSAG,RDS,LoRa,...}` |
20
+ | `PWN::FFI::*` | **11** | Native bindings (including DSPNative, Capstone and Keystone): Volk · Liquid · FFTW · RTLSdr · HackRF · AdalmPluto · SoapySDR · Stdio |
21
21
  | `PWN::AI::*` | **6** engines | OpenAI, Anthropic, Grok (OAuth device-flow), Gemini, Ollama, Open WebUI |
22
- | `bin/pwn_*` + `pwn` | **54** | Headless CLI executables for CI/CD |
22
+ | `bin/` (including `pwn-ai` and `pwn-capd`) | **56** | Headless CLI executables for CI/CD |
23
23
  | Agent toolsets | **16** · **150 tools** | terminal · pwn · memory · skills · sessions · learning · metrics · policy · extrospection · cron · swarm · reward · curriculum · http · mcp · manifest |
24
24
 
25
25
  ## Three ways to use it
@@ -32,7 +32,7 @@ critical when the caller is an autonomous agent.
32
32
  |---|---|
33
33
  | "Trust our scanner" | `cat lib/pwn/sast/sql.rb` - read the regex yourself |
34
34
  | Per-seat license for the glue | MIT-licensed glue; bring your own Burp Pro / Nessus key |
35
- | Agent output is a PDF | Agent output is a `PWN::Reports` object *and* a distilled skill *and* a memory entry |
35
+ | Agent output is a PDF | Reports, memories and reusable skills are separate explicit outputs; one does not prove the others were created |
36
36
  | One vendor's model | Six interchangeable engines; swarm can pit them against each other |
37
37
 
38
38
  ## Why the feedback loop matters