Documentation
¶
Overview ¶
Package schema defines AgentAPI Doctor's stable, provider-neutral public contracts. The package deliberately contains data types and validation only; transports, drivers, storage, and policy live behind internal boundaries.
Index ¶
- Constants
- Variables
- func CanonicalMarshal(value any) ([]byte, error)
- func CanonicalizeJSON(raw []byte) ([]byte, error)
- type ArtifactPin
- type ArtifactSelector
- type AssertionResult
- type AssertionRole
- type Attempt
- type BudgetConsumption
- type BudgetPolicy
- type CapabilityFact
- type CapabilityObservation
- type CapabilityStatus
- type CaptureLayer
- type CaptureMode
- type CaseResult
- type ConditionalBranch
- type DenominatorSummary
- type Digest
- type DimensionOutcome
- type Direction
- type Duration
- func (value Duration) Duration() time.Duration
- func (value Duration) MarshalJSON() ([]byte, error)
- func (value Duration) MarshalText() ([]byte, error)
- func (value Duration) String() string
- func (value *Duration) UnmarshalJSON(raw []byte) error
- func (value *Duration) UnmarshalText(raw []byte) error
- func (value Duration) Validate() error
- type EnvelopeMeta
- type Evidence
- type EvidencePolicy
- type EvidenceRelation
- type ExecutionStatus
- type FaultFamily
- type FinalizerPlan
- type Finding
- type HardBudget
- type IRItem
- type IRType
- type InstanceID
- type InstrumentationMode
- type IntentPlan
- type Interaction
- type LossMarker
- type NetworkPolicy
- type ObjectRef
- type PlanDisposition
- type ProbePolicy
- type Producer
- type ProfileOutcome
- type ProfileResult
- type ReasonCode
- type RedactionRecord
- type ResolvedRunPlan
- type RuntimePolicy
- type SafetyPolicy
- type ScenarioDecision
- type SideEffectPolicy
- type StatisticalEstimate
- type TargetIntent
- type TargetResolution
- type TokenBudget
- type UTCTime
- type Verdict
Constants ¶
const ( SchemaNamespace = "urn:agentapi-doctor:" ExtensionPrefix = "x-" )
Variables ¶
var ( // ErrDuplicateJSONKey is returned before canonicalization if an object // contains a repeated member name. encoding/json otherwise accepts the // last occurrence, which would make a signed input ambiguous. ErrDuplicateJSONKey = errors.New("duplicate JSON object key") // ErrTrailingJSONValue rejects concatenated or trailing JSON values. ErrTrailingJSONValue = errors.New("trailing JSON value") )
Functions ¶
func CanonicalMarshal ¶
CanonicalMarshal marshals a typed value and canonicalizes the result. Typed values cannot carry duplicate member names; custom MarshalJSON implementations are still subjected to strict validation.
Types ¶
type ArtifactPin ¶
type ArtifactPin struct {
Kind string `json:"kind"`
Name string `json:"name"`
Version string `json:"version"`
Digest Digest `json:"digest"`
}
ArtifactPin identifies an exact executable or declarative artifact. Tags and floating versions are discovery aids and never satisfy a run lock.
func (ArtifactPin) Validate ¶
func (pin ArtifactPin) Validate() error
type ArtifactSelector ¶
type AssertionResult ¶
type AssertionResult struct {
AssertionResultID InstanceID `json:"assertion_result_id"`
AssertionID string `json:"assertion_id"`
RequirementID string `json:"requirement_id,omitempty"`
Role AssertionRole `json:"assertion_role"`
Oracle ArtifactPin `json:"oracle"`
Verdict Verdict `json:"verdict"`
ReasonCode ReasonCode `json:"reason_code,omitempty"`
Expected any `json:"expected,omitempty"`
Observed any `json:"observed,omitempty"`
EvidenceRefs []ObjectRef `json:"evidence_refs"`
Deterministic bool `json:"deterministic"`
Statistical *StatisticalEstimate `json:"statistical,omitempty"`
EvaluatorDigest Digest `json:"evaluator_digest"`
}
func (AssertionResult) Validate ¶
func (result AssertionResult) Validate() error
type AssertionRole ¶
type AssertionRole string
const ( AssertionPrecondition AssertionRole = "precondition" AssertionNormative AssertionRole = "normative" AssertionConsumerProfile AssertionRole = "consumer_profile" AssertionBehavioral AssertionRole = "behavioral" AssertionAdvisory AssertionRole = "advisory" )
type Attempt ¶
type Attempt struct {
AttemptID InstanceID `json:"attempt_id"`
InvocationID InstanceID `json:"invocation_id"`
ExecutionStatus ExecutionStatus `json:"execution_status"`
ReasonCode ReasonCode `json:"reason_code,omitempty"`
RequestRef *ObjectRef `json:"request_ref,omitempty"`
EvidenceRefs []ObjectRef `json:"evidence_refs,omitempty"`
Driver ArtifactPin `json:"driver"`
ClientObservationRefs []ObjectRef `json:"client_observation_refs,omitempty"`
ConsumedBudget BudgetConsumption `json:"consumed_budget"`
ResidualLeaseRefs []ObjectRef `json:"residual_lease_refs,omitempty"`
}
type BudgetConsumption ¶
type BudgetConsumption struct {
Requests int64 `json:"requests"`
RequestBytes int64 `json:"request_bytes"`
ResponseBytes int64 `json:"response_bytes"`
ArtifactBytes int64 `json:"artifact_bytes"`
InputTokens *int64 `json:"input_tokens,omitempty"`
OutputTokens *int64 `json:"output_tokens,omitempty"`
Unknown []string `json:"unknown,omitempty"`
}
type BudgetPolicy ¶
type BudgetPolicy struct {
Hard HardBudget `json:"hard"`
Reservation TokenBudget `json:"reservation"`
Cleanup HardBudget `json:"cleanup"`
}
func (BudgetPolicy) Validate ¶
func (budget BudgetPolicy) Validate() error
type CapabilityFact ¶
type CapabilityFact struct {
Capability string `json:"capability"`
Status CapabilityStatus `json:"status"`
Evidence []ObjectRef `json:"evidence"`
}
type CapabilityObservation ¶
type CapabilityObservation struct {
EnvelopeMeta
ObservationID InstanceID `json:"capability_observation_id"`
IntentPlanRef ObjectRef `json:"intent_plan_ref"`
ProbePolicyHash Digest `json:"probe_policy_digest"`
Facts []CapabilityFact `json:"facts"`
ConsumedBudget HardBudget `json:"consumed_budget"`
}
type CapabilityStatus ¶
type CapabilityStatus string
const ( CapabilitySupported CapabilityStatus = "supported" CapabilityUnsupported CapabilityStatus = "unsupported" CapabilityUnknown CapabilityStatus = "unknown" )
type CaptureLayer ¶
type CaptureLayer string
const ( LayerUpstreamApplication CaptureLayer = "upstream_application_observation" LayerProxyForwarded CaptureLayer = "proxy_forwarded_observation" LayerClientSDK CaptureLayer = "client_sdk_observation" LayerSanitizedPersisted CaptureLayer = "sanitized_persisted_evidence" )
type CaptureMode ¶
type CaptureMode string
const ( CaptureMetadataOnly CaptureMode = "metadata_only" CaptureSynthetic CaptureMode = "synthetic_content" CaptureStandard CaptureMode = "standard_fixture_only" CaptureLocalPrivate CaptureMode = "local_private_encrypted" )
type CaseResult ¶
type CaseResult struct {
ScenarioID string `json:"scenario_id"`
PlanDisposition PlanDisposition `json:"plan_disposition"`
AttemptIDs []InstanceID `json:"attempt_ids,omitempty"`
ExecutionStatus ExecutionStatus `json:"execution_status,omitempty"`
Verdict *Verdict `json:"verdict,omitempty"`
ReasonCode ReasonCode `json:"reason_code,omitempty"`
EvidenceRefs []ObjectRef `json:"evidence_refs,omitempty"`
AssertionResults []AssertionResult `json:"assertion_results,omitempty"`
Findings []Finding `json:"findings,omitempty"`
CandidateMember bool `json:"candidate_member"`
ApplicableMember bool `json:"applicable_member"`
ExecutedMember bool `json:"executed_member"`
AttemptAggregation string `json:"attempt_aggregation"`
}
func (CaseResult) Validate ¶
func (result CaseResult) Validate() error
type ConditionalBranch ¶
type DenominatorSummary ¶
type DenominatorSummary struct {
CandidateDigest Digest `json:"candidate_digest"`
CandidateCount int64 `json:"candidate_count"`
ApplicableDigest Digest `json:"applicable_digest"`
ApplicableCount int64 `json:"applicable_count"`
ExecutedDigest Digest `json:"executed_digest"`
ExecutedCount int64 `json:"executed_count"`
}
type Digest ¶
type Digest string
Digest is a lowercase, algorithm-qualified content digest.
func CanonicalDigest ¶
CanonicalDigest hashes the RFC 8785 representation of value.
func NewDigest ¶
NewDigest computes a SHA-256 digest over bytes that are already in their immutable projection. Callers that start from JSON should use CanonicalDigest instead.
func ParseDigest ¶
ParseDigest validates and returns a supported digest.
type DimensionOutcome ¶
type DimensionOutcome string
const ( DimensionPass DimensionOutcome = "pass" DimensionFail DimensionOutcome = "fail" DimensionDegraded DimensionOutcome = "degraded" DimensionInconclusive DimensionOutcome = "inconclusive" DimensionNotRun DimensionOutcome = "not_run" )
type Duration ¶
Duration is a positive, canonical Go-style duration used by authored and resolved plans. It serializes as a string (for example, "15m0s").
func NewDuration ¶
func (Duration) MarshalJSON ¶
func (Duration) MarshalText ¶
func (*Duration) UnmarshalJSON ¶
func (*Duration) UnmarshalText ¶
type EnvelopeMeta ¶
type EnvelopeMeta struct {
SchemaVersion string `json:"schema_version"`
Kind string `json:"kind"`
InstanceID InstanceID `json:"instance_id,omitempty"`
ContentDigest Digest `json:"content_digest"`
ObjectRef ObjectRef `json:"object_ref"`
Producer Producer `json:"producer"`
CreatedAt UTCTime `json:"created_at"`
Extensions map[string]json.RawMessage `json:"extensions,omitempty"`
}
EnvelopeMeta is embedded by immutable public objects. JSON public contracts use snake_case; authored YAML resources use apiVersion/kind.
func SealMeta ¶
func SealMeta(schemaVersion, kind string, id InstanceID, producer Producer, createdAt UTCTime, projection any) (EnvelopeMeta, error)
SealMeta computes an object's content digest over a caller-supplied, explicitly versioned immutable projection and returns matching envelope identity. The projection must not contain content_digest, object_ref, signatures, or Registry-derived fields.
func (EnvelopeMeta) Validate ¶
func (meta EnvelopeMeta) Validate() error
type Evidence ¶
type Evidence struct {
EnvelopeMeta
EvidenceID Digest `json:"evidence_id"`
RunID InstanceID `json:"run_id"`
InvocationID InstanceID `json:"invocation_id"`
AttemptID InstanceID `json:"attempt_id"`
Sequence uint64 `json:"sequence"`
CaptureLayer CaptureLayer `json:"capture_layer"`
InstrumentationMode InstrumentationMode `json:"instrumentation_mode"`
Direction Direction `json:"direction"`
EvidenceKind string `json:"evidence_kind"`
MonotonicOffsetNS int64 `json:"monotonic_offset_ns"`
ByteOffset *int64 `json:"byte_offset,omitempty"`
EventOffset *int64 `json:"event_offset,omitempty"`
PayloadRef *ObjectRef `json:"payload_ref,omitempty"`
PayloadDigest *Digest `json:"payload_digest,omitempty"`
Redactions []RedactionRecord `json:"redactions"`
Relations []EvidenceRelation `json:"relations,omitempty"`
}
Evidence is the sanitized persisted projection for one capture layer. It never claims transport bytes or another layer's chunk boundaries.
type EvidencePolicy ¶
type EvidencePolicy struct {
Capture CaptureMode `json:"capture"`
Redaction string `json:"redaction"`
Publication string `json:"publication"`
}
type EvidenceRelation ¶
type ExecutionStatus ¶
type ExecutionStatus string
const ( ExecutionPlanned ExecutionStatus = "planned" ExecutionRunning ExecutionStatus = "running" ExecutionCompleted ExecutionStatus = "completed" ExecutionSkipped ExecutionStatus = "skipped" ExecutionCancelled ExecutionStatus = "cancelled" ExecutionErrored ExecutionStatus = "errored" )
type FaultFamily ¶
type FaultFamily string
const ( FaultTransport FaultFamily = "transport" FaultWire FaultFamily = "wire" FaultProtocol FaultFamily = "protocol" FaultModel FaultFamily = "model" FaultClient FaultFamily = "client" FaultHarness FaultFamily = "harness" FaultUnknown FaultFamily = "unknown" )
type FinalizerPlan ¶
type FinalizerPlan struct {
LeaseID string `json:"lease_id"`
ResourceType string `json:"resource_type"`
Operation string `json:"operation"`
CleanupBudget HardBudget `json:"cleanup_budget"`
}
type Finding ¶
type Finding struct {
FindingID InstanceID `json:"finding_id"`
AssertionResultID InstanceID `json:"assertion_result_id"`
FaultDomain string `json:"fault_domain"`
FaultFamily FaultFamily `json:"fault_family"`
Category string `json:"category"`
Severity string `json:"severity"`
Confidence float64 `json:"confidence"`
CalibrationVersion string `json:"calibration_version"`
AlternativeDomains []string `json:"alternative_domains,omitempty"`
MinimalEvidenceRefs []ObjectRef `json:"minimal_evidence_refs"`
ReproRefs []ObjectRef `json:"repro_refs,omitempty"`
RequirementID string `json:"requirement_id,omitempty"`
AmbiguityID string `json:"ambiguity_id,omitempty"`
RemediationHint string `json:"remediation_hint"`
UpstreamRoutingHint string `json:"upstream_routing_hint,omitempty"`
FingerprintVersion string `json:"fingerprint_version"`
Fingerprint Digest `json:"fingerprint"`
}
type HardBudget ¶
type HardBudget struct {
MaxRequests int64 `json:"max_requests"`
MaxRequestBytes int64 `json:"max_request_bytes"`
MaxResponseBytes int64 `json:"max_response_bytes"`
MaxArtifactBytes int64 `json:"max_artifact_bytes"`
MaxProcesses int64 `json:"max_processes"`
MaxDuration Duration `json:"max_duration"`
}
func (HardBudget) Validate ¶
func (budget HardBudget) Validate() error
type IRItem ¶
type IRItem struct {
ItemID string `json:"item_id"`
IRType IRType `json:"ir_type"`
SourceProtocol string `json:"source_protocol"`
SourceType string `json:"source_type"`
InteractionID string `json:"interaction_id"`
ParentItemID string `json:"parent_item_id,omitempty"`
CallID string `json:"call_id,omitempty"`
NativeValue json.RawMessage `json:"native_value"`
NormalizedValue json.RawMessage `json:"normalized_value,omitempty"`
EvidenceRefs []ObjectRef `json:"evidence_refs"`
Extension string `json:"extension_namespace,omitempty"`
TransformID string `json:"normalization_transform_id"`
TransformVersion string `json:"normalization_transform_version"`
LossMarkers []LossMarker `json:"loss_markers,omitempty"`
}
IRItem preserves the provider-native JSON type alongside its normalized form and exact evidence references. Normalization never overwrites raw evidence.
type IRType ¶
type IRType string
const ( IRMessage IRType = "message" IRContentPart IRType = "content_part" IRToolCall IRType = "tool_call" IRToolResult IRType = "tool_result" IRReasoningArtifact IRType = "reasoning_artifact" IRUsage IRType = "usage" IRError IRType = "error" IRLifecycleEvent IRType = "lifecycle_event" IRProviderExtension IRType = "provider_extension" )
type InstanceID ¶
type InstanceID string
InstanceID is a UUIDv7 used for Run, Invocation, Attempt, and other event instances. Content-addressed objects additionally carry a Digest.
func NewInstanceID ¶
NewInstanceID creates a UUIDv7 using the supplied wall clock and CSPRNG. Passing nil selects time.Now and crypto/rand.Reader.
func ParseInstanceID ¶
func ParseInstanceID(value string) (InstanceID, error)
ParseInstanceID accepts a canonical lowercase UUIDv7. The reserved run reference "latest" is intentionally not an InstanceID.
func (InstanceID) Validate ¶
func (id InstanceID) Validate() error
type InstrumentationMode ¶
type InstrumentationMode string
const ( InstrumentationDirect InstrumentationMode = "direct_transport" InstrumentationProxy InstrumentationMode = "recording_proxy" InstrumentationFixture InstrumentationMode = "fixture_replay" InstrumentationClient InstrumentationMode = "client_native" )
type IntentPlan ¶
type IntentPlan struct {
EnvelopeMeta
IntentPlanID InstanceID `json:"intent_plan_id"`
ConfigDigest Digest `json:"config_digest"`
Target TargetIntent `json:"target"`
Selectors []ArtifactSelector `json:"selectors"`
SupportManifestDigest Digest `json:"support_manifest_digest"`
CandidateDenominatorDigest Digest `json:"candidate_denominator_digest"`
Probe ProbePolicy `json:"probe"`
ConditionalBranches []ConditionalBranch `json:"conditional_branches"`
Budget BudgetPolicy `json:"budget"`
Evidence EvidencePolicy `json:"evidence"`
Safety SafetyPolicy `json:"safety"`
Author string `json:"author"`
ApprovalRequirements []string `json:"approval_requirements"`
}
IntentPlan is created offline. It describes the maximum authorized scope; it never includes capability probe results.
func (IntentPlan) Validate ¶
func (plan IntentPlan) Validate() error
type Interaction ¶
type Interaction struct {
EnvelopeMeta
InteractionID string `json:"interaction_id"`
Items []IRItem `json:"items"`
}
type LossMarker ¶
type NetworkPolicy ¶
type NetworkPolicy string
const ( NetworkOffline NetworkPolicy = "offline" NetworkTargetOnly NetworkPolicy = "target_only" )
type ObjectRef ¶
type ObjectRef struct {
Kind string `json:"kind"`
InstanceID InstanceID `json:"instance_id,omitempty"`
ContentDigest Digest `json:"content_digest"`
}
ObjectRef prevents an instance identifier from being rebound to different content. Content-addressed objects omit InstanceID.
type PlanDisposition ¶
type PlanDisposition string
const ( DispositionExecute PlanDisposition = "execute" DispositionSkip PlanDisposition = "skip" DispositionNotApplicable PlanDisposition = "not_applicable" )
type ProbePolicy ¶
type ProbePolicy struct {
Operations []string `json:"operations"`
Budget HardBudget `json:"budget"`
Network NetworkPolicy `json:"network"`
}
type Producer ¶
type Producer struct {
Name string `json:"name"`
Version string `json:"version"`
ArtifactDigest Digest `json:"artifact_digest"`
}
Producer identifies the exact software artifact that emitted an object.
type ProfileOutcome ¶
type ProfileOutcome string
const ( ProfileCompatible ProfileOutcome = "compatible" ProfileDegraded ProfileOutcome = "degraded" ProfileIncompatible ProfileOutcome = "incompatible" ProfileInconclusive ProfileOutcome = "inconclusive" )
type ProfileResult ¶
type ProfileResult struct {
EnvelopeMeta
ProfileResultID InstanceID `json:"profile_result_id"`
Profile ArtifactPin `json:"profile"`
SupportLockDigest Digest `json:"support_lock_digest"`
Denominators DenominatorSummary `json:"denominators"`
Outcome ProfileOutcome `json:"profile_outcome"`
Dimensions map[string]DimensionOutcome `json:"dimension_outcomes"`
Cases []CaseResult `json:"cases"`
HardGates []AssertionResult `json:"hard_gates"`
KnownGaps []string `json:"known_gaps,omitempty"`
Waivers []ObjectRef `json:"waivers,omitempty"`
SampleMetadata map[string]any `json:"sample_metadata,omitempty"`
}
type ReasonCode ¶
type ReasonCode string
const ( ReasonUnsupportedCapability ReasonCode = "unsupported_capability" ReasonAuthenticationFailed ReasonCode = "authentication_failed" ReasonPermissionDenied ReasonCode = "permission_denied" ReasonTransientError ReasonCode = "transient_error" ReasonSpecAmbiguity ReasonCode = "spec_ambiguity" ReasonBudgetExhausted ReasonCode = "budget_exhausted" ReasonCostLimit ReasonCode = "cost_limit" ReasonUnsafeOperation ReasonCode = "unsafe_operation" ReasonHarnessError ReasonCode = "harness_error" ReasonDriverError ReasonCode = "driver_error" ReasonCancelledByUser ReasonCode = "cancelled_by_user" ReasonFlakyDetected ReasonCode = "flaky_detected" ReasonInsufficientSamples ReasonCode = "insufficient_samples" ReasonNotObserved ReasonCode = "not_observed" )
type RedactionRecord ¶
type ResolvedRunPlan ¶
type ResolvedRunPlan struct {
EnvelopeMeta
ResolvedPlanID InstanceID `json:"resolved_plan_id"`
IntentPlanRef ObjectRef `json:"intent_plan_ref"`
Resolver ArtifactPin `json:"resolver"`
CapabilityObservationRefs []ObjectRef `json:"capability_observation_refs"`
SupportLockDigest Digest `json:"support_lock_digest"`
Artifacts []ArtifactPin `json:"artifacts"`
Target TargetResolution `json:"target"`
Scenarios []ScenarioDecision `json:"scenarios"`
DenominatorDigest Digest `json:"denominator_digest"`
Budget BudgetPolicy `json:"budget"`
Runtime RuntimePolicy `json:"runtime"`
Finalizers []FinalizerPlan `json:"finalizers,omitempty"`
}
ResolvedRunPlan is the only plan accepted by the executor. Every artifact, branch, scenario, denominator, permission, and budget is exact.
func (ResolvedRunPlan) Validate ¶
func (plan ResolvedRunPlan) Validate() error
type RuntimePolicy ¶
type RuntimePolicy struct {
Concurrency int64 `json:"concurrency"`
Retries int64 `json:"retries"`
Timeout Duration `json:"timeout"`
Capture CaptureMode `json:"capture"`
Sandbox string `json:"sandbox"`
Network NetworkPolicy `json:"network"`
}
type SafetyPolicy ¶
type SafetyPolicy struct {
Network NetworkPolicy `json:"network"`
Redirects string `json:"redirects"`
ToolSideEffects SideEffectPolicy `json:"tool_side_effects"`
DriverPermissions []string `json:"driver_permissions"`
}
type ScenarioDecision ¶
type ScenarioDecision struct {
ScenarioID string `json:"scenario_id"`
Disposition PlanDisposition `json:"disposition"`
ReasonCode string `json:"reason_code,omitempty"`
Driver ArtifactPin `json:"driver"`
DependsOn []string `json:"depends_on,omitempty"`
}
type SideEffectPolicy ¶
type SideEffectPolicy string
const ( SideEffectsNone SideEffectPolicy = "none" SideEffectsReversible SideEffectPolicy = "reversible_only" )
type StatisticalEstimate ¶
type TargetIntent ¶
type TargetIntent struct {
LogicalRef string `json:"logical_ref"`
ProtocolFamily string `json:"protocol_family"`
IdentityExpectation string `json:"identity_expectation"`
AllowedOrigin string `json:"allowed_origin"`
}
func (TargetIntent) Validate ¶
func (target TargetIntent) Validate() error
type TargetResolution ¶
type TargetResolution struct {
IdentityLevel string `json:"identity_level"`
ObservedFingerprint Digest `json:"observed_fingerprint"`
Version string `json:"version,omitempty"`
ConfigurationDigest Digest `json:"configuration_digest,omitempty"`
Model string `json:"model,omitempty"`
Region string `json:"region,omitempty"`
}
type TokenBudget ¶
type TokenBudget struct {
MaxInputTokens int64 `json:"max_input_tokens"`
MaxOutputTokens int64 `json:"max_output_tokens"`
}
func (TokenBudget) Validate ¶
func (budget TokenBudget) Validate() error
type UTCTime ¶
UTCTime is a canonical RFC 3339 timestamp. JSON accepts only a Z suffix and rejects equivalent-but-noncanonical offsets or fractional padding.