Every published stateful or hybrid journey.
Break the journey before production does.
Execute every published Mappls application lifecycle from creation to a reviewed operating outcome. Prove idempotency, optimistic concurrency, invalid-state rejection, immutable events, and unknown-outcome recovery without credentials, provider calls, or durable writes.
Five hostile and success scenarios per journey.
Commands, versions, identities, actors, and facts.
One synchronized fixture contract.
Consented address verification
Commit the shortest reviewed success path to the journey-specific operating target.
The report proves deterministic application-side state-machine behavior only. It is not Mappls entitlement, provider resource, webhook, performance, regional, or production evidence.
- Aggregate
- address verification
- Start
entered- Result
verified- Version
- 6
Every attempted command remains visible.
Accepted commands advance exactly once. Replays, conflicts, invalid transitions, and reconciliation are evidence—not hidden control flow.
enter_verificationnew aggregateenteredv0 → v1Aggregate, event, audit, and outbox intent commit as one application-owned unit.
normalize_addressenterednormalizedv1 → v2Aggregate, event, audit, and outbox intent commit as one application-owned unit.
authorize_capturenormalizedcapture_authorizedv2 → v3Aggregate, event, audit, and outbox intent commit as one application-owned unit.
capture_evidencecapture_authorizedevidence_capturedv3 → v4Aggregate, event, audit, and outbox intent commit as one application-owned unit.
compareevidence_capturedcomparedv4 → v5Aggregate, event, audit, and outbox intent commit as one application-owned unit.
verifycomparedverifiedv5 → v6Aggregate, event, audit, and outbox intent commit as one application-owned unit.
The report explains why it passed.
bounded-inputno-provider-callmonotonic-versionunique-eventsrejection-safereplay-safetargetWhat the simulator will never blur.
- 01
This is an application-owned deterministic fixture. It makes no Mappls provider request and claims no provider webhook payload.
- 02
Idempotency is checked before optimistic concurrency so an exact retry can return the first committed result.
- 03
A reused idempotency key with different intent would be a conflict; applications must persist a request fingerprint with the result.
- 04
Rejected commands do not change the aggregate version and do not emit an event.
- 05
Accepted commands commit the aggregate snapshot, immutable event, audit evidence, and transactional outbox intent atomically.
- 06
A timeout is an unknown outcome. Reconcile by aggregate and command identity before replaying the same key.
Automate this exact evidence path.
These examples call the credential-free simulator—not a Mappls provider endpoint. Production commands must use your trusted application boundary and actual reviewed provider contract.
curlcurl --request POST 'https://developer.mappls.com/api/journey-simulator' \
+ --header 'content-type: application/json' \
+ --data '{"journey":"consented-address-verification","scenario":"complete-journey"}'javascriptconst response = await fetch("https://developer.mappls.com/api/journey-simulator", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({"journey":"consented-address-verification","scenario":"complete-journey"}),
});
if (!response.ok) throw new Error(`Simulation failed: ${response.status}`);
const report = await response.json();
console.log(report.finalSnapshot, report.checks);pythonimport requests
response = requests.post(
"https://developer.mappls.com/api/journey-simulator",
json={"journey":"consented-address-verification","scenario":"complete-journey"},
timeout=10,
)
response.raise_for_status()
report = response.json()
print(report["finalSnapshot"], report["checks"])javavar request = HttpRequest.newBuilder(URI.create("https://developer.mappls.com/api/journey-simulator"))
.header("content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("{\"journey\":\"consented-address-verification\",\"scenario\":\"complete-journey\"}"))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) throw new IllegalStateException("Simulation failed");gopayload := strings.NewReader(`{"journey":"consented-address-verification","scenario":"complete-journey"}`)
request, err := http.NewRequest(http.MethodPost, "https://developer.mappls.com/api/journey-simulator", payload)
if err != nil { return err }
request.Header.Set("content-type", "application/json")
response, err := (&http.Client{Timeout: 10 * time.Second}).Do(request)
if err != nil { return err }
defer response.Body.Close()csharpusing var client = new HttpClient { Timeout = TimeSpan.FromSeconds(10) };
using var content = new StringContent(@"{""journey"":""consented-address-verification"",""scenario"":""complete-journey""}", Encoding.UTF8, "application/json");
using var response = await client.PostAsync("https://developer.mappls.com/api/journey-simulator", content);
response.EnsureSuccessStatusCode();
var report = await response.Content.ReadAsStringAsync();