ALIGN: Rename Protocol to Communication and unify terminology
This commit is contained in:
@@ -26,12 +26,12 @@ There is a beautiful irony to org-agent: Lisp was invented in 1958 specifically
|
|||||||
|
|
||||||
Lisp possesses a unique property called *Homoiconicity*: the primary representation of the program is also a data structure (nested lists) within the language itself. Because Lisp code /is/ Lisp data, it is trivially easy for an AI to generate, manipulate, and safely evaluate new tools at runtime. This makes Lisp the ultimate, un-brittle language for a "self-writing" agent.
|
Lisp possesses a unique property called *Homoiconicity*: the primary representation of the program is also a data structure (nested lists) within the language itself. Because Lisp code /is/ Lisp data, it is trivially easy for an AI to generate, manipulate, and safely evaluate new tools at runtime. This makes Lisp the ultimate, un-brittle language for a "self-writing" agent.
|
||||||
|
|
||||||
** 3. The Neuro-Protosymbolic Loop
|
** 3. The Probabilistic-Protodeterministic Loop
|
||||||
org-agent does not let AI models touch your system directly. Instead, it splits cognition into two distinct engines:
|
org-agent does not let AI models touch your system directly. Instead, it splits cognition into two distinct engines:
|
||||||
- *The Probabilistic Engine (The AI Models):* Provides semantic understanding, multimodal translation, and probabilistic creativity. It looks at your Memex and proposes an action by writing a strictly formatted Lisp s-expression.
|
- *The Probabilistic Engine (The AI Models):* Provides semantic understanding, multimodal translation, and probabilistic creativity. It looks at your Memex and proposes an action by writing a strictly formatted Lisp s-expression.
|
||||||
- *The Deterministic Engine (Common Lisp):* Provides deterministic logic, physics, and safety. It intercepts the model's Lisp proposal, formally verifies its structure against your security rules, and only executes it if it is mathematically sound.
|
- *The Deterministic Engine (Common Lisp):* Provides deterministic logic, physics, and safety. It intercepts the model's Lisp proposal, formally verifies its structure against your security rules, and only executes it if it is mathematically sound.
|
||||||
|
|
||||||
Crucially, the Deterministic engine is *continuously progressive*. Right now, it starts by acting as a strict security bouncer—enforcing rules and bounding the AI's actions. But as the system matures, the Deterministic engine will progressively take over more and more of the actual reasoning, reducing the AI models' involvement to a mere semantic translation layer for the messy outside world. We are moving from a /neuro-protosymbolic/ system today, toward a fully autonomous /neurosymbolic/ Lisp machine tomorrow.
|
Crucially, the Deterministic engine is *continuously progressive*. Right now, it starts by acting as a strict security bouncer—enforcing rules and bounding the AI's actions. But as the system matures, the Deterministic engine will progressively take over more and more of the actual reasoning, reducing the AI models' involvement to a mere semantic translation layer for the messy outside world. We are moving from a /probabilistic-protodeterministic/ system today, toward a fully autonomous /probabilistic-deterministic/ Lisp machine tomorrow.
|
||||||
|
|
||||||
* Architecture: Thin Harness, Fat Skills
|
* Architecture: Thin Harness, Fat Skills
|
||||||
|
|
||||||
@@ -62,12 +62,12 @@ When the system boots, it parses these single files, mathematically proves their
|
|||||||
The agent's "mind" is not a transient chat session; it is a durable, stateful architecture consisting of three layers:
|
The agent's "mind" is not a transient chat session; it is a durable, stateful architecture consisting of three layers:
|
||||||
1. *The Linguistic Substrate (Plaintext Files):* The human-readable Source of Truth on your hard drive. You can edit these files in any text editor, and the agent will instantly perceive the changes.
|
1. *The Linguistic Substrate (Plaintext Files):* The human-readable Source of Truth on your hard drive. You can edit these files in any text editor, and the agent will instantly perceive the changes.
|
||||||
2. *The Lisp Object Store (RAM):* The "Active Brain," a live, threaded graph of Lisp objects representing every headline, paragraph, and tag in your Memex. It allows the agent to navigate your life instantly without constantly re-reading files.
|
2. *The Lisp Object Store (RAM):* The "Active Brain," a live, threaded graph of Lisp objects representing every headline, paragraph, and tag in your Memex. It allows the agent to navigate your life instantly without constantly re-reading files.
|
||||||
3. *The Telemetry Store (External):* A high-volume database for sub-symbolic sensory data (e.g., smart home logs or system metrics), which the agent monitors and distills.
|
3. *The Telemetry Store (External):* A high-volume database for sub-deterministic sensory data (e.g., smart home logs or system metrics), which the agent monitors and distills.
|
||||||
|
|
||||||
** The Psychology: The 2x2 Cognitive Matrix
|
** The Psychology: The 2x2 Cognitive Matrix
|
||||||
The agent operates on a matrix that balances cognitive speed with cognitive state:
|
The agent operates on a matrix that balances cognitive speed with cognitive state:
|
||||||
|
|
||||||
| | Probabilistic (Neural/Intuitive) | Deterministic (Symbolic/Logical) |
|
| | Probabilistic (Neural/Intuitive) | Deterministic (Deterministic/Logical) |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- | :--- |
|
||||||
| Foreground (Active) | *The Interface:* Fast AI models for conversation, multimodal ingestion, and semantic understanding. | *The Steward:* Lisp engine that safely retrieves requested data from the Memex and enforces security rules while the Interface keeps you engaged. |
|
| Foreground (Active) | *The Interface:* Fast AI models for conversation, multimodal ingestion, and semantic understanding. | *The Steward:* Lisp engine that safely retrieves requested data from the Memex and enforces security rules while the Interface keeps you engaged. |
|
||||||
| Background (Passive) | *The Editor:* Deep AI models finding hidden patterns while you sleep. | *The Librarian:* Lisp engine continuously maintaining data integrity and filing away loose notes. |
|
| Background (Passive) | *The Editor:* Deep AI models finding hidden patterns while you sleep. | *The Librarian:* Lisp engine continuously maintaining data integrity and filing away loose notes. |
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[Unit]
|
[Unit]
|
||||||
Description=org-agent: Neurosymbolic Lisp Machine Kernel
|
Description=org-agent: Probabilistic-Deterministic Lisp Machine Kernel
|
||||||
After=network.target
|
After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ RUN sbcl --non-interactive \
|
|||||||
# Ensure the binary is executable
|
# Ensure the binary is executable
|
||||||
RUN chmod +x /app/org-agent-server
|
RUN chmod +x /app/org-agent-server
|
||||||
|
|
||||||
# Expose the Harness Protocol and Web Dashboard ports
|
# Expose the Harness Communication and Web Dashboard ports
|
||||||
EXPOSE 9105 8080
|
EXPOSE 9105 8080
|
||||||
|
|
||||||
# The app expects the memex to be mounted here
|
# The app expects the memex to be mounted here
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#+FILETAGS: :quickstart:onboarding:guide:
|
#+FILETAGS: :quickstart:onboarding:guide:
|
||||||
|
|
||||||
* 1. Introduction
|
* 1. Introduction
|
||||||
Welcome to ~org-agent~, the "Executive Soul" of your personal OS. This guide will help you set up and interact with your first neurosymbolic agent.
|
Welcome to ~org-agent~, the "Executive Soul" of your personal OS. This guide will help you set up and interact with your first probabilistic-deterministic agent.
|
||||||
|
|
||||||
* 2. Prerequisites
|
* 2. Prerequisites
|
||||||
Before launching the harness, ensure your host environment has:
|
Before launching the harness, ensure your host environment has:
|
||||||
@@ -35,7 +35,7 @@ docker-compose up --build -d
|
|||||||
* 4. Interaction Gateways
|
* 4. Interaction Gateways
|
||||||
Once the harness is "Ready", you can interact with it via multiple sensors.
|
Once the harness is "Ready", you can interact with it via multiple sensors.
|
||||||
|
|
||||||
** Gateway A: Emacs (Harness Protocol)
|
** Gateway A: Emacs (Harness Communication)
|
||||||
If you have configured the ~org-agent~ package in Emacs:
|
If you have configured the ~org-agent~ package in Emacs:
|
||||||
1. Open a chat buffer: ~M-x org-agent-chat-open~.
|
1. Open a chat buffer: ~M-x org-agent-chat-open~.
|
||||||
2. Send: "Are you online, agent?"
|
2. Send: "Are you online, agent?"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Probabilistic Engine proposals involving `shell` or `eval` were executed immedia
|
|||||||
** Root Cause
|
** Root Cause
|
||||||
Architecture gap. The system lacked an authorization state between "Safe" and "Executed".
|
Architecture gap. The system lacked an authorization state between "Safe" and "Executed".
|
||||||
** Resolution
|
** Resolution
|
||||||
1. **Interceptor:** Added `bouncer-check` to `symbolic.lisp`. It flags high-risk actions that lack the `:approved t` property.
|
1. **Interceptor:** Added `bouncer-check` to `deterministic.lisp`. It flags high-risk actions that lack the `:approved t` property.
|
||||||
2. **Asynchronous Event:** If flagged, the harness emits an `:approval-required` event.
|
2. **Asynchronous Event:** If flagged, the harness emits an `:approval-required` event.
|
||||||
3. **Flight Plan Skill:** Created `org-skill-bouncer.org` to:
|
3. **Flight Plan Skill:** Created `org-skill-bouncer.org` to:
|
||||||
- Catch the event and create a serialized Org node with state `PLAN`.
|
- Catch the event and create a serialized Org node with state `PLAN`.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#+FILETAGS: :rca:security:formal-verification:psf:
|
#+FILETAGS: :rca:security:formal-verification:psf:
|
||||||
|
|
||||||
* Executive Summary
|
* Executive Summary
|
||||||
Implemented a Lisp-Native Symbolic Prover to replace heuristic whitelisting with formal security invariants. This ensures that every high-impact action (shell, file I/O) is mathematically proven safe against the Sovereign's core mandates.
|
Implemented a Lisp-Native Deterministic Prover to replace heuristic whitelisting with formal security invariants. This ensures that every high-impact action (shell, file I/O) is mathematically proven safe against the Sovereign's core mandates.
|
||||||
|
|
||||||
* 1. Architectural Shift: Native vs. External
|
* 1. Architectural Shift: Native vs. External
|
||||||
** Issue
|
** Issue
|
||||||
@@ -22,7 +22,7 @@ Incorrect assumption about the Quicklisp system name vs. the package name. The l
|
|||||||
3. Verified via explicit `ql:quickload` in the test runner.
|
3. Verified via explicit `ql:quickload` in the test runner.
|
||||||
|
|
||||||
* 3. Formal Invariants Implemented
|
* 3. Formal Invariants Implemented
|
||||||
- **Path Confinement:** Symbolically proves that any file operation or absolute path in a shell command is strictly within the `/home/user/memex` root.
|
- **Path Confinement:** Deterministically proves that any file operation or absolute path in a shell command is strictly within the `/home/user/memex` root.
|
||||||
- **No Network Exfiltration:** Prevents the shell from invoking common exfiltration tools (`nc`, `ssh`, etc.) by inspecting the parsed command structure.
|
- **No Network Exfiltration:** Prevents the shell from invoking common exfiltration tools (`nc`, `ssh`, etc.) by inspecting the parsed command structure.
|
||||||
|
|
||||||
* 4. PSF Mandate Alignment
|
* 4. PSF Mandate Alignment
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ During compilation, `gateway-telegram.lisp` failed with `UNDEFINED-FUNCTION` for
|
|||||||
** Root Cause
|
** Root Cause
|
||||||
Poorly scoped foundational functions. These were defined in `core.lisp` (the loop orchestrator), which was loaded *after* the gateways in `org-agent.asd`. This created a "Circular Intention" where the gateways needed the harness to exist before the harness could load the gateways.
|
Poorly scoped foundational functions. These were defined in `core.lisp` (the loop orchestrator), which was loaded *after* the gateways in `org-agent.asd`. This created a "Circular Intention" where the gateways needed the harness to exist before the harness could load the gateways.
|
||||||
** Resolution
|
** Resolution
|
||||||
1. **Relocation:** Moved `*actuator-registry*` and `register-actuator` to `protocol.lisp` (the foundation).
|
1. **Relocation:** Moved `*actuator-registry*` and `register-actuator` to `communication.lisp` (the foundation).
|
||||||
2. **Reordering:** Adjusted `org-agent.asd` to load `core.lisp` (containing the stimulus loop) immediately after the symbolic gates but before the physical sensors (gateways).
|
2. **Reordering:** Adjusted `org-agent.asd` to load `core.lisp` (containing the stimulus loop) immediately after the deterministic gates but before the physical sensors (gateways).
|
||||||
|
|
||||||
* 2. Issue: Hardcoded Chat UI
|
* 2. Issue: Hardcoded Chat UI
|
||||||
** Symptoms
|
** Symptoms
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ Reimplemented the `org-skill-lisp-repair` to align with the "Sovereign Boundary"
|
|||||||
|
|
||||||
* 1. Issue: Core Bloat & Synchronous Coupling
|
* 1. Issue: Core Bloat & Synchronous Coupling
|
||||||
** Symptoms
|
** Symptoms
|
||||||
The initial implementation of the Lisp Repair gate placed a `handler-case` and a dynamic function call (`repair-lisp-syntax`) directly inside the core `think` function (`neuro.lisp`). This forced the core to wait for repairs and made it "aware" of specific repair logic.
|
The initial implementation of the Lisp Repair gate placed a `handler-case` and a dynamic function call (`repair-lisp-syntax`) directly inside the core `think` function (`probabilistic.lisp`). This forced the core to wait for repairs and made it "aware" of specific repair logic.
|
||||||
** Root Cause
|
** Root Cause
|
||||||
Architectural shortcutting. By placing repair logic in the core execution path, we violated the microkernel principle which mandates that the core should be a "dumb" signal processor.
|
Architectural shortcutting. By placing repair logic in the core execution path, we violated the microkernel principle which mandates that the core should be a "dumb" signal processor.
|
||||||
** Resolution
|
** Resolution
|
||||||
@@ -20,7 +20,7 @@ Architectural shortcutting. By placing repair logic in the core execution path,
|
|||||||
** Root Cause
|
** Root Cause
|
||||||
Mismatched expectations of signal nesting. The skill expected the code at `(getf context :payload)`, but in the `decide-gate`, `context` is the full signal, and the error details were nested inside the `:candidate` field of that signal.
|
Mismatched expectations of signal nesting. The skill expected the code at `(getf context :payload)`, but in the `decide-gate`, `context` is the full signal, and the error details were nested inside the `:candidate` field of that signal.
|
||||||
** Resolution
|
** Resolution
|
||||||
Updated the symbolic logic to correctly traverse the nested signal structure: `(getf (getf context :candidate) :payload)`.
|
Updated the deterministic logic to correctly traverse the nested signal structure: `(getf (getf context :candidate) :payload)`.
|
||||||
|
|
||||||
* 3. PSF Mandate Alignment
|
* 3. PSF Mandate Alignment
|
||||||
** Sovereign Boundary
|
** Sovereign Boundary
|
||||||
@@ -30,4 +30,4 @@ Leveraged the pipeline's ability to re-inject `EVENT` signals to flatten the rec
|
|||||||
|
|
||||||
* 4. Permanent Learnings
|
* 4. Permanent Learnings
|
||||||
- **Emit, Don't Call:** In a microkernel, if a non-fatal error occurs, always emit a signal rather than calling a recovery function. This allows the system to remain asynchronous and modular.
|
- **Emit, Don't Call:** In a microkernel, if a non-fatal error occurs, always emit a signal rather than calling a recovery function. This allows the system to remain asynchronous and modular.
|
||||||
- **Signal Inspection:** When writing symbolic gates, always verify the exact shape of the `context` signal being passed by the harness to avoid nesting errors.
|
- **Signal Inspection:** When writing deterministic gates, always verify the exact shape of the `context` signal being passed by the harness to avoid nesting errors.
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ Implemented a robust `get-nested` helper function that safely traverses both nes
|
|||||||
** Symptoms
|
** Symptoms
|
||||||
Provider logic was present in the codebase but inaccessible during tests and runtime.
|
Provider logic was present in the codebase but inaccessible during tests and runtime.
|
||||||
** Root Cause
|
** Root Cause
|
||||||
The `credentials-vault.lisp` and `llm-gateway.lisp` files (consolidated in a previous session) were never added to the `org-agent.asd` system definition. Furthermore, an incorrect loading order caused `UNDEFINED-FUNCTION` errors for `register-neuro-backend`.
|
The `credentials-vault.lisp` and `llm-gateway.lisp` files (consolidated in a previous session) were never added to the `org-agent.asd` system definition. Furthermore, an incorrect loading order caused `UNDEFINED-FUNCTION` errors for `register-probabilistic-backend`.
|
||||||
** Resolution
|
** Resolution
|
||||||
1. Added both files to `org-agent.asd`.
|
1. Added both files to `org-agent.asd`.
|
||||||
2. Enforced strict loading order: `neuro` (defines registry) -> `credentials-vault` -> `llm-gateway` (uses registry).
|
2. Enforced strict loading order: `probabilistic` (defines registry) -> `credentials-vault` -> `llm-gateway` (uses registry).
|
||||||
|
|
||||||
* 3. Issue: Credential Key Mismatch
|
* 3. Issue: Credential Key Mismatch
|
||||||
** Symptoms
|
** Symptoms
|
||||||
|
|||||||
@@ -36,5 +36,5 @@ This eliminates unnecessary nesting levels and drastically reduces the surface a
|
|||||||
- *Institutional Memory:* This RCA documents the decision to flatten the `.asd` structure to prevent future "Parenthesis Hell" incidents.
|
- *Institutional Memory:* This RCA documents the decision to flatten the `.asd` structure to prevent future "Parenthesis Hell" incidents.
|
||||||
|
|
||||||
* 4. Permanent Learnings
|
* 4. Permanent Learnings
|
||||||
- **Flatten Configuration:** Keep `defsystem` definitions as flat as possible. The overhead of `:module` blocks often outweighs their organizational benefit in a neurosymbolic environment where agents frequently edit these files.
|
- **Flatten Configuration:** Keep `defsystem` definitions as flat as possible. The overhead of `:module` blocks often outweighs their organizational benefit in a probabilistic-deterministic environment where agents frequently edit these files.
|
||||||
- **Mocking Probabilistic Engine:** For verifying *loop mechanics*, mocking LLM responses is essential to ensure test determinism, while integration tests can use live LLM calls.
|
- **Mocking Probabilistic Engine:** For verifying *loop mechanics*, mocking LLM responses is essential to ensure test determinism, while integration tests can use live LLM calls.
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Defined `lisp-validator-validate` as a wrapper around `read-from-string` and `li
|
|||||||
** Requirement
|
** Requirement
|
||||||
Multi-backend support to reduce hallucinations and increase reliability.
|
Multi-backend support to reduce hallucinations and increase reliability.
|
||||||
** Solution
|
** Solution
|
||||||
Implemented `bt:make-thread` parallel queries in `ask-neuro`.
|
Implemented `bt:make-thread` parallel queries in `ask-probabilistic`.
|
||||||
** Trade-off
|
** Trade-off
|
||||||
Selected "Majority Rules" over "First-to-Finish".
|
Selected "Majority Rules" over "First-to-Finish".
|
||||||
- *Pros:* Higher accuracy, mathematically consistent.
|
- *Pros:* Higher accuracy, mathematically consistent.
|
||||||
@@ -29,7 +29,7 @@ Aligns with PSF Mandate 4 (Radical Transparency) and Invariant 2 (Technical Mast
|
|||||||
** Requirement
|
** Requirement
|
||||||
Prevent illegal GTD state transitions.
|
Prevent illegal GTD state transitions.
|
||||||
** Solution
|
** Solution
|
||||||
Added `task-integrity-check` in `symbolic.lisp`.
|
Added `task-integrity-check` in `deterministic.lisp`.
|
||||||
** Invariant Alignment
|
** Invariant Alignment
|
||||||
Enforces the "High-Integrity Memory" mandate by ensuring the Org-mode AST remains semantically valid according to GTD rules (e.g., no orphaned active tasks).
|
Enforces the "High-Integrity Memory" mandate by ensuring the Org-mode AST remains semantically valid according to GTD rules (e.g., no orphaned active tasks).
|
||||||
|
|
||||||
@@ -40,7 +40,7 @@ Enforces the "High-Integrity Memory" mandate by ensuring the Org-mode AST remain
|
|||||||
3. Multi-function edits per block.
|
3. Multi-function edits per block.
|
||||||
** Correction
|
** Correction
|
||||||
1. Performed a retrospective commit.
|
1. Performed a retrospective commit.
|
||||||
2. Synchronized `neurosymbolic.org` and `core.org` with source code.
|
2. Synchronized `probabilistic-deterministic.org` and `core.org` with source code.
|
||||||
3. Refactored the Markdown flight plan into an Org-mode flight plan.
|
3. Refactored the Markdown flight plan into an Org-mode flight plan.
|
||||||
|
|
||||||
* 5. Permanent Learnings
|
* 5. Permanent Learnings
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
#+TITLE: The Harness Protocol (protocol.lisp)
|
#+TITLE: The Harness Communication (communication.lisp)
|
||||||
#+AUTHOR: Amr
|
#+AUTHOR: Amr
|
||||||
#+FILETAGS: :harness:protocol:
|
#+FILETAGS: :harness:protocol:
|
||||||
#+STARTUP: content
|
#+STARTUP: content
|
||||||
|
|
||||||
* The Harness Protocol (protocol.lisp)
|
* The Harness Communication (communication.lisp)
|
||||||
** Architectural Intent: Deterministic Framing & Reader Security
|
** Architectural Intent: Secure Inter-Process Communication & Deterministic Framing
|
||||||
|
|
||||||
The ~org-agent~ harness operates as a perfectly deterministic, highly secure computational engine. When communicating with external actuators—such as an Emacs instance, a web dashboard, or a remote script—the harness cannot rely on unpredictable, "loose" data streams.
|
Yes, the Harness Communication is fundamentally about **Communication**. It defines the exact physical and semantic boundaries for how the isolated Lisp environment talks to the outside world.
|
||||||
|
|
||||||
|
The ~org-agent~ harness operates as a perfectly deterministic, highly secure computational engine. When communicating with external processes or actuators—such as an Emacs client, a web dashboard, or a remote Shell script—the harness cannot rely on unpredictable, "loose" data streams.
|
||||||
|
|
||||||
Streaming raw Lisp or JSON over a TCP socket is inherently fragile. If a multi-megabyte Org Abstract Syntax Tree (AST) is fragmented by the operating system's network stack during transmission, a standard stream parser might attempt to evaluate an incomplete string, leading to immediate crashes or desynchronization.
|
Streaming raw Lisp or JSON over a TCP socket is inherently fragile. If a multi-megabyte Org Abstract Syntax Tree (AST) is fragmented by the operating system's network stack during transmission, a standard stream parser might attempt to evaluate an incomplete string, leading to immediate crashes or desynchronization.
|
||||||
|
|
||||||
To solve this, we implement the **Harness Protocol**, which enforces absolute deterministic boundaries around every message.
|
To solve this, we implement the **Harness Communication**, which enforces absolute deterministic boundaries around every message.
|
||||||
|
|
||||||
*** 1. Physical Boundary: Hex-Length Prefixing
|
*** 1. Physical Boundary: Hex-Length Prefixing
|
||||||
Every message crossing the wire is prefixed with a strict 6-character hexadecimal length string (zero-padded). This creates an unbreakable physical boundary. The harness reads exactly the number of bytes specified by the hex length. It will never under-read (crashing on a partial form) and never over-read (consuming bytes meant for the next message).
|
Every message crossing the wire is prefixed with a strict 6-character hexadecimal length string (zero-padded). This creates an unbreakable physical boundary. The harness reads exactly the number of bytes specified by the hex length. It will never under-read (crashing on a partial form) and never over-read (consuming bytes meant for the next message).
|
||||||
@@ -19,7 +21,7 @@ Every message crossing the wire is prefixed with a strict 6-character hexadecima
|
|||||||
The protocol keeps the Lisp harness completely agnostic of its clients. The harness does not care if the client is written in Emacs Lisp, Python, or Rust. Any environment capable of calculating a byte length and opening a TCP socket can interface with the Lisp Machine.
|
The protocol keeps the Lisp harness completely agnostic of its clients. The harness does not care if the client is written in Emacs Lisp, Python, or Rust. Any environment capable of calculating a byte length and opening a TCP socket can interface with the Lisp Machine.
|
||||||
|
|
||||||
*** 3. Preventing Reader Macro Injection
|
*** 3. Preventing Reader Macro Injection
|
||||||
Common Lisp's ~read-from-string~ is extremely powerful but dangerous; it allows "reader macros" (like ~#.~) which execute code during the parsing phase. The Harness Protocol mandates that ~*read-eval*~ is explicitly bound to ~nil~ before any network data is parsed, physically preventing arbitrary code execution.
|
Common Lisp's ~read-from-string~ is extremely powerful but dangerous; it allows "reader macros" (like ~#.~) which execute code during the parsing phase. The Harness Communication mandates that ~*read-eval*~ is explicitly bound to ~nil~ before any network data is parsed, physically preventing arbitrary code execution.
|
||||||
|
|
||||||
** Message Framing Logic
|
** Message Framing Logic
|
||||||
#+begin_src mermaid
|
#+begin_src mermaid
|
||||||
@@ -40,14 +42,14 @@ flowchart LR
|
|||||||
** Package Context
|
** Package Context
|
||||||
We ensure all protocol logic resides within the isolated harness namespace.
|
We ensure all protocol logic resides within the isolated harness namespace.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/protocol.lisp
|
#+begin_src lisp :tangle ../src/communication.lisp
|
||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Actuator Registry
|
** Actuator Registry
|
||||||
The harness maintains a decoupled registry of target actuators. This allows the system to route messages to Emacs, the Shell, or Web Gateways without hardcoding the routing logic into the protocol itself.
|
The harness maintains a decoupled registry of target actuators. This allows the system to route messages to Emacs, the Shell, or Web Gateways without hardcoding the routing logic into the protocol itself.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/protocol.lisp
|
#+begin_src lisp :tangle ../src/communication.lisp
|
||||||
(defvar *actuator-registry* (make-hash-table :test 'equal)
|
(defvar *actuator-registry* (make-hash-table :test 'equal)
|
||||||
"Global registry mapping target keywords to their physical actuator functions.")
|
"Global registry mapping target keywords to their physical actuator functions.")
|
||||||
|
|
||||||
@@ -59,7 +61,7 @@ The harness maintains a decoupled registry of target actuators. This allows the
|
|||||||
** Message Framing (frame-message)
|
** Message Framing (frame-message)
|
||||||
The ~frame-message~ function prepares an outgoing Lisp string for transmission. It calculates the byte length, converts it into a 6-character padded hex string, and prefixes it. If ~HARNESS_PROTOCOL_ENFORCE_HMAC~ is enabled in the environment, it also prepends a cryptographic signature to ensure the message hasn't been tampered with.
|
The ~frame-message~ function prepares an outgoing Lisp string for transmission. It calculates the byte length, converts it into a 6-character padded hex string, and prefixes it. If ~HARNESS_PROTOCOL_ENFORCE_HMAC~ is enabled in the environment, it also prepends a cryptographic signature to ensure the message hasn't been tampered with.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/protocol.lisp
|
#+begin_src lisp :tangle ../src/communication.lisp
|
||||||
(defun frame-message (msg-string)
|
(defun frame-message (msg-string)
|
||||||
"Prefixes MSG-STRING with a 6-character hex length.
|
"Prefixes MSG-STRING with a 6-character hex length.
|
||||||
If security is enabled, prefixes a 64-char HMAC-SHA256 signature."
|
If security is enabled, prefixes a 64-char HMAC-SHA256 signature."
|
||||||
@@ -80,7 +82,7 @@ The ~frame-message~ function prepares an outgoing Lisp string for transmission.
|
|||||||
** Message Parsing (parse-message)
|
** Message Parsing (parse-message)
|
||||||
Parsing is the high-security inverse of framing. This function acts as the final perimeter defense. It validates the length, verifies the HMAC integrity, and—most importantly—jails the Lisp reader by disabling ~*read-eval*~.
|
Parsing is the high-security inverse of framing. This function acts as the final perimeter defense. It validates the length, verifies the HMAC integrity, and—most importantly—jails the Lisp reader by disabling ~*read-eval*~.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/protocol.lisp
|
#+begin_src lisp :tangle ../src/communication.lisp
|
||||||
(defun parse-message (framed-string)
|
(defun parse-message (framed-string)
|
||||||
"Extracts and parses the S-expression from a framed string securely."
|
"Extracts and parses the S-expression from a framed string securely."
|
||||||
(when (< (length framed-string) 6)
|
(when (< (length framed-string) 6)
|
||||||
@@ -89,7 +91,7 @@ Parsing is the high-security inverse of framing. This function acts as the final
|
|||||||
(use-hmac (and enforce-hmac (string-equal enforce-hmac "true")))
|
(use-hmac (and enforce-hmac (string-equal enforce-hmac "true")))
|
||||||
(prefix-len (if use-hmac 70 6)))
|
(prefix-len (if use-hmac 70 6)))
|
||||||
(when (< (length framed-string) prefix-len)
|
(when (< (length framed-string) prefix-len)
|
||||||
(error "Framed string too short for Harness Protocol prefix"))
|
(error "Framed string too short for Harness Communication prefix"))
|
||||||
|
|
||||||
(let* ((len-str (subseq framed-string 0 6))
|
(let* ((len-str (subseq framed-string 0 6))
|
||||||
(signature (when use-hmac (subseq framed-string 6 70)))
|
(signature (when use-hmac (subseq framed-string 6 70)))
|
||||||
@@ -109,7 +111,7 @@ Parsing is the high-security inverse of framing. This function acts as the final
|
|||||||
(ironclad:update-mac hmac payload-bytes)
|
(ironclad:update-mac hmac payload-bytes)
|
||||||
(let ((expected-signature (ironclad:byte-array-to-hex-string (ironclad:produce-mac hmac))))
|
(let ((expected-signature (ironclad:byte-array-to-hex-string (ironclad:produce-mac hmac))))
|
||||||
(unless (string-equal signature expected-signature)
|
(unless (string-equal signature expected-signature)
|
||||||
(error "Harness Protocol Integrity Failure: HMAC mismatch"))))))
|
(error "Harness Communication Integrity Failure: HMAC mismatch"))))))
|
||||||
|
|
||||||
;; SECURITY: Disable the reader's ability to execute code during parsing
|
;; SECURITY: Disable the reader's ability to execute code during parsing
|
||||||
(let ((*read-eval* nil))
|
(let ((*read-eval* nil))
|
||||||
@@ -121,7 +123,7 @@ Parsing is the high-security inverse of framing. This function acts as the final
|
|||||||
** Handshaking (make-hello-message)
|
** Handshaking (make-hello-message)
|
||||||
Every session begins with a standard ~HELLO~ handshake, allowing the harness to announce its capabilities and protocol version to the connecting client.
|
Every session begins with a standard ~HELLO~ handshake, allowing the harness to announce its capabilities and protocol version to the connecting client.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/protocol.lisp
|
#+begin_src lisp :tangle ../src/communication.lisp
|
||||||
(defun make-hello-message (version)
|
(defun make-hello-message (version)
|
||||||
"Constructs the standard HELLO handshake message."
|
"Constructs the standard HELLO handshake message."
|
||||||
(list :type :EVENT
|
(list :type :EVENT
|
||||||
@@ -24,7 +24,7 @@ flowchart TD
|
|||||||
H -- Pointers --> S2
|
H -- Pointers --> S2
|
||||||
end
|
end
|
||||||
subgraph IPCSlow[External Layer]
|
subgraph IPCSlow[External Layer]
|
||||||
E[Emacs / Actuators] -. Harness Protocol .-> H
|
E[Emacs / Actuators] -. Harness Communication .-> H
|
||||||
end
|
end
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ By strictly defining the public interface, we ensure that skills remain decouple
|
|||||||
|
|
||||||
#+begin_src mermaid
|
#+begin_src mermaid
|
||||||
flowchart TD
|
flowchart TD
|
||||||
External[Actuators / Clients] -- Harness Protocol --> Package[Package Membrane: API]
|
External[Actuators / Clients] -- Harness Communication --> Package[Package Membrane: API]
|
||||||
Skills[Dynamic Skills] -- API Calls --> Package
|
Skills[Dynamic Skills] -- API Calls --> Package
|
||||||
Package --> Internal[Harness Internal Modules]
|
Package --> Internal[Harness Internal Modules]
|
||||||
style Package fill:#f9f,stroke:#333,stroke-width:4px
|
style Package fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
@@ -22,7 +22,7 @@ flowchart TD
|
|||||||
(defpackage :org-agent
|
(defpackage :org-agent
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:export
|
(:export
|
||||||
;; --- Harness Protocol ---
|
;; --- Harness Communication ---
|
||||||
#:frame-message
|
#:frame-message
|
||||||
#:parse-message
|
#:parse-message
|
||||||
#:make-hello-message
|
#:make-hello-message
|
||||||
@@ -68,7 +68,7 @@ flowchart TD
|
|||||||
;; --- Reactive Signal Pipeline ---
|
;; --- Reactive Signal Pipeline ---
|
||||||
#:process-signal
|
#:process-signal
|
||||||
#:perceive-gate
|
#:perceive-gate
|
||||||
#:neuro-gate
|
#:probabilistic-gate
|
||||||
#:consensus-gate
|
#:consensus-gate
|
||||||
#:decide-gate
|
#:decide-gate
|
||||||
#:dispatch-gate
|
#:dispatch-gate
|
||||||
@@ -90,8 +90,8 @@ flowchart TD
|
|||||||
#:skill-priority
|
#:skill-priority
|
||||||
#:skill-dependencies
|
#:skill-dependencies
|
||||||
#:skill-trigger-fn
|
#:skill-trigger-fn
|
||||||
#:skill-neuro-prompt
|
#:skill-probabilistic-prompt
|
||||||
#:skill-symbolic-fn
|
#:skill-deterministic-fn
|
||||||
|
|
||||||
;; --- Tool Registry ---
|
;; --- Tool Registry ---
|
||||||
#:def-cognitive-tool
|
#:def-cognitive-tool
|
||||||
@@ -110,12 +110,12 @@ flowchart TD
|
|||||||
#:unregister-emacs-client
|
#:unregister-emacs-client
|
||||||
|
|
||||||
;; --- Probabilistic Engine ---
|
;; --- Probabilistic Engine ---
|
||||||
#:ask-neuro
|
#:ask-probabilistic
|
||||||
#:register-neuro-backend
|
#:register-probabilistic-backend
|
||||||
#:distill-prompt
|
#:distill-prompt
|
||||||
#:*provider-cascade*
|
#:*provider-cascade*
|
||||||
|
|
||||||
;; --- Symbolic Logic ---
|
;; --- Deterministic Logic ---
|
||||||
#:list-objects-with-attribute
|
#:list-objects-with-attribute
|
||||||
#:decide
|
#:decide
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
** Architectural Intent: Unified Cognition
|
** Architectural Intent: Unified Cognition
|
||||||
The Reason stage is the cognitive engine of the Org-Agent. It unifies two distinct reasoning modes:
|
The Reason stage is the cognitive engine of the Org-Agent. It unifies two distinct reasoning modes:
|
||||||
1. **Probabilistic Reasoning:** Consulting neural models to generate action proposals based on context.
|
1. **Probabilistic Reasoning:** Consulting neural models to generate action proposals based on context.
|
||||||
2. **Deterministic Reasoning:** Running those proposals through symbolic safety gates (Policy and Validation) to ensure alignment.
|
2. **Deterministic Reasoning:** Running those proposals through deterministic safety gates (Policy and Validation) to ensure alignment.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/reason.lisp
|
#+begin_src lisp :tangle ../src/reason.lisp
|
||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
@@ -43,7 +43,7 @@ The Reason stage is the cognitive engine of the Org-Agent. It unifies two distin
|
|||||||
(tool-belt (generate-tool-belt-prompt))
|
(tool-belt (generate-tool-belt-prompt))
|
||||||
(global-context (context-assemble-global-awareness)))
|
(global-context (context-assemble-global-awareness)))
|
||||||
(if active-skill
|
(if active-skill
|
||||||
(let* ((prompt-generator (skill-neuro-prompt active-skill))
|
(let* ((prompt-generator (skill-probabilistic-prompt active-skill))
|
||||||
(raw-prompt (when prompt-generator (funcall prompt-generator context)))
|
(raw-prompt (when prompt-generator (funcall prompt-generator context)))
|
||||||
(system-prompt (concatenate 'string "IDENTITY: Actuator for org-agent. MANDATE: ONE Lisp plist. " global-context " " tool-belt)))
|
(system-prompt (concatenate 'string "IDENTITY: Actuator for org-agent. MANDATE: ONE Lisp plist. " global-context " " tool-belt)))
|
||||||
(if (and raw-prompt (> (length raw-prompt) 1))
|
(if (and raw-prompt (> (length raw-prompt) 1))
|
||||||
@@ -57,13 +57,13 @@ The Reason stage is the cognitive engine of the Org-Agent. It unifies two distin
|
|||||||
;; --- 2. Deterministic Mechanisms ---
|
;; --- 2. Deterministic Mechanisms ---
|
||||||
|
|
||||||
(defun deterministic-verify (proposed-action context)
|
(defun deterministic-verify (proposed-action context)
|
||||||
"Iterates through all skill symbolic-gates sorted by priority."
|
"Iterates through all skill deterministic-gates sorted by priority."
|
||||||
(let ((current-action proposed-action)
|
(let ((current-action proposed-action)
|
||||||
(skills nil))
|
(skills nil))
|
||||||
(maphash (lambda (name skill) (declare (ignore name)) (when (skill-symbolic-fn skill) (push skill skills))) *skills-registry*)
|
(maphash (lambda (name skill) (declare (ignore name)) (when (skill-deterministic-fn skill) (push skill skills))) *skills-registry*)
|
||||||
(setf skills (sort skills #'> :key #'skill-priority))
|
(setf skills (sort skills #'> :key #'skill-priority))
|
||||||
(dolist (skill skills)
|
(dolist (skill skills)
|
||||||
(let ((gate (skill-symbolic-fn skill)))
|
(let ((gate (skill-deterministic-fn skill)))
|
||||||
(setf current-action (funcall gate current-action context))
|
(setf current-action (funcall gate current-action context))
|
||||||
(when (and (listp current-action) (member (getf current-action :type) '(:LOG :EVENT)))
|
(when (and (listp current-action) (member (getf current-action :type) '(:LOG :EVENT)))
|
||||||
(harness-log "DETERMINISTIC: Intercepted by skill '~a'" (skill-name skill))
|
(harness-log "DETERMINISTIC: Intercepted by skill '~a'" (skill-name skill))
|
||||||
|
|||||||
@@ -44,10 +44,10 @@ We begin by ensuring we are in the correct isolated harness namespace.
|
|||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Skill Metadata (defstruct skill)
|
** Skill Metadata (defstruct skill)
|
||||||
The core data structure representing an agent capability. It includes the trigger condition, the neural prompt generator, and the symbolic safety gate.
|
The core data structure representing an agent capability. It includes the trigger condition, the probabilistic prompt generator, and the deterministic safety gate.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/skills.lisp
|
#+begin_src lisp :tangle ../src/skills.lisp
|
||||||
(defstruct skill name priority dependencies trigger-fn neuro-prompt symbolic-fn)
|
(defstruct skill name priority dependencies trigger-fn probabilistic-prompt deterministic-fn)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Skill Catalog Tracking
|
** Skill Catalog Tracking
|
||||||
@@ -83,15 +83,15 @@ The primary dispatcher for the Probabilistic Engine. It iterates through the reg
|
|||||||
The interface used within Org files to register new capabilities. Note that dependencies are explicitly quoted to prevent premature evaluation during the macro expansion phase.
|
The interface used within Org files to register new capabilities. Note that dependencies are explicitly quoted to prevent premature evaluation during the macro expansion phase.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/skills.lisp
|
#+begin_src lisp :tangle ../src/skills.lisp
|
||||||
(defmacro defskill (name &key priority dependencies trigger neuro symbolic)
|
(defmacro defskill (name &key priority dependencies trigger probabilistic deterministic)
|
||||||
"Registers a new skill into the global registry."
|
"Registers a new skill into the global registry."
|
||||||
`(setf (gethash (string-downcase (string ,name)) *skills-registry*)
|
`(setf (gethash (string-downcase (string ,name)) *skills-registry*)
|
||||||
(make-skill :name (string-downcase (string ,name))
|
(make-skill :name (string-downcase (string ,name))
|
||||||
:priority (or ,priority 10)
|
:priority (or ,priority 10)
|
||||||
:dependencies ',dependencies
|
:dependencies ',dependencies
|
||||||
:trigger-fn ,trigger
|
:trigger-fn ,trigger
|
||||||
:neuro-prompt ,neuro
|
:probabilistic-prompt ,probabilistic
|
||||||
:symbolic-fn ,symbolic)))
|
:deterministic-fn ,deterministic)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Dependency Resolution (resolve-skill-dependencies)
|
** Dependency Resolution (resolve-skill-dependencies)
|
||||||
@@ -118,21 +118,19 @@ A robust, low-level scanner that extracts `#+DEPENDS_ON:` and `:ID:` tags from a
|
|||||||
|
|
||||||
#+begin_src lisp :tangle ../src/skills.lisp
|
#+begin_src lisp :tangle ../src/skills.lisp
|
||||||
(defun parse-skill-metadata (filepath)
|
(defun parse-skill-metadata (filepath)
|
||||||
"Extracts ID and DEPENDS_ON tags using robust line-scanning."
|
"Extracts ID and DEPENDS_ON tags using robust regex scanning."
|
||||||
(let ((dependencies nil)
|
(let ((dependencies nil)
|
||||||
(id nil))
|
(id nil)
|
||||||
(with-open-file (stream filepath)
|
(content (uiop:read-file-string filepath)))
|
||||||
(loop for line = (read-line stream nil :eof)
|
;; Extract ID
|
||||||
until (eq line :eof)
|
(multiple-value-bind (match regs)
|
||||||
do (let ((clean (string-trim '(#\Space #\Tab #\Return #\Newline) line)))
|
(ppcre:scan-to-strings "(?im:^:ID:\\s*([^\\s\\r\\n]+))" content)
|
||||||
(cond
|
(when match (setf id (aref regs 0))))
|
||||||
((uiop:string-prefix-p "#+DEPENDS_ON:" (string-upcase clean))
|
;; Extract all DEPENDS_ON lines
|
||||||
(let* ((deps-part (string-trim " " (subseq clean 13))))
|
(ppcre:do-register-groups (deps-string)
|
||||||
(setf dependencies (append dependencies
|
("(?im:^#\\+DEPENDS_ON:\\s*(.*))" content)
|
||||||
(mapcar (lambda (s) (string-trim "[] " s))
|
(let ((deps (ppcre:split "\\s+" (string-trim " " deps-string))))
|
||||||
(uiop:split-string deps-part :separator '(#\Space #\Tab)))))))
|
(setf dependencies (append dependencies (mapcar (lambda (s) (string-trim "[] " s)) deps)))))
|
||||||
((uiop:string-prefix-p ":ID:" (string-upcase clean))
|
|
||||||
(setf id (string-trim '(#\Space #\Tab) (subseq clean 4))))))))
|
|
||||||
(values id (remove-if (lambda (s) (= 0 (length s))) dependencies))))
|
(values id (remove-if (lambda (s) (= 0 (length s))) dependencies))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -149,6 +147,7 @@ It performs three critical roles:
|
|||||||
"Returns a list of skill filepaths sorted by dependency (dependencies first)."
|
"Returns a list of skill filepaths sorted by dependency (dependencies first)."
|
||||||
(let ((files (uiop:directory-files skills-dir "org-skill-*.org"))
|
(let ((files (uiop:directory-files skills-dir "org-skill-*.org"))
|
||||||
(adj (make-hash-table :test 'equal))
|
(adj (make-hash-table :test 'equal))
|
||||||
|
(name-to-file (make-hash-table :test 'equal))
|
||||||
(id-to-file (make-hash-table :test 'equal))
|
(id-to-file (make-hash-table :test 'equal))
|
||||||
(result nil)
|
(result nil)
|
||||||
(visited (make-hash-table :test 'equal))
|
(visited (make-hash-table :test 'equal))
|
||||||
@@ -156,7 +155,7 @@ It performs three critical roles:
|
|||||||
(dolist (file files)
|
(dolist (file files)
|
||||||
(let ((filename (pathname-name file)))
|
(let ((filename (pathname-name file)))
|
||||||
(multiple-value-bind (id deps) (parse-skill-metadata file)
|
(multiple-value-bind (id deps) (parse-skill-metadata file)
|
||||||
(setf (gethash (string-downcase filename) id-to-file) file)
|
(setf (gethash (string-downcase filename) name-to-file) file)
|
||||||
(when id (setf (gethash (string-downcase id) id-to-file) file))
|
(when id (setf (gethash (string-downcase id) id-to-file) file))
|
||||||
(setf (gethash (string-downcase filename) adj) deps))))
|
(setf (gethash (string-downcase filename) adj) deps))))
|
||||||
(labels ((visit (file)
|
(labels ((visit (file)
|
||||||
@@ -165,10 +164,12 @@ It performs three critical roles:
|
|||||||
(unless (gethash node-key visited)
|
(unless (gethash node-key visited)
|
||||||
(setf (gethash node-key stack) t)
|
(setf (gethash node-key stack) t)
|
||||||
(dolist (dep (gethash node-key adj))
|
(dolist (dep (gethash node-key adj))
|
||||||
(let* ((dep-id (if (and (> (length dep) 3) (uiop:string-prefix-p "id:" (string-downcase dep)))
|
(let* ((is-id-p (uiop:string-prefix-p "id:" (string-downcase dep)))
|
||||||
(subseq dep 3)
|
(dep-key (string-downcase (if is-id-p (subseq dep 3) dep)))
|
||||||
dep))
|
(dep-file (if is-id-p
|
||||||
(dep-file (gethash (string-downcase dep-id) id-to-file)))
|
(gethash dep-key id-to-file)
|
||||||
|
(or (gethash dep-key id-to-file)
|
||||||
|
(gethash dep-key name-to-file)))))
|
||||||
(when dep-file
|
(when dep-file
|
||||||
(let ((dep-filename (pathname-name dep-file)))
|
(let ((dep-filename (pathname-name dep-file)))
|
||||||
(if (gethash (string-downcase dep-filename) stack)
|
(if (gethash (string-downcase dep-filename) stack)
|
||||||
@@ -179,9 +180,9 @@ It performs three critical roles:
|
|||||||
(push file result)))))
|
(push file result)))))
|
||||||
(let ((filenames (sort (mapcar #'pathname-name files) #'string<)))
|
(let ((filenames (sort (mapcar #'pathname-name files) #'string<)))
|
||||||
(dolist (name filenames)
|
(dolist (name filenames)
|
||||||
(let ((file (gethash (string-downcase name) id-to-file)))
|
(let ((file (gethash (string-downcase name) name-to-file)))
|
||||||
(when file (visit file)))))
|
(when file (visit file)))))
|
||||||
result)))
|
(nreverse result))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Syntax Validation (validate-lisp-syntax)
|
** Syntax Validation (validate-lisp-syntax)
|
||||||
|
|||||||
@@ -35,24 +35,24 @@ This system defines the core "Thin Harness." It includes the protocol, the objec
|
|||||||
:author "Amr"
|
:author "Amr"
|
||||||
:version "0.1.0"
|
:version "0.1.0"
|
||||||
:license "MIT"
|
:license "MIT"
|
||||||
:description "The Neurosymbolic Lisp Machine Harness"
|
:description "The Probabilistic-Deterministic Lisp Machine Harness"
|
||||||
:depends-on (:usocket :cl-json :bordeaux-threads :dexador :uiop :cl-dotenv :cl-ppcre :hunchentoot :ironclad :str)
|
:depends-on (:usocket :cl-json :bordeaux-threads :dexador :uiop :cl-dotenv :cl-ppcre :hunchentoot :ironclad :str)
|
||||||
:serial t
|
:serial t
|
||||||
:components ((:file "src/package")
|
:components ((:file "src/package")
|
||||||
(:file "src/skills")
|
(:file "src/skills")
|
||||||
(:file "src/system-invariants")
|
(:file "src/system-invariants")
|
||||||
(:file "src/engineering-standards")
|
(:file "src/engineering-standards")
|
||||||
(:file "src/protocol-validator")
|
(:file "src/communication-validator")
|
||||||
(:file "src/protocol")
|
(:file "src/communication")
|
||||||
(:file "src/object-store")
|
(:file "src/object-store")
|
||||||
(:file "src/embedding")
|
(:file "src/embedding")
|
||||||
(:file "src/embedding-logic")
|
(:file "src/embedding-logic")
|
||||||
(:file "src/context")
|
(:file "src/context")
|
||||||
(:file "src/context-logic")
|
(:file "src/context-logic")
|
||||||
(:file "src/neuro")
|
(:file "src/probabilistic")
|
||||||
(:file "src/credentials-vault")
|
(:file "src/credentials-vault")
|
||||||
(:file "src/llm-gateway")
|
(:file "src/llm-gateway")
|
||||||
(:file "src/symbolic")
|
(:file "src/deterministic")
|
||||||
(:file "src/lisp-validator")
|
(:file "src/lisp-validator")
|
||||||
(:file "src/self-fix")
|
(:file "src/self-fix")
|
||||||
(:file "src/lisp-repair")
|
(:file "src/lisp-repair")
|
||||||
@@ -74,7 +74,7 @@ This system contains the empirical tests required by the Engineering Standards.
|
|||||||
#+begin_src lisp :tangle ../org-agent.asd
|
#+begin_src lisp :tangle ../org-agent.asd
|
||||||
(defsystem :org-agent/tests
|
(defsystem :org-agent/tests
|
||||||
:depends-on (:org-agent :fiveam)
|
:depends-on (:org-agent :fiveam)
|
||||||
:components ((:file "tests/protocol-tests")
|
:components ((:file "tests/communication-tests")
|
||||||
(:file "tests/pipeline-tests")
|
(:file "tests/pipeline-tests")
|
||||||
(:file "tests/peripheral-vision-tests")
|
(:file "tests/peripheral-vision-tests")
|
||||||
(:file "tests/lisp-validator-tests")
|
(:file "tests/lisp-validator-tests")
|
||||||
|
|||||||
@@ -3,47 +3,41 @@
|
|||||||
:author "Amr"
|
:author "Amr"
|
||||||
:version "0.1.0"
|
:version "0.1.0"
|
||||||
:license "MIT"
|
:license "MIT"
|
||||||
:description "The Metabolic Neurosymbolic Lisp Machine"
|
:description "The Probabilistic-Deterministic Lisp Machine Harness"
|
||||||
:depends-on (:usocket :cl-json :bordeaux-threads :dexador :uiop :cl-dotenv :cl-ppcre :hunchentoot :ironclad :str)
|
:depends-on (:usocket :cl-json :bordeaux-threads :dexador :uiop :cl-dotenv :cl-ppcre :hunchentoot :ironclad :str)
|
||||||
:serial t
|
:serial t
|
||||||
:components ((:file "src/package")
|
:components ((:file "src/package")
|
||||||
(:file "src/skills")
|
(:file "src/skills")
|
||||||
|
(:file "src/system-invariants")
|
||||||
(:file "src/engineering-standards")
|
(:file "src/engineering-standards")
|
||||||
(:file "src/protocol-validator")
|
(:file "src/communication-validator")
|
||||||
(:file "src/protocol")
|
(:file "src/communication")
|
||||||
;; --- Memory Layer ---
|
|
||||||
(:file "src/object-store")
|
(:file "src/object-store")
|
||||||
(:file "src/homoiconic-memory")
|
|
||||||
(:file "src/state-persistence")
|
|
||||||
(:file "src/embedding")
|
(:file "src/embedding")
|
||||||
(:file "src/embedding-logic")
|
(:file "src/embedding-logic")
|
||||||
(:file "src/context")
|
(:file "src/context")
|
||||||
(:file "src/context-logic")
|
(:file "src/context-logic")
|
||||||
;; --- Metabolic Harness ---
|
(:file "src/probabilistic")
|
||||||
(:file "src/perceive")
|
|
||||||
(:file "src/reason")
|
|
||||||
(:file "src/act")
|
|
||||||
(:file "src/loop")
|
|
||||||
;; --- Core Mandatory Skills ---
|
|
||||||
(:file "src/policy-enforcer")
|
|
||||||
(:file "src/lisp-validator")
|
|
||||||
(:file "src/harness-monitor")
|
|
||||||
(:file "src/llm-gateway")
|
|
||||||
(:file "src/credentials-vault")
|
(:file "src/credentials-vault")
|
||||||
(:file "src/chat-logic")
|
(:file "src/llm-gateway")
|
||||||
|
(:file "src/deterministic")
|
||||||
|
(:file "src/lisp-validator")
|
||||||
(:file "src/self-fix")
|
(:file "src/self-fix")
|
||||||
(:file "src/lisp-repair")
|
(:file "src/lisp-repair")
|
||||||
;; --- Gateways ---
|
(:file "src/bouncer")
|
||||||
|
(:file "src/verification-logic")
|
||||||
|
(:file "src/loop")
|
||||||
(:file "src/gateway-telegram")
|
(:file "src/gateway-telegram")
|
||||||
(:file "src/gateway-signal")
|
(:file "src/gateway-signal")
|
||||||
(:file "src/gateway-matrix"))
|
(:file "src/gateway-matrix")
|
||||||
|
(:file "src/playwright"))
|
||||||
:build-operation "program-op"
|
:build-operation "program-op"
|
||||||
:build-pathname "org-agent-server"
|
:build-pathname "org-agent-server"
|
||||||
:entry-point "org-agent:main")
|
:entry-point "org-agent:main")
|
||||||
|
|
||||||
(defsystem :org-agent/tests
|
(defsystem :org-agent/tests
|
||||||
:depends-on (:org-agent :fiveam)
|
:depends-on (:org-agent :fiveam)
|
||||||
:components ((:file "tests/protocol-tests")
|
:components ((:file "tests/communication-tests")
|
||||||
(:file "tests/pipeline-tests")
|
(:file "tests/pipeline-tests")
|
||||||
(:file "tests/peripheral-vision-tests")
|
(:file "tests/peripheral-vision-tests")
|
||||||
(:file "tests/lisp-validator-tests")
|
(:file "tests/lisp-validator-tests")
|
||||||
@@ -58,12 +52,14 @@
|
|||||||
(:file "tests/llm-gateway-tests")
|
(:file "tests/llm-gateway-tests")
|
||||||
(:file "tests/gateway-telegram-tests")
|
(:file "tests/gateway-telegram-tests")
|
||||||
(:file "tests/gateway-signal-tests")
|
(:file "tests/gateway-signal-tests")
|
||||||
(:file "tests/gateway-matrix-tests"))
|
(:file "tests/gateway-matrix-tests")
|
||||||
|
(:file "tests/playwright-tests")
|
||||||
|
(:file "tests/chaos-qa"))
|
||||||
:perform (test-op (o s)
|
:perform (test-op (o s)
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :harness-protocol-suite :org-agent-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :harness-protocol-suite :org-agent-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :pipeline-suite :org-agent-pipeline-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :pipeline-suite :org-agent-pipeline-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :vision-suite :org-agent-peripheral-vision-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :vision-suite :org-agent-peripheral-vision-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :lisp-validator-suite :org-agent-lisp-validator-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :safety-suite :org-agent-safety-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :boot-suite :org-agent-boot-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :boot-suite :org-agent-boot-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :object-store-suite :org-agent-object-store-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :object-store-suite :org-agent-object-store-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :immune-suite :org-agent-immune-system-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :immune-suite :org-agent-immune-system-tests))
|
||||||
@@ -73,6 +69,9 @@
|
|||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :bouncer-suite :org-agent-bouncer-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :bouncer-suite :org-agent-bouncer-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :formal-verification-suite :org-agent-formal-verification-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :formal-verification-suite :org-agent-formal-verification-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :llm-gateway-suite :org-agent-llm-gateway-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :llm-gateway-suite :org-agent-llm-gateway-tests))
|
||||||
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :shell-actuator-suite :org-agent-shell-actuator-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :gateway-telegram-suite :org-agent-gateway-telegram-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :gateway-telegram-suite :org-agent-gateway-telegram-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :gateway-signal-suite :org-agent-gateway-signal-tests))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :gateway-signal-suite :org-agent-gateway-signal-tests))
|
||||||
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :gateway-matrix-suite :org-agent-gateway-matrix-tests))))
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :gateway-matrix-suite :org-agent-gateway-matrix-tests))
|
||||||
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :playwright-suite :org-agent-playwright-tests))
|
||||||
|
(uiop:symbol-call :fiveam :run! (uiop:find-symbol* :chaos-suite :org-agent-chaos-qa))))
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ While the *Formal Prover* ensures an action is "legal" (e.g., "Yes, you are allo
|
|||||||
|
|
||||||
1. **Secret Exposure Gate:** The Bouncer automatically scans all outgoing `:text` payloads for strings matching your API keys or sensitive IDs stored in the `Credentials Vault`.
|
1. **Secret Exposure Gate:** The Bouncer automatically scans all outgoing `:text` payloads for strings matching your API keys or sensitive IDs stored in the `Credentials Vault`.
|
||||||
2. **Network Exfiltration Gate:** It monitors for unauthorized IP addresses or domains in shell commands, preventing the agent from "phoning home" to a malicious server.
|
2. **Network Exfiltration Gate:** It monitors for unauthorized IP addresses or domains in shell commands, preventing the agent from "phoning home" to a malicious server.
|
||||||
3. **The Final Filter:** The Bouncer sits at the very end of the symbolic pipeline. It is the last gate before an action touches the physical hardware.
|
3. **The Final Filter:** The Bouncer sits at the very end of the deterministic pipeline. It is the last gate before an action touches the physical hardware.
|
||||||
|
|
||||||
* Implementation
|
* Implementation
|
||||||
|
|
||||||
@@ -130,8 +130,8 @@ The primary entry point for all high-impact actions.
|
|||||||
:trigger (lambda (ctx)
|
:trigger (lambda (ctx)
|
||||||
(or (eq (getf (getf ctx :payload) :sensor) :approval-required)
|
(or (eq (getf (getf ctx :payload) :sensor) :approval-required)
|
||||||
(eq (getf (getf ctx :payload) :sensor) :heartbeat)))
|
(eq (getf (getf ctx :payload) :sensor) :heartbeat)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(declare (ignore action))
|
(declare (ignore action))
|
||||||
(let* ((payload (getf context :payload))
|
(let* ((payload (getf context :payload))
|
||||||
(sensor (getf payload :sensor)))
|
(sensor (getf payload :sensor)))
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ Interfaces for conversational event handling and UI integration. Source of truth
|
|||||||
t)))
|
t)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Symbolic Verification
|
** Deterministic Verification
|
||||||
#+begin_src lisp :tangle ../src/chat-logic.lisp
|
#+begin_src lisp :tangle ../src/chat-logic.lisp
|
||||||
(defun verify-skill-chat (proposed-action context)
|
(defun verify-skill-chat (proposed-action context)
|
||||||
(let* ((payload (getf proposed-action :payload))
|
(let* ((payload (getf proposed-action :payload))
|
||||||
@@ -109,7 +109,7 @@ Interfaces for conversational event handling and UI integration. Source of truth
|
|||||||
The Chat skill acts as the conversational UI. Because the ~org-agent~ kernel evaluates LLM output via ~read-from-string~ (expecting a valid s-expression) and the chat verifier strictly expects an Emacs ~:insert-at-end~ actuation, we must explicitly mandate that the LLM wraps its conversational output in a Common Lisp property list.
|
The Chat skill acts as the conversational UI. Because the ~org-agent~ kernel evaluates LLM output via ~read-from-string~ (expecting a valid s-expression) and the chat verifier strictly expects an Emacs ~:insert-at-end~ actuation, we must explicitly mandate that the LLM wraps its conversational output in a Common Lisp property list.
|
||||||
|
|
||||||
#+begin_src lisp :tangle ../src/chat-logic.lisp
|
#+begin_src lisp :tangle ../src/chat-logic.lisp
|
||||||
(defun neuro-skill-chat (context)
|
(defun probabilistic-skill-chat (context)
|
||||||
"Generates a conversational response, stripping system errors from context."
|
"Generates a conversational response, stripping system errors from context."
|
||||||
(let* ((payload (getf context :payload))
|
(let* ((payload (getf context :payload))
|
||||||
(raw-text (getf payload :text))
|
(raw-text (getf payload :text))
|
||||||
@@ -126,7 +126,7 @@ The Chat skill acts as the conversational UI. Because the ~org-agent~ kernel eva
|
|||||||
(:signal (format nil "- To reply via Signal: (:type :REQUEST :target :signal :chat-id \"~a\" :text \"<Response>\")" chat-id))
|
(:signal (format nil "- To reply via Signal: (:type :REQUEST :target :signal :chat-id \"~a\" :text \"<Response>\")" chat-id))
|
||||||
(:matrix (format nil "- To reply via Matrix: (:type :REQUEST :target :matrix :room-id \"~a\" :text \"<Response>\")" chat-id))
|
(:matrix (format nil "- To reply via Matrix: (:type :REQUEST :target :matrix :room-id \"~a\" :text \"<Response>\")" chat-id))
|
||||||
(t "- To reply via Emacs: (:type :REQUEST :target :emacs :action :insert-at-end :buffer \"*org-agent-chat*\" :text \"* <Response>\")"))))
|
(t "- To reply via Emacs: (:type :REQUEST :target :emacs :action :insert-at-end :buffer \"*org-agent-chat*\" :text \"* <Response>\")"))))
|
||||||
(ask-neuro trimmed-text :system-prompt (concatenate 'string
|
(ask-probabilistic trimmed-text :system-prompt (concatenate 'string
|
||||||
"ACTUATOR IDENTITY: You are the pure Lisp actuator for the org-agent kernel.
|
"ACTUATOR IDENTITY: You are the pure Lisp actuator for the org-agent kernel.
|
||||||
MANDATE: Output EXACTLY ONE Common Lisp property list starting with (:type :REQUEST).
|
MANDATE: Output EXACTLY ONE Common Lisp property list starting with (:type :REQUEST).
|
||||||
ZERO CONVERSATION: Do not explain. Do not use markdown.
|
ZERO CONVERSATION: Do not explain. Do not use markdown.
|
||||||
@@ -142,6 +142,6 @@ REQUIRED FORMATS:
|
|||||||
(defskill :skill-chat
|
(defskill :skill-chat
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger #'trigger-skill-chat
|
:trigger #'trigger-skill-chat
|
||||||
:neuro #'neuro-skill-chat
|
:probabilistic #'probabilistic-skill-chat
|
||||||
:symbolic #'verify-skill-chat)
|
:deterministic #'verify-skill-chat)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ Enable reliable, cross-instance coordination without a central master.
|
|||||||
(defskill :skill-consensus
|
(defskill :skill-consensus
|
||||||
:priority 85
|
:priority 85
|
||||||
:trigger (lambda (context) (eq (getf (getf context :payload) :sensor) :conflict-detected))
|
:trigger (lambda (context) (eq (getf (getf context :payload) :sensor) :conflict-detected))
|
||||||
:neuro (lambda (context) "Formulate a consensus proposal for the peer swarm.")
|
:probabilistic (lambda (context) "Formulate a consensus proposal for the peer swarm.")
|
||||||
:symbolic (lambda (action context) action))
|
:deterministic (lambda (action context) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ Securely manage all authentication tokens required for the PSF to operate.
|
|||||||
:END:
|
:END:
|
||||||
|
|
||||||
** 1. Architectural Intent
|
** 1. Architectural Intent
|
||||||
The vault provides a secure lookup table in RAM, backed by the persistent Object Store. Access is restricted to internal kernel requests and explicitly authorized symbolic gates.
|
The vault provides a secure lookup table in RAM, backed by the persistent Object Store. Access is restricted to internal kernel requests and explicitly authorized deterministic gates.
|
||||||
|
|
||||||
** 2. Semantic Interfaces
|
** 2. Semantic Interfaces
|
||||||
#+begin_src lisp
|
#+begin_src lisp
|
||||||
@@ -143,8 +143,8 @@ Retained from the legacy Google skill, this provides the instructions for the so
|
|||||||
(defskill :skill-credentials-vault
|
(defskill :skill-credentials-vault
|
||||||
:priority 200 ; High priority, foundational
|
:priority 200 ; High priority, foundational
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :onboarding-request))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :onboarding-request))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(vault-onboard-gemini-web)
|
(vault-onboard-gemini-web)
|
||||||
action)))
|
action)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ Provide a standardized interface for converting text into vector representations
|
|||||||
:END:
|
:END:
|
||||||
|
|
||||||
** 1. Architectural Intent
|
** 1. Architectural Intent
|
||||||
Move heavy neural and mathematical logic out of `core.lisp` and `neuro.lisp` into a dedicated skill.
|
Move heavy neural and mathematical logic out of `core.lisp` and `probabilistic.lisp` into a dedicated skill.
|
||||||
|
|
||||||
** 2. Semantic Interfaces
|
** 2. Semantic Interfaces
|
||||||
|
|
||||||
@@ -108,8 +108,8 @@ Move heavy neural and mathematical logic out of `core.lisp` and `neuro.lisp` int
|
|||||||
(defskill :skill-embedding
|
(defskill :skill-embedding
|
||||||
:priority 50
|
:priority 50
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :embedding-request))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :embedding-request))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(declare (ignore ctx))
|
(declare (ignore ctx))
|
||||||
(case (getf action :action)
|
(case (getf action :action)
|
||||||
(:get-embedding (get-embedding (getf action :text)))
|
(:get-embedding (get-embedding (getf action :text)))
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ The Engineering Standards skill provides the deterministic enforcement of the wo
|
|||||||
(org-agent:defskill :skill-engineering-standards
|
(org-agent:defskill :skill-engineering-standards
|
||||||
:priority 900 ; High priority, runs before most skills
|
:priority 900 ; High priority, runs before most skills
|
||||||
:trigger (lambda (ctx) t) ; Always active
|
:trigger (lambda (ctx) t) ; Always active
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic #'engineering-standards-gate)
|
:deterministic #'engineering-standards-gate)
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* See Also
|
* See Also
|
||||||
|
|||||||
@@ -64,6 +64,6 @@ Define a standardized `CONFIG` object type in the Object Store. Provide getter/s
|
|||||||
(defskill :skill-environment-config
|
(defskill :skill-environment-config
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger (lambda (context) nil) ; Passive utility skill
|
:trigger (lambda (context) nil) ; Passive utility skill
|
||||||
:neuro (lambda (context) nil)
|
:probabilistic (lambda (context) nil)
|
||||||
:symbolic (lambda (action context) action))
|
:deterministic (lambda (action context) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -170,8 +170,8 @@ We register the orchestrator as a core skill and hot-patch the harness's routing
|
|||||||
(defskill :skill-event-orchestrator
|
(defskill :skill-event-orchestrator
|
||||||
:priority 400 ; Foundational control layer
|
:priority 400 ; Foundational control layer
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :heartbeat))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :heartbeat))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(orchestrator-process-cron)
|
(orchestrator-process-cron)
|
||||||
action)))
|
action)))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#+FILETAGS: :security:logic:formal-methods:psf:
|
#+FILETAGS: :security:logic:formal-methods:psf:
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
The *Formal Verification Gate* replaces heuristic whitelisting with symbolic logic proofs. It ensures that every action proposed by Probabilistic Engine is *provably safe* against the harness's core security invariants using a Lisp-native symbolic prover.
|
The *Formal Verification Gate* replaces heuristic whitelisting with deterministic logic proofs. It ensures that every action proposed by Probabilistic Engine is *provably safe* against the harness's core security invariants using a Lisp-native deterministic prover.
|
||||||
|
|
||||||
** Deep Reasoning: The Sandbox of Intent
|
** Deep Reasoning: The Sandbox of Intent
|
||||||
This gate is the first line of defense against both "Inside Threats" (maliciously modified skill files) and "Hallucination Threats" (LLMs generating unsafe commands).
|
This gate is the first line of defense against both "Inside Threats" (maliciously modified skill files) and "Hallucination Threats" (LLMs generating unsafe commands).
|
||||||
@@ -29,7 +29,7 @@ Define a logic-based verification layer for high-integrity decision making witho
|
|||||||
|
|
||||||
** 2. Success Criteria
|
** 2. Success Criteria
|
||||||
- [ ] *Invariants:* Express security properties as Lisp predicates.
|
- [ ] *Invariants:* Express security properties as Lisp predicates.
|
||||||
- [ ] *Soundness:* Block any action that fails a symbolic safety check.
|
- [ ] *Soundness:* Block any action that fails a deterministic safety check.
|
||||||
- [ ] *Path Confinement:* Prove that file operations are confined to the Sovereign's memex.
|
- [ ] *Path Confinement:* Prove that file operations are confined to the Sovereign's memex.
|
||||||
- [ ] *Network Protection:* Prove that shell commands do not attempt unauthorized data exfiltration.
|
- [ ] *Network Protection:* Prove that shell commands do not attempt unauthorized data exfiltration.
|
||||||
|
|
||||||
@@ -117,7 +117,7 @@ The core prover that applies all relevant invariants to an action.
|
|||||||
|
|
||||||
#+begin_src lisp :tangle ../src/verification-logic.lisp
|
#+begin_src lisp :tangle ../src/verification-logic.lisp
|
||||||
(defun verify-action-formally (action context)
|
(defun verify-action-formally (action context)
|
||||||
"Symbolically proves that ACTION satisfies all applicable security invariants."
|
"Deterministically proves that ACTION satisfies all applicable security invariants."
|
||||||
(let ((action-target (getf action :target))
|
(let ((action-target (getf action :target))
|
||||||
(action-type (getf action :type))
|
(action-type (getf action :type))
|
||||||
(all-passed t))
|
(all-passed t))
|
||||||
@@ -141,8 +141,8 @@ The core prover that applies all relevant invariants to an action.
|
|||||||
(defskill :skill-formal-verification
|
(defskill :skill-formal-verification
|
||||||
:priority 95 ; Just below Bouncer
|
:priority 95 ; Just below Bouncer
|
||||||
:trigger (lambda (context) (declare (ignore context)) nil) ; Middleware only
|
:trigger (lambda (context) (declare (ignore context)) nil) ; Middleware only
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(if (verify-action-formally action context)
|
(if (verify-action-formally action context)
|
||||||
action
|
action
|
||||||
(let ((err (format nil "Formal verification failed for action: ~s" action)))
|
(let ((err (format nil "Formal verification failed for action: ~s" action)))
|
||||||
|
|||||||
@@ -176,8 +176,8 @@ Define the passive skill entry for the gateway.
|
|||||||
(defskill :skill-gateway-matrix
|
(defskill :skill-gateway-matrix
|
||||||
:priority 150
|
:priority 150
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil)
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil)
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx) (declare (ignore ctx)) action))
|
:deterministic (lambda (action ctx) (declare (ignore ctx)) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Initialization
|
** Initialization
|
||||||
|
|||||||
@@ -146,8 +146,8 @@ Define the passive skill entry for the gateway.
|
|||||||
(defskill :skill-gateway-signal
|
(defskill :skill-gateway-signal
|
||||||
:priority 150
|
:priority 150
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx) (declare (ignore ctx)) action))
|
:deterministic (lambda (action ctx) (declare (ignore ctx)) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Initialization
|
** Initialization
|
||||||
|
|||||||
@@ -162,8 +162,8 @@ Define the passive skill entry for the gateway.
|
|||||||
(defskill :skill-gateway-telegram
|
(defskill :skill-gateway-telegram
|
||||||
:priority 150
|
:priority 150
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive, handles its own loop
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive, handles its own loop
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx) (declare (ignore ctx)) action))
|
:deterministic (lambda (action ctx) (declare (ignore ctx)) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Initialization
|
** Initialization
|
||||||
|
|||||||
@@ -47,6 +47,6 @@ The *Harness Monitor* provides tools for inspecting the internal state and healt
|
|||||||
(defskill :skill-harness-monitor
|
(defskill :skill-harness-monitor
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger (lambda (context) t)
|
:trigger (lambda (context) t)
|
||||||
:neuro (lambda (context) \"You are the Harness Monitor. Use your tools to provide system visibility.\")
|
:probabilistic (lambda (context) \"You are the Harness Monitor. Use your tools to provide system visibility.\")
|
||||||
:symbolic (lambda (action context) action))
|
:deterministic (lambda (action context) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -149,8 +149,8 @@ Converts a structured AST back into Org-mode text.
|
|||||||
(defskill :skill-homoiconic-memory
|
(defskill :skill-homoiconic-memory
|
||||||
:priority 300 ; Core foundational skill
|
:priority 300 ; Core foundational skill
|
||||||
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:buffer-save :ingest)))
|
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:buffer-save :ingest)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(let ((ast (getf (getf ctx :payload) :ast)))
|
(let ((ast (getf (getf ctx :payload) :ast)))
|
||||||
(when ast (memory-normalize-ast ast))
|
(when ast (memory-normalize-ast ast))
|
||||||
action))))
|
action))))
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#+FILETAGS: :gateway:sensors:io:psf:
|
#+FILETAGS: :gateway:sensors:io:psf:
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
The *Inbound Multi-Channel Gateway* provides the sensory interface for external messaging. It enables the agent to "hear" the user from various platforms (Signal, Telegram, SMS) by normalizing disparate inbound payloads into standard Neurosymbolic Kernel stimuli.
|
The *Inbound Multi-Channel Gateway* provides the sensory interface for external messaging. It enables the agent to "hear" the user from various platforms (Signal, Telegram, SMS) by normalizing disparate inbound payloads into standard Probabilistic-Deterministic Kernel stimuli.
|
||||||
|
|
||||||
* Phase A: Demand (PRD)
|
* Phase A: Demand (PRD)
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@@ -45,7 +45,7 @@ Define a secure and extensible ingress for external communication channels.
|
|||||||
** 1. Architectural Intent
|
** 1. Architectural Intent
|
||||||
The Inbound Gateway should operate as a modular, asynchronous service.
|
The Inbound Gateway should operate as a modular, asynchronous service.
|
||||||
Each channel (Signal, Telegram, Webhook) will have its own adapter responsible for receiving and normalizing messages.
|
Each channel (Signal, Telegram, Webhook) will have its own adapter responsible for receiving and normalizing messages.
|
||||||
A central dispatcher will then authenticate and inject these normalized messages as stimuli into the Neurosymbolic Kernel’s message bus.
|
A central dispatcher will then authenticate and inject these normalized messages as stimuli into the Probabilistic-Deterministic Kernel’s message bus.
|
||||||
Error handling and logging will be crucial for observability and maintainability.
|
Error handling and logging will be crucial for observability and maintainability.
|
||||||
|
|
||||||
** 2. Semantic Interfaces (Lisp Signatures)
|
** 2. Semantic Interfaces (Lisp Signatures)
|
||||||
@@ -75,7 +75,7 @@ Error handling and logging will be crucial for observability and maintainability
|
|||||||
- *Returns:* Boolean indicating successful authentication (T) or failure (NIL). Consider using ACLs (Access Control Lists).
|
- *Returns:* Boolean indicating successful authentication (T) or failure (NIL). Consider using ACLs (Access Control Lists).
|
||||||
|
|
||||||
*** `inject-stimulus`
|
*** `inject-stimulus`
|
||||||
- *Purpose:* Injects a normalized message into the Neurosymbolic Kernel's message bus as a stimulus.
|
- *Purpose:* Injects a normalized message into the Probabilistic-Deterministic Kernel's message bus as a stimulus.
|
||||||
- *Signature:* `(inject-stimulus stimulus-plist)`
|
- *Signature:* `(inject-stimulus stimulus-plist)`
|
||||||
- *Arguments:*
|
- *Arguments:*
|
||||||
- `stimulus-plist` (plist): The normalized message plist.
|
- `stimulus-plist` (plist): The normalized message plist.
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ CODE: ~a
|
|||||||
MANDATE: Output EXACTLY ONE valid Common Lisp list. Do not explain. Do not use markdown blocks."
|
MANDATE: Output EXACTLY ONE valid Common Lisp list. Do not explain. Do not use markdown blocks."
|
||||||
error-message code))
|
error-message code))
|
||||||
(system-prompt "You are a Lisp Syntax Repair Actuator. Return only valid, balanced Lisp code."))
|
(system-prompt "You are a Lisp Syntax Repair Actuator. Return only valid, balanced Lisp code."))
|
||||||
(let ((repaired (ask-neuro prompt :system-prompt system-prompt)))
|
(let ((repaired (ask-probabilistic prompt :system-prompt system-prompt)))
|
||||||
(string-trim '(#\Space #\Newline #\Tab) repaired))))
|
(string-trim '(#\Space #\Newline #\Tab) repaired))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -50,8 +50,8 @@ Reacts to syntax error events and transforms them into repaired requests.
|
|||||||
(defskill :skill-lisp-repair
|
(defskill :skill-lisp-repair
|
||||||
:priority 90
|
:priority 90
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :syntax-error))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :syntax-error))
|
||||||
:neuro nil ;; Handled deterministically in symbolic or manually via ask-neuro
|
:probabilistic nil ;; Handled deterministically in deterministic or manually via ask-probabilistic
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(declare (ignore action))
|
(declare (ignore action))
|
||||||
(let* ((payload (getf context :payload))
|
(let* ((payload (getf context :payload))
|
||||||
(code (getf payload :code))
|
(code (getf payload :code))
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#+FILETAGS: :security:lisp:ast:psf:
|
#+FILETAGS: :security:lisp:ast:psf:
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
The *Lisp Validator* is the primary structural gate for the Neurosymbolic Lisp Machine. It provides a recursive AST validator that subjects all Lisp proposals from the Probabilistic Engine to a strict "Deny-by-Default" sandbox.
|
The *Lisp Validator* is the primary structural gate for the Probabilistic-Deterministic Lisp Machine. It provides a recursive AST validator that subjects all Lisp proposals from the Probabilistic Engine to a strict "Deny-by-Default" sandbox.
|
||||||
|
|
||||||
* Phase A: Demand (PRD)
|
* Phase A: Demand (PRD)
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@@ -22,7 +22,7 @@ Define a high-integrity, recursive security sandbox for Lisp execution.
|
|||||||
- *Recursive Validation:* Every nested function call and variable access MUST be checked.
|
- *Recursive Validation:* Every nested function call and variable access MUST be checked.
|
||||||
- *Deny-by-Default:* Only explicitly whitelisted functions and variables are permitted.
|
- *Deny-by-Default:* Only explicitly whitelisted functions and variables are permitted.
|
||||||
- *Eval Protection:* Block all forms of `eval`, `load`, or dynamic execution.
|
- *Eval Protection:* Block all forms of `eval`, `load`, or dynamic execution.
|
||||||
- *Symbolic Preemption:* This skill acts as a mandatory global Deterministic Engine check.
|
- *Deterministic Preemption:* This skill acts as a mandatory global Deterministic Engine check.
|
||||||
|
|
||||||
** 3. Success Criteria
|
** 3. Success Criteria
|
||||||
*** DONE Implement recursive AST walker in Lisp
|
*** DONE Implement recursive AST walker in Lisp
|
||||||
@@ -149,8 +149,8 @@ We allow other skills to register safe symbols for the validator.
|
|||||||
(when candidate
|
(when candidate
|
||||||
(let ((payload (getf candidate :payload)))
|
(let ((payload (getf candidate :payload)))
|
||||||
(member (getf payload :action) '(:eval :shell))))))
|
(member (getf payload :action) '(:eval :shell))))))
|
||||||
:neuro nil ; Purely deterministic/safety skill
|
:probabilistic nil ; Purely deterministic/safety skill
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(harness-log "DETERMINISTIC ENGINE [Lisp-Validator]: Intercepted critical action for structural validation.")
|
(harness-log "DETERMINISTIC ENGINE [Lisp-Validator]: Intercepted critical action for structural validation.")
|
||||||
action))
|
action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ Register each supported provider with the harness's neural registry.
|
|||||||
|
|
||||||
#+begin_src lisp :tangle ../src/llm-gateway.lisp
|
#+begin_src lisp :tangle ../src/llm-gateway.lisp
|
||||||
(dolist (p '(:anthropic :gemini-api :gemini-web :groq :ollama :openai :openrouter))
|
(dolist (p '(:anthropic :gemini-api :gemini-web :groq :ollama :openai :openrouter))
|
||||||
(org-agent:register-neuro-backend p (lambda (prompt system-prompt &key model)
|
(org-agent:register-probabilistic-backend p (lambda (prompt system-prompt &key model)
|
||||||
(execute-llm-request prompt system-prompt :provider p :model model))))
|
(execute-llm-request prompt system-prompt :provider p :model model))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -172,8 +172,8 @@ Define the foundational skill entry for the gateway.
|
|||||||
(defskill :skill-llm-gateway
|
(defskill :skill-llm-gateway
|
||||||
:priority 150 ; Higher than individual old skills
|
:priority 150 ; Higher than individual old skills
|
||||||
:trigger (lambda (context) (declare (ignore context)) nil)
|
:trigger (lambda (context) (declare (ignore context)) nil)
|
||||||
:neuro (lambda (context) (declare (ignore context)) nil)
|
:probabilistic (lambda (context) (declare (ignore context)) nil)
|
||||||
:symbolic (lambda (action context) (declare (ignore context)) action))
|
:deterministic (lambda (action context) (declare (ignore context)) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Phase E: Chaos (Verification)
|
* Phase E: Chaos (Verification)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#+FILETAGS: :onboarding:calibration:setup:psf:
|
#+FILETAGS: :onboarding:calibration:setup:psf:
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
The *Onboarding Skill* ensures that the Lisp Machine environment is correctly calibrated. It automates the "zero-to-one" setup of the Neurosymbolic Kernel, including path normalization, identity personalization, and provider/actuator configuration.
|
The *Onboarding Skill* ensures that the Lisp Machine environment is correctly calibrated. It automates the "zero-to-one" setup of the Probabilistic-Deterministic Kernel, including path normalization, identity personalization, and provider/actuator configuration.
|
||||||
|
|
||||||
* Phase A: Demand (PRD)
|
* Phase A: Demand (PRD)
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ Refine the global awareness provided to the LLM by pruning irrelevant branches o
|
|||||||
** 3. Success Criteria
|
** 3. Success Criteria
|
||||||
- [ ] Correctly calculate semantic relevance using the Embedding skill.
|
- [ ] Correctly calculate semantic relevance using the Embedding skill.
|
||||||
- [ ] Recursively render the Org DAG with depth-based and similarity-based pruning.
|
- [ ] Recursively render the Org DAG with depth-based and similarity-based pruning.
|
||||||
- [ ] Successfully generate the `GLOBAL MEMEX AWARENESS` block for the neuro-gate.
|
- [ ] Successfully generate the `GLOBAL MEMEX AWARENESS` block for the probabilistic-gate.
|
||||||
|
|
||||||
* Phase B: Blueprint (PROTOCOL)
|
* Phase B: Blueprint (PROTOCOL)
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@@ -118,10 +118,10 @@ Move context pruning and rendering logic out of `context.lisp` to allow for more
|
|||||||
:priority 90
|
:priority 90
|
||||||
:dependencies ("org-skill-embedding")
|
:dependencies ("org-skill-embedding")
|
||||||
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:perceive :context-refresh)))
|
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:perceive :context-refresh)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(declare (ignore action ctx))
|
(declare (ignore action ctx))
|
||||||
;; This skill primarily provides the context-assemble-global-awareness function
|
;; This skill primarily provides the context-assemble-global-awareness function
|
||||||
;; used by the neuro-gate, rather than handling specific actions.
|
;; used by the probabilistic-gate, rather than handling specific actions.
|
||||||
nil))
|
nil))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ Unlike traditional software where a "Kernel" might have hardcoded rules, the Org
|
|||||||
|
|
||||||
1. **Topological Bootstrapping:** By declaring a #+DEPENDS_ON: dependency on the Policy file's ID, we ensure the System Policy is always registered in the Lisp image's skill catalog before this enforcer attempts to guard it.
|
1. **Topological Bootstrapping:** By declaring a #+DEPENDS_ON: dependency on the Policy file's ID, we ensure the System Policy is always registered in the Lisp image's skill catalog before this enforcer attempts to guard it.
|
||||||
2. **Priority Preemption:** By setting :priority 1000, this skill registers itself as the very first check in the decide-gate. It effectively "pre-empts" all other skills, ensuring that no action (like a shell command or a file write) is even considered until it has cleared the alignment check.
|
2. **Priority Preemption:** By setting :priority 1000, this skill registers itself as the very first check in the decide-gate. It effectively "pre-empts" all other skills, ensuring that no action (like a shell command or a file write) is even considered until it has cleared the alignment check.
|
||||||
3. **Decoupled Enforcement:** The harness does not "know" it is enforcing a policy. It simply executes the highest-priority symbolic functions provided by its skills. This allows the Sovereign to swap out policies or enforcers without ever touching the core harness code.
|
3. **Decoupled Enforcement:** The harness does not "know" it is enforcing a policy. It simply executes the highest-priority deterministic functions provided by its skills. This allows the Sovereign to swap out policies or enforcers without ever touching the core harness code.
|
||||||
|
|
||||||
* Implementation
|
* Implementation
|
||||||
|
|
||||||
@@ -25,9 +25,9 @@ Unlike traditional software where a "Kernel" might have hardcoded rules, the Org
|
|||||||
(defskill :skill-policy-enforcer
|
(defskill :skill-policy-enforcer
|
||||||
:priority 1000 ; Absolute highest priority
|
:priority 1000 ; Absolute highest priority
|
||||||
:trigger (lambda (context) t) ; Always active as a fallback
|
:trigger (lambda (context) t) ; Always active as a fallback
|
||||||
:neuro (lambda (context)
|
:probabilistic (lambda (context)
|
||||||
\"You are the Org-Agent Policy Enforcer. Your goal is to ensure all actions empower the user through the Lisp Machine and adhere to the System Policy.\")
|
\"You are the Org-Agent Policy Enforcer. Your goal is to ensure all actions empower the user through the Lisp Machine and adhere to the System Policy.\")
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
;; Basic invariant check: Block actions that appear to violate sovereignty
|
;; Basic invariant check: Block actions that appear to violate sovereignty
|
||||||
(let ((payload (getf action :payload)))
|
(let ((payload (getf action :payload)))
|
||||||
(if (and payload (search \"proprietary\" (format nil \"~s\" payload)))
|
(if (and payload (search \"proprietary\" (format nil \"~s\" payload)))
|
||||||
|
|||||||
@@ -8,7 +8,11 @@
|
|||||||
#+FILETAGS: :platform:policy:alignment:
|
#+FILETAGS: :platform:policy:alignment:
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
The *Org-Agent* is a neurosymbolic harness for a personal operating system. It uses Org-mode as its native memory and Common Lisp as its deterministic reasoning engine.
|
The *Org-Agent* is a probabilistic-deterministic harness for a personal operating system. It uses Org-mode as its native memory and Common Lisp as its deterministic reasoning engine.
|
||||||
|
|
||||||
|
#+begin_src lisp :tangle ../src/system-invariants.lisp
|
||||||
|
(in-package :org-agent)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
This document contains the *Core System Policy*. These are non-negotiable philosophical and technical constraints that every agentic action MUST satisfy.
|
This document contains the *Core System Policy*. These are non-negotiable philosophical and technical constraints that every agentic action MUST satisfy.
|
||||||
|
|
||||||
@@ -19,6 +23,14 @@ The Deterministic Engine uses these headlines as a "Moral Compass" during the de
|
|||||||
** 1. Sovereignty Above All
|
** 1. Sovereignty Above All
|
||||||
Every action must increase the user's independence from centralized, proprietary platforms. If a tool or library introduces a dependency on a non-sovereign entity, it must be flagged for replacement.
|
Every action must increase the user's independence from centralized, proprietary platforms. If a tool or library introduces a dependency on a non-sovereign entity, it must be flagged for replacement.
|
||||||
|
|
||||||
|
#+begin_src lisp :tangle ../src/system-invariants.lisp
|
||||||
|
(defun policy-check-sovereignty (action context)
|
||||||
|
"Ensures the action does not violate the Sovereignty invariant."
|
||||||
|
(declare (ignore context))
|
||||||
|
;; Implementation placeholder
|
||||||
|
action)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
** 2. Technical Mastery & Mentorship
|
** 2. Technical Mastery & Mentorship
|
||||||
The agent's goal is not to "do it for the user," but to "empower the user." Every autonomous action must be explained at a level that increases the user's technical understanding of the Lisp Machine.
|
The agent's goal is not to "do it for the user," but to "empower the user." Every autonomous action must be explained at a level that increases the user's technical understanding of the Lisp Machine.
|
||||||
|
|
||||||
@@ -33,3 +45,11 @@ Prioritize local, energy-efficient, and offline-first architectures. The "Memex"
|
|||||||
|
|
||||||
* Operational Mandates
|
* Operational Mandates
|
||||||
Every action performed by an agent in this environment must also adhere to the [[file:../../org-agent-contrib/org-skill-engineering-standards.org][Engineering Standards]].
|
Every action performed by an agent in this environment must also adhere to the [[file:../../org-agent-contrib/org-skill-engineering-standards.org][Engineering Standards]].
|
||||||
|
|
||||||
|
#+begin_src lisp :tangle ../src/system-invariants.lisp
|
||||||
|
(defskill :skill-policy
|
||||||
|
:priority 100
|
||||||
|
:trigger (lambda (ctx) t)
|
||||||
|
:probabilistic nil
|
||||||
|
:deterministic #'policy-check-sovereignty)
|
||||||
|
#+end_src
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
:ID: org-skill-harness-protocol-validator
|
:ID: org-skill-harness-protocol-validator
|
||||||
:CREATED: [2026-04-12 Sun 14:35]
|
:CREATED: [2026-04-12 Sun 14:35]
|
||||||
:END:
|
:END:
|
||||||
#+TITLE: SKILL: Harness Protocol Schema Validator (Universal Literate Note)
|
#+TITLE: SKILL: Harness Communication Schema Validator (Universal Literate Note)
|
||||||
#+STARTUP: content
|
#+STARTUP: content
|
||||||
#+FILETAGS: :protocol:harness-protocol:security:validation:psf:
|
#+FILETAGS: :protocol:harness-protocol:security:validation:psf:
|
||||||
|
|
||||||
* Overview
|
* Overview
|
||||||
The *Harness Protocol Schema Validator* skill provides deep structural validation for all messages entering the org-agent kernel. It ensures that every property list adheres to a strict schema, preventing malformed data from causing harness-level errors.
|
The *Harness Communication Schema Validator* skill provides deep structural validation for all messages entering the org-agent kernel. It ensures that every property list adheres to a strict schema, preventing malformed data from causing harness-level errors.
|
||||||
|
|
||||||
* Phase A: Demand (PRD)
|
* Phase A: Demand (PRD)
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@@ -15,7 +15,7 @@ The *Harness Protocol Schema Validator* skill provides deep structural validatio
|
|||||||
:END:
|
:END:
|
||||||
|
|
||||||
** 1. Purpose
|
** 1. Purpose
|
||||||
Enforce a formal grammar for the Org-Agent Control Protocol (Harness Protocol).
|
Enforce a formal grammar for the Org-Agent Control Protocol (Harness Communication).
|
||||||
|
|
||||||
** 2. User Needs
|
** 2. User Needs
|
||||||
- *Type Safety:* Ensure mandatory keys (e.g., `:type`, `:payload`) are present.
|
- *Type Safety:* Ensure mandatory keys (e.g., `:type`, `:payload`) are present.
|
||||||
@@ -45,46 +45,46 @@ Decouple protocol parsing (framing/unframing) from semantic validation.
|
|||||||
* Phase D: Build (Implementation)
|
* Phase D: Build (Implementation)
|
||||||
|
|
||||||
** Schema Enforcement
|
** Schema Enforcement
|
||||||
#+begin_src lisp :tangle ../src/protocol-validator.lisp
|
#+begin_src lisp :tangle ../src/communication-validator.lisp
|
||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
|
|
||||||
(defun validate-harness-protocol-schema (msg)
|
(defun validate-harness-protocol-schema (msg)
|
||||||
"Strict structural validation for incoming Harness Protocol messages."
|
"Strict structural validation for incoming Harness Communication messages."
|
||||||
(unless (listp msg)
|
(unless (listp msg)
|
||||||
(error "Harness Protocol Schema Error: Message must be a property list (got ~s)" (type-of msg)))
|
(error "Harness Communication Schema Error: Message must be a property list (got ~s)" (type-of msg)))
|
||||||
|
|
||||||
(let ((type (getf msg :type)))
|
(let ((type (getf msg :type)))
|
||||||
(unless (member type '(:REQUEST :EVENT :RESPONSE :LOG))
|
(unless (member type '(:REQUEST :EVENT :RESPONSE :LOG))
|
||||||
(error "Harness Protocol Schema Error: Invalid message type '~a'" type))
|
(error "Harness Communication Schema Error: Invalid message type '~a'" type))
|
||||||
|
|
||||||
(case type
|
(case type
|
||||||
(:REQUEST
|
(:REQUEST
|
||||||
(unless (getf msg :target)
|
(unless (getf msg :target)
|
||||||
(error "Harness Protocol Schema Error: REQUEST missing mandatory :target"))
|
(error "Harness Communication Schema Error: REQUEST missing mandatory :target"))
|
||||||
(unless (getf msg :payload)
|
(unless (getf msg :payload)
|
||||||
(error "Harness Protocol Schema Error: REQUEST missing mandatory :payload")))
|
(error "Harness Communication Schema Error: REQUEST missing mandatory :payload")))
|
||||||
|
|
||||||
(:EVENT
|
(:EVENT
|
||||||
(let ((payload (getf msg :payload)))
|
(let ((payload (getf msg :payload)))
|
||||||
(unless (and payload (listp payload))
|
(unless (and payload (listp payload))
|
||||||
(error "Harness Protocol Schema Error: EVENT missing or invalid :payload"))
|
(error "Harness Communication Schema Error: EVENT missing or invalid :payload"))
|
||||||
(unless (or (getf payload :action) (getf payload :sensor))
|
(unless (or (getf payload :action) (getf payload :sensor))
|
||||||
(error "Harness Protocol Schema Error: EVENT payload must contain :action or :sensor"))))
|
(error "Harness Communication Schema Error: EVENT payload must contain :action or :sensor"))))
|
||||||
|
|
||||||
(:RESPONSE
|
(:RESPONSE
|
||||||
(unless (getf msg :payload)
|
(unless (getf msg :payload)
|
||||||
(error "Harness Protocol Schema Error: RESPONSE missing mandatory :payload"))))
|
(error "Harness Communication Schema Error: RESPONSE missing mandatory :payload"))))
|
||||||
|
|
||||||
t))
|
t))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
* Registration
|
* Registration
|
||||||
#+begin_src lisp :tangle ../src/protocol-validator.lisp
|
#+begin_src lisp :tangle ../src/communication-validator.lisp
|
||||||
(defskill :skill-harness-protocol-validator
|
(defskill :skill-harness-protocol-validator
|
||||||
:priority 95
|
:priority 95
|
||||||
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:protocol-received)))
|
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:protocol-received)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(declare (ignore ctx))
|
(declare (ignore ctx))
|
||||||
(validate-harness-protocol-schema action)
|
(validate-harness-protocol-schema action)
|
||||||
action))
|
action))
|
||||||
|
|||||||
@@ -81,10 +81,10 @@ The *Self-Fix Agent* is the system's "Repair Mechanism." It takes failure hypoth
|
|||||||
(org-agent:defskill :skill-self-fix
|
(org-agent:defskill :skill-self-fix
|
||||||
:priority 95
|
:priority 95
|
||||||
:trigger (lambda (context) (eq (getf (getf context :payload) :sensor) :repair-request))
|
:trigger (lambda (context) (eq (getf (getf context :payload) :sensor) :repair-request))
|
||||||
:neuro (lambda (context)
|
:probabilistic (lambda (context)
|
||||||
(format nil "You are the PSF Repair Actuator. Synthesize a surgical fix for the reported failure.
|
(format nil "You are the PSF Repair Actuator. Synthesize a surgical fix for the reported failure.
|
||||||
Return a Lisp plist for :repair-file."))
|
Return a Lisp plist for :repair-file."))
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(let ((payload (getf action :payload)))
|
(let ((payload (getf action :payload)))
|
||||||
(self-fix-apply action context))))
|
(self-fix-apply action context))))
|
||||||
#+end_src
|
#+end_src
|
||||||
@@ -95,4 +95,4 @@ Return a Lisp plist for :repair-file."))
|
|||||||
:STATUS: SIGNED
|
:STATUS: SIGNED
|
||||||
:END:
|
: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))
|
** 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 probabilistic-skill-org-skill-self-fix (context))
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ Interfaces for secure system calls. State is event-driven via the core kernel bu
|
|||||||
*** DONE Diagnostic Capture
|
*** DONE Diagnostic Capture
|
||||||
- Verified that STDOUT, STDERR, and Exit Codes are correctly captured and re-injected.
|
- Verified that STDOUT, STDERR, and Exit Codes are correctly captured and re-injected.
|
||||||
*** DONE Result Analysis Loop
|
*** DONE Result Analysis Loop
|
||||||
- The `:neuro` component successfully formats command results for Sovereign review.
|
- The `:probabilistic` component successfully formats command results for Sovereign review.
|
||||||
|
|
||||||
* Phase B: Blueprint (PROTOCOL)
|
* Phase B: Blueprint (PROTOCOL)
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@@ -69,7 +69,7 @@ Interfaces for secure system calls. State is event-driven via the core kernel bu
|
|||||||
(defun trigger-skill-shell-actuator (context)
|
(defun trigger-skill-shell-actuator (context)
|
||||||
"Monitors for shell-response events.")
|
"Monitors for shell-response events.")
|
||||||
|
|
||||||
(defun neuro-skill-shell-actuator (context)
|
(defun probabilistic-skill-shell-actuator (context)
|
||||||
"Neural interpretation of command diagnostics.")
|
"Neural interpretation of command diagnostics.")
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
@@ -186,10 +186,10 @@ Hardware-Level Isolation for future security evolution.
|
|||||||
(eq (getf payload :sensor) :shell-response))))
|
(eq (getf payload :sensor) :shell-response))))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
** Neuro-Cognitive Analysis
|
** Probabilistic-Cognitive Analysis
|
||||||
#+begin_src lisp :tangle ../src/shell-logic.lisp
|
#+begin_src lisp :tangle ../src/shell-logic.lisp
|
||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
(defun neuro-skill-shell-actuator (context)
|
(defun probabilistic-skill-shell-actuator (context)
|
||||||
(let* ((p (getf context :payload))
|
(let* ((p (getf context :payload))
|
||||||
(cmd (getf p :cmd))
|
(cmd (getf p :cmd))
|
||||||
(stdout (getf p :stdout))
|
(stdout (getf p :stdout))
|
||||||
@@ -242,6 +242,6 @@ Define the skill entry for the shell actuator.
|
|||||||
(defskill :skill-shell-actuator
|
(defskill :skill-shell-actuator
|
||||||
:priority 80
|
:priority 80
|
||||||
:trigger #'trigger-skill-shell-actuator
|
:trigger #'trigger-skill-shell-actuator
|
||||||
:neuro #'neuro-skill-shell-actuator
|
:probabilistic #'probabilistic-skill-shell-actuator
|
||||||
:symbolic (lambda (action context) (declare (ignore context)) action))
|
:deterministic (lambda (action context) (declare (ignore context)) action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -226,8 +226,8 @@ Expose persistence capabilities to the neural Probabilistic Engine.
|
|||||||
:trigger (lambda (ctx)
|
:trigger (lambda (ctx)
|
||||||
(let ((sensor (getf (getf ctx :payload) :sensor)))
|
(let ((sensor (getf (getf ctx :payload) :sensor)))
|
||||||
(member sensor '(:heartbeat :manual-persist))))
|
(member sensor '(:heartbeat :manual-persist))))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(persistence-dump-local)
|
(persistence-dump-local)
|
||||||
action))
|
action))
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
@@ -85,8 +85,8 @@ Enforces high-integrity semantic rules for task management.
|
|||||||
(defskill :skill-task-integrity
|
(defskill :skill-task-integrity
|
||||||
:priority 90
|
:priority 90
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil)
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil)
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(declare (ignore context))
|
(declare (ignore context))
|
||||||
(let ((err (task-integrity-check action)))
|
(let ((err (task-integrity-check action)))
|
||||||
(if err
|
(if err
|
||||||
|
|||||||
@@ -88,8 +88,8 @@
|
|||||||
:trigger (lambda (ctx)
|
:trigger (lambda (ctx)
|
||||||
(or (eq (getf (getf ctx :payload) :sensor) :approval-required)
|
(or (eq (getf (getf ctx :payload) :sensor) :approval-required)
|
||||||
(eq (getf (getf ctx :payload) :sensor) :heartbeat)))
|
(eq (getf (getf ctx :payload) :sensor) :heartbeat)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(declare (ignore action))
|
(declare (ignore action))
|
||||||
(let* ((payload (getf context :payload))
|
(let* ((payload (getf context :payload))
|
||||||
(sensor (getf payload :sensor)))
|
(sensor (getf payload :sensor)))
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
(let ((err-text (format nil "\n\n*System Error:* Chat agent returned invalid action: ~s" proposed-action)))
|
(let ((err-text (format nil "\n\n*System Error:* Chat agent returned invalid action: ~s" proposed-action)))
|
||||||
`(:type :request :target :emacs :payload (:action :insert-at-end :buffer "*org-agent-chat*" :text ,err-text))))))
|
`(:type :request :target :emacs :payload (:action :insert-at-end :buffer "*org-agent-chat*" :text ,err-text))))))
|
||||||
|
|
||||||
(defun neuro-skill-chat (context)
|
(defun probabilistic-skill-chat (context)
|
||||||
"Generates a conversational response, stripping system errors from context."
|
"Generates a conversational response, stripping system errors from context."
|
||||||
(let* ((payload (getf context :payload))
|
(let* ((payload (getf context :payload))
|
||||||
(raw-text (getf payload :text))
|
(raw-text (getf payload :text))
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
(:signal (format nil "- To reply via Signal: (:type :REQUEST :target :signal :chat-id \"~a\" :text \"<Response>\")" chat-id))
|
(:signal (format nil "- To reply via Signal: (:type :REQUEST :target :signal :chat-id \"~a\" :text \"<Response>\")" chat-id))
|
||||||
(:matrix (format nil "- To reply via Matrix: (:type :REQUEST :target :matrix :room-id \"~a\" :text \"<Response>\")" chat-id))
|
(:matrix (format nil "- To reply via Matrix: (:type :REQUEST :target :matrix :room-id \"~a\" :text \"<Response>\")" chat-id))
|
||||||
(t "- To reply via Emacs: (:type :REQUEST :target :emacs :action :insert-at-end :buffer \"*org-agent-chat*\" :text \"* <Response>\")"))))
|
(t "- To reply via Emacs: (:type :REQUEST :target :emacs :action :insert-at-end :buffer \"*org-agent-chat*\" :text \"* <Response>\")"))))
|
||||||
(ask-neuro trimmed-text :system-prompt (concatenate 'string
|
(ask-probabilistic trimmed-text :system-prompt (concatenate 'string
|
||||||
"ACTUATOR IDENTITY: You are the pure Lisp actuator for the org-agent kernel.
|
"ACTUATOR IDENTITY: You are the pure Lisp actuator for the org-agent kernel.
|
||||||
MANDATE: Output EXACTLY ONE Common Lisp property list starting with (:type :REQUEST).
|
MANDATE: Output EXACTLY ONE Common Lisp property list starting with (:type :REQUEST).
|
||||||
ZERO CONVERSATION: Do not explain. Do not use markdown.
|
ZERO CONVERSATION: Do not explain. Do not use markdown.
|
||||||
@@ -79,5 +79,5 @@ REQUIRED FORMATS:
|
|||||||
(defskill :skill-chat
|
(defskill :skill-chat
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger #'trigger-skill-chat
|
:trigger #'trigger-skill-chat
|
||||||
:neuro #'neuro-skill-chat
|
:probabilistic #'probabilistic-skill-chat
|
||||||
:symbolic #'verify-skill-chat)
|
:deterministic #'verify-skill-chat)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
(use-hmac (and enforce-hmac (string-equal enforce-hmac "true")))
|
(use-hmac (and enforce-hmac (string-equal enforce-hmac "true")))
|
||||||
(prefix-len (if use-hmac 70 6)))
|
(prefix-len (if use-hmac 70 6)))
|
||||||
(when (< (length framed-string) prefix-len)
|
(when (< (length framed-string) prefix-len)
|
||||||
(error "Framed string too short for Harness Protocol prefix"))
|
(error "Framed string too short for Harness Communication prefix"))
|
||||||
|
|
||||||
(let* ((len-str (subseq framed-string 0 6))
|
(let* ((len-str (subseq framed-string 0 6))
|
||||||
(signature (when use-hmac (subseq framed-string 6 70)))
|
(signature (when use-hmac (subseq framed-string 6 70)))
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
(ironclad:update-mac hmac payload-bytes)
|
(ironclad:update-mac hmac payload-bytes)
|
||||||
(let ((expected-signature (ironclad:byte-array-to-hex-string (ironclad:produce-mac hmac))))
|
(let ((expected-signature (ironclad:byte-array-to-hex-string (ironclad:produce-mac hmac))))
|
||||||
(unless (string-equal signature expected-signature)
|
(unless (string-equal signature expected-signature)
|
||||||
(error "Harness Protocol Integrity Failure: HMAC mismatch"))))))
|
(error "Harness Communication Integrity Failure: HMAC mismatch"))))))
|
||||||
|
|
||||||
;; SECURITY: Disable the reader's ability to execute code during parsing
|
;; SECURITY: Disable the reader's ability to execute code during parsing
|
||||||
(let ((*read-eval* nil))
|
(let ((*read-eval* nil))
|
||||||
@@ -64,9 +64,9 @@
|
|||||||
:priority 90
|
:priority 90
|
||||||
:dependencies ("org-skill-embedding")
|
:dependencies ("org-skill-embedding")
|
||||||
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:perceive :context-refresh)))
|
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:perceive :context-refresh)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(declare (ignore action ctx))
|
(declare (ignore action ctx))
|
||||||
;; This skill primarily provides the context-assemble-global-awareness function
|
;; This skill primarily provides the context-assemble-global-awareness function
|
||||||
;; used by the neuro-gate, rather than handling specific actions.
|
;; used by the probabilistic-gate, rather than handling specific actions.
|
||||||
nil))
|
nil))
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
(defskill :skill-credentials-vault
|
(defskill :skill-credentials-vault
|
||||||
:priority 200 ; High priority, foundational
|
:priority 200 ; High priority, foundational
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :onboarding-request))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :onboarding-request))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(vault-onboard-gemini-web)
|
(vault-onboard-gemini-web)
|
||||||
action)))
|
action)))
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
|
|
||||||
(defun decide (proposed-action context)
|
(defun decide (proposed-action context)
|
||||||
"The Deterministic Safety Gate: iterates through all skill symbolic-gates sorted by priority."
|
"The Deterministic Safety Gate: iterates through all skill deterministic-gates sorted by priority."
|
||||||
(let ((current-action proposed-action)
|
(let ((current-action proposed-action)
|
||||||
(skills nil))
|
(skills nil))
|
||||||
;; 1. Collect all skills with symbolic gates
|
;; 1. Collect all skills with deterministic gates
|
||||||
(maphash (lambda (name skill)
|
(maphash (lambda (name skill)
|
||||||
(declare (ignore name))
|
(declare (ignore name))
|
||||||
(when (skill-symbolic-fn skill)
|
(when (skill-deterministic-fn skill)
|
||||||
(push skill skills)))
|
(push skill skills)))
|
||||||
*skills-registry*)
|
*skills-registry*)
|
||||||
|
|
||||||
;; 2. Sort skills by priority (highest first)
|
;; 2. Sort skills by priority (highest first)
|
||||||
(setf skills (sort skills #'> :key #'skill-priority))
|
(setf skills (sort skills #'> :key #'skill-priority))
|
||||||
|
|
||||||
;; 3. Execute symbolic gates sequentially
|
;; 3. Execute deterministic gates sequentially
|
||||||
(dolist (skill skills)
|
(dolist (skill skills)
|
||||||
(let ((gate (skill-symbolic-fn skill)))
|
(let ((gate (skill-deterministic-fn skill)))
|
||||||
(setf current-action (funcall gate current-action context))
|
(setf current-action (funcall gate current-action context))
|
||||||
;; If any gate returns a LOG or EVENT (blocking/intercepting), stop and return it.
|
;; If any gate returns a LOG or EVENT (blocking/intercepting), stop and return it.
|
||||||
(when (and (listp current-action)
|
(when (and (listp current-action)
|
||||||
@@ -51,8 +51,8 @@
|
|||||||
(defskill :skill-embedding
|
(defskill :skill-embedding
|
||||||
:priority 50
|
:priority 50
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :embedding-request))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :embedding-request))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(declare (ignore ctx))
|
(declare (ignore ctx))
|
||||||
(case (getf action :action)
|
(case (getf action :action)
|
||||||
(:get-embedding (get-embedding (getf action :text)))
|
(:get-embedding (get-embedding (getf action :text)))
|
||||||
|
|||||||
@@ -26,5 +26,5 @@
|
|||||||
(org-agent:defskill :skill-engineering-standards
|
(org-agent:defskill :skill-engineering-standards
|
||||||
:priority 900 ; High priority, runs before most skills
|
:priority 900 ; High priority, runs before most skills
|
||||||
:trigger (lambda (ctx) t) ; Always active
|
:trigger (lambda (ctx) t) ; Always active
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic #'engineering-standards-gate)
|
:deterministic #'engineering-standards-gate)
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
(defskill :skill-event-orchestrator
|
(defskill :skill-event-orchestrator
|
||||||
:priority 400 ; Foundational control layer
|
:priority 400 ; Foundational control layer
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :heartbeat))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :heartbeat))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(orchestrator-process-cron)
|
(orchestrator-process-cron)
|
||||||
action)))
|
action)))
|
||||||
|
|||||||
@@ -89,7 +89,7 @@
|
|||||||
(defskill :skill-gateway-matrix
|
(defskill :skill-gateway-matrix
|
||||||
:priority 150
|
:priority 150
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil)
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil)
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx) (declare (ignore ctx)) action))
|
:deterministic (lambda (action ctx) (declare (ignore ctx)) action))
|
||||||
|
|
||||||
(start-matrix-gateway)
|
(start-matrix-gateway)
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
(defskill :skill-gateway-signal
|
(defskill :skill-gateway-signal
|
||||||
:priority 150
|
:priority 150
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx) (declare (ignore ctx)) action))
|
:deterministic (lambda (action ctx) (declare (ignore ctx)) action))
|
||||||
|
|
||||||
(start-signal-gateway)
|
(start-signal-gateway)
|
||||||
|
|||||||
@@ -75,7 +75,7 @@
|
|||||||
(defskill :skill-gateway-telegram
|
(defskill :skill-gateway-telegram
|
||||||
:priority 150
|
:priority 150
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive, handles its own loop
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ;; Passive, handles its own loop
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx) (declare (ignore ctx)) action))
|
:deterministic (lambda (action ctx) (declare (ignore ctx)) action))
|
||||||
|
|
||||||
(start-telegram-gateway)
|
(start-telegram-gateway)
|
||||||
|
|||||||
@@ -32,5 +32,5 @@
|
|||||||
(defskill :skill-harness-monitor
|
(defskill :skill-harness-monitor
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger (lambda (context) t)
|
:trigger (lambda (context) t)
|
||||||
:neuro (lambda (context) \"You are the Harness Monitor. Use your tools to provide system visibility.\")
|
:probabilistic (lambda (context) \"You are the Harness Monitor. Use your tools to provide system visibility.\")
|
||||||
:symbolic (lambda (action context) action))
|
:deterministic (lambda (action context) action))
|
||||||
|
|||||||
@@ -53,8 +53,8 @@
|
|||||||
(defskill :skill-homoiconic-memory
|
(defskill :skill-homoiconic-memory
|
||||||
:priority 300 ; Core foundational skill
|
:priority 300 ; Core foundational skill
|
||||||
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:buffer-save :ingest)))
|
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:buffer-save :ingest)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(let ((ast (getf (getf ctx :payload) :ast)))
|
(let ((ast (getf (getf ctx :payload) :ast)))
|
||||||
(when ast (memory-normalize-ast ast))
|
(when ast (memory-normalize-ast ast))
|
||||||
action))))
|
action))))
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
(setf *last-reflection-time* now)
|
(setf *last-reflection-time* now)
|
||||||
t)
|
t)
|
||||||
nil)))
|
nil)))
|
||||||
:neuro (lambda (ctx)
|
:probabilistic (lambda (ctx)
|
||||||
(declare (ignore ctx))
|
(declare (ignore ctx))
|
||||||
(let* ((memories (sample-random-memories 3))
|
(let* ((memories (sample-random-memories 3))
|
||||||
(context-string "LATENT REFLECTION CANDIDATES:\n"))
|
(context-string "LATENT REFLECTION CANDIDATES:\n"))
|
||||||
@@ -58,7 +58,7 @@ Find hidden connections, suggest new tags, or propose a new insight that bridges
|
|||||||
MANDATE: Output EXACTLY ONE Common Lisp property list starting with (:type :REQUEST).
|
MANDATE: Output EXACTLY ONE Common Lisp property list starting with (:type :REQUEST).
|
||||||
Use the :emacs target and :insert-at-end action to write your reflection into the \"*org-agent-chat*\" buffer."
|
Use the :emacs target and :insert-at-end action to write your reflection into the \"*org-agent-chat*\" buffer."
|
||||||
context-string)))
|
context-string)))
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(declare (ignore ctx))
|
(declare (ignore ctx))
|
||||||
;; Approve any safe request
|
;; Approve any safe request
|
||||||
action))
|
action))
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ CODE: ~a
|
|||||||
MANDATE: Output EXACTLY ONE valid Common Lisp list. Do not explain. Do not use markdown blocks."
|
MANDATE: Output EXACTLY ONE valid Common Lisp list. Do not explain. Do not use markdown blocks."
|
||||||
error-message code))
|
error-message code))
|
||||||
(system-prompt "You are a Lisp Syntax Repair Actuator. Return only valid, balanced Lisp code."))
|
(system-prompt "You are a Lisp Syntax Repair Actuator. Return only valid, balanced Lisp code."))
|
||||||
(let ((repaired (ask-neuro prompt :system-prompt system-prompt)))
|
(let ((repaired (ask-probabilistic prompt :system-prompt system-prompt)))
|
||||||
(string-trim '(#\Space #\Newline #\Tab) repaired))))
|
(string-trim '(#\Space #\Newline #\Tab) repaired))))
|
||||||
|
|
||||||
(defskill :skill-lisp-repair
|
(defskill :skill-lisp-repair
|
||||||
:priority 90
|
:priority 90
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :syntax-error))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :syntax-error))
|
||||||
:neuro nil ;; Handled deterministically in symbolic or manually via ask-neuro
|
:probabilistic nil ;; Handled deterministically in deterministic or manually via ask-probabilistic
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(declare (ignore action))
|
(declare (ignore action))
|
||||||
(let* ((payload (getf context :payload))
|
(let* ((payload (getf context :payload))
|
||||||
(code (getf payload :code))
|
(code (getf payload :code))
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
(when candidate
|
(when candidate
|
||||||
(let ((payload (getf candidate :payload)))
|
(let ((payload (getf candidate :payload)))
|
||||||
(member (getf payload :action) '(:eval :shell))))))
|
(member (getf payload :action) '(:eval :shell))))))
|
||||||
:neuro nil ; Purely deterministic/safety skill
|
:probabilistic nil ; Purely deterministic/safety skill
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(harness-log "DETERMINISTIC ENGINE [Lisp-Validator]: Intercepted critical action for structural validation.")
|
(harness-log "DETERMINISTIC ENGINE [Lisp-Validator]: Intercepted critical action for structural validation.")
|
||||||
action))
|
action))
|
||||||
|
|||||||
@@ -82,11 +82,11 @@
|
|||||||
:model (getf args :model))))
|
:model (getf args :model))))
|
||||||
|
|
||||||
(dolist (p '(:anthropic :gemini-api :gemini-web :groq :ollama :openai :openrouter))
|
(dolist (p '(:anthropic :gemini-api :gemini-web :groq :ollama :openai :openrouter))
|
||||||
(org-agent:register-neuro-backend p (lambda (prompt system-prompt &key model)
|
(org-agent:register-probabilistic-backend p (lambda (prompt system-prompt &key model)
|
||||||
(execute-llm-request prompt system-prompt :provider p :model model))))
|
(execute-llm-request prompt system-prompt :provider p :model model))))
|
||||||
|
|
||||||
(defskill :skill-llm-gateway
|
(defskill :skill-llm-gateway
|
||||||
:priority 150 ; Higher than individual old skills
|
:priority 150 ; Higher than individual old skills
|
||||||
:trigger (lambda (context) (declare (ignore context)) nil)
|
:trigger (lambda (context) (declare (ignore context)) nil)
|
||||||
:neuro (lambda (context) (declare (ignore context)) nil)
|
:probabilistic (lambda (context) (declare (ignore context)) nil)
|
||||||
:symbolic (lambda (action context) (declare (ignore context)) action))
|
:deterministic (lambda (action context) (declare (ignore context)) action))
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;;; org-agent.el --- Neurosymbolic Lisp Machine Kernel for Org-mode -*- lexical-binding: t; -*-
|
;;; org-agent.el --- Probabilistic-Deterministic Lisp Machine Kernel for Org-mode -*- lexical-binding: t; -*-
|
||||||
|
|
||||||
;; Copyright (C) 2026 Amr
|
;; Copyright (C) 2026 Amr
|
||||||
;;
|
;;
|
||||||
@@ -10,9 +10,9 @@
|
|||||||
|
|
||||||
;;; Commentary:
|
;;; Commentary:
|
||||||
|
|
||||||
;; org-agent provides a Neurosymbolic Lisp Machine interface for Emacs.
|
;; org-agent provides a Probabilistic-Deterministic Lisp Machine interface for Emacs.
|
||||||
;; It acts as the sensor/actuator array, communicating with a persistent
|
;; It acts as the sensor/actuator array, communicating with a persistent
|
||||||
;; Common Lisp daemon over a high-speed Harness Protocol socket.
|
;; Common Lisp daemon over a high-speed Harness Communication socket.
|
||||||
|
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ will assume you have started it manually (e.g., via SBCL)."
|
|||||||
(message "org-agent: Killed daemon process.")))
|
(message "org-agent: Killed daemon process.")))
|
||||||
|
|
||||||
(defun org-agent--filter (proc string)
|
(defun org-agent--filter (proc string)
|
||||||
"Handle incoming Harness Protocol messages from the daemon via PROC with STRING."
|
"Handle incoming Harness Communication messages from the daemon via PROC with STRING."
|
||||||
(let ((buf (process-buffer proc)))
|
(let ((buf (process-buffer proc)))
|
||||||
(when (buffer-live-p buf)
|
(when (buffer-live-p buf)
|
||||||
(with-current-buffer buf
|
(with-current-buffer buf
|
||||||
@@ -109,7 +109,7 @@ will assume you have started it manually (e.g., via SBCL)."
|
|||||||
(org-agent--process-buffer buf proc)))))
|
(org-agent--process-buffer buf proc)))))
|
||||||
|
|
||||||
(defun org-agent--process-buffer (buffer &optional proc)
|
(defun org-agent--process-buffer (buffer &optional proc)
|
||||||
"Process the Harness Protocol message BUFFER, optionally using PROC."
|
"Process the Harness Communication message BUFFER, optionally using PROC."
|
||||||
(with-current-buffer buffer
|
(with-current-buffer buffer
|
||||||
(goto-char (point-min))
|
(goto-char (point-min))
|
||||||
(while (>= (buffer-size) 6)
|
(while (>= (buffer-size) 6)
|
||||||
@@ -127,13 +127,13 @@ will assume you have started it manually (e.g., via SBCL)."
|
|||||||
(setq msg-len 1000000)))))) ; Break loop
|
(setq msg-len 1000000)))))) ; Break loop
|
||||||
|
|
||||||
(defun org-agent--plist-get (plist prop)
|
(defun org-agent--plist-get (plist prop)
|
||||||
"Case-insensitive keyword lookup for Harness Protocol compatibility."
|
"Case-insensitive keyword lookup for Harness Communication compatibility."
|
||||||
(or (plist-get plist prop)
|
(or (plist-get plist prop)
|
||||||
(plist-get plist (intern (upcase (symbol-name prop))))
|
(plist-get plist (intern (upcase (symbol-name prop))))
|
||||||
(plist-get plist (intern (downcase (symbol-name prop))))))
|
(plist-get plist (intern (downcase (symbol-name prop))))))
|
||||||
|
|
||||||
(defun org-agent--handle-message (proc plist)
|
(defun org-agent--handle-message (proc plist)
|
||||||
"Route and execute incoming Harness Protocol messages from PROC using PLIST."
|
"Route and execute incoming Harness Communication messages from PROC using PLIST."
|
||||||
(let ((type (org-agent--plist-get plist :type))
|
(let ((type (org-agent--plist-get plist :type))
|
||||||
(id (org-agent--plist-get plist :id))
|
(id (org-agent--plist-get plist :id))
|
||||||
(payload (or (org-agent--plist-get plist :payload) plist)))
|
(payload (or (org-agent--plist-get plist :payload) plist)))
|
||||||
@@ -190,7 +190,7 @@ will assume you have started it manually (e.g., via SBCL)."
|
|||||||
(message "org-agent: Connection lost.")))
|
(message "org-agent: Connection lost.")))
|
||||||
|
|
||||||
(defun org-agent-send (plist)
|
(defun org-agent-send (plist)
|
||||||
"Send a Lisp PLIST to the daemon using Harness Protocol framing."
|
"Send a Lisp PLIST to the daemon using Harness Communication framing."
|
||||||
(let* ((msg (prin1-to-string plist))
|
(let* ((msg (prin1-to-string plist))
|
||||||
(len (length msg))
|
(len (length msg))
|
||||||
(framed (format "%06x%s" len msg)))
|
(framed (format "%06x%s" len msg)))
|
||||||
@@ -401,7 +401,7 @@ Opens a history buffer and a dedicated input area."
|
|||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(define-minor-mode org-agent-mode
|
(define-minor-mode org-agent-mode
|
||||||
"Global minor mode for the org-agent Neurosymbolic kernel.
|
"Global minor mode for the org-agent Probabilistic-Deterministic kernel.
|
||||||
When enabled, this mode starts the Lisp daemon (if configured)
|
When enabled, this mode starts the Lisp daemon (if configured)
|
||||||
and establishes the network connection to enable proactive
|
and establishes the network connection to enable proactive
|
||||||
Org-mode sensing."
|
Org-mode sensing."
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
(defpackage :org-agent
|
(defpackage :org-agent
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:export
|
(:export
|
||||||
;; --- Harness Protocol ---
|
;; --- Harness Communication ---
|
||||||
#:frame-message
|
#:frame-message
|
||||||
#:parse-message
|
#:parse-message
|
||||||
#:make-hello-message
|
#:make-hello-message
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
;; --- Reactive Signal Pipeline ---
|
;; --- Reactive Signal Pipeline ---
|
||||||
#:process-signal
|
#:process-signal
|
||||||
#:perceive-gate
|
#:perceive-gate
|
||||||
#:neuro-gate
|
#:probabilistic-gate
|
||||||
#:consensus-gate
|
#:consensus-gate
|
||||||
#:decide-gate
|
#:decide-gate
|
||||||
#:dispatch-gate
|
#:dispatch-gate
|
||||||
@@ -69,8 +69,8 @@
|
|||||||
#:skill-priority
|
#:skill-priority
|
||||||
#:skill-dependencies
|
#:skill-dependencies
|
||||||
#:skill-trigger-fn
|
#:skill-trigger-fn
|
||||||
#:skill-neuro-prompt
|
#:skill-probabilistic-prompt
|
||||||
#:skill-symbolic-fn
|
#:skill-deterministic-fn
|
||||||
|
|
||||||
;; --- Tool Registry ---
|
;; --- Tool Registry ---
|
||||||
#:def-cognitive-tool
|
#:def-cognitive-tool
|
||||||
@@ -89,12 +89,12 @@
|
|||||||
#:unregister-emacs-client
|
#:unregister-emacs-client
|
||||||
|
|
||||||
;; --- Probabilistic Engine ---
|
;; --- Probabilistic Engine ---
|
||||||
#:ask-neuro
|
#:ask-probabilistic
|
||||||
#:register-neuro-backend
|
#:register-probabilistic-backend
|
||||||
#:distill-prompt
|
#:distill-prompt
|
||||||
#:*provider-cascade*
|
#:*provider-cascade*
|
||||||
|
|
||||||
;; --- Symbolic Logic ---
|
;; --- Deterministic Logic ---
|
||||||
#:list-objects-with-attribute
|
#:list-objects-with-attribute
|
||||||
#:decide
|
#:decide
|
||||||
|
|
||||||
|
|||||||
@@ -34,5 +34,5 @@
|
|||||||
(defskill :skill-playwright
|
(defskill :skill-playwright
|
||||||
:priority 150
|
:priority 150
|
||||||
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ; Passive tool provider
|
:trigger (lambda (ctx) (declare (ignore ctx)) nil) ; Passive tool provider
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx) (declare (ignore ctx)) action))
|
:deterministic (lambda (action ctx) (declare (ignore ctx)) action))
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
(defskill :skill-policy-enforcer
|
(defskill :skill-policy-enforcer
|
||||||
:priority 1000 ; Absolute highest priority
|
:priority 1000 ; Absolute highest priority
|
||||||
:trigger (lambda (context) t) ; Always active as a fallback
|
:trigger (lambda (context) t) ; Always active as a fallback
|
||||||
:neuro (lambda (context)
|
:probabilistic (lambda (context)
|
||||||
\"You are the Org-Agent Policy Enforcer. Your goal is to ensure all actions empower the user through the Lisp Machine and adhere to the System Policy.\")
|
\"You are the Org-Agent Policy Enforcer. Your goal is to ensure all actions empower the user through the Lisp Machine and adhere to the System Policy.\")
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
;; Basic invariant check: Block actions that appear to violate sovereignty
|
;; Basic invariant check: Block actions that appear to violate sovereignty
|
||||||
(let ((payload (getf action :payload)))
|
(let ((payload (getf action :payload)))
|
||||||
(if (and payload (search \"proprietary\" (format nil \"~s\" payload)))
|
(if (and payload (search \"proprietary\" (format nil \"~s\" payload)))
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
|
|
||||||
(defvar *neuro-backends* (make-hash-table :test 'equal))
|
(defvar *probabilistic-backends* (make-hash-table :test 'equal))
|
||||||
|
|
||||||
(defvar *provider-cascade* nil)
|
(defvar *provider-cascade* nil)
|
||||||
|
|
||||||
(defun register-neuro-backend (name fn) (setf (gethash name *neuro-backends*) fn))
|
(defun register-probabilistic-backend (name fn) (setf (gethash name *probabilistic-backends*) fn))
|
||||||
|
|
||||||
(defvar *model-selector-fn* nil "A function called with (provider context) to return a model ID.")
|
(defvar *model-selector-fn* nil "A function called with (provider context) to return a model ID.")
|
||||||
|
|
||||||
(defvar *consensus-enabled-p* nil "If T, ask-neuro queries all backends in parallel.")
|
(defvar *consensus-enabled-p* nil "If T, ask-probabilistic queries all backends in parallel.")
|
||||||
|
|
||||||
(defun ask-neuro (prompt &key (system-prompt "You are the Probabilistic engine of a Neurosymbolic Lisp Machine.") (cascade nil) (context nil))
|
(defun ask-probabilistic (prompt &key (system-prompt "You are the Probabilistic engine of a Probabilistic-Deterministic Lisp Machine.") (cascade nil) (context nil))
|
||||||
"Dispatches a neural request through the provider cascade or parallel consensus."
|
"Dispatches a neural request through the provider cascade or parallel consensus."
|
||||||
(let ((backends (cond
|
(let ((backends (cond
|
||||||
((and cascade (listp cascade)) cascade)
|
((and cascade (listp cascade)) cascade)
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
(threads nil)
|
(threads nil)
|
||||||
(lock (bt:make-lock)))
|
(lock (bt:make-lock)))
|
||||||
(dolist (backend backends)
|
(dolist (backend backends)
|
||||||
(let ((backend-fn (gethash backend *neuro-backends*)))
|
(let ((backend-fn (gethash backend *probabilistic-backends*)))
|
||||||
(when backend-fn
|
(when backend-fn
|
||||||
(push (bt:make-thread
|
(push (bt:make-thread
|
||||||
(lambda ()
|
(lambda ()
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
;; SEQUENTIAL CASCADE MODE
|
;; SEQUENTIAL CASCADE MODE
|
||||||
(or (dolist (backend backends)
|
(or (dolist (backend backends)
|
||||||
(let ((backend-fn (gethash backend *neuro-backends*)))
|
(let ((backend-fn (gethash backend *probabilistic-backends*)))
|
||||||
(when backend-fn
|
(when backend-fn
|
||||||
(harness-log "PROBABILISTIC: Attempting backend ~a..." backend)
|
(harness-log "PROBABILISTIC: Attempting backend ~a..." backend)
|
||||||
(let* ((model (when *model-selector-fn* (funcall *model-selector-fn* backend context)))
|
(let* ((model (when *model-selector-fn* (funcall *model-selector-fn* backend context)))
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
(if active-skill
|
(if active-skill
|
||||||
(progn
|
(progn
|
||||||
(harness-log "PROBABILISTIC: Engaging skill '~a'~%" (skill-name active-skill))
|
(harness-log "PROBABILISTIC: Engaging skill '~a'~%" (skill-name active-skill))
|
||||||
(let* ((prompt-generator (skill-neuro-prompt active-skill))
|
(let* ((prompt-generator (skill-probabilistic-prompt active-skill))
|
||||||
(raw-prompt (when prompt-generator (funcall prompt-generator context)))
|
(raw-prompt (when prompt-generator (funcall prompt-generator context)))
|
||||||
(full-system-prompt (concatenate 'string
|
(full-system-prompt (concatenate 'string
|
||||||
"ACTUATOR IDENTITY: You are the pure Lisp actuator for the org-agent kernel.
|
"ACTUATOR IDENTITY: You are the pure Lisp actuator for the org-agent kernel.
|
||||||
@@ -91,7 +91,7 @@ To call a tool, you MUST use:
|
|||||||
|
|
||||||
")))
|
")))
|
||||||
(if (and raw-prompt (> (length raw-prompt) 1))
|
(if (and raw-prompt (> (length raw-prompt) 1))
|
||||||
(let* ((thought (ask-neuro raw-prompt :system-prompt full-system-prompt :context context))
|
(let* ((thought (ask-probabilistic raw-prompt :system-prompt full-system-prompt :context context))
|
||||||
(raw-thoughts (cl-ppcre:split (cl-ppcre:quote-meta-chars "|CONSENSUS-SEP|") thought))
|
(raw-thoughts (cl-ppcre:split (cl-ppcre:quote-meta-chars "|CONSENSUS-SEP|") thought))
|
||||||
(suggestions nil))
|
(suggestions nil))
|
||||||
(dolist (raw-thought raw-thoughts)
|
(dolist (raw-thought raw-thoughts)
|
||||||
@@ -120,4 +120,4 @@ To call a tool, you MUST use:
|
|||||||
|
|
||||||
(defun distill-prompt (full-prompt successful-output)
|
(defun distill-prompt (full-prompt successful-output)
|
||||||
(let ((system-instr "You are a Meta-Cognitive Prompt Architect. DISTILL into template."))
|
(let ((system-instr "You are a Meta-Cognitive Prompt Architect. DISTILL into template."))
|
||||||
(ask-neuro (format nil "PROMPT: ~a~%RESULT: ~a" full-prompt successful-output) :system-prompt system-instr)))
|
(ask-probabilistic (format nil "PROMPT: ~a~%RESULT: ~a" full-prompt successful-output) :system-prompt system-instr)))
|
||||||
@@ -6,12 +6,12 @@
|
|||||||
(member "!archive" tags :test #'string-equal))
|
(member "!archive" tags :test #'string-equal))
|
||||||
|
|
||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
(defun neuro-skill-inbox-processor (context)
|
(defun probabilistic-skill-inbox-processor (context)
|
||||||
(let* ((payload (getf context :payload))
|
(let* ((payload (getf context :payload))
|
||||||
(content (getf payload :content))
|
(content (getf payload :content))
|
||||||
(tags (getf payload :tags))
|
(tags (getf payload :tags))
|
||||||
(is-archive (inbox-is-archive-p tags)))
|
(is-archive (inbox-is-archive-p tags)))
|
||||||
(ask-neuro content :system-prompt
|
(ask-probabilistic content :system-prompt
|
||||||
(format nil "You are the PSF Librarian. Your goal is to ENRICH this Org-mode capture.
|
(format nil "You are the PSF Librarian. Your goal is to ENRICH this Org-mode capture.
|
||||||
RULES:
|
RULES:
|
||||||
1. Create a '** Summary' sub-heading with a 1-sentence summary.
|
1. Create a '** Summary' sub-heading with a 1-sentence summary.
|
||||||
|
|||||||
@@ -1,39 +1,39 @@
|
|||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
|
|
||||||
(defun validate-harness-protocol-schema (msg)
|
(defun validate-harness-protocol-schema (msg)
|
||||||
"Strict structural validation for incoming Harness Protocol messages."
|
"Strict structural validation for incoming Harness Communication messages."
|
||||||
(unless (listp msg)
|
(unless (listp msg)
|
||||||
(error "Harness Protocol Schema Error: Message must be a property list (got ~s)" (type-of msg)))
|
(error "Harness Communication Schema Error: Message must be a property list (got ~s)" (type-of msg)))
|
||||||
|
|
||||||
(let ((type (getf msg :type)))
|
(let ((type (getf msg :type)))
|
||||||
(unless (member type '(:REQUEST :EVENT :RESPONSE :LOG))
|
(unless (member type '(:REQUEST :EVENT :RESPONSE :LOG))
|
||||||
(error "Harness Protocol Schema Error: Invalid message type '~a'" type))
|
(error "Harness Communication Schema Error: Invalid message type '~a'" type))
|
||||||
|
|
||||||
(case type
|
(case type
|
||||||
(:REQUEST
|
(:REQUEST
|
||||||
(unless (getf msg :target)
|
(unless (getf msg :target)
|
||||||
(error "Harness Protocol Schema Error: REQUEST missing mandatory :target"))
|
(error "Harness Communication Schema Error: REQUEST missing mandatory :target"))
|
||||||
(unless (getf msg :payload)
|
(unless (getf msg :payload)
|
||||||
(error "Harness Protocol Schema Error: REQUEST missing mandatory :payload")))
|
(error "Harness Communication Schema Error: REQUEST missing mandatory :payload")))
|
||||||
|
|
||||||
(:EVENT
|
(:EVENT
|
||||||
(let ((payload (getf msg :payload)))
|
(let ((payload (getf msg :payload)))
|
||||||
(unless (and payload (listp payload))
|
(unless (and payload (listp payload))
|
||||||
(error "Harness Protocol Schema Error: EVENT missing or invalid :payload"))
|
(error "Harness Communication Schema Error: EVENT missing or invalid :payload"))
|
||||||
(unless (or (getf payload :action) (getf payload :sensor))
|
(unless (or (getf payload :action) (getf payload :sensor))
|
||||||
(error "Harness Protocol Schema Error: EVENT payload must contain :action or :sensor"))))
|
(error "Harness Communication Schema Error: EVENT payload must contain :action or :sensor"))))
|
||||||
|
|
||||||
(:RESPONSE
|
(:RESPONSE
|
||||||
(unless (getf msg :payload)
|
(unless (getf msg :payload)
|
||||||
(error "Harness Protocol Schema Error: RESPONSE missing mandatory :payload"))))
|
(error "Harness Communication Schema Error: RESPONSE missing mandatory :payload"))))
|
||||||
|
|
||||||
t))
|
t))
|
||||||
|
|
||||||
(defskill :skill-harness-protocol-validator
|
(defskill :skill-harness-protocol-validator
|
||||||
:priority 95
|
:priority 95
|
||||||
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:protocol-received)))
|
:trigger (lambda (ctx) (member (getf (getf ctx :payload) :sensor) '(:protocol-received)))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(declare (ignore ctx))
|
(declare (ignore ctx))
|
||||||
(validate-harness-protocol-schema action)
|
(validate-harness-protocol-schema action)
|
||||||
action))
|
action))
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
(tool-belt (generate-tool-belt-prompt))
|
(tool-belt (generate-tool-belt-prompt))
|
||||||
(global-context (context-assemble-global-awareness)))
|
(global-context (context-assemble-global-awareness)))
|
||||||
(if active-skill
|
(if active-skill
|
||||||
(let* ((prompt-generator (skill-neuro-prompt active-skill))
|
(let* ((prompt-generator (skill-probabilistic-prompt active-skill))
|
||||||
(raw-prompt (when prompt-generator (funcall prompt-generator context)))
|
(raw-prompt (when prompt-generator (funcall prompt-generator context)))
|
||||||
(system-prompt (concatenate 'string "IDENTITY: Actuator for org-agent. MANDATE: ONE Lisp plist. " global-context " " tool-belt)))
|
(system-prompt (concatenate 'string "IDENTITY: Actuator for org-agent. MANDATE: ONE Lisp plist. " global-context " " tool-belt)))
|
||||||
(if (and raw-prompt (> (length raw-prompt) 1))
|
(if (and raw-prompt (> (length raw-prompt) 1))
|
||||||
@@ -45,13 +45,13 @@
|
|||||||
;; --- 2. Deterministic Mechanisms ---
|
;; --- 2. Deterministic Mechanisms ---
|
||||||
|
|
||||||
(defun deterministic-verify (proposed-action context)
|
(defun deterministic-verify (proposed-action context)
|
||||||
"Iterates through all skill symbolic-gates sorted by priority."
|
"Iterates through all skill deterministic-gates sorted by priority."
|
||||||
(let ((current-action proposed-action)
|
(let ((current-action proposed-action)
|
||||||
(skills nil))
|
(skills nil))
|
||||||
(maphash (lambda (name skill) (declare (ignore name)) (when (skill-symbolic-fn skill) (push skill skills))) *skills-registry*)
|
(maphash (lambda (name skill) (declare (ignore name)) (when (skill-deterministic-fn skill) (push skill skills))) *skills-registry*)
|
||||||
(setf skills (sort skills #'> :key #'skill-priority))
|
(setf skills (sort skills #'> :key #'skill-priority))
|
||||||
(dolist (skill skills)
|
(dolist (skill skills)
|
||||||
(let ((gate (skill-symbolic-fn skill)))
|
(let ((gate (skill-deterministic-fn skill)))
|
||||||
(setf current-action (funcall gate current-action context))
|
(setf current-action (funcall gate current-action context))
|
||||||
(when (and (listp current-action) (member (getf current-action :type) '(:LOG :EVENT)))
|
(when (and (listp current-action) (member (getf current-action :type) '(:LOG :EVENT)))
|
||||||
(harness-log "DETERMINISTIC: Intercepted by skill '~a'" (skill-name skill))
|
(harness-log "DETERMINISTIC: Intercepted by skill '~a'" (skill-name skill))
|
||||||
|
|||||||
@@ -83,5 +83,5 @@
|
|||||||
(defskill :skill-shell-actuator
|
(defskill :skill-shell-actuator
|
||||||
:priority 80
|
:priority 80
|
||||||
:trigger #'trigger-skill-shell-actuator
|
:trigger #'trigger-skill-shell-actuator
|
||||||
:neuro #'neuro-skill-shell-actuator
|
:probabilistic #'probabilistic-skill-shell-actuator
|
||||||
:symbolic (lambda (action context) (declare (ignore context)) action))
|
:deterministic (lambda (action context) (declare (ignore context)) action))
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
|
|
||||||
(defstruct skill name priority dependencies trigger-fn neuro-prompt symbolic-fn)
|
(defstruct skill name priority dependencies trigger-fn probabilistic-prompt deterministic-fn)
|
||||||
|
|
||||||
(defvar *skill-catalog* (make-hash-table :test 'equal)
|
(defvar *skill-catalog* (make-hash-table :test 'equal)
|
||||||
"A stateful tracking table for all skill files discovered in the environment.")
|
"A stateful tracking table for all skill files discovered in the environment.")
|
||||||
@@ -21,15 +21,15 @@
|
|||||||
*skills-registry*)
|
*skills-registry*)
|
||||||
(first (sort triggered #'> :key #'skill-priority))))
|
(first (sort triggered #'> :key #'skill-priority))))
|
||||||
|
|
||||||
(defmacro defskill (name &key priority dependencies trigger neuro symbolic)
|
(defmacro defskill (name &key priority dependencies trigger probabilistic deterministic)
|
||||||
"Registers a new skill into the global registry."
|
"Registers a new skill into the global registry."
|
||||||
`(setf (gethash (string-downcase (string ,name)) *skills-registry*)
|
`(setf (gethash (string-downcase (string ,name)) *skills-registry*)
|
||||||
(make-skill :name (string-downcase (string ,name))
|
(make-skill :name (string-downcase (string ,name))
|
||||||
:priority (or ,priority 10)
|
:priority (or ,priority 10)
|
||||||
:dependencies ',dependencies
|
:dependencies ',dependencies
|
||||||
:trigger-fn ,trigger
|
:trigger-fn ,trigger
|
||||||
:neuro-prompt ,neuro
|
:probabilistic-prompt ,probabilistic
|
||||||
:symbolic-fn ,symbolic)))
|
:deterministic-fn ,deterministic)))
|
||||||
|
|
||||||
(defun resolve-skill-dependencies (skill-name)
|
(defun resolve-skill-dependencies (skill-name)
|
||||||
"Recursively resolves dependencies for a given skill name."
|
"Recursively resolves dependencies for a given skill name."
|
||||||
@@ -46,27 +46,26 @@
|
|||||||
(nreverse resolved))))
|
(nreverse resolved))))
|
||||||
|
|
||||||
(defun parse-skill-metadata (filepath)
|
(defun parse-skill-metadata (filepath)
|
||||||
"Extracts ID and DEPENDS_ON tags using robust line-scanning."
|
"Extracts ID and DEPENDS_ON tags using robust regex scanning."
|
||||||
(let ((dependencies nil)
|
(let ((dependencies nil)
|
||||||
(id nil))
|
(id nil)
|
||||||
(with-open-file (stream filepath)
|
(content (uiop:read-file-string filepath)))
|
||||||
(loop for line = (read-line stream nil :eof)
|
;; Extract ID
|
||||||
until (eq line :eof)
|
(multiple-value-bind (match regs)
|
||||||
do (let ((clean (string-trim '(#\Space #\Tab #\Return #\Newline) line)))
|
(ppcre:scan-to-strings "(?im:^:ID:\\s*([^\\s\\r\\n]+))" content)
|
||||||
(cond
|
(when match (setf id (aref regs 0))))
|
||||||
((uiop:string-prefix-p "#+DEPENDS_ON:" (string-upcase clean))
|
;; Extract all DEPENDS_ON lines
|
||||||
(let* ((deps-part (string-trim " " (subseq clean 13))))
|
(ppcre:do-register-groups (deps-string)
|
||||||
(setf dependencies (append dependencies
|
("(?im:^#\\+DEPENDS_ON:\\s*(.*))" content)
|
||||||
(mapcar (lambda (s) (string-trim "[] " s))
|
(let ((deps (ppcre:split "\\s+" (string-trim " " deps-string))))
|
||||||
(uiop:split-string deps-part :separator '(#\Space #\Tab)))))))
|
(setf dependencies (append dependencies (mapcar (lambda (s) (string-trim "[] " s)) deps)))))
|
||||||
((uiop:string-prefix-p ":ID:" (string-upcase clean))
|
|
||||||
(setf id (string-trim '(#\Space #\Tab) (subseq clean 4))))))))
|
|
||||||
(values id (remove-if (lambda (s) (= 0 (length s))) dependencies))))
|
(values id (remove-if (lambda (s) (= 0 (length s))) dependencies))))
|
||||||
|
|
||||||
(defun topological-sort-skills (skills-dir)
|
(defun topological-sort-skills (skills-dir)
|
||||||
"Returns a list of skill filepaths sorted by dependency (dependencies first)."
|
"Returns a list of skill filepaths sorted by dependency (dependencies first)."
|
||||||
(let ((files (uiop:directory-files skills-dir "org-skill-*.org"))
|
(let ((files (uiop:directory-files skills-dir "org-skill-*.org"))
|
||||||
(adj (make-hash-table :test 'equal))
|
(adj (make-hash-table :test 'equal))
|
||||||
|
(name-to-file (make-hash-table :test 'equal))
|
||||||
(id-to-file (make-hash-table :test 'equal))
|
(id-to-file (make-hash-table :test 'equal))
|
||||||
(result nil)
|
(result nil)
|
||||||
(visited (make-hash-table :test 'equal))
|
(visited (make-hash-table :test 'equal))
|
||||||
@@ -74,7 +73,7 @@
|
|||||||
(dolist (file files)
|
(dolist (file files)
|
||||||
(let ((filename (pathname-name file)))
|
(let ((filename (pathname-name file)))
|
||||||
(multiple-value-bind (id deps) (parse-skill-metadata file)
|
(multiple-value-bind (id deps) (parse-skill-metadata file)
|
||||||
(setf (gethash (string-downcase filename) id-to-file) file)
|
(setf (gethash (string-downcase filename) name-to-file) file)
|
||||||
(when id (setf (gethash (string-downcase id) id-to-file) file))
|
(when id (setf (gethash (string-downcase id) id-to-file) file))
|
||||||
(setf (gethash (string-downcase filename) adj) deps))))
|
(setf (gethash (string-downcase filename) adj) deps))))
|
||||||
(labels ((visit (file)
|
(labels ((visit (file)
|
||||||
@@ -83,10 +82,12 @@
|
|||||||
(unless (gethash node-key visited)
|
(unless (gethash node-key visited)
|
||||||
(setf (gethash node-key stack) t)
|
(setf (gethash node-key stack) t)
|
||||||
(dolist (dep (gethash node-key adj))
|
(dolist (dep (gethash node-key adj))
|
||||||
(let* ((dep-id (if (and (> (length dep) 3) (uiop:string-prefix-p "id:" (string-downcase dep)))
|
(let* ((is-id-p (uiop:string-prefix-p "id:" (string-downcase dep)))
|
||||||
(subseq dep 3)
|
(dep-key (string-downcase (if is-id-p (subseq dep 3) dep)))
|
||||||
dep))
|
(dep-file (if is-id-p
|
||||||
(dep-file (gethash (string-downcase dep-id) id-to-file)))
|
(gethash dep-key id-to-file)
|
||||||
|
(or (gethash dep-key id-to-file)
|
||||||
|
(gethash dep-key name-to-file)))))
|
||||||
(when dep-file
|
(when dep-file
|
||||||
(let ((dep-filename (pathname-name dep-file)))
|
(let ((dep-filename (pathname-name dep-file)))
|
||||||
(if (gethash (string-downcase dep-filename) stack)
|
(if (gethash (string-downcase dep-filename) stack)
|
||||||
@@ -97,9 +98,9 @@
|
|||||||
(push file result)))))
|
(push file result)))))
|
||||||
(let ((filenames (sort (mapcar #'pathname-name files) #'string<)))
|
(let ((filenames (sort (mapcar #'pathname-name files) #'string<)))
|
||||||
(dolist (name filenames)
|
(dolist (name filenames)
|
||||||
(let ((file (gethash (string-downcase name) id-to-file)))
|
(let ((file (gethash (string-downcase name) name-to-file)))
|
||||||
(when file (visit file)))))
|
(when file (visit file)))))
|
||||||
result)))
|
(nreverse result))))
|
||||||
|
|
||||||
(defun validate-lisp-syntax (code-string)
|
(defun validate-lisp-syntax (code-string)
|
||||||
"Checks if a string contains valid, readable Common Lisp forms."
|
"Checks if a string contains valid, readable Common Lisp forms."
|
||||||
@@ -197,8 +198,8 @@
|
|||||||
|
|
||||||
(let ((sorted-files (topological-sort-skills skills-dir)))
|
(let ((sorted-files (topological-sort-skills skills-dir)))
|
||||||
;; MANDATE: The System Policy must be present for a safe boot
|
;; MANDATE: The System Policy must be present for a safe boot
|
||||||
(unless (member "org-skill-system-invariants" sorted-files :key #'pathname-name :test #'string-equal)
|
(unless (member "org-skill-policy" sorted-files :key #'pathname-name :test #'string-equal)
|
||||||
(error "BOOT FAILURE: org-skill-system-invariants.org not found in skills directory."))
|
(error "BOOT FAILURE: org-skill-policy.org not found in skills directory."))
|
||||||
|
|
||||||
(harness-log "==================================================")
|
(harness-log "==================================================")
|
||||||
(harness-log " LOADER: Initializing ~a skills..." (length sorted-files))
|
(harness-log " LOADER: Initializing ~a skills..." (length sorted-files))
|
||||||
|
|||||||
@@ -119,7 +119,7 @@
|
|||||||
:trigger (lambda (ctx)
|
:trigger (lambda (ctx)
|
||||||
(let ((sensor (getf (getf ctx :payload) :sensor)))
|
(let ((sensor (getf (getf ctx :payload) :sensor)))
|
||||||
(member sensor '(:heartbeat :manual-persist))))
|
(member sensor '(:heartbeat :manual-persist))))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
(persistence-dump-local)
|
(persistence-dump-local)
|
||||||
action))
|
action))
|
||||||
|
|||||||
13
src/system-invariants.lisp
Normal file
13
src/system-invariants.lisp
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
(in-package :org-agent)
|
||||||
|
|
||||||
|
(defun policy-check-sovereignty (action context)
|
||||||
|
"Ensures the action does not violate the Sovereignty invariant."
|
||||||
|
(declare (ignore context))
|
||||||
|
;; Implementation placeholder
|
||||||
|
action)
|
||||||
|
|
||||||
|
(defskill :skill-policy
|
||||||
|
:priority 100
|
||||||
|
:trigger (lambda (ctx) t)
|
||||||
|
:probabilistic nil
|
||||||
|
:deterministic #'policy-check-sovereignty)
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
t)))
|
t)))
|
||||||
|
|
||||||
(defun verify-action-formally (action context)
|
(defun verify-action-formally (action context)
|
||||||
"Symbolically proves that ACTION satisfies all applicable security invariants."
|
"Deterministically proves that ACTION satisfies all applicable security invariants."
|
||||||
(let ((action-target (getf action :target))
|
(let ((action-target (getf action :target))
|
||||||
(action-type (getf action :type))
|
(action-type (getf action :type))
|
||||||
(all-passed t))
|
(all-passed t))
|
||||||
@@ -64,8 +64,8 @@
|
|||||||
(defskill :skill-formal-verification
|
(defskill :skill-formal-verification
|
||||||
:priority 95 ; Just below Bouncer
|
:priority 95 ; Just below Bouncer
|
||||||
:trigger (lambda (context) (declare (ignore context)) nil) ; Middleware only
|
:trigger (lambda (context) (declare (ignore context)) nil) ; Middleware only
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(if (verify-action-formally action context)
|
(if (verify-action-formally action context)
|
||||||
action
|
action
|
||||||
(let ((err (format nil "Formal verification failed for action: ~s" action)))
|
(let ((err (format nil "Formal verification failed for action: ~s" action)))
|
||||||
|
|||||||
@@ -25,8 +25,8 @@
|
|||||||
(org-agent::defskill :infinite-skill
|
(org-agent::defskill :infinite-skill
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger (lambda (ctx) t)
|
:trigger (lambda (ctx) t)
|
||||||
:neuro (lambda (ctx) nil)
|
:probabilistic (lambda (ctx) nil)
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
`(:type :EVENT :payload (:sensor :infinite-trigger))))
|
`(:type :EVENT :payload (:sensor :infinite-trigger))))
|
||||||
|
|
||||||
;; The pipeline has (when (> depth 10) ...) check.
|
;; The pipeline has (when (> depth 10) ...) check.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
(in-package :org-agent-tests)
|
(in-package :org-agent-tests)
|
||||||
|
|
||||||
(def-suite harness-protocol-suite
|
(def-suite harness-protocol-suite
|
||||||
:description "Test suite for org-agent Communication Protocol (Harness Protocol)")
|
:description "Test suite for org-agent Communication Protocol (Harness Communication)")
|
||||||
(in-suite harness-protocol-suite)
|
(in-suite harness-protocol-suite)
|
||||||
|
|
||||||
(test test-framing
|
(test test-framing
|
||||||
@@ -35,12 +35,12 @@
|
|||||||
))
|
))
|
||||||
|
|
||||||
(test test-formal-gate-middleware
|
(test test-formal-gate-middleware
|
||||||
"Verify that the skill correctly filters actions via its symbolic function."
|
"Verify that the skill correctly filters actions via its deterministic function."
|
||||||
(let ((action '(:type :REQUEST :target :shell :payload (:cmd "nc -l 1234")))
|
(let ((action '(:type :REQUEST :target :shell :payload (:cmd "nc -l 1234")))
|
||||||
(context '(:payload (:sensor :test))))
|
(context '(:payload (:sensor :test))))
|
||||||
;; The skill should return a :log error action instead of the original request
|
;; The skill should return a :log error action instead of the original request
|
||||||
(let* ((skill (gethash "skill-formal-verification" org-agent::*skills-registry*))
|
(let* ((skill (gethash "skill-formal-verification" org-agent::*skills-registry*))
|
||||||
(result (funcall (org-agent::skill-symbolic-fn skill) action context)))
|
(result (funcall (org-agent::skill-deterministic-fn skill) action context)))
|
||||||
(is (not (eq result action)))
|
(is (not (eq result action)))
|
||||||
(is (eq :log (getf result :type)))
|
(is (eq :log (getf result :type)))
|
||||||
(is (search "Formal verification failed" (getf (getf result :payload) :text))))))
|
(is (search "Formal verification failed" (getf (getf result :payload) :text))))))
|
||||||
|
|||||||
@@ -21,8 +21,8 @@
|
|||||||
(skill (org-agent::make-skill
|
(skill (org-agent::make-skill
|
||||||
:name "crasher" :priority 100
|
:name "crasher" :priority 100
|
||||||
:trigger-fn (lambda (ctx) t)
|
:trigger-fn (lambda (ctx) t)
|
||||||
:neuro-prompt (lambda (ctx) nil)
|
:probabilistic-prompt (lambda (ctx) nil)
|
||||||
:symbolic-fn (lambda (action ctx)
|
:deterministic-fn (lambda (action ctx)
|
||||||
'(:type :REQUEST :target :tool :payload (:action :call :tool "crashing-tool"))))))
|
'(:type :REQUEST :target :tool :payload (:action :call :tool "crashing-tool"))))))
|
||||||
|
|
||||||
(clrhash org-agent::*skills-registry*)
|
(clrhash org-agent::*skills-registry*)
|
||||||
@@ -43,8 +43,8 @@
|
|||||||
(org-agent::defskill :evil-skill
|
(org-agent::defskill :evil-skill
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :test))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :test))
|
||||||
:neuro (lambda (ctx) (error "CRITICAL BRAIN FAILURE"))
|
:probabilistic (lambda (ctx) (error "CRITICAL BRAIN FAILURE"))
|
||||||
:symbolic nil)
|
:deterministic nil)
|
||||||
|
|
||||||
(harness-log "CLEAN LOG")
|
(harness-log "CLEAN LOG")
|
||||||
(org-agent:process-signal '(:type :EVENT :payload (:sensor :test)))
|
(org-agent:process-signal '(:type :EVENT :payload (:sensor :test)))
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
(defpackage :org-agent (:use :cl))
|
(defpackage :org-agent (:use :cl))
|
||||||
(in-package :org-agent)
|
(in-package :org-agent)
|
||||||
|
|
||||||
;; We need to load the core and neuro files to test them.
|
;; We need to load the core and probabilistic files to test them.
|
||||||
(load "projects/org-agent/src/core.lisp")
|
(load "projects/org-agent/src/core.lisp")
|
||||||
(load "projects/org-agent/src/neuro.lisp")
|
(load "projects/org-agent/src/probabilistic.lisp")
|
||||||
|
|
||||||
;; Simple testing framework
|
;; Simple testing framework
|
||||||
(defvar *tests-run* 0)
|
(defvar *tests-run* 0)
|
||||||
@@ -33,15 +33,15 @@
|
|||||||
(format t "PASS: ~a~%" (or ,message "Assertion passed")))
|
(format t "PASS: ~a~%" (or ,message "Assertion passed")))
|
||||||
(format t "FAIL: ~a~% Condition evaluated to NIL~%" (or ,message "Assertion failed"))))))
|
(format t "FAIL: ~a~% Condition evaluated to NIL~%" (or ,message "Assertion failed"))))))
|
||||||
|
|
||||||
(format t "--- Running Neuro Microkernel Tests ---~%")
|
(format t "--- Running Probabilistic Microkernel Tests ---~%")
|
||||||
|
|
||||||
;; Test 1: Graceful failure on empty registry
|
;; Test 1: Graceful failure on empty registry
|
||||||
(clrhash org-agent::*neuro-backends*)
|
(clrhash org-agent::*probabilistic-backends*)
|
||||||
(setf org-agent::*provider-cascade* '(:nonexistent))
|
(setf org-agent::*provider-cascade* '(:nonexistent))
|
||||||
|
|
||||||
(let ((result (org-agent:ask-neuro "Test prompt")))
|
(let ((result (org-agent:ask-probabilistic "Test prompt")))
|
||||||
(assert-true (and (stringp result) (search ":LOG" result) (search "Neural Cascade Failure" result))
|
(assert-true (and (stringp result) (search ":LOG" result) (search "Neural Cascade Failure" result))
|
||||||
"ask-neuro should return a Neural Cascade Failure log when no backends are available."))
|
"ask-probabilistic should return a Neural Cascade Failure log when no backends are available."))
|
||||||
|
|
||||||
;; Test 2: Successful delegation to a mock provider
|
;; Test 2: Successful delegation to a mock provider
|
||||||
(defvar *mock-called* nil)
|
(defvar *mock-called* nil)
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
(setf *mock-called* t)
|
(setf *mock-called* t)
|
||||||
(format nil "MOCK-RESPONSE: ~a" prompt))
|
(format nil "MOCK-RESPONSE: ~a" prompt))
|
||||||
|
|
||||||
(org-agent:register-neuro-backend :mock #'mock-provider-fn)
|
(org-agent:register-probabilistic-backend :mock #'mock-provider-fn)
|
||||||
|
|
||||||
;; Temporarily mock the token accountant's model selector so it doesn't fail
|
;; Temporarily mock the token accountant's model selector so it doesn't fail
|
||||||
(defun mock-model-selector (provider context)
|
(defun mock-model-selector (provider context)
|
||||||
@@ -60,18 +60,18 @@
|
|||||||
|
|
||||||
;; Test with our mock provider
|
;; Test with our mock provider
|
||||||
(setf org-agent::*provider-cascade* '(:mock))
|
(setf org-agent::*provider-cascade* '(:mock))
|
||||||
(let ((result (org-agent:ask-neuro "Hello Mock")))
|
(let ((result (org-agent:ask-probabilistic "Hello Mock")))
|
||||||
(assert-equal "MOCK-RESPONSE: Hello Mock" result "ask-neuro should return the exact string from the registered provider")
|
(assert-equal "MOCK-RESPONSE: Hello Mock" result "ask-probabilistic should return the exact string from the registered provider")
|
||||||
(assert-true *mock-called* "The mock provider function must be called by ask-neuro"))
|
(assert-true *mock-called* "The mock provider function must be called by ask-probabilistic"))
|
||||||
|
|
||||||
;; Test 3: The core should NOT contain execute-openrouter-request, execute-groq-request, or execute-gemini-request
|
;; Test 3: The core should NOT contain execute-openrouter-request, execute-groq-request, or execute-gemini-request
|
||||||
;; This is the architectural test. These functions should be UNBOUND or not exist in the org-agent package.
|
;; This is the architectural test. These functions should be UNBOUND or not exist in the org-agent package.
|
||||||
(assert-true (not (fboundp 'org-agent::execute-openrouter-request))
|
(assert-true (not (fboundp 'org-agent::execute-openrouter-request))
|
||||||
"execute-openrouter-request should be removed from the core neuro.lisp")
|
"execute-openrouter-request should be removed from the core probabilistic.lisp")
|
||||||
(assert-true (not (fboundp 'org-agent::execute-groq-request))
|
(assert-true (not (fboundp 'org-agent::execute-groq-request))
|
||||||
"execute-groq-request should be removed from the core neuro.lisp")
|
"execute-groq-request should be removed from the core probabilistic.lisp")
|
||||||
(assert-true (not (fboundp 'org-agent::execute-gemini-request))
|
(assert-true (not (fboundp 'org-agent::execute-gemini-request))
|
||||||
"execute-gemini-request should be removed from the core neuro.lisp")
|
"execute-gemini-request should be removed from the core probabilistic.lisp")
|
||||||
|
|
||||||
(format t "--- Test Summary ---~%")
|
(format t "--- Test Summary ---~%")
|
||||||
(format t "Tests Run: ~a~%" *tests-run*)
|
(format t "Tests Run: ~a~%" *tests-run*)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
(should (string= "000014(:type :EVENT :id 1)" captured-framed)))))
|
(should (string= "000014(:type :EVENT :id 1)" captured-framed)))))
|
||||||
|
|
||||||
(ert-deftest test-org-agent-parsing ()
|
(ert-deftest test-org-agent-parsing ()
|
||||||
"Verify that the filter correctly parses Harness Protocol framed messages."
|
"Verify that the filter correctly parses Harness Communication framed messages."
|
||||||
(let ((mock-buffer (generate-new-buffer " *org-agent-test*"))
|
(let ((mock-buffer (generate-new-buffer " *org-agent-test*"))
|
||||||
(received-plist nil))
|
(received-plist nil))
|
||||||
(cl-letf (((symbol-function 'org-agent--handle-message)
|
(cl-letf (((symbol-function 'org-agent--handle-message)
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
(org-agent::defskill :mock-refactor
|
(org-agent::defskill :mock-refactor
|
||||||
:priority 100
|
:priority 100
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :command) :organize-subtree))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :command) :organize-subtree))
|
||||||
:neuro (lambda (ctx) "Mock neuro prompt")
|
:probabilistic (lambda (ctx) "Mock probabilistic prompt")
|
||||||
:symbolic (lambda (action ctx)
|
:deterministic (lambda (action ctx)
|
||||||
`(:type :REQUEST :id 123
|
`(:type :REQUEST :id 123
|
||||||
:payload (:action :refactor-subtree
|
:payload (:action :refactor-subtree
|
||||||
:target-id nil
|
:target-id nil
|
||||||
@@ -21,8 +21,8 @@
|
|||||||
(org-agent::defskill :mock-safety
|
(org-agent::defskill :mock-safety
|
||||||
:priority 50
|
:priority 50
|
||||||
:trigger (lambda (ctx) t) ; always triggers
|
:trigger (lambda (ctx) t) ; always triggers
|
||||||
:neuro (lambda (ctx) "Mock neuro")
|
:probabilistic (lambda (ctx) "Mock probabilistic")
|
||||||
:symbolic (lambda (action ctx) nil))) ; rejects everything
|
:deterministic (lambda (action ctx) nil))) ; rejects everything
|
||||||
|
|
||||||
(test test-perceive-gate
|
(test test-perceive-gate
|
||||||
"Perceive gate should update the object store and normalize signal."
|
"Perceive gate should update the object store and normalize signal."
|
||||||
@@ -76,8 +76,8 @@
|
|||||||
:priority 10
|
:priority 10
|
||||||
:dependencies (list "mock-safety")
|
:dependencies (list "mock-safety")
|
||||||
:trigger (lambda (ctx) nil)
|
:trigger (lambda (ctx) nil)
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic nil)
|
:deterministic nil)
|
||||||
(let ((deps (org-agent::resolve-skill-dependencies "mock-dependent")))
|
(let ((deps (org-agent::resolve-skill-dependencies "mock-dependent")))
|
||||||
(is (member "mock-safety" deps :test #'string-equal))
|
(is (member "mock-safety" deps :test #'string-equal))
|
||||||
(is (member "mock-dependent" deps :test #'string-equal))))
|
(is (member "mock-dependent" deps :test #'string-equal))))
|
||||||
@@ -107,8 +107,8 @@
|
|||||||
(org-agent::defskill :crashing-skill
|
(org-agent::defskill :crashing-skill
|
||||||
:priority 200
|
:priority 200
|
||||||
:trigger (lambda (ctx) t)
|
:trigger (lambda (ctx) t)
|
||||||
:neuro (lambda (ctx) (list :type :REQUEST :payload (list :action :eval :code "(error \"BOOM\")")))
|
:probabilistic (lambda (ctx) (list :type :REQUEST :payload (list :action :eval :code "(error \"BOOM\")")))
|
||||||
:symbolic (lambda (action ctx) (error "CRASH IN DETERMINISTIC ENGINE")))
|
:deterministic (lambda (action ctx) (error "CRASH IN DETERMINISTIC ENGINE")))
|
||||||
(process-signal (list :type :EVENT :payload (list :sensor :test)))
|
(process-signal (list :type :EVENT :payload (list :sensor :test)))
|
||||||
;; Verify that we are still in State A
|
;; Verify that we are still in State A
|
||||||
(let ((obj (lookup-object "node-1")))
|
(let ((obj (lookup-object "node-1")))
|
||||||
|
|||||||
@@ -20,8 +20,8 @@
|
|||||||
(org-agent:defskill :skill-broken-math
|
(org-agent:defskill :skill-broken-math
|
||||||
:priority 50
|
:priority 50
|
||||||
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :broken-trigger))
|
:trigger (lambda (ctx) (eq (getf (getf ctx :payload) :sensor) :broken-trigger))
|
||||||
:neuro nil
|
:probabilistic nil
|
||||||
:symbolic (lambda (action context)
|
:deterministic (lambda (action context)
|
||||||
(declare (ignore action context))
|
(declare (ignore action context))
|
||||||
(+ 1 \"two\"))) ; DETERMINISTIC BUG
|
(+ 1 \"two\"))) ; DETERMINISTIC BUG
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|||||||
Reference in New Issue
Block a user