This guide describes the Agent Eval 0.18.0 API. Maven coordinates and Java packages still use
agent-judge and io.github.markpollack.judge.Judgment retains what its producer returned: producer status, optional finding and support/distribution, reasoning, own Checks, actual Requirement and native observations.
A Verdict retains composition: complete original opinions and children, separate seat treatment, attempted stages, roster/coverage, rule configuration, provenance, and invocation ownership.
Keep the whole result rather than serializing only its collective Judgment.
Conclusion and reliance
Verdict.conclusion() derives PASS, FAIL, INCONCLUSIVE, or NOT_APPLICABLE from the retained facts.
requireUsable() validates bounds, meaning and ownership, then returns the unchanged Verdict.
Producer ABSTAIN and invocation ERROR do not silently become subject FAIL.
A Policy sees the whole original Verdict and chooses RELY, ABSTAIN, or ESCALATE.
EvaluationResult keeps that Verdict with PolicyResult.NotRequested, .Decided, or .Failed; optional PolicyAttribution retains the application’s identity/version/configuration on decided and failed results.
Policy withholding does not change the Verdict’s conclusion and cannot manufacture a passing assertion.
Inline attribution retains its configuration. External references/digests require caller-owned byte custody.
Store and reopen
The runnable requirements example writes and reopens the complete EvaluationResult and asserts equality. For RFC2119/EARS useNativeRequirementCodecs.codec(); it registers their native specifications.
For text/AllOf use new VerdictCodec() from agent-judge-json-jackson2.
Custom rules require explicit trusted pure VotingRuleFactory registrations with complete immutable configuration; no stored class loading or global discovery occurs.
A failed reduction keeps captured declarations. Reopening a failed attempt does not execute its failed aggregation.
Codec reads, reports, and retained AssertJ assertions execute no producer or application policy.
Live AssertJ stages cache a result or thrown failure; separate direct executions remain fresh calls.
Explicit Evaluations.apply(retainedVerdict, newPolicy) requests a new policy decision; that is different from reading a stored result.
Refusal and preservation
A refused native return retains the complete original Judgment, its actual Requirement, own Checks and lower invocations.RefusedReturn carries the expected input separately; the Seat records RETURNED_REJECTED and a separate rejection treatment.
A returned refusal is not an invocation exception and must not fabricate one.
InvocationRecords.of(verdict) includes all available owners once.
V6 restores declared joins for single identities, named seats, selected cascades, used meta-members, and complete refused originals.
Independent equal Checks/opinions remain distinct. It does not promise arbitrary Java object identity.
The strict writer reconstructs before yielding bytes. If incidental sharing expands beyond the existing 256-node/eight-refusal/byte/depth limits, it throws PreservationLimitException carrying the complete available original object/document.
Do not swallow this limit or save a partial replacement. The caller owns alternate archival storage.
Historical bytes
Current typed codecs refuse V2/V3/V4/V5 rather than automatically rewriting history. Keep original bytes and version tags. V5 archival reading uses producerc0ae61dda4a65e9278485cb528925d71f27a1007.
Typed V4 archival reading uses 7387aab1bf9d3bd56e4d9a932f2f40e2978d676d; that reader refuses V2 and V3.
No verified typed V2/V3 reader pin is supplied here.
Description V3 remains unchanged.
The historical 0.17 migration guide describes that release, not current typed V6 compatibility.
See the strict V6 contract for normative fields and bounds.