Foundation OS Migration Guide
Version 1.0 - Step-by-Step Migration from Current to Target Architecture
Date: June 27, 2025
Executive Summary
This guide provides detailed, actionable steps for migrating from the current Foundation/MABEAM architecture to the new dependency-based, multi-agent platform. The migration prioritizes zero-downtime transitions, data preservation, and team productivity throughout the transformation.
Migration Approach: Incremental, backward-compatible transformation
Estimated Downtime: Zero (rolling deployment)
Data Migration: Automated with manual verification checkpoints
Rollback Time: <30 minutes at any stage
Pre-Migration Assessment
Current System Inventory
Before beginning migration, conduct a comprehensive inventory of your current system:
# 1. Catalog existing foundation.mabeam usage
find . -name "*.ex" -exec grep -l "Foundation\.MABEAM\." {} \;
# 2. Identify agent implementations
find . -name "*.ex" -exec grep -l "Agent\." {} \;
# 3. Catalog custom coordination logic
find . -name "*.ex" -exec grep -l "Coordination\." {} \;
# 4. Identify error handling patterns
find . -name "*.ex" -exec grep -l "Error\." {} \;
Compatibility Check
Run the pre-migration compatibility checker:
# Add to mix.exs temporarily
{:foundation_migration_checker, "~> 0.1.0", only: [:dev]}
# Run compatibility check
mix foundation.check_migration_readiness
Backup Procedures
Critical: Always backup before migration:
# 1. Code backup
git tag pre-migration-backup-$(date +%Y%m%d-%H%M%S)
git push origin --tags
# 2. Database backup (if applicable)
pg_dump your_database > pre_migration_backup.sql
# 3. Configuration backup
cp -r config/ config_backup/
Phase 1: Foundation Purification Migration
Target Completion: Week 1-4 of Implementation Roadmap
Step 1.1: Add Jido Dependencies
# mix.exs - Add these dependencies
defp deps do
[
# ... existing dependencies ...
# Jido ecosystem
{:jido, "~> 0.1.0"},
{:jido_action, "~> 0.1.0"},
{:jido_signal, "~> 0.1.0"},
# Migration helpers (temporary)
{:foundation_migration_tools, "~> 0.1.0", only: [:dev]}
]
end
# Install dependencies
mix deps.get
mix deps.compile
# Verify compilation
mix compile --warnings-as-errors
Step 1.2: Error System Migration
Automated Migration Script:
# Run the error migration script
mix foundation.migrate.errors
# Manual verification
find lib/ -name "*.ex" -exec grep -l "EnhancedError" {} \;
# Should return empty after migration
Manual Error Migration (if automated script unavailable):
# Before: lib/your_module.ex
defmodule YourModule do
alias Foundation.Types.EnhancedError
def some_function do
{:error, EnhancedError.new(:validation_failed, "Invalid input")}
end
end
# After: lib/your_module.ex
defmodule YourModule do
alias Foundation.Types.Error
def some_function do
{:error, Error.new(:validation_failed, "Invalid input")}
end
end
Step 1.3: Deprecate foundation.mabeam Usage
Automated Deprecation Script:
# Run deprecation markers
mix foundation.deprecate.mabeam
# This will:
# 1. Add @deprecated to all foundation.mabeam functions
# 2. Add compiler warnings
# 3. Generate migration notices
Manual Deprecation Pattern:
# Before: lib/foundation/mabeam/agent.ex
defmodule Foundation.MABEAM.Agent do
def register_agent(config) do
# ... implementation
end
end
# After: lib/foundation/mabeam/agent.ex
defmodule Foundation.MABEAM.Agent do
@deprecated "Use FoundationJido.Agent.register_agent/1 instead"
def register_agent(config) do
IO.warn("Foundation.MABEAM.Agent.register_agent/1 is deprecated. " <>
"Use FoundationJido.Agent.register_agent/1 instead.")
# ... existing implementation (unchanged)
end
end
Step 1.4: Update Existing Code (Gradual)
Create Migration Helpers:
# lib/migration_helpers.ex (temporary file)
defmodule MigrationHelpers do
@moduledoc """
Temporary helpers for smooth migration.
Remove after migration complete.
"""
def bridge_agent_registration(config) do
# Bridge old calls to new system
case foundation_jido_available?() do
true -> FoundationJido.Agent.register_agent(config)
false -> Foundation.MABEAM.Agent.register_agent(config)
end
end
defp foundation_jido_available? do
Code.ensure_loaded?(FoundationJido.Agent)
end
end
Update Client Code Gradually:
# Before: lib/your_agent.ex
defmodule YourAgent do
def start do
Foundation.MABEAM.Agent.register_agent(%{...})
end
end
# During Migration: lib/your_agent.ex
defmodule YourAgent do
def start do
MigrationHelpers.bridge_agent_registration(%{...})
end
end
# After Migration: lib/your_agent.ex
defmodule YourAgent do
def start do
FoundationJido.Agent.register_agent(%{...})
end
end
Phase 1 Verification
# 1. All tests pass
mix test
# 2. No compilation warnings
mix compile --warnings-as-errors
# 3. Deprecation warnings present
mix compile 2>&1 | grep "deprecated"
# 4. System functional
mix foundation.health_check
Phase 2: Integration Layer Migration
Target Completion: Week 5-9 of Implementation Roadmap
Step 2.1: Create FoundationJido Structure
# Create integration layer directories
mkdir -p lib/foundation_jido/{agent,signal,action,coordination}
mkdir -p test/foundation_jido/{agent,signal,action,coordination}
Step 2.2: Migrate Agent Registration
Create New Agent Registry Adapter:
# lib/foundation_jido/agent/registry_adapter.ex
defmodule FoundationJido.Agent.RegistryAdapter do
@moduledoc """
Bridges Jido agents with Foundation.ProcessRegistry
"""
alias Foundation.ProcessRegistry
alias Foundation.Types.Error
def register_agent(config) do
with {:ok, metadata} <- build_agent_metadata(config),
{:ok, pid} <- start_jido_agent(config),
{:ok, _} <- ProcessRegistry.register(pid, metadata) do
{:ok, pid}
else
{:error, reason} -> {:error, Error.new(:agent_registration_failed, reason)}
end
end
defp build_agent_metadata(config) do
# Convert Jido agent config to Foundation metadata format
metadata = %{
type: :agent,
capabilities: Map.get(config, :capabilities, []),
name: Map.get(config, :name),
restart_policy: Map.get(config, :restart_policy, :permanent)
}
{:ok, metadata}
end
defp start_jido_agent(config) do
# Start Jido agent with Foundation integration
Jido.Agent.start_link(config)
end
end
Step 2.3: Create Signal Integration
JidoSignal to Foundation Bridge:
# lib/foundation_jido/signal/foundation_dispatch.ex
defmodule FoundationJido.Signal.FoundationDispatch do
@moduledoc """
JidoSignal dispatch adapter using Foundation services
"""
alias Foundation.Infrastructure.CircuitBreaker
alias Foundation.Telemetry
alias Foundation.Types.Error
def dispatch(signal, adapter_config) do
Telemetry.execute([:signal, :dispatch, :start], %{}, %{signal: signal})
result = case adapter_config.type do
:http -> dispatch_http(signal, adapter_config)
:pid -> dispatch_pid(signal, adapter_config)
_ -> {:error, Error.new(:unsupported_adapter, adapter_config.type)}
end
Telemetry.execute([:signal, :dispatch, :complete], %{}, %{
signal: signal,
result: result
})
result
end
defp dispatch_http(signal, config) do
CircuitBreaker.execute(:signal_http, fn ->
# Use Foundation's circuit breaker for HTTP calls
JidoSignal.Dispatch.HttpAdapter.dispatch(signal, config)
end)
end
defp dispatch_pid(signal, config) do
# Use Foundation's process registry for PID lookups
case Foundation.ProcessRegistry.lookup(config.target) do
{:ok, pid} -> JidoSignal.Dispatch.PidAdapter.dispatch(signal, %{config | target: pid})
{:error, reason} -> {:error, Error.new(:target_not_found, reason)}
end
end
end
Step 2.4: Migrate Coordination Logic
Move Auction Logic:
# Move coordination modules
mv lib/foundation/mabeam/coordination/ lib/foundation_jido/coordination/
# Update module names
sed -i 's/Foundation\.MABEAM\.Coordination/FoundationJido.Coordination/g' \
lib/foundation_jido/coordination/*.ex
Refactor for Jido Integration:
# lib/foundation_jido/coordination/auction.ex
defmodule FoundationJido.Coordination.Auction do
@moduledoc """
Economic auction protocols for multi-agent coordination
Migrated from Foundation.MABEAM.Coordination.Auction
"""
alias FoundationJido.Agent.RegistryAdapter
alias Foundation.Types.Error
def run_auction(auction_spec, participants) do
with {:ok, agents} <- resolve_participants(participants),
{:ok, bids} <- collect_bids(agents, auction_spec),
{:ok, winner} <- select_winner(bids, auction_spec) do
notify_auction_result(participants, winner)
else
{:error, reason} -> {:error, Error.new(:auction_failed, reason)}
end
end
defp resolve_participants(participant_specs) do
# Use FoundationJido registry to resolve agent references
Enum.reduce_while(participant_specs, {:ok, []}, fn spec, {:ok, acc} ->
case RegistryAdapter.lookup_agent(spec) do
{:ok, agent} -> {:cont, {:ok, [agent | acc]}}
{:error, reason} -> {:halt, {:error, reason}}
end
end)
end
# ... rest of implementation
end
Step 2.5: Create Migration Bridge
Temporary Compatibility Layer:
# lib/foundation_jido/migration_bridge.ex
defmodule FoundationJido.MigrationBridge do
@moduledoc """
Temporary bridge for smooth migration.
Provides backward compatibility during transition period.
"""
# Delegate old calls to new implementations
defdelegate register_agent(config), to: FoundationJido.Agent.RegistryAdapter
defdelegate run_auction(spec, participants), to: FoundationJido.Coordination.Auction
# Add logging for migration tracking
def track_migration_call(function_name, args) do
Foundation.Telemetry.execute([:migration, :bridge_call], %{count: 1}, %{
function: function_name,
args: inspect(args)
})
end
end
Phase 2 Verification
# 1. Integration tests pass
mix test test/foundation_jido/
# 2. Bridge functionality works
mix foundation.test_bridge
# 3. Performance acceptable
mix foundation.benchmark_integration
# 4. Memory usage stable
mix foundation.memory_check
Phase 3: DSPEx Enhancement Migration
Target Completion: Week 10-13 of Implementation Roadmap
Step 3.1: Create DSPEx-Jido Bridge
Program as Agent Wrapper:
# lib/dspex/jido/program_agent.ex
defmodule DSPEx.Jido.ProgramAgent do
@moduledoc """
Wraps DSPEx.Program as a Jido agent
"""
use Jido.Agent,
name: "dspex_program",
schema: [
program: [type: :any, required: true],
optimization_state: [type: :map, default: %{}]
]
alias DSPEx.Program
alias FoundationJido.Agent.RegistryAdapter
def mount(state, opts) do
program = Keyword.fetch!(opts, :program)
# Register as agent with ML capabilities
{:ok, _} = RegistryAdapter.register_agent(%{
name: Program.get_name(program),
capabilities: [:ml_optimization, :program_execution],
restart_policy: :permanent
})
{:ok, %{state | program: program}}
end
def handle_instruction(%{action: "run_program", params: params}, state) do
result = Program.run(state.program, params)
{:ok, %{result: result}, state}
end
def handle_instruction(%{action: "optimize", params: params}, state) do
# Use DSPEx teleprompters for optimization
optimized_program = DSPEx.Teleprompter.SIMBA.optimize(
state.program,
params.training_data,
params.options
)
{:ok, %{optimized: true}, %{state | program: optimized_program}}
end
end
Step 3.2: Create ML Action Library
Optimization Actions:
# lib/dspex/jido/teleprompter_actions.ex
defmodule DSPEx.Jido.TeleprompterActions do
@moduledoc """
DSPEx optimization as Jido actions
"""
defmodule OptimizeProgram do
use JidoAction.Action,
name: "optimize_program",
description: "Optimize a DSPEx program using teleprompters"
alias DSPEx.Teleprompter
alias Foundation.Types.Error
def run(params, context) do
with {:ok, program} <- validate_program(params.program),
{:ok, training_data} <- validate_training_data(params.training_data),
{:ok, optimized} <- run_optimization(program, training_data, params.options) do
{:ok, %{optimized_program: optimized}, context}
else
{:error, reason} -> {:error, Error.new(:optimization_failed, reason)}
end
end
defp run_optimization(program, training_data, options) do
strategy = Map.get(options, :strategy, :simba)
case strategy do
:simba -> Teleprompter.SIMBA.optimize(program, training_data, options)
:beacon -> Teleprompter.BEACON.optimize(program, training_data, options)
_ -> {:error, "Unknown optimization strategy: #{strategy}"}
end
end
# ... validation helpers
end
end
Step 3.3: Multi-Agent Coordination
Variable-Aware Coordination:
# lib/dspex/jido/coordination_bridge.ex
defmodule DSPEx.Jido.CoordinationBridge do
@moduledoc """
Bridge DSPEx variable system with multi-agent coordination
"""
alias DSPEx.Variable
alias FoundationJido.Coordination
alias Foundation.Types.Error
def coordinate_optimization(programs, shared_variables, options \\ []) do
with {:ok, agent_specs} <- programs_to_agent_specs(programs),
{:ok, coordination_spec} <- build_coordination_spec(shared_variables, options),
{:ok, result} <- Coordination.Orchestrator.coordinate(agent_specs, coordination_spec) do
extract_optimization_results(result)
else
{:error, reason} -> {:error, Error.new(:coordination_failed, reason)}
end
end
defp programs_to_agent_specs(programs) do
specs = Enum.map(programs, fn program ->
%{
agent_type: DSPEx.Jido.ProgramAgent,
config: %{program: program},
capabilities: Variable.Space.get_capabilities(program.variable_space)
}
end)
{:ok, specs}
end
defp build_coordination_spec(shared_variables, options) do
spec = %{
coordination_type: Map.get(options, :coordination_type, :auction),
shared_resources: Variable.Space.get_shared_resources(shared_variables),
optimization_target: Map.get(options, :target, :maximize_performance)
}
{:ok, spec}
end
# ... rest of implementation
end
Phase 3 Verification
# 1. DSPEx programs run as agents
mix test test/dspex/jido/
# 2. Multi-agent optimization works
mix dspex.test_multi_agent_optimization
# 3. Variable coordination functional
mix dspex.test_variable_coordination
# 4. Performance benchmarks met
mix dspex.benchmark_multi_agent
Phase 4: Production Migration
Target Completion: Week 14-16 of Implementation Roadmap
Step 4.1: Environment Preparation
Staging Environment Setup:
# 1. Create staging environment
terraform apply -var-file=staging.tfvars
# 2. Deploy current system to staging
mix deploy staging
# 3. Verify staging system health
mix foundation.health_check --env=staging
Step 4.2: Blue-Green Deployment
Deployment Script:
#!/bin/bash
# deploy_migration.sh
set -e
# 1. Deploy new system to green environment
echo "Deploying to green environment..."
mix deploy green --version=migration-v1.0
# 2. Run smoke tests
echo "Running smoke tests..."
mix foundation.smoke_test --env=green
# 3. Gradually shift traffic
echo "Starting traffic shift..."
for percent in 10 25 50 75 100; do
echo "Shifting $percent% traffic to green..."
terraform apply -var="traffic_split=$percent"
sleep 300 # Wait 5 minutes
# Check health metrics
if ! mix foundation.health_check --env=green; then
echo "Health check failed! Rolling back..."
terraform apply -var="traffic_split=0"
exit 1
fi
done
echo "Migration complete!"
Step 4.3: Data Migration
Agent State Migration:
# lib/migration/agent_state_migrator.ex
defmodule Migration.AgentStateMigrator do
@moduledoc """
Migrates agent state from old foundation.mabeam to new FoundationJido
"""
def migrate_all_agents do
with {:ok, old_agents} <- fetch_old_agent_states(),
{:ok, migration_plan} <- build_migration_plan(old_agents),
{:ok, results} <- execute_migration(migration_plan) do
verify_migration(results)
end
end
defp fetch_old_agent_states do
# Extract state from old Foundation.MABEAM.ProcessRegistry
Foundation.MABEAM.ProcessRegistry.list_all_agents()
end
defp build_migration_plan(agents) do
plan = Enum.map(agents, fn agent ->
%{
old_state: agent,
new_config: convert_to_jido_config(agent),
migration_strategy: determine_strategy(agent)
}
end)
{:ok, plan}
end
defp execute_migration(plan) do
Enum.reduce_while(plan, {:ok, []}, fn item, {:ok, acc} ->
case migrate_single_agent(item) do
{:ok, result} -> {:cont, {:ok, [result | acc]}}
{:error, reason} -> {:halt, {:error, reason}}
end
end)
end
# ... rest of implementation
end
Step 4.4: Cleanup and Verification
Remove Migration Helpers:
# 1. Remove temporary files
rm lib/migration_helpers.ex
rm lib/foundation_jido/migration_bridge.ex
# 2. Remove deprecated modules
rm -rf lib/foundation/mabeam/
# 3. Update dependencies
# Remove {:foundation_migration_tools, ...} from mix.exs
# 4. Run final verification
mix foundation.verify_migration_complete
Phase 4 Verification
# 1. All systems operational
mix foundation.health_check --env=production
# 2. No deprecated code in use
mix foundation.check_deprecated_usage
# 3. Performance targets met
mix foundation.benchmark_production
# 4. Error rates normal
mix foundation.check_error_rates
Rollback Procedures
Emergency Rollback (< 5 minutes)
# 1. Immediate traffic rollback
terraform apply -var="traffic_split=0"
# 2. Verify old system health
mix foundation.health_check --env=blue
# 3. Notify team
mix foundation.notify_rollback "Emergency rollback executed"
Planned Rollback (< 30 minutes)
# 1. Graceful agent shutdown
mix foundation.graceful_shutdown --timeout=300
# 2. Restore from backup
mix foundation.restore_from_backup --backup=pre-migration
# 3. Verify system state
mix foundation.verify_rollback_complete
# 4. Resume operations
mix foundation.start_all_services
Post-Migration Validation
Week 1 After Migration
# Daily health checks
mix foundation.health_check --detailed
# Performance monitoring
mix foundation.performance_report --days=7
# Error rate analysis
mix foundation.error_analysis --days=7
Week 2-4 After Migration
# Weekly comprehensive review
mix foundation.migration_success_report --weeks=1
# Optimization opportunities
mix foundation.optimization_analysis
# Team feedback collection
mix foundation.collect_team_feedback
Troubleshooting Guide
Common Issues
Issue 1: Agent Registration Failures
# Symptom: Agents fail to register with new system
# Check: Registry service health
mix foundation.check_registry_health
# Solution: Restart registry service
mix foundation.restart_service ProcessRegistry
Issue 2: Signal Dispatch Timeouts
# Symptom: JidoSignal dispatches timing out
# Check: Circuit breaker status
mix foundation.check_circuit_breakers
# Solution: Reset circuit breakers
mix foundation.reset_circuit_breaker :signal_http
Issue 3: Performance Degradation
# Symptom: Response times increased after migration
# Check: Integration layer overhead
mix foundation.profile_integration_layer
# Solution: Optimize hot paths
mix foundation.optimize_integration --profile=production
Getting Help
- Internal Team: Check team wiki and internal documentation
- Jido Community: https://github.com/agentjido/jido/discussions
- Expert Consultation: Engage with Jido maintainers if needed
- Emergency Support: Use established incident response procedures
Conclusion
This migration guide provides a comprehensive, step-by-step approach to transforming your Foundation/MABEAM system into a world-class multi-agent platform. The incremental approach minimizes risk while ensuring system stability throughout the transition.
Key Success Factors:
- Follow the phases in order
- Verify each step before proceeding
- Maintain comprehensive backups
- Monitor system health continuously
- Have rollback procedures ready
Post-Migration Benefits:
- Clean, maintainable architecture
- Better separation of concerns
- Improved development velocity
- Production-ready observability
- Future-proof foundation for growth
The result will be a robust, scalable platform capable of supporting sophisticated multi-agent workflows while maintaining the reliability and performance your team depends on.