Skip to content

Data model

Agent Evaluation separates framework-native artifacts from Softprobe workflow records. Softprobe does not model cases, assertions, scorers, or reducers — those remain inside the framework definition and result bundle.

Core flow

text
FrameworkDefinition + SubjectVersion + EnvironmentVersion + RunnerVersion
→ WorkflowVersion
→ framework runner (FrameworkAttempt)
→ native result bundle + EvidenceArtifact
→ Softprobe lifecycle + compare + GateDecision

Layer A — Immutable resources (before execution)

EntityDescriptionExample
FrameworkDefinitionClosed, content-addressed native suite + dependenciesPromptfoo config/tests/prompts bundle digest
RunnerVersionFramework name, package/lockfile/image digests, command, result-bundle schema, capabilitiespromptfoo-runner@2.1.0 + image sha
SubjectVersionCode, image, model config, prompts, tools, or deployment under testsupport-agent@sha256:…
EnvironmentVersionSandbox topology, mounts, secret refs, network policy, limits, time policynetwork off, workspace ro
WorkflowVersionResolved FrameworkDefinition + RunnerVersion + SubjectVersion + EnvironmentVersion + gate policyCI-pinned workflow digest

Layer B — Runtime records (during/after execution)

EntityDescription
WorkflowRunOne execution of one WorkflowVersion (outer lifecycle)
FrameworkAttemptOne runner invocation; framework-internal retries stay in the native bundle
EvidenceArtifactNative definition, native result bundle, logs, traces, usage, environment evidence
GateDecisionVersioned workflow policy over outer status, provenance, and optionally runner-reported fields
EventAppend-only outer lifecycle events — see Events (workflow.validated, framework.attempted, artifact.committed, framework.result.accepted, gate.decided, workflow.completed)

Optional score projection: framework-reported measurements may land in thelake scores for query. Native aggregate detail stays in the result bundle; gate decisions are ledger-only unless a gate emits a separately configured boolean measurement.

ER diagram

Worked example (Promptfoo runner)

Input

yaml
runner: promptfoo-runner@2.1.0
framework_definition: cas://sha256:promptfoo-def-bundle
subject: support-router-prod
environment:
  network: off
  secrets: [OPENAI_API_KEY_REF]
  limits: { timeout_s: 300, max_result_mb: 50 }
gate_policy: support-router-v1

After execution

text
WorkflowRun.status = succeeded
FrameworkAttempt.status = succeeded
EvidenceArtifact.native_result = cas://sha256:promptfoo-results
score_projection = optional / may be lossy
GateDecision = pass

Lifecycle events (see Events)

text
workflow.validated → framework.attempted → artifact.committed
  → framework.result.accepted → gate.decided → workflow.completed

Score target v2 (projection only)

Projected measurements attach to one canonical target:

span | trace | session | workflow_run | framework_attempt

Legacy span_id / trace_id / session_id remain for v1 APIs. See Score targets.

Zero code changes · Full-context visibility · Cost optimization