-`Option` type and `WithMessageProvider(mp MessageProvider) Option`
-`FieldLevel` interface — passed to custom validator functions; exposes `Field() reflect.Value`, `Param() string`, `FieldName() string`; go-playground backend never visible
-`WithCustomValidator(tag string, fn func(FieldLevel) bool) Option` — registers a custom validation tag at construction time; panics on empty or conflicting tag
-`OverrideProvider(handlers map[string]func(field, param string) string, base MessageProvider) MessageProvider` — composes a tag→message handler map with a fallback; use for custom tag messages without re-implementing built-ins
- **Full built-in tag coverage** in `DefaultMessages` and `SpanishMessages` — all go-playground/validator tags have specific messages (fields, network, strings, format, comparisons, other; ~150 tags total)
- Field names in error context prefer the json struct tag, falling back to the Go
field name
- Error codes: `ErrInvalidInput` for constraint failures, `ErrInternal` for
non-struct arguments — both returned as `*xerrors.Err`
### Design Notes
1.**Contracts as the source of truth.**`launcher` accepts `lifecycle.Component`
and `logging.Logger` from `contracts`. It does not define its own lifecycle
interface. Any type that satisfies the contracts interface is directly compatible —
no adapters needed.
2.**Duck typing replaced by explicit interfaces.** micro-lib's `logz` detected
enrichable errors via private `errorWithCode`/`errorWithContext` interfaces.
`core/logz` detects them via `contracts/errs.CodedError` and `contracts/errs.ContextualError`.
The decoupling (logz does not import xerrors) is preserved; the contract is now
visible. See [ADR-002](docs/adr/ADR-002-logz-contracts-errs.md).