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.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/documentation/AI-Integration.md +4 -4
- data/documentation/AWS.md +10 -9
- data/documentation/Agent-Tool-Registry.md +20 -17
- data/documentation/Blockchain.md +3 -2
- data/documentation/Bounty.md +8 -6
- data/documentation/BurpSuite.md +6 -10
- data/documentation/CLI-Drivers.md +7 -4
- data/documentation/Capability-Broker-Sandbox.md +1 -1
- data/documentation/Configuration.md +23 -15
- data/documentation/Contributing.md +3 -3
- data/documentation/Cron.md +3 -2
- data/documentation/Diagrams.md +9 -3
- data/documentation/Drivers.md +12 -6
- data/documentation/Extrospection.md +25 -5
- data/documentation/FFI.md +15 -25
- data/documentation/Fuzzing.md +13 -13
- data/documentation/General-PWN-Usage.md +7 -4
- data/documentation/Harness-Evaluation.md +90 -3
- data/documentation/Home.md +6 -5
- data/documentation/How-PWN-Works.md +9 -10
- data/documentation/Installation.md +12 -11
- data/documentation/Metasploit.md +13 -19
- data/documentation/Mistakes.md +2 -2
- data/documentation/NmapIt.md +6 -3
- data/documentation/Operability.md +99 -0
- data/documentation/Persistence.md +3 -2
- data/documentation/Plugin-Degradation.md +4 -2
- data/documentation/Plugins.md +4 -11
- data/documentation/Policy-Benchmark.md +4 -0
- data/documentation/Reinforcement-Learning.md +19 -3
- data/documentation/Reporting.md +6 -5
- data/documentation/SAST.md +15 -10
- data/documentation/SDR-Decoder-Coverage.md +10 -4
- data/documentation/SDR.md +28 -40
- data/documentation/Session-Workflow.md +25 -12
- data/documentation/Sessions.md +7 -0
- data/documentation/Skills-Memory-Learning.md +11 -4
- data/documentation/Swarm.md +6 -0
- data/documentation/Transparent-Browser.md +1 -1
- data/documentation/Troubleshooting.md +6 -3
- data/documentation/What-is-PWN.md +4 -4
- data/documentation/Why-PWN.md +1 -1
- data/documentation/diagrams/agent-tool-registry.svg +219 -180
- data/documentation/diagrams/ai-integration-tool-calling.svg +35 -34
- data/documentation/diagrams/code-scanning-sast.svg +78 -78
- data/documentation/diagrams/cron-scheduling.svg +165 -145
- data/documentation/diagrams/dot/_THEME.md +6 -4
- data/documentation/diagrams/dot/agent-tool-registry.dot +6 -2
- data/documentation/diagrams/dot/ai-integration-tool-calling.dot +1 -1
- data/documentation/diagrams/dot/code-scanning-sast.dot +8 -8
- data/documentation/diagrams/dot/cron-scheduling.dot +2 -0
- data/documentation/diagrams/dot/driver-framework.dot +1 -1
- data/documentation/diagrams/dot/extrospection-world-awareness.dot +2 -2
- data/documentation/diagrams/dot/fuzzing-workflow.dot +3 -3
- data/documentation/diagrams/dot/history-to-drivers.dot +1 -1
- data/documentation/diagrams/dot/memory-skills-detailed.dot +3 -3
- data/documentation/diagrams/dot/mistakes-negative-feedback.dot +2 -2
- data/documentation/diagrams/dot/overall-pwn-architecture.dot +33 -121
- data/documentation/diagrams/dot/persistence-filesystem.dot +2 -2
- data/documentation/diagrams/dot/plugin-ecosystem.dot +2 -2
- data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +31 -167
- data/documentation/diagrams/dot/pwn-repl-prototyping.dot +1 -1
- data/documentation/diagrams/dot/reinforcement-learning.dot +15 -7
- data/documentation/diagrams/dot/reporting-pipeline.dot +5 -3
- data/documentation/diagrams/dot/reverse-engineering-flow.dot +3 -3
- data/documentation/diagrams/dot/sdr-radio-flow.dot +5 -5
- data/documentation/diagrams/dot/sessions-cron-automation.dot +1 -1
- data/documentation/diagrams/dot/swarm-multi-agent.dot +3 -3
- data/documentation/diagrams/dot/task-summarizer.dot +2 -2
- data/documentation/diagrams/dot/web-application-testing.dot +4 -3
- data/documentation/diagrams/dot/zero-day-research-flow.dot +4 -3
- data/documentation/diagrams/driver-framework.svg +1 -1
- data/documentation/diagrams/extrospection-world-awareness.svg +178 -178
- data/documentation/diagrams/fuzzing-workflow.svg +58 -58
- data/documentation/diagrams/history-to-drivers.svg +42 -42
- data/documentation/diagrams/memory-skills-detailed.svg +210 -210
- data/documentation/diagrams/mistakes-negative-feedback.svg +116 -116
- data/documentation/diagrams/overall-pwn-architecture.svg +248 -404
- data/documentation/diagrams/persistence-filesystem.svg +143 -143
- data/documentation/diagrams/plugin-ecosystem.svg +100 -100
- data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +233 -752
- data/documentation/diagrams/pwn-repl-prototyping.svg +27 -27
- data/documentation/diagrams/reinforcement-learning.svg +295 -221
- data/documentation/diagrams/reporting-pipeline.svg +94 -80
- data/documentation/diagrams/reverse-engineering-flow.svg +31 -31
- data/documentation/diagrams/sdr-radio-flow.svg +157 -155
- data/documentation/diagrams/sessions-cron-automation.svg +13 -13
- data/documentation/diagrams/swarm-multi-agent.svg +86 -86
- data/documentation/diagrams/task-summarizer.svg +57 -57
- data/documentation/diagrams/web-application-testing.svg +81 -75
- data/documentation/diagrams/zero-day-research-flow.svg +101 -92
- data/documentation/pwn-REPL.md +5 -3
- data/documentation/pwn-ai-Agent.md +18 -14
- data/documentation/pwn_silent_help_learn_demo.gif +0 -0
- data/etc/default_skills/pwn/ai/agent/learning/SKILL.md +1 -0
- data/lib/pwn/ai/agent/learning.rb +46 -1
- data/lib/pwn/ai/agent/policy_evaluation.rb +5 -1
- data/lib/pwn/ai/agent/reward.rb +9 -0
- data/lib/pwn/version.rb +1 -1
- data/spec/fixtures/harness/completion_regressions.json +10 -0
- data/spec/fixtures/harness/completion_regressions.json.sha256 +1 -0
- data/spec/integration/harness_evaluation_spec.rb +13 -0
- data/spec/lib/pwn/ai/agent/learning_spec.rb +22 -0
- data/spec/lib/pwn/ai/agent/policy_evaluation_spec.rb +6 -1
- data/spec/lib/pwn/ai/agent/reward_spec.rb +21 -0
- data/spec/support/harness/evaluate.rb +1 -1
- data/third_party/pwn_rdoc.jsonl +2 -1
- metadata +8 -5
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# `~/.pwn/` - Persistence Map
|
|
2
2
|
|
|
3
|
-
|
|
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
|

