Module: PWN::AI::Agent::SkillReview
- Defined in:
- lib/pwn/ai/agent/skill_review.rb
Overview
Decide whether a completed task should update or create a skill. recommend is the default. auto-safe writes only a small verified addition.
Constant Summary collapse
- LEDGER =
File.join(Dir.home, '.pwn', 'skill_review.jsonl').freeze
- MODES =
%w[off recommend auto-safe].freeze
Class Method Summary collapse
- .authors ⇒ Object
- .help ⇒ Object
- .note_reuse(opts = {}) ⇒ Object
- .review(opts = {}) ⇒ Object
- .review_turn(opts = {}) ⇒ Object
Class Method Details
.authors ⇒ Object
72 73 74 |
# File 'lib/pwn/ai/agent/skill_review.rb', line 72 public_class_method def self. "AUTHOR(S):\n 0day Inc. <[email protected]>\n" end |
.help ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/pwn/ai/agent/skill_review.rb', line 76 public_class_method def self.help puts "USAGE: # Review a completed task and recommend or apply a skill change. #{self}.review( request: 'required - the completed task text', mode: 'optional - off, recommend, or auto-safe; default recommend', procedure: 'optional - Hash with when, prerequisites, steps, verification, and failures', evidence: 'optional - execution proof with source, fixture_passed, and sessions', name: 'optional - skill name to prefer', success: 'optional - true alone is a routine success and is skipped', user_correction: 'optional - true reviews an explicit operator correction', skills_root: 'optional - skills directory for the write' ) # Build a review from the completed turn, including an operator correction or a resolved mistake. #{self}.review_turn( request: 'required - the completed task text', final: 'optional - final answer, not saved as a procedure', success: 'optional - true alone does not create a skill', session_id: 'optional - session id for the turn', mistake: 'optional - resolved mistake Hash with count and source from the mistakes store' ) # Record whether a later task retrieved or reused a reviewed skill. #{self}.note_reuse( name: 'required - skill name', retrieved: 'optional - true when the catalog returned the skill', reused: 'optional - true when the procedure was followed', regressed: 'optional - true when reuse made the task worse' ) # Print the module authors. #{self}.authors " end |
.note_reuse(opts = {}) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/pwn/ai/agent/skill_review.rb', line 60 public_class_method def self.note_reuse(opts = {}) row = { name: opts[:name].to_s, retrieved: opts[:retrieved] == true, reused: opts[:reused] == true, regressed: opts[:regressed] == true, at: Time.now.utc.iso8601 } append_ledger(row: row) row end |
.review(opts = {}) ⇒ Object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/pwn/ai/agent/skill_review.rb', line 16 public_class_method def self.review(opts = {}) mode = mode_from(mode: opts[:mode]) request = opts[:request].to_s return finish(action: 'skipped', reason: 'mode off', mode: mode, request: request) if mode == 'off' return finish(action: 'skipped', reason: 'routine success is not a skill', mode: mode, request: request) unless useful?(opts) procedure = procedure_from(procedure: opts[:procedure], evidence: opts[:evidence]) unless procedure[:ok] return finish(action: 'refused', reason: procedure[:reason], mode: mode, request: request) if opts[:procedure] return finish(action: 'recommend', reason: 'a structured procedure is required before saving', mode: mode, request: request, verified: false) end target = locate(name: opts[:name], query: request, procedure: procedure[:text]) kind = target ? 'update' : 'create' verified = verified_execution?(evidence: opts[:evidence]) proposal = { action: 'recommend', kind: kind, name: target ? target[:name] : opts[:name].to_s, mode: mode, request: request, verified: verified, reason: target ? 'closest skill matches the procedure' : 'no existing skill matches', path: target && target[:path] } return finish(proposal.merge(action: 'refused', reason: 'generated module skills are not rewritten')) if generated?(name: proposal[:name], path: proposal[:path]) return finish(proposal) unless mode == 'auto-safe' && auto_safe?(proposal: proposal, procedure: procedure) apply_update(proposal: proposal, procedure: procedure, evidence: opts[:evidence], skills_root: opts[:skills_root]) end |
.review_turn(opts = {}) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/pwn/ai/agent/skill_review.rb', line 48 public_class_method def self.review_turn(opts = {}) request = opts[:request].to_s correction = defined?(Mistakes) && request.match?(Mistakes::CORRECTION_RX) mistake = opts[:mistake] if mistake.nil? && defined?(Mistakes) && Mistakes.respond_to?(:top) rows = Array(Mistakes.top(limit: 8, unresolved_only: false)) mistake = rows.find { |row| row.is_a?(Hash) && row[:resolved] == true && row[:count].to_i >= 2 } mistake = mistake.merge(source: 'mistakes') if mistake end review(opts.merge(user_correction: correction == true, mistake: mistake, session_id: opts[:session_id], final: opts[:final])) end |