Changelog
View SourceAll notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
0.2.0 - 2025-10-28
Added
CI/CD Infrastructure
- GitHub Actions Workflow: Comprehensive CI pipeline for automated testing
- Matrix testing across Elixir 1.15, 1.16, 1.17 and OTP 26, 27
- Separate jobs for unit tests, integration tests, Dialyzer, and dependency audits
- Smart caching for dependencies and PLT files
- Conditional integration test execution with API key support
- Documentation in
.github/workflows/README.md
Examples and Documentation
Comprehensive Examples: Three runnable examples demonstrating key features
- Customer support agent with custom tools and conversational memory
- Multi-agent research workflow with parallel execution
- Structured data extraction with validated output schemas
- Complete examples README with setup instructions and key concepts
Customer Support Example Application: Production-ready multi-agent system
- Four specialized agents (Greeter, Technical, Billing, Order Support)
- Custom tools for knowledge base, order lookup, refunds, and ticket creation
- Interactive CLI interface with session management
- Data stores for orders, tickets, and knowledge base
- Full application architecture documentation
Context Management Improvements
TokenCounter Test Coverage: Comprehensive unit tests for token counting
- 15 tests covering all TokenCounter functionality
- Mock-based testing for unit tests
- Integration tests for real API calls
- Error handling and edge case coverage
Date/Time Context Provider: Dynamic timestamp injection for prompts
Normandy.Components.DateTimeProviderfor temporal context- Configurable timezone support
- Test coverage for provider functionality
Development Tools
- JSON Deserializer: Improved JSON parsing with error handling
Normandy.LLM.JsonDeserializerfor robust JSON parsing- Fallback mechanisms for malformed JSON
- Integration tests for retry scenarios
Fixed
TokenCounter Implementation: Critical bug fixes for production use
- Fixed Claudio client initialization (map format instead of keyword list)
- Fixed agent structure access patterns (direct field access)
- Fixed system prompt extraction (pattern matching instead of get_in/2)
- Added comprehensive error handling for malformed agents
Access Protocol Issues: Resolved struct field access errors
- Replaced get_in/2 with pattern matching for BaseAgentConfig
- Improved error messages for malformed agent structures
Documentation
- Enhanced ExDoc configuration with organized module groups
- Examples directory with comprehensive usage documentation
- CI/CD workflow documentation with local testing commands
- Customer support application architecture guide
Test Coverage
- 443 unit tests (29 doctests + 21 properties + 393 tests)
- 62 integration tests (56 API + 6 comprehensive DSL tests)
- 15 new TokenCounter unit tests
- Total: 505+ tests, all passing
0.1.0 - 2025-10-26
Added
Declarative DSLs (Phase 8.6)
Agent DSL: Define agents with declarative syntax
Normandy.DSL.Agent-agent do ...endblocks for agent configuration- Macro-based configuration for model, temperature, prompts, tools
- Automatic initialization with
new/1and agent execution - Background, steps, and output_instructions directives
Workflow DSL: Compose multi-agent workflows
Normandy.DSL.Workflow-workflow do ... endblocks- Sequential execution:
step :name do ... end - Parallel execution:
parallel :name do ... end - Race patterns:
race :name do ... end - Data flow:
input(from: :step_name)or static values - Result transformation:
transform fn ... end - Conditional execution:
when_result do ... end - Automatic step orchestration and error handling
Pattern Matching Helpers: Utilities for result tuples
Normandy.Coordination.Pattern- Ergonomic {:ok, value} | {:error, reason} handling- Type checking:
ok?/1,error?/1 - Value extraction:
ok!/2,error!/2,unwrap!/1 - Filtering lists:
filter_ok/1,filter_errors/1 - Transformations:
map_ok/2,map_error/2 - Composition:
then/2,find_ok/1,collect_ok/1,all_ok/1,all_ok_map/1 - Wrapping utilities:
wrap/1,try_wrap/1
Reactive Coordination Patterns
Normandy.Coordination.Reactive- Concurrent agent execution primitivesrace/3- Return first successful result from multiple agentsall/3- Wait for all agents with optional fail-fast modesome/4- Quorum pattern (wait for N successful results)map/3- Transform agent resultswhen_result/3- Conditional execution based on results
Agent Pool Management
Normandy.Coordination.AgentPool- Connection pool pattern for agents- Transaction-based API with automatic checkout/checkin
- Manual checkout/checkin for advanced use cases
- Configurable pool size with overflow support
- LIFO/FIFO checkout strategies
- Automatic agent replacement on failure
- Pool statistics and monitoring
- Non-blocking checkout with timeout support
Core Foundation (Phases 1-7)
Schema System: Macro-based DSL for defining agent I/O schemas with JSON Schema generation
Normandy.Schemamodule withschemaandio_schemamacros- Type system with casting, dumping, and loading via
Normandy.Type - Changeset-like validation with
Normandy.Validate - Support for parameterized and custom types
Agent System: Core agent implementation with LLM integration
Normandy.Agents.BaseAgentwith init, run, and get_response methodsNormandy.Agents.BaseAgentConfigfor agent state management- Context provider system for dynamic prompt injection
- Tool/function calling support via
Normandy.Agents.ToolCallResponse
Memory Management: Conversational history tracking
Normandy.Components.AgentMemorywith turn-based organization- Message serialization and deserialization
- Configurable message history limits
Prompt System: Structured prompt generation
Normandy.Components.SystemPromptGeneratorwith section-based promptsNormandy.Components.PromptSpecificationfor prompt structureNormandy.Components.ContextProviderprotocol for dynamic context
Streaming Responses: Real-time LLM response streaming
- Streaming support in
Normandy.Agents.BaseAgent - Callback-based streaming with arity-2 callback support
- Streaming support in
Resilience Patterns: Fault tolerance and reliability
Normandy.Resilience.Retrywith exponential backoffNormandy.Resilience.CircuitBreakerfor preventing cascade failures- Integration with BaseAgent for automatic retry on failures
Context Window Management: Intelligent conversation management
Normandy.Context.WindowManagerfor automatic context managementNormandy.Context.TokenCounterfor accurate token countingNormandy.Context.Summarizerfor conversation summarization- Support for Claude's prompt caching (up to 90% cost reduction)
Multi-Agent Coordination (Phase 8)
Agent Communication: Message-based agent-to-agent communication
Normandy.Coordination.AgentMessagefor structured messagingNormandy.Coordination.SharedContextfor stateless context sharingNormandy.Coordination.StatefulContext(GenServer + ETS) for stateful sharing
Orchestration Patterns: Multiple coordination strategies
Normandy.Coordination.SequentialOrchestratorfor pipeline executionNormandy.Coordination.ParallelOrchestratorfor concurrent executionNormandy.Coordination.HierarchicalCoordinatorfor manager-worker patterns- Simple and advanced APIs for flexible usage
Agent Processes: OTP-based agent supervision
Normandy.Coordination.AgentProcess(GenServer wrapper)Normandy.Coordination.AgentSupervisor(DynamicSupervisor)- Fault tolerance with Elixir/OTP patterns
Batch Processing
- Concurrent Processing: Efficient batch agent execution
Normandy.Batch.Processorfor concurrent batch processing- Configurable concurrency limits
- Result aggregation and error handling
Integration & Testing (Phase 8.5)
Integration Tests: Comprehensive real-world testing
- 56 integration tests with real Anthropic API calls
- Test helpers:
IntegrationHelperandNormandyIntegrationHelper - Tag-based test exclusion (
@moduletag :api,@moduletag :integration) - Coverage for multi-agent workflows, resilience, caching, and batch processing
LLM Client Integration: Claudio HTTP client migration
- Updated to Claudio v0.1.1 from hex.pm
- Migrated from Tesla to Req HTTP client
- Streaming error handling for
Req.Response.Async
Fixed
- Orchestrator APIs: Fixed
extract_resultto return full response maps instead of just chat_message strings - Function clause matching: Improved pattern matching for simple vs advanced orchestrator APIs
- Streaming callbacks: Fixed arity-2 callback support for streaming responses
Documentation
- Comprehensive README with usage examples
- Project roadmap (ROADMAP.md) tracking implementation phases
- MIT License
- Hex.pm package metadata and documentation configuration
Dependencies
elixir_uuid~> 1.2 - UUID generation for conversation turnspoison~> 6.0 - JSON encoding/decodingclaudio~> 0.1.1 - Anthropic Claude API clientdialyxir~> 1.4 (dev/test) - Static analysisstream_data~> 1.1 (dev/test) - Property-based testingex_doc~> 0.34 (dev) - Documentation generation
Test Coverage
- 443 unit tests (29 doctests + 21 properties + 393 tests)
- 62 integration tests (56 API + 6 comprehensive DSL tests, excluded by default)
- Total: 505 tests, all passing
- New test files:
test/coordination/pattern_test.exs(13 tests)test/coordination/reactive_test.exs(33 tests)test/coordination/agent_pool_test.exs(30 tests)test/dsl/agent_test.exs(8 tests)test/dsl/workflow_test.exs(14 tests)test/dsl/workflow_transform_integration_test.exs(4 tests)test/normandy_integration/dsl_comprehensive_test.exs(6 comprehensive integration tests)