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.
Application-owned widget selection
Reject a command based on an outdated aggregate version without changing durable truth.
The report proves deterministic application-side state-machine behavior only. It is not Mappls entitlement, provider resource, webhook, performance, regional, or production evidence.
- Aggregate
- widget selection session
- Start
draft- Result
draft- Version
- 1
Every attempted command remains visible.
Accepted commands advance exactly once. Replays, conflicts, invalid transitions, and reconciliation are evidence—not hidden control flow.
create_sessionnew aggregatedraftv0 → v1Aggregate, event, audit, and outbox intent commit as one application-owned unit.
open_widgetdraftdraftv1 → v1Expected version 0 does not match current version 1.
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":"widget-selection-session","scenario":"stale-version"}'javascriptconst response = await fetch("https://developer.mappls.com/api/journey-simulator", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({"journey":"widget-selection-session","scenario":"stale-version"}),
});
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":"widget-selection-session","scenario":"stale-version"},
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\":\"widget-selection-session\",\"scenario\":\"stale-version\"}"))
.build();
var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) throw new IllegalStateException("Simulation failed");gopayload := strings.NewReader(`{"journey":"widget-selection-session","scenario":"stale-version"}`)
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"":""widget-selection-session"",""scenario"":""stale-version""}", 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();