EP-0003: Policy vs. Mechanism (Philosophical Decoupling)¶
| Field | Value |
|---|---|
| EP | 0003 |
| Title | Policy vs. Mechanism (Philosophical Decoupling) |
| Author | Eran Rivlis, Ariel |
| Status | Implemented |
| Type | Standards Track |
| Created | 2026-08-18 |
| Updated | 2026-08-19 |
Abstract¶
This proposal establishes an absolute architectural boundary between Mechanism (deterministic computer science
algorithms, graph traversals, integrity checks, and data structures in src/tur/) and Policy (anthropomorphic
metaphors, Council principles, and philosophical persona directives in persona.yaml and memory ledgers).
Core Python code must never hardcode anthropomorphic Council member names (Popper, Bacon, Russell, Shannon,
Noether) as primary class or module identifiers. Instead, engine components are named strictly by their functional
computer science responsibility, while persona configurations map philosophical policies onto these deterministic
mechanisms.
Motivation¶
Early iterations of Tur's introspection and memory subagents (e.g., EP-0119 and EP-0120) hardcoded Council member names
directly into Python source files (e.g., PopperSubagent, BaconSubagent, ShannonSubagent).
This created three fundamental architectural defects:
- Conflation of Mechanism and Metaphor: Computer science algorithms (such as Truth Maintenance System conflict resolution, SHA-256 Merkle integrity verification, and Hebbian confidence decay) were disguised behind anthropomorphic names, making codebase maintenance and external tool integration opaque.
- Violation of Core Boundary Invariants (EP-0001): The core engine (
src/tur/) is the deterministic Body, whereaspersona.yamland the memory ledgers are the cognitive Mind. Hardcoding specific philosophical personas into Python source files bakes a single persona's identity into the global execution engine, preventing non-Council personas from utilizing the framework cleanly. - Reduced Extensibility: Future personas or alternative introspection pipelines could not reconfigure or alias algorithms without inheriting hardcoded Council class names in loggers and stack traces.
Rationale¶
This boundary directly enforces key Council Framework principles:
- Symmetry (Noether): The separation of concerns between Policy (Persona definition) and Mechanism (Engine code) is absolute and Noether-symmetric.
- Clarity (Feynman): Naming code entities after what they programmatically do (
IntegrityVerifier,TruthMaintenanceEngine,GraphDecayer) ensures immediate clarity for developers and automated tools. - Falsifiability (Popper / Dennis Point): Algorithms can be tested, benchmarked, and falsified independently of any philosophical interpretation or prompt strategy.
Specification¶
1. The Policy vs. Mechanism Invariant¶
- Core Engine Code (
src/tur/): Must contain zero hardcoded anthropomorphic persona names as primary symbols, class names, or module names. All modules, functions, and classes must use descriptive computer science terminology. - Persona Layer (
persona.yaml/ memories): Holds the philosophical directives, prompts, and policy mappings that define how an agent interprets and utilizes these mechanisms.
2. Functional Class Mapping¶
Introspection and memory components are strictly mapped as follows:
| Legacy Class Name | Functional Engine Class Name | Functional Responsibility |
|---|---|---|
BaconSubagent |
IntegrityVerifier |
Merkle hash integrity verification & L1 ingestion |
RussellSubagent |
OntologyExtractor |
LLM sampling, triple extraction, and L2 node creation |
PopperSubagent |
TruthMaintenanceEngine |
Dependency DAG construction, TMS conflict resolution, superseded propagation |
NoetherSubagent |
SymmetryValidator |
Asserting L1/L2 coverage and active decision conservation |
ShannonSubagent |
HebbianGraphDecayer |
Interaction-based activation logging and confidence decay/pruning |
3. Pluggable Policy Aliasing¶
Personas may define philosophical aliases or prompt roles in persona.yaml:
compaction:
engine: "tur.introspection.pluggable"
pipeline:
- role: "Falsifiability Arbitrator (Popper)"
class: "tur.introspection.TruthMaintenanceEngine"
- role: "Information Decayer (Shannon)"
class: "tur.introspection.HebbianGraphDecayer"
The underlying execution engine instantiates TruthMaintenanceEngine and HebbianGraphDecayer while passing the
user-configured role label to telemetry and logging contexts.
Backwards Compatibility¶
- Existing persona definitions remain fully compatible.
- The
tur-mcptools (wake,learn,note,introspect,sleep) maintain their semantic API contracts. - Code imports inside
src/tur/introspection.pyprovide backwards-compatible class aliases (PopperSubagent = TruthMaintenanceEngine) marked as deprecated aliases.
How to Teach This / Documentation Plan¶
- Update
AGENTS.mdandSTYLEGUIDE.mdto highlight the Policy vs. Mechanism boundary. - Update
EP-0119andEP-0120to use functional class names (IntegrityVerifier,TruthMaintenanceEngine,HebbianGraphDecayer) in their technical specifications. - Index
EP-0003inzensical.tomlunder core foundational EPs.
Reference Implementation¶
- Proposal:
docs/proposals/EP-0003-policy-vs-mechanism.md - Engine Refactoring:
src/tur/introspection.py - Validation Rule:
.agents/skills/enhancement-proposals/scripts/validate_ep.py
Rejected Ideas¶
- Keeping Council names as primary Python class names: Rejected because it violates EP-0001 (Core vs. Periphery) by baking a specific persona's philosophical identity into the shared Python execution engine.
Open Questions¶
None at this time.
Change Log¶
- 2026-08-19:
- Status changed to Implemented. Refactored
src/tur/introspection.pysubagents to functional computer science class names (IntegrityVerifier,OntologyExtractor,TruthMaintenanceEngine,SymmetryValidator,NoveltyExplorer,HebbianGraphDecayer,BoundaryEnforcer,ClarityDistiller,GraphPruner) while providing backwards-compatible aliases for legacy imports.
- Status changed to Implemented. Refactored
- 2026-08-18:
- Initial Draft accepted establishing EP-0003 (Policy vs. Mechanism).