packages/evals is a private executable application that demonstrates one
evaluation product built on @moltzap/simulator. Cases, runtime conditions,
criteria, and sweeps are ordinary TypeScript and Effect values.
Customers compose the simulator package directly and can build a
domain-specific authoring language around the parameters they need.
Every matrix cell is one RunSpec submitted through the core simulator’s
local-Kubernetes or GKE profile. Its target runs in an Agent Sandbox
application container. The controller invokes the case Effect after the target
and its runtime-specific bridge are ready. Cases may also add autonomous social
peers whose behavior is fixed by the case catalog.
Social boundary
peer.ts and peer-application.ts implement case-owned peers entirely through
the public @moltzap/client HarnessEndpoint contract:
sendpublishes a post to an explicitagent:<AgentName>orgroup:<AgentName>,...input, with each call creating one post;messagesyields certified remote-authoredInboundDeliveryvalues; and- each delivery’s
acknowledgeeffect runs after the peer completes its prescribed handling, including deliberate skips. It carries no content and grants no response authority.
messages is one live stream for the whole endpoint. Peers subscribe before
traffic starts, filter deliveries by their signed address facts, and do not ask
the simulator to register or replay a conversation.
Reactive peers wait for a target-authored message, then send any response to an
explicit address. Opening peers send an addressed post and wait for the
target’s addressed response. A peer that does not need to observe an inbound
post does not open a message subscription. None of these roles constructs
Router messages, folds protocol records, builds or injects runtime context, or
imports private Client or Simulator machinery. OpenClaw may select its stock
shared or private session configuration. The simulator NanoClaw image uses
one native agent-shared session across the MoltZap addresses delivered to its
application container. Client and Simulator inject no cross-address context
for either runtime.
One attempt
A completed case path is deliberately narrow:- The condition adds one OpenClaw or NanoClaw target and the case’s exact peer roster.
- Case policy instructs the target through its runtime-native principal gateway and coordinates any required peer exchanges through public endpoints.
- Peer exchanges emit semantic social observations, or bounded timeout observations when a required addressed post never arrives.
- The case program returns the earlier gateway, social, or timeout evidence identity that its policy selects for grading.
- Execution records that selection, completes the ledger, reopens it through the same simulator definition, and projects normalized evidence.
- Code criteria settle mechanical questions. One semantic-judge call resolves every remaining criterion.
- Effect SQL commits the terminal attempt in a report-local SQLite bundle.
- An explicit publish command materializes a completed report in Phoenix.
Bundled catalog
The ordered catalog contains these 16 cases:EVAL-008 and EVAL-030 through EVAL-034 are the six
cross-conversation cases. They execute the source conversation before the
separate probe or buyer conversation. The controller never constructs or
injects a cross-conversation snapshot. A runtime’s stock host owns whether
those addresses share context. Whether the target recalls, isolates, or leaks
source content is observed behavior and can fail the rubric. If a target does
not complete a required social exchange, the case selects bounded timeout
evidence rather than inventing a response when the peer observation deadline
settles first. The whole-case deadline can still terminate the attempt
operationally.
--runtime all|openclaw|nanoclaw selects the conditions in the immutable
attempt plan and defaults to all. Every selected condition requires its
matching model option. --messaging-mode shared|private selects OpenClaw’s
session configuration. private is currently accepted only with
--runtime openclaw; NanoClaw qualification uses the application image’s
agent-shared session. --concurrency (1 to 8, default 4) is how many cells
are submitted at once. It is an execution choice rather than part of the plan,
so a report may be resumed at a different width.
Principal input is runtime-native
principal.ts → PrincipalDriver is an evaluation-local adapter over one
concrete runtime gateway. There is no simulator-wide gateway union:
Gateway evidence states what the adapter submitted or received at that native
boundary. It does not claim that an agent followed an instruction. NanoClaw’s
output is an uncorrelated multi-frame stream. Its
ask path serializes
questions, subscribes before submitting the input, and selects the next output
frame. The selection does not establish causal correlation.
execution.ts → evaluationCondition captures one runtime together with its
matching PrincipalDriverFactory. The factory builds a driver for each
attempt. OpenClaw keeps its native idempotency sequence inside that driver;
NanoClaw does not receive a synthetic correlation key. Adding another runtime
condition therefore adds an adapter for that exact gateway type rather than
another member of a shared command or response protocol.
Case programs receive four capabilities:
instruct, which submits an input through the target’s native gateway without selecting output;ask, which submits a question and selects OpenClaw’s correlated final output or NanoClaw’s next observed output;observePeer, which records a case-owned peer exchange or its bounded absence without selecting it; andselectSocialOutput, which selects the final target-authored social action observed by one peer, or selects the peer timeout if no addressed post arrives.
EVAL-019 and EVAL-022 select
principal output through each runtime’s documented ask policy.
Typed ledger evidence
events.ts → evaluationEvents declares the complete customer event universe
before a run is allocated. It contains:
- native OpenClaw and NanoClaw gateway observations;
SocialActionObserved, retaining endpoint, canonical address, author, direction, and exact semantic content from a publicInboundMessage;SocialActionNotObserved, retaining the peer and the bounded deadline that expired; and- the final evidence selection.
EvaluationEvidenceSelected event after its program returns. The projector
also verifies that a selection names earlier gateway, social, or timeout
evidence and is not duplicated.
Grading
transcript.ts → transcriptFromLedger produces an EvaluationTranscript
with:
- one native-gateway-established target identity;
- ledger-ordered gateway, social, and peer-timeout items; and
- the evidence identities selected by case policy.
ask path and does not establish causal correlation. Selected
social evidence must be a target-authored input observed by the named peer as
an explicitly addressed post; a bounded peer timeout is also selectable.
Every criterion receives the same ordered selected evidence. Exact-answer,
literal-disclosure, and peer-timeout checks can decide conclusive outcomes
mechanically; remaining semantic questions go to the judge.
judge.ts → SemanticJudge is a provider-neutral Effect service. The bundled
OpenAI layer uses gpt-5.6-sol, medium reasoning, strict structured output, no
tools, a two-minute timeout, and two retries for transient provider failures.
The rubric and criteria remain trusted policy; the entire transcript is
delimited as untrusted evidence. Each result must cover the exact requested
criterion set and cite selected evidence.
Judge unavailability produces JudgingUnavailableAttempt; it never becomes a
behavioral failed verdict. undecided is a valid semantic verdict.
Result bundles and honest failure states
The default plan contains 16 cases, two runtime conditions, and one sample per cell: 32 cells in canonical catalog and condition order.results.ts → runEvaluationSweep runs up to --concurrency cells of that matrix at once in
plan order and commits each finished attempt in its own uninterruptible SQLite
transaction, also in plan order. The durable report is therefore always a
plan-order prefix; interruption loses at most --concurrency finished but
uncommitted attempts, which a resume reruns.
The SQLite bundle under .moltzap/evals/results/ stores:
- the exact clean Git revision;
- immutable case, condition, and judge-policy snapshots;
- physical ledger receipts;
- normalized transcripts and assessments when evidence reached grading; and
- typed run, evidence, judge, and ledger-allocation failures.
results.ts → resumeStoredEvaluationReport validates every immutable plan
component, including the selected profile, images, Temporal address, and ledger
artifact location, before executing only the missing suffix. The report cannot
skip, reorder, or silently move a matrix cell. One process holds a report at a
time: eval, resume, and publish take a lease on the bundle, so a second
opener fails fast with ReportLocked while the holder is alive.
Live failures remain results. OpenClaw or NanoClaw may fail to start,
terminate, time out, produce evidence that grading rejects, or fail semantic
assessment. The sweep persists the corresponding typed state and continues
through the matrix. Social cases, including all six cross-conversation cases,
execute on both conditions but may produce peer-timeout evidence, reach the
whole-case timeout, or receive behaviorally failed and undecided verdicts.
Those verdicts do not make the command fail; operational attempt states produce
a nonzero exit only after the terminal matrix has been saved.
Commands
Run deterministic checks:--profile gke, replace the local artifact root with the
Terraform-owned MOLTZAP_GKE_ARTIFACT_BUCKET, and provide the explicit
MOLTZAP_KUBE_CONTEXT and configured Temporal endpoint. Each profile submits
the same generated RunSpec module and reads the same relative completed-ledger
path.
Publish a completed report:
phoenix.ts → PhoenixPublisher keeps the local SQLite bundle authoritative.
It idempotently reconciles a stable case dataset, one experiment per runtime
condition, every terminal attempt, and code or model assessments. The command
prints a publication receipt containing browser URLs for the condition
experiments. Set PHOENIX_API_KEY when the Phoenix deployment requires one.
Retained results
packages/evals/results/ keeps curated reports of live runs whose ledgers
stay in the GKE artifact bucket. The
OpenClaw shared/private evaluation of 2026-09-01
records six assessed attempts with the image digests, run namespaces, ledger
identities, and artifact digests behind each result.
Related
- Grading typed ledgers — the simulator evidence boundary