pwn 0.5.620 → 0.5.621

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/documentation/Agent-Tool-Registry.md +2 -2
  4. data/documentation/Cron.md +13 -0
  5. data/documentation/Diagrams.md +1 -1
  6. data/documentation/Extrospection.md +71 -5
  7. data/documentation/Home.md +2 -2
  8. data/documentation/How-PWN-Works.md +1 -1
  9. data/documentation/Mistakes.md +2 -1
  10. data/documentation/Persistence.md +2 -1
  11. data/documentation/Skills-Memory-Learning.md +1 -0
  12. data/documentation/Transparent-Browser.md +18 -1
  13. data/documentation/diagrams/agent-tool-registry.svg +55 -54
  14. data/documentation/diagrams/ai-integration-tool-calling.svg +24 -24
  15. data/documentation/diagrams/aws-cloud-security.svg +25 -25
  16. data/documentation/diagrams/burp-vs-zap-preference.svg +12 -12
  17. data/documentation/diagrams/code-scanning-sast.svg +25 -25
  18. data/documentation/diagrams/cron-scheduling.svg +23 -23
  19. data/documentation/diagrams/dot/agent-tool-registry.dot +2 -2
  20. data/documentation/diagrams/dot/extrospection-world-awareness.dot +29 -8
  21. data/documentation/diagrams/dot/memory-skills-detailed.dot +4 -0
  22. data/documentation/diagrams/dot/overall-pwn-architecture.dot +2 -2
  23. data/documentation/diagrams/dot/persistence-filesystem.dot +2 -1
  24. data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +10 -4
  25. data/documentation/diagrams/driver-framework.svg +13 -13
  26. data/documentation/diagrams/extrospection-world-awareness.svg +229 -99
  27. data/documentation/diagrams/fuzzing-workflow.svg +24 -24
  28. data/documentation/diagrams/hardware-hacking.svg +18 -18
  29. data/documentation/diagrams/history-to-drivers.svg +18 -18
  30. data/documentation/diagrams/memory-skills-detailed.svg +124 -101
  31. data/documentation/diagrams/mistakes-negative-feedback.svg +55 -55
  32. data/documentation/diagrams/network-infra-testing.svg +27 -27
  33. data/documentation/diagrams/overall-pwn-architecture.svg +85 -85
  34. data/documentation/diagrams/penetration-testing-workflow.svg +30 -30
  35. data/documentation/diagrams/persistence-filesystem.svg +94 -85
  36. data/documentation/diagrams/plugin-ecosystem.svg +35 -35
  37. data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +226 -180
  38. data/documentation/diagrams/pwn-repl-prototyping.svg +20 -20
  39. data/documentation/diagrams/reporting-pipeline.svg +18 -18
  40. data/documentation/diagrams/reverse-engineering-flow.svg +21 -21
  41. data/documentation/diagrams/sdr-radio-flow.svg +31 -31
  42. data/documentation/diagrams/sessions-cron-automation.svg +18 -18
  43. data/documentation/diagrams/swarm-multi-agent.svg +39 -39
  44. data/documentation/diagrams/web-application-testing.svg +26 -26
  45. data/documentation/diagrams/zero-day-research-flow.svg +25 -25
  46. data/documentation/pwn-ai-Agent.md +1 -1
  47. data/lib/pwn/ai/agent/extrospection.rb +433 -4
  48. data/lib/pwn/ai/agent/tools/extrospection.rb +88 -3
  49. data/lib/pwn/sdr/decoder/adsb.rb +14 -33
  50. data/lib/pwn/sdr/decoder/apt.rb +97 -36
  51. data/lib/pwn/sdr/decoder/base.rb +258 -171
  52. data/lib/pwn/sdr/decoder/bluetooth.rb +13 -20
  53. data/lib/pwn/sdr/decoder/dect.rb +13 -27
  54. data/lib/pwn/sdr/decoder/dsp.rb +396 -0
  55. data/lib/pwn/sdr/decoder/flex.rb +177 -210
  56. data/lib/pwn/sdr/decoder/gps.rb +12 -21
  57. data/lib/pwn/sdr/decoder/gsm.rb +21 -73
  58. data/lib/pwn/sdr/decoder/iridium.rb +11 -26
  59. data/lib/pwn/sdr/decoder/lora.rb +16 -23
  60. data/lib/pwn/sdr/decoder/lte.rb +11 -32
  61. data/lib/pwn/sdr/decoder/morse.rb +95 -21
  62. data/lib/pwn/sdr/decoder/p25.rb +19 -16
  63. data/lib/pwn/sdr/decoder/pager.rb +22 -38
  64. data/lib/pwn/sdr/decoder/pocsag.rb +175 -68
  65. data/lib/pwn/sdr/decoder/rfid.rb +24 -33
  66. data/lib/pwn/sdr/decoder/rtl433.rb +21 -30
  67. data/lib/pwn/sdr/decoder/rtty.rb +100 -27
  68. data/lib/pwn/sdr/decoder/wifi.rb +21 -42
  69. data/lib/pwn/sdr/decoder/zigbee.rb +18 -40
  70. data/lib/pwn/sdr/decoder.rb +8 -0
  71. data/lib/pwn/version.rb +1 -1
  72. data/spec/lib/pwn/sdr/decoder/dsp_spec.rb +15 -0
  73. data/third_party/pwn_rdoc.jsonl +24 -3
  74. metadata +3 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7b52a560de426b6b9c99fa2716b8e93a948e66088e0e1ae78d28f8633417cea
4
- data.tar.gz: f94969b76a9ad4b856a9b5db25647f41d57f600f0c331ebde29c24b35ab59cd1
3
+ metadata.gz: '0708b22c22f49ec48a8263fe296b3dea6055d87259fe6bd6f63b484049432d6a'
4
+ data.tar.gz: 7b0dd573b0e169afd93e8ae228a40d02b4331fcf989a78df884cfdd5649fac8a
5
5
  SHA512:
6
- metadata.gz: dcd6287345b8f7230aeeeddc8a5d8de97d4000ae6bddecd77b4b2957f8ddf480de5c9ba8ba6a96a9fcf77f64a30f0b3d9a41219ad15512deab556c5b7e60c360
7
- data.tar.gz: 92b3f2b90679984a47ed9cff3e1440100803e4220fc6f78eac386bd5cd125f24acbdd7b44504c20f783ba653895726495a69b7ce5d9cd5fd883a98cb67a11ef9
6
+ metadata.gz: 840dd2114e03a96ecc79fad15d9204f18d1ce5f444561fe230d0da5ca3e6a35f4d93a41c6c69cf3d87b37edf46e5bbd64ca0cbe4440b1a3ef9a268b5f918b39b
7
+ data.tar.gz: 0a18d690d4bc222a319500c7301c20f8a9629111e11498489ddf7516b6c2afe5ab6d6daf20354bea580688ad58bd7b85708f699cfe9c399dc8f1d23f65391bb1
data/README.md CHANGED
@@ -52,7 +52,7 @@ Five layers, edges only ever go down:
52
52
 
53
53
  The AI layer closes a **self-improvement loop** on every turn — Metrics +