|
|
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
|
-
|
|
|
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
|
|
58
|
-
the Ruby interpreter
|
|
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
|
|
data/documentation/Plugins.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# `PWN::Plugins` - All
|
|
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.
|
|
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
|
|
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 (
|
|
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 #
|
|
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]
|
data/documentation/Reporting.md
CHANGED
|
@@ -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
|
-
|
|
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: './
|
|
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)
|
data/documentation/SAST.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# `PWN::SAST` - Static Application Security Testing
|
|
2
2
|
|
|
3
|
-
48 modules in `PWN::SAST
|
|
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
|

|
|
@@ -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
|
|
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
|
-
|
|
18
|
-
PWN::
|
|
19
|
-
|
|
20
|
-
|
|
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` (
|
|
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
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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::*`** |
|
|
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(
|
|
61
|
-
PWN::SDR::GQRX.
|
|
62
|
-
|
|
63
|
-
snap = PWN::SDR::GQRX.get_spectrum_snapshot(gqrx_sock: g)
|
|
64
|
-
PWN::SDR::FrequencyAllocation.
|
|
65
|
-
|
|
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
|
-
##
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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.
|
|
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.
|
|
21
|
-
|
|
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 -->
|
|
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
|
-
|
|
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
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 |
|
|
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
|
|
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
|
|
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)
|
data/documentation/Sessions.md
CHANGED
|
@@ -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.
|
|
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
|

|
|
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.
|
|
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
|
-
|
|
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:
|
data/documentation/Swarm.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
103
|
+
## Agent stops before verified completion
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
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::*` | **
|
|
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
|
-
| `PWN::FFI::*` | **
|
|
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
|
|
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
|
data/documentation/Why-PWN.md
CHANGED
|
@@ -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 |
|
|
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
|