73 lines
3.1 KiB
Common Lisp
73 lines
3.1 KiB
Common Lisp
(defun architect-perceive-frozen-prd (note-path)
|
|
"Checks if a master note has a FROZEN PRD and lacks a Phase B section."
|
|
(let ((content (uiop:read-file-string note-path)))
|
|
(when (and (search "* Phase A: Demand (PRD)" content)
|
|
(search ":STATUS: FROZEN" content)
|
|
(not (search "* Phase B: Blueprint (PROTOCOL)" content)))
|
|
`(:note-path ,note-path :content ,content))))
|
|
|
|
(defun architect-scan-all-notes ()
|
|
"Scans all org-skill-*.org notes for demands ready for blueprinting.
|
|
Uses manual filtering to ensure robustness across Lisp environments."
|
|
(let* ((notes-dir (or (uiop:getenv "MEMEX_NOTES") "/home/user/memex/notes/"))
|
|
(files (uiop:directory-files (uiop:ensure-directory-pathname notes-dir)))
|
|
(ready-notes '()))
|
|
(dolist (file files)
|
|
(let ((name (pathname-name file))
|
|
(type (pathname-type file)))
|
|
(when (and name type
|
|
(uiop:string-prefix-p "org-skill-" name)
|
|
(string-equal type "org"))
|
|
(let ((status (architect-perceive-frozen-prd file)))
|
|
(when status (push status ready-notes))))))
|
|
ready-notes))
|
|
|
|
(defun trigger-skill-architect (context)
|
|
"Triggers on heartbeat if any master note is in a FROZEN PRD state."
|
|
(let ((type (getf context :type))
|
|
(payload (getf context :payload)))
|
|
(when (and (eq type :EVENT) (eq (getf payload :sensor) :heartbeat))
|
|
(let ((ready (architect-scan-all-notes)))
|
|
(when ready
|
|
(setf (getf (getf context :payload) :ready-notes) ready)
|
|
t)))))
|
|
|
|
(defun neuro-skill-architect (context)
|
|
(let* ((payload (getf context :payload))
|
|
(note (car (getf payload :ready-notes)))
|
|
(note-path (getf note :note-path))
|
|
(prd-content (getf note :content))
|
|
(path-str (namestring note-path)))
|
|
(format nil "
|
|
You are the PSF Architect.
|
|
The Master Note '~a' has a FROZEN PRD and needs a PROTOCOL.
|
|
|
|
NOTE CONTENT:
|
|
---
|
|
~a
|
|
---
|
|
|
|
TASK:
|
|
Draft the '* Phase B: Blueprint (PROTOCOL)' section.
|
|
1. Define Architectural Intent.
|
|
2. Define Semantic Interfaces using Lisp signatures.
|
|
|
|
Return a Lisp plist: (:target :architect :action :actuate :path \"~a\" :content \"...blueprint section...\")
|
|
" path-str prd-content path-str)))
|
|
|
|
(defun architect-actuate (action context)
|
|
(declare (ignore context))
|
|
(let* ((payload (getf action :payload))
|
|
(note-path (or (getf payload :path) (getf action :path)))
|
|
(blueprint-content (or (getf payload :content) (getf action :content))))
|
|
(if (and note-path blueprint-content)
|
|
(progn
|
|
(org-agent:kernel-log "ARCHITECT - Appending PROTOCOL to ~a" note-path)
|
|
(with-open-file (out note-path :direction :output :if-exists :append)
|
|
(format out "~%* Phase B: Blueprint (PROTOCOL)~%:PROPERTIES:~%:STATUS: SIGNED~%:END:~%~%~a"
|
|
blueprint-content))
|
|
(format nil "SUCCESS - Architect established PROTOCOL in ~a" note-path))
|
|
(progn
|
|
(org-agent:kernel-log "ARCHITECT FAILURE - Missing path or content in action: ~a" action)
|
|
nil))))
|