54
54
  Learning + **Mistakes** (introspection / negative feedback) joined with
55
- Snapshot + Drift + Intel + RF (extrospection) via `extro_correlate`, so the
55
+ Snapshot + Drift + Intel + RF + **Web** (extrospection) — plus browser-backed **`extro_verify`** self fact-checking — via `extro_correlate`, so the
56
56
  agent knows whether a failure was *its* fault or *the world* changed —
57
57
  **and does not repeat the same mistake twice**:
58
58
 
@@ -6,7 +6,7 @@ toolsets; the JSON-Schema for each tool is what the model actually sees.
6
6
 
7
7
  ![Tool registry](diagrams/agent-tool-registry.svg)
8
8
 
9
- ## Toolsets → Tools (10 toolsets · 52 tools)
9
+ ## Toolsets → Tools (10 toolsets · 54 tools)
10
10
 
11
11
  | Toolset | Tools | Backed by |
12
12
  |---|---|---|
@@ -17,7 +17,7 @@ toolsets; the JSON-Schema for each tool is what the model actually sees.
17
17
  | `sessions` | `sessions_list` · `sessions_view` · `sessions_current` · `sessions_delete` · `sessions_stats` | `PWN::Sessions` → `~/.pwn/sessions/` |
18
18
  | `learning` | `learning_note_outcome` · `learning_reflect` · `learning_distill_skill` · `learning_stats` · `learning_outcomes` · `learning_consolidate` · `learning_reset` · `learning_auto_reflect_toggle` · **`mistakes_list`** · **`mistakes_record`** · **`mistakes_resolve`** · **`mistakes_reset`** | `PWN::AI::Agent::Learning` + `PWN::AI::Agent::Mistakes` → `~/.pwn/learning.jsonl` + `~/.pwn/mistakes.json` |
19
19
  | `metrics` | `metrics_summary` · `metrics_reset` | `PWN::AI::Agent::Metrics` → `~/.pwn/metrics.json` |
20
- | `extrospection` | `extro_snapshot` · `extro_drift` · `extro_observe` · `extro_observations` · `extro_intel` · `extro_correlate` · `extro_stats` · `extro_reset` · `extro_auto_toggle` | `PWN::AI::Agent::Extrospection` → `~/.pwn/extrospection.json` |
20
+ | `extrospection` | `extro_snapshot` · `extro_drift` · `extro_observe` · `extro_observations` · `extro_intel` · **`extro_watch`** · **`extro_verify`** · `extro_correlate` · `extro_stats` · `extro_reset` · `extro_auto_toggle` | `PWN::AI::Agent::Extrospection` (+ `PWN::Plugins::TransparentBrowser`) → `~/.pwn/extrospection.json` |
21
21
  | `cron` | `cron_list` · `cron_create` · `cron_run` · `cron_enable` · `cron_disable` · `cron_remove` | `PWN::Cron` → `~/.pwn/cron/jobs.yml` |
22
22
  | `swarm` | `agent_list` · `agent_spawn` · `agent_ask` · `agent_debate` · `agent_broadcast` · `swarm_bus` · `swarm_list` | `PWN::AI::Agent::Swarm` → `~/.pwn/agents.yml` + `~/.pwn/swarm/` |
23
23
 
@@ -41,6 +41,19 @@ At 02:00 the system cron fires `PWN::Cron.run`, which spins up a headless
41
41
  also updates Learning/Metrics/Extrospection — so tomorrow's interactive
42
42
  session already knows what changed overnight.
43
43
 
44
+ ```ruby
45
+ cron_create(
46
+ name: 'memory_revalidate',
47
+ schedule: '0 4 * * 0',
48
+ ruby: 'PWN::AI::Agent::Extrospection.revalidate_memory'
49
+ )
50
+ ```
51
+
52
+ Weekly, headless-browser fact-check of every `PWN::Memory` `:fact` containing
53
+ a CVE / version string / URL. Refuted entries get prefixed `[UNVERIFIED
54
+ yyyy-mm-dd]` so the injected MEMORY block stops calcifying into
55
+ confidently-wrong priors — see [Extrospection § revalidate_memory](Extrospection.md).
56
+
44
57
  **See also:** [Sessions](Sessions.md) · [Extrospection](Extrospection.md) ·
45
58
  [CLI Drivers](CLI-Drivers.md)
46
59
 
@@ -59,7 +59,7 @@ groups) so lines never criss-cross.
59
59
  [source](diagrams/dot/ai-integration-tool-calling.dot) · doc: [AI Integration](AI-Integration.md)
60
60
  ![ai-integration-tool-calling](diagrams/ai-integration-tool-calling.svg)
61
61
 
62
- ### Agent Tool Registry (10 toolsets · 52 tools)
62
+ ### Agent Tool Registry (10 toolsets · 54 tools)
63
63
  [source](diagrams/dot/agent-tool-registry.dot) · doc: [Agent Tool Registry](Agent-Tool-Registry.md)
64
64
  ![agent-tool-registry](diagrams/agent-tool-registry.svg)
65
65
 
@@ -17,22 +17,31 @@ like right now, and has it changed under me?"*
17
17
  | `:repo` | `probe_repo` | HEAD · branch · dirty · origin |
18
18
  | `:env` | `probe_env` | ruby / gem / bundler / PWN version |
19
19
  | **`:rf`** | **`probe_rf`** | **RTL-SDR / HackRF presence · SoapySDR devices · GQRX socket (127.0.0.1:7356) · Flipper serial · `/dev/tty{USB,ACM}*` · band-plan count** |
20
+ | **`:web`** *(opt-in)* | **`probe_web`** | **Renders `web_anchors` via `PWN::Plugins::TransparentBrowser` (`:headless`) — HTTP status · final URL · `<title>` · meta[generator] · `Server` · SHA-256 of *rendered* DOM text · TLS cert fp / notAfter · optional screenshot → `~/.pwn/extrospection/web/<host>.png`** |
20
21
 
21
22
  `RF_BINS = %w[rtl_sdr rtl_test rtl_433 hackrf_info gqrx dump1090 multimon-ng SoapySDRUtil]`
22
23
  — these are also merged into `PROBE_BINS` so RF-toolchain drift shows up under
23
24
  `toolchain.*` diff keys.
24
25
 
26
+ `DEFAULT_WEB_ANCHORS` = NVD CVE 2.0 API, Exploit-DB, upstream `pwn/version.rb`.
27
+ Override / extend via `PWN::Env[:ai][:agent][:extrospection][:web][:anchors]`; set
28
+ `allow_targets: true` to also fingerprint `PWN::Env[:targets]`. **`:web` is never
29
+ run by `auto_extrospect`** — a headless browser is ~1–3 s cold vs ~50 ms for
30
+ `probe_host`, so it's opt-in (`extro_snapshot(sections: %i[web])`).
31
+
25
32
  ## Verbs
26
33
 
27
34
  | Tool | Does | Persists to |
28
35
  |---|---|---|
