package structuredoutput import ( "errors" "gitea.maximumdirect.net/eric/audita/internal/framework/outcomes" ) // FailureKind separates invalid generated content from operational failures. type FailureKind string const ( FailureMalformedOutput FailureKind = "malformed_output" FailureRuntime FailureKind = "runtime" ) // Failure exposes a safe message while retaining the typed cause for callers. // The cause must not be serialized or formatted directly in user artifacts. type Failure struct { Kind FailureKind // Retained until the adapter switches to reason-based classification. Class FailureClass Reason outcomes.ReasonCode Message string Cause error } // FailureClass determines whether domain processing may safely skip a model // operation or must stop the run. Parent cancellation always stops the run. type FailureClass string const ( FailureRecoverable FailureClass = "recoverable" FailureFatal FailureClass = "fatal" FailureCanceled FailureClass = "canceled" ) func (f *Failure) Error() string { return f.Message } func (f *Failure) Unwrap() error { return f.Cause } func IsRecoverable(err error) bool { var failure *Failure return errors.As(err, &failure) && failure.Class == FailureRecoverable } func IsMalformedError(err error) bool { var failure *Failure return errors.As(err, &failure) && failure.Kind == FailureMalformedOutput }