The pipeline
Every VPoint call runs through a fixed sequence of anchors — slots where stages can attach:
A stage that produces a value short-circuits the rest of the pipeline; a stage that passes through lets execution continue. With no stages attached, the call takes a fast path straight to the default plan — the original function, exactly as written.
The three stage patterns
Almost every test uses one of three shapes. Inside a CEL expression,args.<param> reads the call’s inputs and invoke() executes the next stage or the real function.
Override — replace the result entirely. The real function never runs:
sample() captures a value for the test to assert on and returns it unchanged:
Validated against the schema
CEL stages compile against the VPoint’s schema when inserted. Type names, field names, and required fields are all checked —ChargeResult { txn: ... } fails at insert time if the field is txnId. This is why inspecting the schema first (via the MCP tools or your SDK’s build-time output) beats guessing.
Key rules:
- Inputs are read only through
args.<param>— a bare parameter name is rejected at parse time. - Type names match the schema exactly and are case-sensitive; use the simple name (
ChargeResult, notpb.ChargeResult). - Without
invoke(), the expression fully replaces the function’s result. ctx.<fn>(...)calls context functions your service registered.
let bindings, and current limitations — is in the CEL reference.