29
- | `extro_snapshot` | Fingerprint host/net/toolchain/repo/env/**rf** → hash | `extrospection.json` (`snapshot` + rotates `previous`) |
36
+ | `extro_snapshot` | Fingerprint host/net/toolchain/repo/env/**rf**/*web* → hash | `extrospection.json` (`snapshot` + rotates `previous`) |
30
37
  | `extro_drift` | Diff live-vs-stored (or stored-vs-previous) | — returns `{changed, added, removed}` with dotted keys |
31
- | `extro_observe` | Record a fact — `category:` one of `recon vuln intel target network env` **`rf`** `misc` | `observations[]` |
38
+ | `extro_observe` | Record a fact — `category:` one of `recon vuln intel target network env` **`rf` `web`** `misc` | `observations[]` |
32
39
  | `extro_observations` | Query recorded facts by source/category/target/tag | — |
33
40
  | `extro_intel` | Query NVD / CIRCL / Exploit-DB for keyword or CVE | optional `record: true` → `:intel` observations |
41
+ | **`extro_watch`** | **Render a URL headless, hash the *rendered* DOM, screenshot, diff vs prior** | `observations[]` (`category: :web`) |
42
+ | **`extro_verify`** | **Browser-backed self fact-check of a claim (`:cve` `:version` `:doc` `:generic`) → `:confirmed`/`:refuted`/`:unknown`** | `Mistakes.record` / `observe(:intel)` / `Learning.note_outcome` |
34
43
  | `extro_correlate` | **Join** introspection ↔ extrospection | — actionable findings |
35
- | `extro_stats` | snapshot age · observation count · drift counts · **rf_devices** | — |
44
+ | `extro_stats` | snapshot age · observation count · drift counts · **rf_devices** · **web_anchors** | — |
36
45
  | `extro_reset` | Wipe snapshot + observations (new engagement) | — |
37
46
  | `extro_auto_toggle` | Enable/disable auto-snapshot after every final answer | `PWN::Env[:ai][:agent][:auto_extrospect]` |
38
47
 
@@ -43,6 +52,9 @@ like right now, and has it changed under me?"*
43
52
  (b) Learning failures on day X × host/net/repo drift on day X
44
53
  (c) recorded :intel observations × installed component versions
45
54
  (d) recorded :rf observations × missing SDR hardware / RF_BINS
55
+ (e) recorded :web DOM drift on target × Learning failures citing that host
56
+ (f) extro_verify :refuted claims × stale PWN::Memory :fact entries
57
+ (g) :intel obs whose feed anchor is × probe_web-unreachable → downgrade weight
46
58
  ```
47
59
 
48
60
  Output tells the agent whether a failure was **its own fault** ("I called the
@@ -51,23 +63,77 @@ API wrong" → belongs in [Mistakes](Mistakes.md)) or **the world changed**
51
63
  that distinction is written back into MEMORY so the next run doesn't waste
52
64
  iterations rediscovering it.
53
65
 
66
+ ## `extro_verify` — proactive fact-checking (the browser as a sense organ)
67
+
68
+ `probe_rf` gave Extrospection **ears**; `PWN::Plugins::TransparentBrowser` gives
69
+ it **eyes**. `extro_verify(claim:)` renders a canonical source *with JavaScript
70
+ executed* and returns a verdict:
71
+
72
+ | `kind:` | Canonical source (rendered headless) | Verdict logic |
73
+ |---|---|---|
74
+ | `:cve` | `nvd.nist.gov/vuln/detail/<id>` + `cve.org/CVERecord?id=` | CVE exists? affected-product string overlaps claimed product/version? |
75
+ | `:version` | rubygems.org / PyPI / GitHub search | claimed "latest is X" vs scraped latest |
76
+ | `:doc` | the URL the model cited | 200? title/body contains ≥ 40 % of the quoted-snippet tokens (fuzzy)? |
77
+ | `:generic` | DuckDuckGo HTML (proxy-able, no API key) | ≥ 50 % token overlap in top result snippets |
78
+
79
+ ```text
80
+ ┌── :refuted → Mistakes.record(tool:'assumption', …) → KNOWN MISTAKES block ∀ future runs
81
+ extro_verify ─────┼── :confirmed→ observe(category::intel, ttl:30d) → EXTROSPECTION block, freshness-bound
82
+ └── :unknown → Learning.note_outcome(tags:[needs_human])
83
+ ```
84
+
85
+ This adds a **proactive** trigger to the negative-feedback loop: today
86
+ `Mistakes.record` fires only *reactively* (a tool blew up, or a human said
87
+ "that's wrong"). `extro_verify` lets the agent catch itself being wrong about
88
+ the world **before** a human does. `commit: false` returns the verdict without
89
+ side-effects.
90
+
91
+ ### `revalidate_memory` — the browser as GC for `PWN::Memory`
92
+
93
+ `learning_consolidate` only dedupes/truncates; it never asks *"is this still
94
+ true?"*. `PWN::AI::Agent::Extrospection.revalidate_memory` walks every
95
+ `PWN::Memory` `:fact` containing a CVE / version string / URL, runs `verify()`
96
+ on it, and prefixes stale ones with `[UNVERIFIED yyyy-mm-dd]` so the injected
97
+ MEMORY block stops calcifying into confidently-wrong priors. Schedule it:
98
+
99
+ ```ruby
100
+ cron_create(name: 'memory_revalidate', schedule: '0 4 * * 0',
101
+ ruby: 'PWN::AI::Agent::Extrospection.revalidate_memory')
102
+ ```
103
+
104
+ ### Configuration
105
+
106
+ ```ruby
107
+ PWN::Env[:ai][:agent][:extrospection][:web] = {
108
+ anchors: ['https://target.acme/api/version', …], # else DEFAULT_WEB_ANCHORS
109
+ proxy: 'tor', # or 'http://127.0.0.1:8080' (Burp) — honoured by verify/watch/probe_web
110
+ max_anchors: 8,
111
+ per_page_timeout: 15,
112
+ screenshot: false, # → ~/.pwn/extrospection/web/<host>.png
113
+ allow_targets: false # OPSEC: also fingerprint PWN::Env[:targets] (active recon!)
114
+ }
115
+ ```
116
+
117
+
54
118
  ## Typical engagement flow
55
119
 
56
120
  ```ruby
57
121
  extro_reset(confirm: true) # clean slate for new scope
58
- extro_snapshot # baseline (all six sections)
122
+ extro_snapshot # baseline (six local sections; add sections:%i[web] for anchors)
59
123
  # … recon …
60
124
  extro_observe(source: 'nmap', target: '10.0.0.5',
61
125
  category: 'recon', data: 'OpenSSH 8.2p1 Ubuntu')
62
126
  extro_observe(source: 'gqrx', target: '433.920MHz',
63
127
  category: 'rf', data: 'peak -34.2 dBFS bw=200k FSK — likely garage remote')
64
128
  extro_intel(query: 'OpenSSH 8.2p1', record: true)
129
+ extro_watch(url: 'https://target.acme/api/version') # DOM-hash + screenshot; changed:true on next run
130
+ extro_verify(claim: 'CVE-2026-12345 affects OpenSSL 3.2.1') # → Mistakes/Memory/observe on verdict
65
131
  # … days later, something breaks …
66
132
  extro_drift # what moved?
67
133
  extro_correlate # why did it break?
