All 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.
0.3.0 - 2026-01-08
-
Backend IR Structs - Universal request/response contracts for LLM backends
CrucibleIR.Backend.Prompt- Backend input contract with chat-style messages, tool calling, and multimodal content support- Supports roles:
:system,:user,:assistant,:tool - Multimodal content parts: text, image (URL or base64), audio, tool_result
- Tool definitions and tool choice directives (
:auto,:none,:required,%{name: string}) - Request/trace ID correlation and metadata
- Supports roles:
CrucibleIR.Backend.Options- Generation options normalized across providers- Standard parameters:
model,temperature,max_tokens,top_p,top_k,frequency_penalty,presence_penalty,stop - Response format:
:text,:json,:json_schemawith JSON schema support - Streaming, caching (
:ephemeral), extended thinking with budget tokens - Reproducibility via
seed, timeout configuration, andextramap for provider-specific options
- Standard parameters:
CrucibleIR.Backend.Completion- Backend output contract with normalized response structure- Choices with index, message, and finish reason (
:stop,:length,:tool_calls,:content_filter,:error) - Extended thinking content and token tracking
- Usage metrics: prompt_tokens, completion_tokens, total_tokens, thinking_tokens, cached_tokens
- Latency tracking:
latency_ms,time_to_first_token_ms - Raw response preservation and metadata
- Choices with index, message, and finish reason (
CrucibleIR.Backend.Capabilities- Backend capability discovery and limits- Required:
backend_id,provider - Feature flags:
supports_streaming,supports_tools,supports_vision,supports_audio,supports_json_mode,supports_extended_thinking,supports_caching - Limits:
max_tokens,max_context_length,max_images_per_request,requests_per_minute,tokens_per_minute - Cost visibility:
cost_per_million_input,cost_per_million_output
- Required:
-
Serialization Support for Backend IR
from_map/2andfrom_json/2for all Backend IR structs- Automatic conversion of message roles, content parts, tool calls
- Normalization of tool choice, response format, cache control, finish reason atoms
- Nested Options deserialization within Prompt structs
- Usage and choice deserialization in Completion structs
-
Validation Support for Backend IR
validate/1forPrompt,Options,Completion,Capabilities- Message validation: role, content (string or multimodal parts)
- Content part validation: type must be
:text,:image,:audio, or:tool_result - Tool choice validation:
:auto,:none,:required, or%{name: string} - Options validation: response_format, cache_control, non-negative integers, stop sequences, json_schema requirement
- Completion validation: choices list, finish_reason enum
- Capabilities validation: required fields, boolean flags
-
New Example
examples/10_backend_ir_contract.exs- Demonstrates Prompt, Completion, and Capabilities IR with JSON serialization
-
Comprehensive Tests
test/crucible_ir/backend/prompt_test.exs- Struct defaults, JSON encoding, validationtest/crucible_ir/backend/options_test.exs- Struct defaults, JSON encoding, validationtest/crucible_ir/backend/completion_test.exs- Struct defaults, JSON encoding, validationtest/crucible_ir/backend/capabilities_test.exs- Struct defaults, JSON encoding, validation- Extended serialization_test.exs with Backend IR round-trip tests
- Extended validation_test.exs with Backend IR validation tests
- Updated README with Backend IR Quick Start section and struct field reference
- Updated
docs/20251225/current_state.mdwith Backend IR documentation - Updated
docs/20251226/ir_boundary/IR_BOUNDARY_AND_CONTRACT.mdto include Backend IR in boundary definition - Updated
lib/crucible_ir.exmodule documentation with Backend IR section - Updated
examples/README.mdandexamples/run_all.shwith new example
0.2.1 - 2025-12-26
- Examples directory with API integration demos (backends, datasets, model registry, training, deployment, feedback, outputs, serialization)
- IR boundary documentation (
docs/20251226/ir_boundary/) - JSON round-trip tests for model lifecycle, deployment, feedback, and output specs
- Serialization now decodes experiment model lifecycle fields and reliability feedback configs
- Serialization now normalizes dataset formats, stage modules, backend deployment IDs, and ensemble weights
- Documentation clarifies the IR boundary and serialization contract
0.2.0 - 2025-12-25
- Model Lifecycle Structs
CrucibleIR.ModelRef- Model reference with provider, framework, and artifact URICrucibleIR.ModelVersion- Model version with stage, metrics, and lineage trackingCrucibleIR.Training.Config- Training configuration (epochs, batch size, optimizer, device)CrucibleIR.Training.Run- Training run tracking (status, metrics history, checkpoints)CrucibleIR.Deployment.Config- Deployment configuration (environment, strategy, scaling)CrucibleIR.Deployment.Status- Deployment status (state, health, replicas)CrucibleIR.Feedback.Config- Feedback collection configuration (sampling, storage, drift detection)CrucibleIR.Feedback.Event- Feedback event (input, output, user feedback, latency)
0.1.1 - 2025-11-26
-
Validation Module (
CrucibleIR.Validation)validate/1- Validates structs and returns{:ok, struct}or{:error, errors}valid?/1- Returns boolean indicating validityerrors/1- Returns list of validation errors- Validates all IR structs including nested configurations
- Validates enum values (strategies, execution modes, etc.)
- Validates numeric ranges (alpha between 0 and 1)
- Provides detailed, actionable error messages
- 41 comprehensive validation tests
-
Serialization Module (
CrucibleIR.Serialization)to_json/1- Encodes structs to JSON stringsfrom_json/2- Decodes JSON to typed structs with automatic conversionfrom_map/2- Converts maps (string or atom keys) to structs- Handles nested struct deserialization (Experiment → BackendRef, Reliability.Config, etc.)
- Automatic string-to-atom conversion for identifiers
- Smart dataset name handling (preserves strings with spaces, converts simple names to atoms)
- Round-trip serialization preserves data integrity
- 26 comprehensive serialization tests including round-trip tests
-
Builder Module (
CrucibleIR.Builder)- Fluent, chainable API for experiment construction
experiment/1- Creates new experiment builderwith_description/2- Adds descriptionwith_backend/2- Configures backend with optionsadd_stage/2- Adds pipeline stageswith_dataset/2- Configures datasetwith_ensemble/2- Adds ensemble voting configurationwith_hedging/2- Adds request hedging configurationwith_stats/2- Adds statistical testing configurationwith_fairness/1- Adds fairness checking configurationwith_guardrails/1- Adds security guardrails configurationadd_output/2- Adds output specificationsbuild/1- Validates and finalizes experiment- All builder methods are chainable
- Automatic validation on
build/1 - 29 comprehensive builder tests
-
Main Module Delegations
CrucibleIR.validate/1delegates toValidation.validate/1CrucibleIR.valid?/1delegates toValidation.valid?/1CrucibleIR.to_json/1delegates toSerialization.to_json/1CrucibleIR.from_json/2delegates toSerialization.from_json/2CrucibleIR.from_map/2delegates toSerialization.from_map/2CrucibleIR.experiment/1delegates toBuilder.experiment/1
-
Documentation
- Comprehensive module documentation with examples
- Updated README with v0.1.1 feature examples
- Validation examples
- Serialization examples
- Builder API examples
- 3 new doctests (in addition to existing 3)
- Test coverage increased from 78 to 174 tests (96 new tests)
- Documentation coverage remains at 100%
- All new modules follow existing patterns (immutability, type specs, comprehensive docs)
- Zero compilation warnings
- All tests pass with zero failures
- Backward compatible with v0.1.0
0.1.0 - 2025-11-26
- Initial release of CrucibleIR
- Core experiment definition structs:
CrucibleIR.Experiment- Top-level experiment definitionCrucibleIR.BackendRef- LLM backend referenceCrucibleIR.DatasetRef- Dataset referenceCrucibleIR.StageDef- Processing stage definitionCrucibleIR.OutputSpec- Output specification
- Reliability configuration structs:
CrucibleIR.Reliability.Config- Container for all reliability configsCrucibleIR.Reliability.Ensemble- Ensemble voting configurationCrucibleIR.Reliability.Hedging- Request hedging configurationCrucibleIR.Reliability.Stats- Statistical testing configurationCrucibleIR.Reliability.Fairness- Fairness checking configurationCrucibleIR.Reliability.Guardrail- Security guardrails configuration
- JSON serialization support via
Jason.Encoderfor all structs - Full type specifications with
@typeand@spec - Comprehensive documentation with examples
CrucibleIR.new_experiment/1convenience function- Test coverage: 78 tests (3 doctests, 75 unit tests), 0 failures
- All structs are immutable
- JSON-first approach for serialization
- Hierarchical configuration structure
- Required fields enforced with
@enforce_keys - Optional fields default to
nilor sensible defaults