package domain import "time" // ExecutionObserver receives one immutable metadata event synchronously. type ExecutionObserver func(ExecutionEvent) type ExecutionEventKind string const ( ExecutionStarted ExecutionEventKind = "started" ExecutionAttempt ExecutionEventKind = "attempt" ExecutionRetryDelay ExecutionEventKind = "retry_delay" ExecutionFinished ExecutionEventKind = "finished" ) type ExecutionOutcome string const ( ExecutionOutcomeSuccess ExecutionOutcome = "success" ExecutionOutcomeInvalidOutput ExecutionOutcome = "invalid_output" ExecutionOutcomeError ExecutionOutcome = "error" ) type ExecutionFailureKind string const ( ExecutionFailureNone ExecutionFailureKind = "" ExecutionFailureCanceled ExecutionFailureKind = "canceled" ExecutionFailureDeadline ExecutionFailureKind = "deadline" ExecutionFailureTransport ExecutionFailureKind = "transport" ExecutionFailureProviderStatus ExecutionFailureKind = "provider_status" ExecutionFailureMalformedResponse ExecutionFailureKind = "malformed_response" ExecutionFailureCapacity ExecutionFailureKind = "capacity" ExecutionFailureInvalidConfig ExecutionFailureKind = "invalid_config" ExecutionFailureInvalidRequest ExecutionFailureKind = "invalid_request" ExecutionFailurePromptNotFound ExecutionFailureKind = "prompt_not_found" ExecutionFailureProfileNotFound ExecutionFailureKind = "profile_not_found" ExecutionFailurePromptLoad ExecutionFailureKind = "prompt_load" ExecutionFailureProfileLoad ExecutionFailureKind = "profile_load" ExecutionFailureArtifactLoad ExecutionFailureKind = "artifact_load" ExecutionFailurePromptRender ExecutionFailureKind = "prompt_render" ExecutionFailureValidation ExecutionFailureKind = "validation" ExecutionFailureGeneration ExecutionFailureKind = "generation" ExecutionFailureOther ExecutionFailureKind = "other" ) // ObservedTokenCount distinguishes omitted usage from reported zero. type ObservedTokenCount struct { Value int Known bool Complete bool } // ObservedTokenUsage reports presence-aware token counts. type ObservedTokenUsage struct { PromptTokens ObservedTokenCount CompletionTokens ObservedTokenCount TotalTokens ObservedTokenCount CachedTokens ObservedTokenCount CacheWriteTokens ObservedTokenCount } // ExecutionEvent contains metadata only; it carries no mutable containers or // error values. Nonterminal events leave aggregate counters at zero. type ExecutionEvent struct { Kind ExecutionEventKind RunID string Time time.Time PromptID string PromptVersion *string ProfileID string BackendID string Model string Generation uint64 Attempt uint64 Dispatched bool CapacityWait time.Duration GenerationDuration time.Duration RetryDelay time.Duration Duration time.Duration Outcome ExecutionOutcome Failure ExecutionFailureKind StatusCode int RetriesExhausted bool Usage ObservedTokenUsage Attempts uint64 TransientRetries uint64 RepairCalls uint64 }