Normalize the Stage.describe/1 return value to a canonical schema format
that aligns with the Crucible.Stage behaviour contract. This breaking
change establishes a consistent introspection interface across all
Crucible stages.
Schema Format Changes:
The name field changes from a string ("ensemble_voting") to an atom
(:ensemble_voting) for consistency with Elixir conventions and pattern
matching ergonomics.
Added __schema_version__ marker ("1.0.0") to enable future schema
evolution and backward compatibility detection.
Introduced core schema fields: required, optional, types, and defaults.
These provide machine-readable option specifications that enable
tooling, validation, and documentation generation.
Moved domain-specific metadata (strategies, execution_modes, inputs,
outputs, config_type, behaviour) into the __extensions__.ensemble
namespace. This separates universal stage metadata from ensemble-
specific concerns.
Dependency Updates:
Upgraded crucible_framework from ~> 0.4.0 to ~> 0.5.0 to align with
the new Stage behaviour contract requirements.
Bumped crucible_ir from ~> 0.2.0 to ~> 0.2.1 for compatibility.
Extended dialyxir to run in test environment for improved CI coverage.
Testing:
Added comprehensive conformance test suite in conformance_test.exs
that validates schema structure, field relationships, type
specifications, and extension format.
Updated existing stage_test.exs and stage_behaviour_test.exs to
verify the new canonical format, including atom name assertions and
extension namespace access patterns.
Documentation:
Updated README Stage Introspection example to demonstrate the new
canonical schema format with all core fields and extension access.
Added Stage Contract section documenting available options including
normalization, timeout_ms, and min_responses with their types and
default values.