86 lines
3.7 KiB
Org Mode
86 lines
3.7 KiB
Org Mode
#+TITLE: SKILL: Self-Fix Agent (Universal Literate Note)
|
|
#+ID: skill-self-fix
|
|
#+STARTUP: content
|
|
#+FILETAGS: :self-repair:autonomy:debugging:psf:
|
|
#+DEPENDS_ON: skill-scientist skill-shell-actuator
|
|
|
|
* Overview
|
|
The *Self-Fix Agent* is the system's "Repair Mechanism." It takes the failure hypotheses from the *Scientist Agent*, applies surgical code modifications in a sandboxed environment, and merges the fix only after rigorous verification by the *TDD Runner*.
|
|
|
|
* Phase A: Demand (PRD)
|
|
:PROPERTIES:
|
|
:STATUS: FROZEN
|
|
:END:
|
|
|
|
** 1. Purpose
|
|
Enable autonomous, verified code correction without human intervention.
|
|
|
|
** 2. User Needs
|
|
- *Surgical Modification:* Apply targeted changes to specific Lisp functions or Org headlines.
|
|
- *Sandboxed Verification:* Test every fix in a controlled environment before merging.
|
|
- *Rollback Capability:* Use the *Interactive Steering* snapshots to revert if a fix fails.
|
|
- *Audit Logging:* Every fix must be documented in `RCA.org`.
|
|
|
|
* Phase D: Build (Implementation)
|
|
|
|
** Repair Logic
|
|
#+begin_src lisp :tangle ../projects/org-skill-self-fix/src/repair-logic.lisp
|
|
(defun self-fix-replace-all (string part replacement)
|
|
(with-output-to-string (out)
|
|
(loop with part-length = (length part)
|
|
for old-pos = 0 then (+ pos part-length)
|
|
for pos = (search part string :start2 old-pos)
|
|
do (write-string string out :start old-pos :end (or pos (length string)))
|
|
when pos do (write-string replacement out)
|
|
while pos)))
|
|
|
|
(defun self-fix-apply (action context)
|
|
"Applies a surgical code fix directly to the target file."
|
|
(declare (ignore context))
|
|
(let* ((payload (getf action :payload))
|
|
(target-file (getf payload :file))
|
|
(old-code (getf payload :old))
|
|
(new-code (getf payload :new)))
|
|
(org-agent:kernel-log "SELF-FIX - Attempting surgical fix on ~a..." target-file)
|
|
(if (uiop:file-exists-p target-file)
|
|
(let ((content (uiop:read-file-string target-file)))
|
|
(if (search old-code content)
|
|
(let ((new-content (self-fix-replace-all content old-code new-code)))
|
|
(with-open-file (out target-file :direction :output :if-exists :supersede)
|
|
(write-string new-content out))
|
|
(org-agent:kernel-log "SELF-FIX SUCCESS - Applied fix to ~a" target-file)
|
|
t)
|
|
(progn
|
|
(org-agent:kernel-log "SELF-FIX FAILURE - Could not find old code in ~a" target-file)
|
|
nil)))
|
|
(progn
|
|
(org-agent:kernel-log "SELF-FIX FAILURE - File not found: ~a" target-file)
|
|
nil))))
|
|
|
|
(defun neuro-skill-self-fix (context)
|
|
"Neural stage: Synthesizes a surgical code modification based on the hypothesis."
|
|
(let* ((payload (getf context :payload))
|
|
(hypothesis (getf payload :hypothesis))
|
|
(failure-log (getf payload :failure-log)))
|
|
(org-agent:ask-neuro
|
|
(format nil "Based on the hypothesis '~a' and failure '~a', provide the exact Lisp code to fix it.
|
|
Return a Lisp plist: (:target :self-fix :action :apply :file \"path/to/file.lisp\" :old \"old code\" :new \"new code\")"
|
|
hypothesis failure-log)
|
|
:system-prompt "You are the PSF Repair Actuator. You MUST return ONLY a Lisp plist.")))
|
|
#+end_src
|
|
|
|
* Registration
|
|
#+begin_src lisp
|
|
(defskill :skill-self-fix
|
|
:priority 95
|
|
:trigger (lambda (context) (eq (getf (getf context :payload) :sensor) :repair-request))
|
|
:neuro #'neuro-skill-self-fix
|
|
:symbolic #'self-fix-apply)
|
|
#+end_src
|
|
|
|
* Phase B: Blueprint (PROTOCOL)
|
|
:PROPERTIES:
|
|
:STATUS: SIGNED
|
|
:END:
|
|
|
|
** 1. Architectural IntentnEstablish core functional interfaces for this skill.\n\n** 2. Semantic Interfaces\n(defun trigger-skill-org-skill-self-fix (context))\n(defun neuro-skill-org-skill-self-fix (context)) |