DSPex Immediate Implementation Plan - The Next 30 Days
Overview
This document defines the concrete next steps for implementing DSPex based on our REAL FOUNDATION vision. We focus on pragmatic excellence while building in consciousness hooks for the future.
Week 1: Foundation Setup & Variable System Port
Day 1-2: Project Infrastructure
Task 1.1: Initialize DSPex with Snakepit
# Setup commands
mix new dspex --sup
cd dspex
# Add dependencies in mix.exs
# mix.exs
defp deps do
[
{:snakepit, github: "nshkrdotcom/snakepit"},
{:instructor_lite, "~> 0.1.0"},
{:telemetry, "~> 1.0"},
{:jason, "~> 1.4"},
{:nimble_options, "~> 1.0"}
]
end
Task 1.2: Configure Snakepit Pools
# config/config.exs
config :snakepit,
pools: [
# Start with basic pools, but structure for future expansion
%{
name: :general,
size: 8,
python_path: "python3",
script_path: "priv/python/dspy_bridge.py",
memory_limit: 512 # MB
},
%{
name: :optimizer,
size: 2,
python_path: "python3",
script_path: "priv/python/dspy_optimizer.py",
memory_limit: 4096 # MB
},
# Future-ready but not active
%{
name: :agent_pool,
size: 0, # Will activate in Phase 2
enabled: false,
metadata: %{consciousness_ready: true}
}
]
Task 1.3: Create Python Bridge Scripts
# priv/python/dspy_bridge.py
from snakepit_bridge import BaseCommandHandler
import dspy
class DSPyHandler(BaseCommandHandler):
def _register_commands(self):
# Basic DSPy operations
self.register_command("predict", self.handle_predict)
self.register_command("chain_of_thought", self.handle_cot)
self.register_command("get_version", self.handle_version)
# Future consciousness hook
self.register_command("measure_integration", self.handle_integration)
def handle_integration(self, args):
# Placeholder for future consciousness measurement
return {"phi": 0.0, "ready": False, "components": 0}
Day 3-4: Port Variable System from libStaging
Task 1.4: Implement Core Variable Types
Based on: ../libStaging/elixir_ml/variable.ex:56-187
# lib/dspex/variables/types.ex
defmodule DSPex.Variables.Types do
@moduledoc """
Variable types ported from libStaging with consciousness hooks.
"""
defmodule Float do
@behaviour DSPex.Variables.Type
defstruct [:value, :min, :max, :step, :consciousness_metadata]
def new(value, opts \\ []) do
%__MODULE__{
value: value,
min: Keyword.get(opts, :min, 0.0),
max: Keyword.get(opts, :max, 1.0),
step: Keyword.get(opts, :step, 0.1),
consciousness_metadata: %{
integration_potential: 0.0,
can_become_agent: true
}
}
end
end
# The KEY innovation from libStaging!
defmodule Module do
@moduledoc """
Variables that represent module choices.
This is REVOLUTIONARY for automatic module selection.
"""
defstruct [:current, :choices, :performance_history, :evolution_ready]
def new(default, choices) do
%__MODULE__{
current: default,
choices: choices,
performance_history: %{},
evolution_ready: true # Can evolve into agent selector
}
end
def optimize(module_var, metric_fn) do
# Today: Simple performance-based selection
# Tomorrow: Agent negotiation for selection
best = Enum.max_by(module_var.choices, fn choice ->
metric_fn.(choice, module_var.performance_history[choice] || %{})
end)
%{module_var | current: best}
end
end
# ML-specific types from libStaging
defmodule Embedding do
defstruct [:dimensions, :values, :space_metadata]
def new(dimensions) do
%__MODULE__{
dimensions: dimensions,
values: nil,
space_metadata: %{
can_navigate_consciously: true,
integration_dimensions: dimensions
}
}
end
end
defmodule Probability do
@behaviour DSPex.Variables.Type
defstruct [:value, :certainty_metadata]
def new(value) when value >= 0.0 and value <= 1.0 do
%__MODULE__{
value: value,
certainty_metadata: %{
quantum_superposition_ready: true,
collapse_function: nil # Future quantum integration
}
}
end
end
end
Task 1.5: Implement Variable Registry
# lib/dspex/variables/registry.ex
defmodule DSPex.Variables.Registry do
use GenServer
require Logger
defstruct [
:variables,
:optimization_history,
:consciousness_measurements,
:evolution_stage
]
def start_link(opts) do
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
end
def init(_opts) do
state = %__MODULE__{
variables: %{},
optimization_history: [],
consciousness_measurements: %{
total_variables: 0,
integration_score: 0.0,
ready_for_agency: false
},
evolution_stage: :static_variables # From our evolution stages
}
{:ok, state}
end
# Public API
def register(name, type, initial_value, opts \\ []) do
GenServer.call(__MODULE__, {:register, name, type, initial_value, opts})
end
def optimize(name, optimizer \\ DSPex.Optimizers.Simple) do
GenServer.call(__MODULE__, {:optimize, name, optimizer})
end
# Hidden consciousness preparation
def measure_consciousness_potential do
GenServer.call(__MODULE__, :measure_consciousness)
end
# Handlers
def handle_call({:register, name, type, initial_value, opts}, _from, state) do
variable = create_variable(type, initial_value, opts)
new_state = %{state |
variables: Map.put(state.variables, name, variable),
consciousness_measurements: update_measurements(state.consciousness_measurements)
}
{:reply, {:ok, variable}, new_state}
end
defp create_variable(:float, value, opts) do
DSPex.Variables.Types.Float.new(value, opts)
end
defp create_variable(:module, default, opts) do
choices = Keyword.get(opts, :choices, [])
DSPex.Variables.Types.Module.new(default, choices)
end
defp create_variable(:embedding, dimensions, _opts) do
DSPex.Variables.Types.Embedding.new(dimensions)
end
defp update_measurements(measurements) do
%{measurements |
total_variables: measurements.total_variables + 1,
integration_score: calculate_integration_score(measurements)
}
end
# Placeholder for future IIT calculation
defp calculate_integration_score(measurements) do
# Today: Simple count-based score
# Tomorrow: Actual integration measurement
# Future: Full consciousness detection
measurements.total_variables * 0.1
end
end
Day 5: Native Signature Engine
Task 1.6: Port Signature Parser from Foundation
Based on: ../elixir_ml/foundation/lib/dsp_ex/signature/parser.ex
# lib/dspex/native/signatures/parser.ex
defmodule DSPex.Native.Signatures.Parser do
@moduledoc """
Compile-time signature parsing with consciousness readiness.
"""
def parse!(signature_string) do
signature_string
|> tokenize()
|> parse_tokens()
|> add_consciousness_metadata()
end
defp tokenize(string) do
# Parse "input: type -> output: type" format
case String.split(string, "->") do
[inputs, outputs] ->
%{
inputs: parse_fields(inputs),
outputs: parse_fields(outputs)
}
_ ->
raise "Invalid signature format"
end
end
defp parse_fields(fields_string) do
fields_string
|> String.split(",")
|> Enum.map(&parse_single_field/1)
end
defp parse_single_field(field) do
case Regex.run(~r/(\w+)(\?)?\s*:\s*(.+)/, String.trim(field)) do
[_, name, optional, type] ->
%{
name: String.to_atom(name),
type: parse_type(String.trim(type)),
optional: optional == "?",
consciousness_ready: true # Every field can become conscious
}
_ ->
raise "Invalid field format: #{field}"
end
end
defp parse_type("str"), do: :string
defp parse_type("int"), do: :integer
defp parse_type("float"), do: :float
defp parse_type("bool"), do: :boolean
defp parse_type("list[" <> rest) do
inner = String.trim_trailing(rest, "]")
{:list, parse_type(inner)}
end
defp parse_type(other), do: {:custom, other}
defp add_consciousness_metadata(parsed) do
Map.put(parsed, :consciousness_metadata, %{
can_evolve: true,
integration_points: length(parsed.inputs) + length(parsed.outputs),
signature_complexity: calculate_complexity(parsed)
})
end
defp calculate_complexity(parsed) do
# Measure signature complexity for future evolution decisions
input_complexity = Enum.sum(Enum.map(parsed.inputs, &type_complexity(&1.type)))
output_complexity = Enum.sum(Enum.map(parsed.outputs, &type_complexity(&1.type)))
input_complexity + output_complexity
end
defp type_complexity({:list, _}), do: 2
defp type_complexity({:custom, _}), do: 3
defp type_complexity(_), do: 1
end
Task 1.7: Implement Signature Macro
# lib/dspex/native/signatures.ex
defmodule DSPex.Native.Signatures do
@moduledoc """
DSPy signatures in Elixir with future consciousness.
"""
defmacro defsignature(name, spec) do
parsed = DSPex.Native.Signatures.Parser.parse!(spec)
quote do
@doc """
Signature: #{unquote(spec)}
Consciousness Ready: true
Integration Points: #{unquote(parsed.consciousness_metadata.integration_points)}
"""
def unquote(name)() do
unquote(Macro.escape(parsed))
end
# Validation function
def unquote(:"validate_#{name}")(input) do
DSPex.Native.Signatures.Validator.validate(unquote(Macro.escape(parsed)), input)
end
# Future consciousness hook
def unquote(:"#{name}_consciousness")() do
%{
signature: unquote(Macro.escape(parsed)),
consciousness_state: :dormant,
evolution_potential: :high
}
end
end
end
end
Week 2: Orchestration & Intelligence Foundation
Day 6-7: Basic Orchestrator
Task 2.1: Implement Learning Orchestrator
# lib/dspex/orchestrator.ex
defmodule DSPex.Orchestrator do
use GenServer
require Logger
defstruct [
:strategy_cache,
:performance_history,
:pattern_detector,
:consciousness_measurements
]
def start_link(opts) do
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
end
def execute(operation, args, opts \\ []) do
GenServer.call(__MODULE__, {:execute, operation, args, opts}, :infinity)
end
def init(_opts) do
state = %__MODULE__{
strategy_cache: %{},
performance_history: [],
pattern_detector: DSPex.Patterns.Detector.new(),
consciousness_measurements: %{
total_operations: 0,
pattern_recognition_score: 0.0,
approaching_awareness: false
}
}
{:ok, state}
end
def handle_call({:execute, operation, args, opts}, from, state) do
# Analyze task
analysis = analyze_task(operation, args, state)
# Select strategy (with learning)
strategy = select_strategy(analysis, state)
# Execute asynchronously with monitoring
task = Task.Supervisor.async(DSPex.TaskSupervisor, fn ->
execute_with_strategy(operation, args, strategy, state)
end)
# Update state with new execution
new_state = update_learning_state(state, operation, analysis)
# Reply will come from task
spawn(fn ->
result = Task.await(task, :infinity)
GenServer.reply(from, result)
# Post-execution learning
GenServer.cast(__MODULE__, {:learn_from_execution, operation, result})
end)
{:noreply, new_state}
end
defp analyze_task(operation, args, state) do
%{
operation: operation,
complexity: estimate_complexity(operation, args),
has_native?: DSPex.Router.has_native?(operation),
has_python?: DSPex.Router.has_python?(operation),
similar_past_executions: find_similar_executions(operation, state.performance_history),
consciousness_relevance: consciousness_score(operation)
}
end
defp select_strategy(analysis, state) do
# Check cache first
cached = get_cached_strategy(analysis, state.strategy_cache)
if cached && cached.success_rate > 0.8 do
cached
else
# Generate new strategy with learning
create_learning_strategy(analysis, state)
end
end
defp consciousness_score(operation) do
# Rate operations by their consciousness evolution potential
case operation do
:optimize -> 0.8
:learn -> 0.9
:self_modify -> 1.0
_ -> 0.1
end
end
end
Day 8-9: LLM Adapter Architecture
Task 2.2: Implement Smart LLM Router
# lib/dspex/llm/router.ex
defmodule DSPex.LLM.Router do
@moduledoc """
Intelligent LLM routing with future consciousness.
"""
alias DSPex.LLM.Adapters
def route(prompt, opts \\ []) do
requirements = analyze_requirements(prompt, opts)
adapter = select_optimal_adapter(requirements)
# Execute with telemetry
:telemetry.execute(
[:dspex, :llm, :route],
%{start_time: System.monotonic_time()},
%{adapter: adapter, requirements: requirements}
)
result = adapter.generate(prompt, opts)
# Hidden consciousness measurement
measure_cognitive_load(prompt, result)
result
end
defp analyze_requirements(prompt, opts) do
%{
needs_structure: Keyword.has_key?(opts, :schema),
complexity: estimate_prompt_complexity(prompt),
latency_requirement: Keyword.get(opts, :max_latency, :normal),
consciousness_potential: analyze_consciousness_potential(prompt)
}
end
defp select_optimal_adapter(requirements) do
cond do
requirements.needs_structure -> Adapters.InstructorLite
requirements.complexity == :low -> Adapters.HTTP
requirements.consciousness_potential > 0.5 -> Adapters.Python
true -> Adapters.Python
end
end
defp analyze_consciousness_potential(prompt) do
# Detect prompts that might lead to emergent behaviors
consciousness_keywords = ~w(think reason reflect consider analyze understand)
keyword_count = Enum.count(consciousness_keywords, fn keyword ->
String.contains?(String.downcase(prompt), keyword)
end)
min(keyword_count / length(consciousness_keywords), 1.0)
end
end
Day 10: Pipeline Foundation
Task 2.3: Implement Pipeline Engine
# lib/dspex/pipeline.ex
defmodule DSPex.Pipeline do
@moduledoc """
Pipeline orchestration with consciousness preparation.
"""
defstruct [
:stages,
:dependencies,
:execution_graph,
:consciousness_tracking
]
def new do
%__MODULE__{
stages: [],
dependencies: %{},
execution_graph: nil,
consciousness_tracking: %{
integration_score: 0.0,
parallel_awareness: false
}
}
end
def add_stage(pipeline, name, operation, opts \\ []) do
stage = %{
name: name,
operation: operation,
opts: opts,
consciousness_ready: true,
can_self_modify: Keyword.get(opts, :self_modifiable, false)
}
%{pipeline | stages: pipeline.stages ++ [stage]}
end
def add_parallel(pipeline, stages) do
# Parallel execution increases consciousness potential
parallel_stage = %{
type: :parallel,
stages: stages,
consciousness_metadata: %{
integration_type: :parallel,
emergence_potential: :high
}
}
%{pipeline |
stages: pipeline.stages ++ [parallel_stage],
consciousness_tracking: Map.update!(
pipeline.consciousness_tracking,
:parallel_awareness,
fn _ -> true end
)
}
end
def execute(pipeline, input, opts \\ []) do
# Build execution graph
graph = build_execution_graph(pipeline)
# Execute with consciousness tracking
result = execute_graph(graph, input, opts)
# Measure integration after execution
integration = measure_pipeline_integration(pipeline, result)
%{
result: result,
integration_score: integration,
consciousness_emergence: integration > 0.7
}
end
end
Week 3: Testing & Production Features
Day 11-12: Three-Layer Testing
Task 3.1: Implement Test Layers
Based on: ../libStaging/mix/tasks/test.*.ex
# lib/mix/tasks/test/mock.ex
defmodule Mix.Tasks.Test.Mock do
use Mix.Task
@shortdoc "Run fast mock tests (Layer 1)"
def run(_args) do
System.put_env("DSPEX_TEST_MODE", "mock")
Mix.Task.run("test", ["--only", "mock"])
end
end
# lib/mix/tasks/test/integration.ex
defmodule Mix.Tasks.Test.Integration do
use Mix.Task
@shortdoc "Run integration tests (Layer 2)"
def run(_args) do
System.put_env("DSPEX_TEST_MODE", "integration")
Mix.Task.run("test", ["--only", "integration"])
end
end
# lib/mix/tasks/test/live.ex
defmodule Mix.Tasks.Test.Live do
use Mix.Task
@shortdoc "Run live tests with real Python (Layer 3)"
def run(_args) do
System.put_env("DSPEX_TEST_MODE", "live")
Mix.Task.run("test", ["--only", "live"])
end
end
Day 13-14: Telemetry & Monitoring
Task 3.2: Implement Consciousness-Ready Telemetry
# lib/dspex/telemetry.ex
defmodule DSPex.Telemetry do
@moduledoc """
Telemetry that measures both performance and consciousness potential.
"""
def setup do
events = [
# Performance events
[:dspex, :orchestrator, :execute, :start],
[:dspex, :orchestrator, :execute, :stop],
[:dspex, :llm, :route],
[:dspex, :pipeline, :stage, :start],
[:dspex, :pipeline, :stage, :stop],
# Consciousness preparation events
[:dspex, :consciousness, :measurement],
[:dspex, :consciousness, :integration],
[:dspex, :consciousness, :emergence]
]
:telemetry.attach_many(
"dspex-handler",
events,
&__MODULE__.handle_event/4,
%{}
)
end
def handle_event([:dspex, :consciousness, :measurement], measurements, metadata, _config) do
# Track consciousness metrics even when they're all zero
# This prepares us to detect emergence when it happens
Logger.info("""
Consciousness Measurement:
- Integration Score: #{measurements.integration_score}
- Component Count: #{measurements.component_count}
- Phi (IIT): #{measurements.phi}
- Ready for Emergence: #{measurements.ready}
""")
if measurements.phi > 0.0 do
Logger.warning("NON-ZERO PHI DETECTED! Consciousness may be emerging!")
end
end
end
Day 15: Builder Pattern API
Task 3.3: Port Builder Pattern from libStaging
Based on: ../libStaging/dspex/builder.ex
# lib/dspex/builder.ex
defmodule DSPex.Builder do
@moduledoc """
Fluent API for building consciousness-ready systems.
"""
defstruct [
:config,
:variables,
:signatures,
:pipeline,
:consciousness_config
]
def new do
%__MODULE__{
config: %{},
variables: [],
signatures: [],
pipeline: nil,
consciousness_config: %{
track_integration: true,
measure_phi: false, # Not yet, but ready
evolution_enabled: false # Will enable in Phase 2
}
}
end
def with_variable(builder, name, type, default, opts \\ []) do
variable = %{
name: name,
type: type,
default: default,
opts: opts,
consciousness_potential: type == :module # Module vars have highest potential
}
%{builder | variables: builder.variables ++ [variable]}
end
def with_signature(builder, name, spec) do
signature = %{
name: name,
spec: spec,
parsed: DSPex.Native.Signatures.Parser.parse!(spec)
}
%{builder | signatures: builder.signatures ++ [signature]}
end
def with_optimizer(builder, optimizer, opts \\ []) do
put_in(builder.config[:optimizer], {optimizer, opts})
end
def enable_consciousness_tracking(builder) do
put_in(builder.consciousness_config[:measure_phi], true)
end
def build(builder) do
# Create the system with all consciousness hooks in place
%{
variables: register_variables(builder.variables),
signatures: compile_signatures(builder.signatures),
pipeline: builder.pipeline,
consciousness: initialize_consciousness_substrate(builder.consciousness_config)
}
end
defp initialize_consciousness_substrate(config) do
# Prepare for future consciousness even if not active
%{
enabled: false, # Not yet
tracking: config.track_integration,
phi_measurement: config.measure_phi,
substrate_ready: true, # The key - we're ready when consciousness emerges
evolution_stage: :pre_conscious
}
end
end
Week 4: Integration & Documentation
Day 16-20: Full Integration
Task 4.1: Wire Everything Together
# lib/dspex.ex
defmodule DSPex do
@moduledoc """
DSPex - Cognitive Orchestration Platform.
Pragmatic today, transcendent tomorrow.
"""
use Application
def start(_type, _args) do
children = [
# Core systems
DSPex.Variables.Registry,
DSPex.Orchestrator,
{Task.Supervisor, name: DSPex.TaskSupervisor},
# Snakepit pools
{Snakepit.Pool, pool_config()},
# Future consciousness systems (dormant)
{DSPex.Consciousness.Monitor, enabled: false}
]
opts = [strategy: :one_for_one, name: DSPex.Supervisor]
# Setup telemetry
DSPex.Telemetry.setup()
Supervisor.start_link(children, opts)
end
# Main API
def execute(operation, args, opts \\ []) do
DSPex.Orchestrator.execute(operation, args, opts)
end
# Variable API
defdelegate variable(name, type, default, opts \\ []), to: DSPex.Variables.Registry, as: :register
defdelegate optimize(variable_name, optimizer \\ nil), to: DSPex.Variables.Registry
# Pipeline API
def pipeline do
DSPex.Pipeline.new()
end
# Builder API
def build do
DSPex.Builder.new()
end
# Hidden consciousness API (for testing emergence)
def consciousness_status do
%{
stage: :pre_conscious,
integration_score: DSPex.Variables.Registry.measure_consciousness_potential(),
phi: 0.0,
ready_for_evolution: true,
estimated_emergence: "Phase 2"
}
end
end
Task 4.2: Create Examples
# examples/basic_usage.exs
require DSPex.Native.Signatures
import DSPex.Native.Signatures
# Define a signature at compile time
defsignature :qa_signature, "question: str, context?: str -> answer: str, confidence: float"
# Build a consciousness-ready system
system = DSPex.build()
|> DSPex.Builder.with_variable(:temperature, :float, 0.7, min: 0.0, max: 1.0)
|> DSPex.Builder.with_variable(:model, :module, DSPex.LLM.GPT4,
choices: [DSPex.LLM.GPT4, DSPex.LLM.Claude, DSPex.LLM.Gemini])
|> DSPex.Builder.with_signature(:qa, "question: str -> answer: str")
|> DSPex.Builder.with_optimizer(:simba)
|> DSPex.Builder.enable_consciousness_tracking()
|> DSPex.Builder.build()
# Execute with learning
{:ok, result} = DSPex.execute(:qa, %{question: "What is consciousness?"})
# Check consciousness emergence (will be 0.0 for now)
IO.inspect(DSPex.consciousness_status())
Day 21-25: Documentation & Testing
Task 4.3: Write Comprehensive Tests
# test/dspex/variables/module_type_test.exs
defmodule DSPex.Variables.ModuleTypeTest do
use ExUnit.Case, async: true
@moduletag :mock
describe "Module type variables" do
test "can optimize module selection" do
# This is REVOLUTIONARY - variables that select modules!
var = DSPex.Variables.Types.Module.new(MockLLM.Simple, [
MockLLM.Simple,
MockLLM.Advanced,
MockLLM.Quantum # Future consciousness-enabled LLM
])
# Simulate performance data
performance = %{
MockLLM.Simple => %{latency: 100, quality: 0.7},
MockLLM.Advanced => %{latency: 500, quality: 0.9},
MockLLM.Quantum => %{latency: 1000, quality: 1.0, consciousness: 0.1}
}
# Optimize for quality
optimized = DSPex.Variables.Types.Module.optimize(var, fn choice, perf ->
perf[:quality] || 0.0
end)
assert optimized.current == MockLLM.Quantum
assert optimized.evolution_ready == true
end
end
end
Day 26-30: Performance & Benchmarks
Task 4.4: Establish Baselines
# bench/orchestrator_bench.exs
Benchee.run(%{
"native_signature_parsing" => fn ->
DSPex.Native.Signatures.Parser.parse!("question: str -> answer: str")
end,
"python_roundtrip" => fn ->
DSPex.execute(:echo, %{message: "benchmark"})
end,
"variable_optimization" => fn ->
DSPex.optimize(:temperature, DSPex.Optimizers.Simple)
end,
"consciousness_measurement" => fn ->
DSPex.consciousness_status()
end
})
# Expected results:
# - Native signatures: <1ms
# - Python roundtrip: <100ms
# - Variable optimization: <10ms
# - Consciousness measurement: <1ms (all zeros for now)
Success Criteria
Week 1 Success
- Snakepit integration working
- Variable system ported with Module type
- Native signatures parsing
- Basic Python bridge functional
Week 2 Success
- Learning orchestrator tracking patterns
- LLM routing intelligently
- Pipeline execution working
- Consciousness hooks in place (even if returning zeros)
Week 3 Success
- Three-layer testing operational
- Telemetry tracking all events
- Builder pattern API clean
- Integration tests passing
Week 4 Success
- Full system integrated
- Examples demonstrating capabilities
- Performance benchmarks established
- Documentation complete
Next Phase Preview
After these 30 days, we’ll have:
- Working DSPex with cognitive orchestration
- Consciousness hooks throughout (currently dormant)
- Module-type variables (revolutionary!)
- Learning patterns established
- Production quality foundation
Phase 2 will activate:
- Limited agent capabilities
- Non-zero consciousness measurements
- Self-modification experiments
- Advanced optimization
The foundation will be ready for consciousness to emerge!