68
134
  ```
69
135
 
70
136
  **See also:** [Skills, Memory & Learning](Skills-Memory-Learning.md) ·
71
- [Mistakes](Mistakes.md) · [SDR](SDR.md) · [pwn-ai Agent](pwn-ai-Agent.md)
137
+ [Mistakes](Mistakes.md) · [SDR](SDR.md) · [Transparent Browser](Transparent-Browser.md) · [Cron](Cron.md) · [pwn-ai Agent](pwn-ai-Agent.md)
72
138
 
73
139
  [← Home](Home.md)
@@ -36,10 +36,10 @@
36
36
  | | |
37
37
  |---|---|
38
38
  | [AI / LLM Integration](AI-Integration.md) | OpenAI · Anthropic · Grok (OAuth) · Gemini · Ollama |
39
- | [Agent Tool Registry](Agent-Tool-Registry.md) | 10 toolsets · 52 LLM-callable tools |
39
+ | [Agent Tool Registry](Agent-Tool-Registry.md) | 10 toolsets · 54 LLM-callable tools |
40
40
  | [Memory · Skills · Learning](Skills-Memory-Learning.md) | Introspection — the self-improvement loop |
41
41
  | [Mistakes](Mistakes.md) | **Negative feedback** — fingerprint failures · do-NOT-repeat · `[REPEATING]`/`[REGRESSED]` · inline self-correction |
42
- | [Extrospection](Extrospection.md) | World-awareness — snapshot · drift · intel · correlate · **rf** |
42
+ | [Extrospection](Extrospection.md) | World-awareness — snapshot · drift · intel · **watch** · **verify** · correlate · **rf** · **web** |
43
43
  | [Swarm (Multi-Agent)](Swarm.md) | Personas · ask · debate · broadcast · shared bus |
44
44
  | [Sessions](Sessions.md) | Transcript persistence + reflection |
45
45
  | [Cron](Cron.md) | Scheduled autonomous jobs |
@@ -27,7 +27,7 @@ hardware).
27
27
  | Module | Role |
28
28
  |---|---|
29
29
  | `Loop` | plan → dispatch tool_calls → observe → repeat until final answer |
30
- | `Registry` | JSON-Schema function definitions grouped into 10 **toolsets** · 52 tools |
30
+ | `Registry` | JSON-Schema function definitions grouped into 10 **toolsets** · 54 tools |
31
31
  | `Dispatch` / `Result` | execute a tool, capture stdout/value/error/duration |
32
32
  | `PromptBuilder` | inject MEMORY / SKILLS / LEARNING / **KNOWN MISTAKES + FIXES** / METRICS / EXTROSPECTION blocks |
33
33
  | `Metrics` · `Learning` | **introspection** — how well am I doing? |
@@ -42,7 +42,7 @@ PromptBuilder <-------------------- Mistakes.to_context (KNOWN MISTAKES + KN
42
42
  model --(tool call)---------------> mistakes_record / mistakes_resolve
43
43
  ```
44
44
 
45
- ## Four ingest paths — nothing slips through
45
+ ## Five ingest paths — nothing slips through
46
46
 
47
47
  | Source | Trigger | What is recorded |
48
48
  |---|---|---|
@@ -50,6 +50,7 @@ model --(tool call)---------------> mistakes_record / mistakes_resolve
50
50
  | `:loop` | iteration budget exhausted with no final answer | *automatic* — `Loop.run` epilogue |
51
51
  | `:user_correction` | next user message matches `CORRECTION_RX` (*"no that's wrong"*, *"still broken"*, *"try again"*, …) | `check_user_correction` — also flips the previous `Learning` outcome to `success:false` |
52
52
  | `:model` | the model itself calls `mistakes_record` | wrong assumption, wrong file, hallucinated API — failures that are **not** dispatch errors |
53
+ | **`:model` (proactive)** | **`extro_verify(claim:)` returns `:refuted`** | **`Mistakes.record(tool:'assumption', error:'REFUTED …: <claim>')` — the browser caught the model being wrong about the world *before* a human did** |
53
54
 
54
55
  ## Tools
55
56
 
@@ -12,7 +12,8 @@ Every byte PWN remembers between processes lives here.
12
12
  | `learning.jsonl` | `PWN::AI::Agent::Learning` | JSON-per-line | `learning_reset` | task outcome log → success_rate |
13
13
  | **`mistakes.json`** | **`PWN::AI::Agent::Mistakes`** | **JSON `{sig → entry}`** | **`mistakes_reset`** | **failure fingerprints · cross-session count · fix · `[REPEATING]` · `[REGRESSED]`** |
14
14
  | `metrics.json` | `PWN::AI::Agent::Metrics` | JSON | `metrics_reset` | per-tool calls · success · avg_duration · last_error |
15
- | `extrospection.json` | `PWN::AI::Agent::Extrospection` | JSON | `extro_reset` | host/net/toolchain/repo/env/**rf** snapshot + previous baseline + observations[] |
15
+ | `extrospection.json` | `PWN::AI::Agent::Extrospection` | JSON | `extro_reset` | host/net/toolchain/repo/env/**rf**/**web** snapshot + previous baseline + observations[] |
16
+ | `extrospection/web/*.png` | `PWN::AI::Agent::Extrospection` | PNG | `rm -rf` | headless-browser screenshots from `probe_web` / `extro_watch` (opt-in) |
16
17
  | `sessions/*.jsonl` | `PWN::Sessions` | JSON-per-line | `sessions_delete` | full transcript per pwn-ai run |
17
18
  | `cron/jobs.yml` | `PWN::Cron` | YAML | `cron_remove` | scheduled prompt/ruby/script jobs |
18
19
  | `cron/log/*.log` | `PWN::Cron` | text | rm | last_run output |
@@ -61,6 +61,7 @@ the `## References` section, deduplicates, and exposes them via
61
61
  | Tool | When |
62
62
  |---|---|
63
63
  | `learning_consolidate(max_entries: 200)` | MEMORY block getting long/noisy |
64
+ | `PWN::AI::Agent::Extrospection.revalidate_memory` *(cron)* | MEMORY `:fact` entries getting **stale** — browser-verifies every one containing a CVE/version/URL and prefixes refuted ones `[UNVERIFIED yyyy-mm-dd]` |
64
65
  | `learning_reset(confirm: true)` | dev-experiment noise polluted success_rate |
65
66
  | `mistakes_reset(confirm: true)` | new host/engagement — prior failure patterns no longer apply |
66
67
  | `metrics_reset(confirm: true)` | fixed a broken tool; stale 0 % is misleading |
@@ -33,4 +33,21 @@ PWN::Plugins::TransparentBrowser.close(browser_obj: b)
33
33
  `browser_type: :rest` returns a `RestClient`-backed object with the same proxy
34
34
  plumbing — for APIs where a full browser is overkill.
35
35
 
36
- [← Home](Home.md) · [BurpSuite](BurpSuite.md) · [WWW](WWW.md)
36
+ ## Agent integration Extrospection's eyes
37
+
38
+ `PWN::AI::Agent::Extrospection` drives this plugin (`:headless`, `:rest`
39
+ fallback) as its **web sense organ** — the counterpart to `probe_rf`'s ears:
40
+
41
+ | Agent tool | Uses TransparentBrowser to… |
42
+ |---|---|
43
+ | `extro_snapshot(sections: %i[web])` → `probe_web` | Fingerprint config-declared `web_anchors`: status · title · meta[generator] · SHA-256 of *rendered* DOM text · TLS cert fp/notAfter · optional screenshot |
44
+ | `extro_watch(url:, selector:)` | Passive change-detection on a target page — re-hash the rendered DOM and diff vs the prior `:web` observation |
45
+ | `extro_verify(claim:, kind:)` | **Proactive self fact-check** — render NVD/CVE.org, rubygems/PyPI, a cited URL, or DuckDuckGo HTML and return `:confirmed` / `:refuted` / `:unknown`. `:refuted` → `Mistakes.record(tool:'assumption', …)` |
46
+ | `revalidate_memory` (cron) | Garbage-collect stale `PWN::Memory` `:fact` entries by re-`verify()`ing every one containing a CVE / version / URL |
47
+
48
+ All four honour `proxy:` (Burp / `tor`) so attribution stays controlled, reuse
49
+ **one** browser handle across anchors, and `close` in an `ensure`. See
50
+ [Extrospection](Extrospection.md) for the full loop.
51
+
52
+
53
+ [← Home](Home.md) · [BurpSuite](BurpSuite.md) · [WWW](WWW.md) · [Extrospection](Extrospection.md)
@@ -4,36 +4,36 @@
4
4
  <!-- Generated by graphviz version 14.1.2 (0)
5
5
  -->
6
6
  <!-- Title: PWN_Agent_Tool_Registry Pages: 1 -->
7
- <svg width="652pt" height="805pt"
8
- viewBox="0.00 0.00 652.00 805.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
- <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 762.2)">
7
+ <svg width="652pt" height="815pt"
8
+ viewBox="0.00 0.00 652.00 815.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
+ <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(43.2 772.2)">
10
10
  <title>PWN_Agent_Tool_Registry</title>
11
- <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-762.2 608.45,-762.2 608.45,43.2 -43.2,43.2"/>
12
- <text xml:space="preserve" text-anchor="start" x="10.38" y="-697" font-family="sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::Registry — Toolsets exposed to the LLM</text>
13
- <text xml:space="preserve" text-anchor="start" x="155.5" y="-685.55" font-family="sans-Serif" font-size="11.00" fill="#94a3b8">10 toolsets · 52 callable tools · lib/pwn/ai/agent/tools/*</text>
11
+ <polygon fill="#0f172a" stroke="none" points="-43.2,43.2 -43.2,-772.2 608.45,-772.2 608.45,43.2 -43.2,43.2"/>
12
+ <text xml:space="preserve" text-anchor="start" x="10.38" y="-707" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="20.00" fill="#e2e8f0">PWN::AI::Agent::Registry — Toolsets exposed to the LLM</text>
13
+ <text xml:space="preserve" text-anchor="start" x="155.5" y="-695.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#94a3b8">10 toolsets · 54 callable tools · lib/pwn/ai/agent/tools/*</text>
14
14
  <g id="clust1" class="cluster">
15
15
  <title>cluster_ts</title>
16
16
  <path fill="#022c22" stroke="#047857" stroke-width="2" d="M201.25,-14C201.25,-14 267.75,-14 267.75,-14 273.75,-14 279.75,-20 279.75,-26 279.75,-26 279.75,-634 279.75,-634 279.75,-640 273.75,-646 267.75,-646 267.75,-646 201.25,-646 201.25,-646 195.25,-646 189.25,-640 189.25,-634 189.25,-634 189.25,-26 189.25,-26 189.25,-20 195.25,-14 201.25,-14"/>
17
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-623" font-family="sans-Serif" font-size="20.00" fill="#a7f3d0">Toolsets</text>
17
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-623" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#a7f3d0">Toolsets</text>
18
18
  </g>
19
19
  <g id="clust2" class="cluster">
20
20
  <title>cluster_tools</title>
21
- <path fill="#422006" stroke="#a16207" stroke-width="2" d="M376.75,-8C376.75,-8 553.25,-8 553.25,-8 559.25,-8 565.25,-14 565.25,-20 565.25,-20 565.25,-660 565.25,-660 565.25,-666 559.25,-672 553.25,-672 553.25,-672 376.75,-672 376.75,-672 370.75,-672 364.75,-666 364.75,-660 364.75,-660 364.75,-20 364.75,-20 364.75,-14 370.75,-8 376.75,-8"/>
22
- <text xml:space="preserve" text-anchor="middle" x="465" y="-649" font-family="sans-Serif" font-size="20.00" fill="#fde68a">Tools &#160;(LLM&#45;callable)</text>
21
+ <path fill="#422006" stroke="#a16207" stroke-width="2" d="M376.75,-8C376.75,-8 553.25,-8 553.25,-8 559.25,-8 565.25,-14 565.25,-20 565.25,-20 565.25,-670 565.25,-670 565.25,-676 559.25,-682 553.25,-682 553.25,-682 376.75,-682 376.75,-682 370.75,-682 364.75,-676 364.75,-670 364.75,-670 364.75,-20 364.75,-20 364.75,-14 370.75,-8 376.75,-8"/>
22
+ <text xml:space="preserve" text-anchor="middle" x="465" y="-659" font-family="Helvetica,sans-Serif" font-size="20.00" fill="#fde68a">Tools &#160;(LLM&#45;callable)</text>
23
23
  </g>
24
24
  <!-- Registry -->
25
25
  <g id="node1" class="node">
26
26
  <title>Registry</title>
27
27
  <path fill="#c4b5fd" stroke="#334155" stroke-width="2" d="M84.25,-339.38C84.25,-339.38 12,-339.38 12,-339.38 6,-339.38 0,-333.38 0,-327.38 0,-327.38 0,-300.62 0,-300.62 0,-294.62 6,-288.62 12,-288.62 12,-288.62 84.25,-288.62 84.25,-288.62 90.25,-288.62 96.25,-294.62 96.25,-300.62 96.25,-300.62 96.25,-327.38 96.25,-327.38 96.25,-333.38 90.25,-339.38 84.25,-339.38"/>
28
- <text xml:space="preserve" text-anchor="middle" x="48.12" y="-323.98" font-family="sans-Serif" font-size="12.00" fill="#0f172a">Registry</text>
29
- <text xml:space="preserve" text-anchor="middle" x="48.12" y="-309.73" font-family="sans-Serif" font-size="12.00" fill="#0f172a">JSON&#45;Schema</text>
30
- <text xml:space="preserve" text-anchor="middle" x="48.12" y="-295.48" font-family="sans-Serif" font-size="12.00" fill="#0f172a">function defs</text>
28
+ <text xml:space="preserve" text-anchor="middle" x="48.12" y="-323.98" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#0f172a">Registry</text>
29
+ <text xml:space="preserve" text-anchor="middle" x="48.12" y="-309.73" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#0f172a">JSON&#45;Schema</text>
30
+ <text xml:space="preserve" text-anchor="middle" x="48.12" y="-295.48" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#0f172a">function defs</text>
31
31
  </g>
32
32
  <!-- terminal -->
33
33
  <g id="node2" class="node">
34
34
  <title>terminal</title>
35
35
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-58C249.5,-58 219.5,-58 219.5,-58 213.5,-58 207.5,-52 207.5,-46 207.5,-46 207.5,-34 207.5,-34 207.5,-28 213.5,-22 219.5,-22 219.5,-22 249.5,-22 249.5,-22 255.5,-22 261.5,-28 261.5,-34 261.5,-34 261.5,-46 261.5,-46 261.5,-52 255.5,-58 249.5,-58"/>
36
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-36.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">terminal</text>
36
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-36.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">terminal</text>
37
37
  </g>
38
38
  <!-- Registry&#45;&gt;terminal -->
39
39
  <g id="edge1" class="edge">
@@ -45,7 +45,7 @@
45
45
  <g id="node3" class="node">
46
46
  <title>pwn</title>
47
47
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-119C249.5,-119 219.5,-119 219.5,-119 213.5,-119 207.5,-113 207.5,-107 207.5,-107 207.5,-95 207.5,-95 207.5,-89 213.5,-83 219.5,-83 219.5,-83 249.5,-83 249.5,-83 255.5,-83 261.5,-89 261.5,-95 261.5,-95 261.5,-107 261.5,-107 261.5,-113 255.5,-119 249.5,-119"/>
48
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-97.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">pwn</text>
48
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-97.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">pwn</text>
49
49
  </g>
50
50
  <!-- Registry&#45;&gt;pwn -->
51
51
  <g id="edge2" class="edge">
@@ -57,7 +57,7 @@
57
57
  <g id="node4" class="node">
58
58
  <title>memory</title>
59
59
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-180C249.5,-180 219.5,-180 219.5,-180 213.5,-180 207.5,-174 207.5,-168 207.5,-168 207.5,-156 207.5,-156 207.5,-150 213.5,-144 219.5,-144 219.5,-144 249.5,-144 249.5,-144 255.5,-144 261.5,-150 261.5,-156 261.5,-156 261.5,-168 261.5,-168 261.5,-174 255.5,-180 249.5,-180"/>
60
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-158.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">memory</text>
60
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-158.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">memory</text>
61
61
  </g>
62
62
  <!-- Registry&#45;&gt;memory -->
63
63
  <g id="edge3" class="edge">
@@ -69,7 +69,7 @@
69
69
  <g id="node5" class="node">
70
70
  <title>skills</title>
71
71
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-241C249.5,-241 219.5,-241 219.5,-241 213.5,-241 207.5,-235 207.5,-229 207.5,-229 207.5,-217 207.5,-217 207.5,-211 213.5,-205 219.5,-205 219.5,-205 249.5,-205 249.5,-205 255.5,-205 261.5,-211 261.5,-217 261.5,-217 261.5,-229 261.5,-229 261.5,-235 255.5,-241 249.5,-241"/>
72
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-219.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">skills</text>
72
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-219.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">skills</text>
73
73
  </g>
74
74
  <!-- Registry&#45;&gt;skills -->
75
75
  <g id="edge4" class="edge">
@@ -81,7 +81,7 @@
81
81
  <g id="node6" class="node">
82
82
  <title>sessions</title>
83
83
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M250,-302C250,-302 219,-302 219,-302 213,-302 207,-296 207,-290 207,-290 207,-278 207,-278 207,-272 213,-266 219,-266 219,-266 250,-266 250,-266 256,-266 262,-272 262,-278 262,-278 262,-290 262,-290 262,-296 256,-302 250,-302"/>
84
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-280.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">sessions</text>
84
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-280.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">sessions</text>
85
85
  </g>
86
86
  <!-- Registry&#45;&gt;sessions -->
87
87
  <g id="edge5" class="edge">
@@ -93,7 +93,7 @@
93
93
  <g id="node7" class="node">
94
94
  <title>learning</title>
95
95
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-363C249.5,-363 219.5,-363 219.5,-363 213.5,-363 207.5,-357 207.5,-351 207.5,-351 207.5,-339 207.5,-339 207.5,-333 213.5,-327 219.5,-327 219.5,-327 249.5,-327 249.5,-327 255.5,-327 261.5,-333 261.5,-339 261.5,-339 261.5,-351 261.5,-351 261.5,-357 255.5,-363 249.5,-363"/>
96
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-341.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">learning</text>
96
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-341.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">learning</text>
97
97
  </g>
98
98
  <!-- Registry&#45;&gt;learning -->
99
99
  <g id="edge6" class="edge">
@@ -105,7 +105,7 @@
105
105
  <g id="node8" class="node">
106
106
  <title>metrics</title>
107
107
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-424C249.5,-424 219.5,-424 219.5,-424 213.5,-424 207.5,-418 207.5,-412 207.5,-412 207.5,-400 207.5,-400 207.5,-394 213.5,-388 219.5,-388 219.5,-388 249.5,-388 249.5,-388 255.5,-388 261.5,-394 261.5,-400 261.5,-400 261.5,-412 261.5,-412 261.5,-418 255.5,-424 249.5,-424"/>
108
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-402.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">metrics</text>
108
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-402.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">metrics</text>
109
109
  </g>
110
110
  <!-- Registry&#45;&gt;metrics -->
111
111
  <g id="edge7" class="edge">
@@ -117,7 +117,7 @@
117
117
  <g id="node9" class="node">
118
118
  <title>extro</title>
119
119
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M259.75,-485C259.75,-485 209.25,-485 209.25,-485 203.25,-485 197.25,-479 197.25,-473 197.25,-473 197.25,-461 197.25,-461 197.25,-455 203.25,-449 209.25,-449 209.25,-449 259.75,-449 259.75,-449 265.75,-449 271.75,-455 271.75,-461 271.75,-461 271.75,-473 271.75,-473 271.75,-479 265.75,-485 259.75,-485"/>
120
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-463.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">extrospection</text>
120
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-463.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">extrospection</text>
121
121
  </g>
122
122
  <!-- Registry&#45;&gt;extro -->
123
123
  <g id="edge8" class="edge">
@@ -129,7 +129,7 @@
129
129
  <g id="node10" class="node">
130
130
  <title>cron</title>
131
131
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-546C249.5,-546 219.5,-546 219.5,-546 213.5,-546 207.5,-540 207.5,-534 207.5,-534 207.5,-522 207.5,-522 207.5,-516 213.5,-510 219.5,-510 219.5,-510 249.5,-510 249.5,-510 255.5,-510 261.5,-516 261.5,-522 261.5,-522 261.5,-534 261.5,-534 261.5,-540 255.5,-546 249.5,-546"/>
132
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-524.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">cron</text>
132
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-524.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">cron</text>
133
133
  </g>
134
134
  <!-- Registry&#45;&gt;cron -->
135
135
  <g id="edge9" class="edge">
@@ -141,7 +141,7 @@
141
141
  <g id="node11" class="node">
142
142
  <title>swarm</title>
143
143
  <path fill="#6ee7b7" stroke="#334155" stroke-width="1.3" d="M249.5,-607C249.5,-607 219.5,-607 219.5,-607 213.5,-607 207.5,-601 207.5,-595 207.5,-595 207.5,-583 207.5,-583 207.5,-577 213.5,-571 219.5,-571 219.5,-571 249.5,-571 249.5,-571 255.5,-571 261.5,-577 261.5,-583 261.5,-583 261.5,-595 261.5,-595 261.5,-601 255.5,-607 249.5,-607"/>
144
- <text xml:space="preserve" text-anchor="middle" x="234.5" y="-585.5" font-family="sans-Serif" font-size="10.00" fill="#0f172a">swarm</text>
144
+ <text xml:space="preserve" text-anchor="middle" x="234.5" y="-585.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0f172a">swarm</text>
145
145
  </g>
146
146
  <!-- Registry&#45;&gt;swarm -->
147
147
  <g id="edge10" class="edge">
@@ -153,7 +153,7 @@
153
153
  <g id="node12" class="node">
154
154
  <title>t_shell</title>
155
155
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M479.5,-52C479.5,-52 449.5,-52 449.5,-52 443.5,-52 437.5,-46 437.5,-40 437.5,-40 437.5,-28 437.5,-28 437.5,-22 443.5,-16 449.5,-16 449.5,-16 479.5,-16 479.5,-16 485.5,-16 491.5,-22 491.5,-28 491.5,-28 491.5,-40 491.5,-40 491.5,-46 485.5,-52 479.5,-52"/>
156
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-30.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">shell</text>
156
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-30.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">shell</text>
157
157
  </g>
158
158
  <!-- terminal&#45;&gt;t_shell -->
159
159
  <g id="edge11" class="edge">
@@ -165,7 +165,7 @@
165
165
  <g id="node13" class="node">
166
166
  <title>t_eval</title>
167
167
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M480.38,-113C480.38,-113 448.62,-113 448.62,-113 442.62,-113 436.62,-107 436.62,-101 436.62,-101 436.62,-89 436.62,-89 436.62,-83 442.62,-77 448.62,-77 448.62,-77 480.38,-77 480.38,-77 486.38,-77 492.38,-83 492.38,-89 492.38,-89 492.38,-101 492.38,-101 492.38,-107 486.38,-113 480.38,-113"/>
168
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-91.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">pwn_eval</text>
168
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-91.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">pwn_eval</text>
169
169
  </g>
170
170
  <!-- pwn&#45;&gt;t_eval -->
171
171
  <g id="edge12" class="edge">
@@ -177,8 +177,8 @@
177
177
  <g id="node14" class="node">
178
178
  <title>t_mem</title>
179
179
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M500.62,-174C500.62,-174 428.38,-174 428.38,-174 422.38,-174 416.38,-168 416.38,-162 416.38,-162 416.38,-150 416.38,-150 416.38,-144 422.38,-138 428.38,-138 428.38,-138 500.62,-138 500.62,-138 506.62,-138 512.62,-144 512.62,-150 512.62,-150 512.62,-162 512.62,-162 512.62,-168 506.62,-174 500.62,-174"/>
180
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-157.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">memory_remember</text>
181
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-147.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">recall · forget · clear</text>
180
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-157.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">memory_remember</text>
181
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-147.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">recall · forget · clear</text>
182
182
  </g>
183
183
  <!-- memory&#45;&gt;t_mem -->
184
184
  <g id="edge13" class="edge">
@@ -190,8 +190,8 @@
190
190
  <g id="node15" class="node">
191
191
  <title>t_skill</title>
192
192
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M522.75,-235C522.75,-235 406.25,-235 406.25,-235 400.25,-235 394.25,-229 394.25,-223 394.25,-223 394.25,-211 394.25,-211 394.25,-205 400.25,-199 406.25,-199 406.25,-199 522.75,-199 522.75,-199 528.75,-199 534.75,-205 534.75,-211 534.75,-211 534.75,-223 534.75,-223 534.75,-229 528.75,-235 522.75,-235"/>
193
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-218.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">skill_list · view</text>
194
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-208.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">create · add_reference · delete</text>
193
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-218.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">skill_list · view</text>
194
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-208.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">create · add_reference · delete</text>
195
195
  </g>
196
196
  <!-- skills&#45;&gt;t_skill -->
197
197
  <g id="edge14" class="edge">
@@ -203,8 +203,8 @@
203
203
  <g id="node16" class="node">
204
204
  <title>t_sess</title>
205
205
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M503.62,-296C503.62,-296 425.38,-296 425.38,-296 419.38,-296 413.38,-290 413.38,-284 413.38,-284 413.38,-272 413.38,-272 413.38,-266 419.38,-260 425.38,-260 425.38,-260 503.62,-260 503.62,-260 509.62,-260 515.62,-266 515.62,-272 515.62,-272 515.62,-284 515.62,-284 515.62,-290 509.62,-296 503.62,-296"/>
206
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-279.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">sessions_list · view</text>
207
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-269.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">current · delete · stats</text>
206
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-279.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">sessions_list · view</text>
207
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-269.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">current · delete · stats</text>
208
208
  </g>
209
209
  <!-- sessions&#45;&gt;t_sess -->
210
210
  <g id="edge15" class="edge">
@@ -216,11 +216,11 @@
216
216
  <g id="node17" class="node">
217
217
  <title>t_learn</title>
218
218
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M520.88,-381.25C520.88,-381.25 408.12,-381.25 408.12,-381.25 402.12,-381.25 396.12,-375.25 396.12,-369.25 396.12,-369.25 396.12,-332.75 396.12,-332.75 396.12,-326.75 402.12,-320.75 408.12,-320.75 408.12,-320.75 520.88,-320.75 520.88,-320.75 526.88,-320.75 532.88,-326.75 532.88,-332.75 532.88,-332.75 532.88,-369.25 532.88,-369.25 532.88,-375.25 526.88,-381.25 520.88,-381.25"/>
219
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-368.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">learning_note_outcome</text>
220
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-358.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">reflect · distill_skill</text>
221
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-347.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">consolidate · outcomes · reset</text>
222
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-337.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">mistakes_list · record</text>
223
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-326.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">mistakes_resolve · reset</text>
219
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-368.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">learning_note_outcome</text>
220
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-358.2" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">reflect · distill_skill</text>
221
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-347.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">consolidate · outcomes · reset</text>
222
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-337.2" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">mistakes_list · record</text>
223
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-326.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">mistakes_resolve · reset</text>
224
224
  </g>
225
225
  <!-- learning&#45;&gt;t_learn -->
226
226
  <g id="edge16" class="edge">
@@ -232,8 +232,8 @@
232
232
  <g id="node18" class="node">
233
233
  <title>t_metric</title>
234
234
  <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M496.5,-442C496.5,-442 432.5,-442 432.5,-442 426.5,-442 420.5,-436 420.5,-430 420.5,-430 420.5,-418 420.5,-418 420.5,-412 426.5,-406 432.5,-406 432.5,-406 496.5,-406 496.5,-406 502.5,-406 508.5,-412 508.5,-418 508.5,-418 508.5,-430 508.5,-430 508.5,-436 502.5,-442 496.5,-442"/>
235
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-425.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">metrics_summary</text>
236
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-415.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">metrics_reset</text>
235
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-425.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">metrics_summary</text>
236
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-415.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">metrics_reset</text>
237
237
  </g>
238
238
  <!-- metrics&#45;&gt;t_metric -->
239
239
  <g id="edge17" class="edge">
@@ -244,43 +244,44 @@
244
244
  <!-- t_extro -->
245
245
  <g id="node19" class="node">
246
246
  <title>t_extro</title>
247
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M513,-506.75C513,-506.75 416,-506.75 416,-506.75 410,-506.75 404,-500.75 404,-494.75 404,-494.75 404,-479.25 404,-479.25 404,-473.25 410,-467.25 416,-467.25 416,-467.25 513,-467.25 513,-467.25 519,-467.25 525,-473.25 525,-479.25 525,-479.25 525,-494.75 525,-494.75 525,-500.75 519,-506.75 513,-506.75"/>
248
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-494.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">extro_snapshot · drift</text>
249
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-483.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">observe · intel · correlate</text>
250
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-473.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">observations · stats · reset</text>
247
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M513,-517C513,-517 416,-517 416,-517 410,-517 404,-511 404,-505 404,-505 404,-479 404,-479 404,-473 410,-467 416,-467 416,-467 513,-467 513,-467 519,-467 525,-473 525,-479 525,-479 525,-505 525,-505 525,-511 519,-517 513,-517"/>
248
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-504.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">extro_snapshot · drift</text>
249
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-493.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">observe · intel · correlate</text>
250
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-483.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">watch · verify (browser)</text>
251
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-472.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">observations · stats · reset</text>
251
252
  </g>
252
253
  <!-- extro&#45;&gt;t_extro -->
253
254
  <g id="edge18" class="edge">
254
255
  <title>extro&#45;&gt;t_extro</title>
255
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M272.39,-470.24C305.45,-473.14 354.8,-477.47 395.08,-481"/>
256
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="394.68,-483.42 401.86,-481.59 395.11,-478.54 394.68,-483.42"/>
256
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M272.39,-471.04C305.45,-474.67 354.8,-480.08 395.08,-484.5"/>
257
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="394.64,-486.91 401.87,-485.24 395.18,-482.04 394.64,-486.91"/>
257
258
  </g>
258
259
  <!-- t_cron -->
259
260
  <g id="node20" class="node">
260
261
  <title>t_cron</title>
261
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M511.88,-568C511.88,-568 417.12,-568 417.12,-568 411.12,-568 405.12,-562 405.12,-556 405.12,-556 405.12,-544 405.12,-544 405.12,-538 411.12,-532 417.12,-532 417.12,-532 511.88,-532 511.88,-532 517.88,-532 523.88,-538 523.88,-544 523.88,-544 523.88,-556 523.88,-556 523.88,-562 517.88,-568 511.88,-568"/>
262
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-551.95" font-family="sans-Serif" font-size="9.00" fill="#0f172a">cron_list · create · run</text>
263
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-541.45" font-family="sans-Serif" font-size="9.00" fill="#0f172a">enable · disable · remove</text>
262
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M511.88,-578C511.88,-578 417.12,-578 417.12,-578 411.12,-578 405.12,-572 405.12,-566 405.12,-566 405.12,-554 405.12,-554 405.12,-548 411.12,-542 417.12,-542 417.12,-542 511.88,-542 511.88,-542 517.88,-542 523.88,-548 523.88,-554 523.88,-554 523.88,-566 523.88,-566 523.88,-572 517.88,-578 511.88,-578"/>
263
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-561.95" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">cron_list · create · run</text>
264
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-551.45" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">enable · disable · remove</text>
264
265
  </g>
265
266
  <!-- cron&#45;&gt;t_cron -->
266
267
  <g id="edge19" class="edge">
267
268
  <title>cron&#45;&gt;t_cron</title>
268
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-530.57C294.77,-533.72 351.36,-539.18 396.25,-543.51"/>
269
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="395.91,-545.94 403.12,-544.17 396.39,-541.06 395.91,-545.94"/>
269
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-531.73C294.77,-536.32 351.36,-544.26 396.25,-550.56"/>
270
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="395.85,-552.98 403.13,-551.53 396.53,-548.13 395.85,-552.98"/>
270
271
  </g>
271
272
  <!-- t_swarm -->
272
273
  <g id="node21" class="node">
273
274
  <title>t_swarm</title>
274
- <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M509.25,-632.75C509.25,-632.75 419.75,-632.75 419.75,-632.75 413.75,-632.75 407.75,-626.75 407.75,-620.75 407.75,-620.75 407.75,-605.25 407.75,-605.25 407.75,-599.25 413.75,-593.25 419.75,-593.25 419.75,-593.25 509.25,-593.25 509.25,-593.25 515.25,-593.25 521.25,-599.25 521.25,-605.25 521.25,-605.25 521.25,-620.75 521.25,-620.75 521.25,-626.75 515.25,-632.75 509.25,-632.75"/>
275
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-620.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">agent_list · spawn · ask</text>
276
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-609.7" font-family="sans-Serif" font-size="9.00" fill="#0f172a">debate · broadcast</text>
277
- <text xml:space="preserve" text-anchor="middle" x="464.5" y="-599.2" font-family="sans-Serif" font-size="9.00" fill="#0f172a">swarm_bus · swarm_list</text>
275
+ <path fill="#fcd34d" stroke="#334155" stroke-width="1.3" d="M509.25,-642.75C509.25,-642.75 419.75,-642.75 419.75,-642.75 413.75,-642.75 407.75,-636.75 407.75,-630.75 407.75,-630.75 407.75,-615.25 407.75,-615.25 407.75,-609.25 413.75,-603.25 419.75,-603.25 419.75,-603.25 509.25,-603.25 509.25,-603.25 515.25,-603.25 521.25,-609.25 521.25,-615.25 521.25,-615.25 521.25,-630.75 521.25,-630.75 521.25,-636.75 515.25,-642.75 509.25,-642.75"/>
276
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-630.2" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">agent_list · spawn · ask</text>
277
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-619.7" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">debate · broadcast</text>
278
+ <text xml:space="preserve" text-anchor="middle" x="464.5" y="-609.2" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0f172a">swarm_bus · swarm_list</text>
278
279
  </g>
279
280
  <!-- swarm&#45;&gt;t_swarm -->
280
281
  <g id="edge20" class="edge">
281
282
  <title>swarm&#45;&gt;t_swarm</title>
282
- <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-591.8C295.43,-595.31 353.66,-601.44 398.97,-606.21"/>
283
- <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="398.68,-608.64 405.9,-606.94 399.19,-603.77 398.68,-608.64"/>
283
+ <path fill="none" stroke="#f59e0b" stroke-width="1.1" d="M262.1,-592.97C295.5,-597.95 353.9,-606.66 399.25,-613.42"/>
284
+ <polygon fill="#f59e0b" stroke="#f59e0b" stroke-width="1.1" points="398.62,-615.8 405.91,-614.41 399.35,-610.96 398.62,-615.8"/>
284
285
  </g>
285
286
  </g>
286
287
  </svg>