{"serverId":"mcp-registry/ai.cloudworldmodel/cloud-world-model","tools":[{"name":"scenario.get","fixed":{"name":"scenario_get","description":"Hydrate one built-in scenario from the live Cloud World Model scenario library. Prerequisite: a scenario id returned by scenario.list. Returns the complete selected scenario graph, including resources and connections plus optional seed, resilienceConfig, protectedResilienceConfig, traffic/failure presets, named traffic-phase summaries, activeFailurePhases and optionalFailurePhases (type, resource/zone target, severity, step range), retry-workload disclosure, and real-world incident metadata. The","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["scenarioId"],"properties":{"scenarioId":{"type":"string","minLength":1,"description":"Scenario identifier returned by scenario.list"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Get Scenario"},"changes":[{"kind":"name","detail":"Renamed \"scenario.get\" → \"scenario_get\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":223,"tokensAfter":223},{"name":"scenario.list","fixed":{"name":"scenario_list","description":"List the built-in demo scenarios as compact catalog cards — stable IDs, title/name, description, difficulty, tags, category, duration, provider summary, resource/connection counts, named active/optional traffic phases, and retry-workload disclosure. Use it as the first call when you want a ready-made architecture instead of designing one; the cards intentionally omit resource, connection, traffic-pattern, and failure-injection graphs. Anonymous discovery includes only scenarios with at most 10 r","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"category":{"type":"string","minLength":1,"description":"Only scenarios in this category, such as scaling, failure, reliability, networking, or cost"},"provider":{"enum":["aws","gcp","azure","oci","digitalocean"],"type":"string","description":"Only scenarios that include resources from this cloud provider"},"difficulty":{"enum":["beginner","intermediate","advanced"],"type":"string","description":"Only scenarios at this difficulty level"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"List Scenarios"},"changes":[{"kind":"name","detail":"Renamed \"scenario.list\" → \"scenario_list\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":309,"tokensAfter":309},{"name":"simulation.create","fixed":{"name":"simulation_create","description":"Create a temporary anonymous demo cloud simulation from a list of resources and connections (max 2 active simulations per client, up to 10 resources; the returned simulationId is a short-lived unguessable capability that survives MCP transport teardown, but it is cleaned up when the demo lifetime expires or the simulation is deleted). No API key required for this temporary anonymous demo operation. Built-in scenario workflow: call `scenario.list` and pass a returned card's `id` as `scenarioId` t","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name"],"properties":{"name":{"type":"string","maxLength":120,"description":"Human-readable name for the simulation"},"seed":{"type":"integer","minimum":0,"description":"Deterministic RNG seed for reproducible replays"},"traffic":{"type":"number","default":0,"description":"Initial traffic in requests per second (RPS)"},"appWeight":{"enum":["lean","typical","heavy"],"type":"string","description":"Immutable root-level workload weight; defaults to typical with appWeightDefaulted=true. Lean is measured only for the eligible owned graph; heavy is an unsupported assumption. predictionEvidence reports per-quantity provenance and assumption ranges, not confidence intervals."},"resources":{"type":"array","items":{"type":"object","required":["id","type","name"],"properties":{"id":{"type":"string","description":"Unique identifier for this resource within the simulation"},"name":{"type":"string","description":"Display name for the resource"},"type":{"enum":["compute","database","storage","network","cache","queue","kubernetes"],"type":"string","description":"Resource category"},"maxAcu":{"description":"Not accepted at resource level; use characteristics.maxAcu for the exact AWS Aurora Serverless v2 db.serverless shape."},"minAcu":{"description":"Not accepted at resource level; use characteristics.minAcu for the exact AWS Aurora Serverless v2 db.serverless shape."},"location":{"type":"object","required":["regionKey"],"properties":{"zoneKey":{"type":"string"},"regionKey":{"type":"string"},"localityType":{"enum":["az","zone","availability_domain","fault_domain"],"type":"string"},"providerLabel":{"type":"string"},"faultDomainKey":{"type":"string"}},"description":"Resource region; set location.regionKey:'us-east-2' on each owned typical node (normalized to use2).","additionalProperties":false},"provider":{"enum":["aws","gcp","azure","oci","digitalocean"],"type":"string","default":"aws","description":"Cloud provider hosting this resource"},"recoveryPolicy":{"type":"object","properties":{"warningSteps":{"type":"integer","minimum":1},"criticalSteps":{"type":"integer","minimum":1},"failureParkSteps":{"type":"integer","minimum":1},"warningCpuThreshold":{"type":"number","maximum":100,"minimum":0},"criticalCpuThreshold":{"type":"number","maximum":100,"minimum":0}},"description":"Optional recovery thresholds and cooldown lengths for this resource","additionalProperties":false},"characteristics":{"type":"object","properties":{"size":{"type":"string","description":"Instance or SKU size (e.g. 't3.medium', 'db.r5.large')"},"ocpus":{"type":"integer","maximum":126,"description":"OCI flexible compute shape capacity. Family-specific limits are validated against the provider shape; VM.Standard.E4.Flex accepts 1–64 OCPUs and 1 OCPU = 2 vCPUs. Not a performance or price claim.","exclusiveMinimum":0},"config":{"type":"object","properties":{"maxCapacity":{"type":"number","exclusiveMinimum":0},"minCapacity":{"type":"number","exclusiveMinimum":0}},"description":"Aurora Serverless ACU bounds. Nested config uses minCapacity/maxCapacity; flat characteristics.minAcu/maxAcu aliases are accepted only on the exact AWS Aurora Serverless v2 db.serverless shape.","additionalProperties":true},"maxAcu":{"type":"number","description":"Flat maximum ACU alias only for AWS Aurora Serverless v2 size db.serverless; conflicts with maxCapacity are rejected.","exclusiveMinimum":0},"minAcu":{"type":"number","description":"Flat minimum ACU alias only for AWS Aurora Serverless v2 size db.serverless; conflicts with minCapacity are rejected.","exclusiveMinimum":0},"multiAz":{"type":"boolean","description":"AWS Aurora Serverless v2: true with instanceCount:2 creates a billable reader in a second AZ."},"workload":{"enum":["crud","crud-typical"],"type":"string","description":"Explicit 'crud-typical' on each owned typical app; 'crud' selects lean identity on the exact lean graph."},"nodePools":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"size":{"type":"string"},"maxNodes":{"type":"number"},"minNodes":{"type":"number"},"nodeCount":{"type":"number"},"workerVcpu":{"type":"number","exclusiveMinimum":0},"perNodeRate":{"type":"number","exclusiveMinimum":0},"gpuReadiness":{"type":"object","required":["initialReadyNodes"],"properties":{"capacity":{"anyOf":[{"type":"object","required":["unit","perNode","provenance"],"properties":{"unit":{"type":"string","const":"requests-per-second"},"perNode":{"type":"number","exclusiveMinimum":0},"provenance":{"enum":["user-supplied","estimated"],"type":"string"}},"additionalProperties":false},{"type":"object","required":["unit","perNode","meanCallDurationSeconds","provenance"],"properties":{"unit":{"type":"string","const":"concurrent-calls"},"perNode":{"type":"number","exclusiveMinimum":0},"provenance":{"enum":["user-supplied","estimated"],"type":"string"},"meanCallDurationSeconds":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false}]},"imagePull":{"$ref":"#/properties/resources/items/properties/characteristics/properties/nodePools/items/properties/gpuReadiness/properties/autoscalerReaction"},"modelLoad":{"$ref":"#/properties/resources/items/properties/characteristics/properties/nodePools/items/properties/gpuReadiness/properties/autoscalerReaction"},"nodeProvision":{"$ref":"#/properties/resources/items/properties/characteristics/properties/nodePools/items/properties/gpuReadiness/properties/autoscalerReaction"},"warmSpareNodes":{"type":"integer","default":0,"minimum":0},"initialReadyNodes":{"type":"integer","minimum":0},"autoscalerReaction":{"type":"object","required":["seconds","provenance"],"properties":{"seconds":{"type":"number","minimum":0},"provenance":{"enum":["user-supplied","estimated"],"type":"string"}},"additionalProperties":false},"servedRequestP99Ms":{"type":"object","required":["value","provenance"],"properties":{"value":{"type":"number","minimum":0},"provenance":{"enum":["user-supplied","estimated"],"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"maxThroughput":{"type":"number"},"kubernetesMemoryProfile":{"type":"object","required":["limitGiB","baselineWorkingSetGiB","loadBreakpoints","source","confidence"],"properties":{"source":{"enum":["user-provided","calibrated","external"],"type":"string"},"limitGiB":{"type":"number","maximum":1024,"exclusiveMinimum":0},"confidence":{"enum":["low","medium","high"],"type":"string"},"requestGiB":{"type":"number","maximum":1024,"exclusiveMinimum":0},"headroomGiB":{"type":"number","default":0,"maximum":1024,"minimum":0},"extrapolation":{"enum":["clamp","linear"],"type":"string","default":"linear"},"loadBreakpoints":{"type":"array","items":{"type":"object","required":["perReplicaRps","workingSetGiB"],"properties":{"perReplicaRps":{"type":"number","exclusiveMinimum":0},"workingSetGiB":{"type":"number","maximum":1024,"exclusiveMinimum":0}},"additionalProperties":false},"maxItems":20,"minItems":1},"restartDelaySteps":{"type":"number","maximum":600,"minimum":1},"burstWorkingSetGiB":{"type":"number","maximum":1024,"exclusiveMinimum":0},"restartDelaySeconds":{"type":"number","maximum":600,"minimum":1},"baselineWorkingSetGiB":{"type":"number","maximum":1024,"exclusiveMinimum":0},"memoryAwareAutoscaling":{"type":"boolean"},"maxConcurrentRestartFraction":{"type":"number","default":0.3333333333333333,"maximum":1,"minimum":0.05},"memoryScaleOutThresholdRatio":{"type":"number","default":0.85,"maximum":1,"minimum":0}},"additionalProperties":false}},"additionalProperties":true},"description":"EKS GPU pools require a stable id/name, catalog size, node counts/bounds and each pool's explicit gpuReadiness assumptions."},"appRuntime":{"type":"string","description":"Owned typical app runtime: node."},"capacityGB":{"type":"number","description":"Storage capacity in GB — drives per-GB snapshot/backup idle cost and stopped-instance storage cost"},"cdnTraffic":{"type":"object","required":["cacheableFraction","cacheableMissDatabaseFraction","dynamicDatabaseFraction"],"properties":{"cacheableFraction":{"type":"number","maximum":1,"minimum":0},"dynamicDatabaseFraction":{"type":"number","maximum":1,"minimum":0},"cacheableMissDatabaseFraction":{"type":"number","maximum":1,"minimum":0}},"description":"Assumed CDN cacheable/dynamic request mix and DB-query fractions. cacheHitRate applies only to the cacheable share. Read simulation.step metrics.cdnFlow for the modeled edge, origin and database flow.","additionalProperties":false},"autoscaling":{"type":"boolean","description":"Mark this compute resource as the autoscaling primary target"},"capacityRps":{"type":"number","description":"Compute only: literal per-node RPS ceiling at which CPU reaches ~95%. Kubernetes rejects capacityRps; use maxThroughput for its total cluster ceiling.","exclusiveMinimum":0},"maxCapacity":{"type":"number","description":"Aurora Serverless maximum ACU (flat form; nested config wins).","exclusiveMinimum":0},"minCapacity":{"type":"number","description":"Aurora Serverless minimum ACU (flat form; nested config wins).","exclusiveMinimum":0},"billingState":{"enum":["active","idle","stopped","detached","deleted"],"type":"string","description":"Billing state: 'stopped' bills storage only, 'idle'/'detached' bill flat idle rates, 'deleted' bills nothing. Default 'active'."},"cacheHitRate":{"type":"number","maximum":1,"minimum":0,"description":"Cache only: fraction (0–1) of requests routed through this cache that are served from cache; 0.8 means an 80% hit rate."},"gpuReadiness":{"$ref":"#/properties/resources/items/properties/characteristics/properties/nodePools/items/properties/gpuReadiness","description":"Ordinary EKS GPU readiness assumptions: four timed phases, explicit per-node capacity and warm reserve; not Spot or measured performance. For multiple pools set nodePools[].gpuReadiness. Inspect metrics.kubernetes[].gpuReadiness for phase and capacity-gap evidence."},"appDbPoolSize":{"type":"integer","description":"Owned typical: pool size 250 on each app.","exclusiveMinimum":0},"instanceCount":{"type":"integer","maximum":100,"minimum":1,"description":"Generic fixed compute: represented VM count (integer 1–100); capacity aggregates and CPU is per VM. Cannot combine with autoscaling:true, minInstances, or maxInstances. AWS Aurora Serverless v2 remains 1 with multiAz:false or 2 with multiAz:true."},"maxThroughput":{"type":"number","description":"Kubernetes: total cluster RPS ceiling; compute: legacy internal throughput scaling parameter (prefer capacityRps for compute)."},"serviceFamily":{"type":"string","description":"Idle-billed service family (e.g. 'nat-gateway', 'vpc-endpoint', 'eip-detached', 'ebs-snapshot') — determines the flat idle rate"},"appWorkerCount":{"type":"integer","description":"Owned typical: 2 workers on each app.","exclusiveMinimum":0},"maxConnections":{"type":"integer","maximum":1000000,"description":"Fixed concurrent DB connection budget; Aurora Serverless defaults from maximum configured ACU.","exclusiveMinimum":0},"route53Failover":{"type":"object","required":["primaryRegion","secondaryRegion"],"properties":{"dnsTtlSeconds":{"type":"number","default":60,"maximum":86400,"exclusiveMinimum":0},"primaryRegion":{"type":"string","minLength":1},"secondaryRegion":{"type":"string","minLength":1},"failureThreshold":{"type":"integer","default":3,"exclusiveMinimum":0},"recoveryThreshold":{"type":"integer","default":3,"exclusiveMinimum":0},"primaryTrafficShare":{"type":"number","default":0.5,"maximum":1,"minimum":0},"simulationSecondsPerStep":{"type":"number","default":10,"exclusiveMinimum":0},"healthCheckIntervalSeconds":{"type":"number","default":10,"exclusiveMinimum":0}},"additionalProperties":false},"sessionAffinity":{"type":"object","required":["mode","fleetId"],"properties":{"mode":{"type":"string","const":"sticky"},"fleetId":{"type":"string","maxLength":128,"minLength":1},"workload":{"type":"object","required":["replicas","minReplicas","maxReplicas","capacityRpsPerReplica"],"properties":{"replicas":{"type":"integer","maximum":10000,"minimum":1},"autoscaling":{"type":"boolean","default":true},"maxReplicas":{"type":"integer","maximum":10000,"minimum":1},"minReplicas":{"type":"integer","maximum":10000,"minimum":1},"targetCpuPercent":{"type":"number","default":70,"maximum":100,"minimum":1},"capacityRpsPerReplica":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false},"reconnect":{"enum":["none","next-step"],"type":"string","default":"none"},"arrivalsPerStep":{"type":"number","default":0,"minimum":0},"initialSessions":{"type":"number","default":100,"minimum":0},"meanLifetimeSteps":{"type":"number","default":300,"minimum":1},"maxSessionsPerOwner":{"type":"number","default":1000,"exclusiveMinimum":0},"requestsPerSessionPerSecond":{"type":"number","default":1,"exclusiveMinimum":0}},"description":"Opt-in modeled sticky owners for generic compute; Kubernetes requires explicit workload replicas independent of nodes. Use identical fleetId/config on compute peers. Existing sessions do not migrate on scale-out; owner loss disconnects them. reconnect:'next-step' explicitly enables rebinding; default none. Session arrivals/lifetime are assumptions, not measured OpenShell data. Read full step metrics.sessionAffinity for per-owner load, rejects and disconnects.","additionalProperties":false},"connectionDemand":{"type":"object","required":["mode"],"properties":{"mode":{"enum":["load-derived","declared","max"],"type":"string","description":"load-derived keeps the legacy traffic estimate; declared uses only the plan-time declaredConnections/idlePoolFloor; max uses the greatest of load-derived and declared/floor demand."},"idlePoolFloor":{"type":"integer","maximum":1000000,"minimum":0,"description":"ASSUMPTION / plan-time minimum idle pool footprint, not an observed live connection count."},"declaredConnections":{"type":"integer","maximum":1000000,"minimum":0,"description":"ASSUMPTION / plan-time peak pool budget (for example, replicas × per-pod pool size), not an observed live connection count."}},"description":"Database only. Omit to preserve legacy load-derived connection use. `declared` and `max` require declaredConnections and/or idlePoolFloor. Demand above usable maxConnections adds a bounded rule-based pool-saturation error signal, not a provider-calibrated rate.","additionalProperties":false},"kubernetesCpuHpa":{"type":"object","required":["cpuDemandMilliCoresPerRps","targets","replicas","minReplicas","maxReplicas"],"properties":{"targets":{"type":"array","items":{"anyOf":[{"type":"object","required":["type","targetPercent"],"properties":{"type":{"type":"string","const":"Utilization"},"targetPercent":{"type":"number","maximum":1000,"exclusiveMinimum":0}},"additionalProperties":false},{"type":"object","required":["type","targetMilliCores"],"properties":{"type":{"type":"string","const":"AverageValue"},"targetMilliCores":{"type":"number","maximum":100000,"exclusiveMinimum":0}},"additionalProperties":false}]},"maxItems":2,"minItems":1},"replicas":{"type":"integer","maximum":10000,"minimum":1},"maxReplicas":{"type":"integer","maximum":10000,"minimum":1},"minReplicas":{"type":"integer","maximum":10000,"minimum":1},"cpuDemandEvidence":{"$ref":"#/properties/resources/items/properties/characteristics/properties/kubernetesCpuHpa/properties/cpuRequestEvidence"},"cpuRequestEvidence":{"type":"object","required":["source","reference"],"properties":{"source":{"enum":["calibrated","external"],"type":"string"},"reference":{"type":"string","maxLength":512,"minLength":1}},"additionalProperties":false},"cpuDemandCalibration":{"type":"object","required":["method","reviewed","measurements"],"properties":{"method":{"type":"string","const":"least-squares-through-origin"},"reviewed":{"type":"boolean","const":true},"measurements":{"type":"array","items":{"type":"object","required":["rps","cpuMilliCores"],"properties":{"rps":{"type":"number","maximum":1000000,"exclusiveMinimum":0},"cpuMilliCores":{"type":"number","maximum":1000000000,"minimum":0}},"additionalProperties":false},"maxItems":100,"minItems":2}},"additionalProperties":false},"cpuRequestMilliCores":{"type":"number","maximum":100000,"exclusiveMinimum":0},"cpuDemandMilliCoresPerRps":{"type":"number","maximum":1000000,"exclusiveMinimum":0},"scaleDownStabilizationSteps":{"type":"integer","maximum":10000,"minimum":1}},"description":"Opt-in bounded workload-pod replica model, separate from node-pool scaling. Declare CPU demand in millicores/RPS and targets (Utilization requires an explicit CPU request). A reviewed cpuDemandCalibration may include 2–100 offered-RPS/aggregate-mCPU points and must match the explicit demand value; cite its source and reference in cpuDemandEvidence. Unannotated request/demand inputs are ASSUMED; no HPA controller parity is claimed.","additionalProperties":false},"loadBalancerScheme":{"enum":["internal","internet-facing"],"type":"string","description":"Owned typical ALB scheme: internal."},"scaleInCpuThreshold":{"type":"number","maximum":100,"minimum":0,"description":"Compute or Kubernetes only — overrides the simulation-wide CPU HPA scale-in target for THIS resource's scale decisions only; every other resource keeps the simulation-wide default."},"scaleOutCpuThreshold":{"type":"number","maximum":100,"minimum":0,"description":"Compute or Kubernetes only — overrides the simulation-wide CPU HPA scale-out target (see the top-level autoscalingTargetCpu) for THIS resource's scale decisions only; every other resource keeps the simulation-wide default."},"cacheableRequestShare":{"type":"number","maximum":1,"minimum":0,"description":"Cache only: fraction (0–1) of offered requests routed through this cache; when omitted on a connected cache path, all synchronous non-queued traffic is assumed cacheable."},"workloadDatabaseEngine":{"enum":["mysql"],"type":"string","description":"MySQL workload identity on the db.r5.large database."},"workloadDatabaseVersion":{"type":"string","description":"Owned typical MySQL workload version: 8.0."}},"description":"Capacity and sizing characteristics for the resource (extra keys such as costMultiplier pass through unchanged)","additionalProperties":true}},"additionalProperties":false},"description":"List of cloud resources composing this simulation. For a built-in scenario, pass the hydrated resources from scenario.get; scenario.list cards are graph-free. (max 10 in demo mode; mutually exclusive with scenarioId)"},"scenarioId":{"type":"string","minLength":1,"description":"Live scenario identifier from scenario.list; mutually exclusive with resources and connections"},"connections":{"type":"array","items":{"type":"object","required":["sourceId","targetId"],"properties":{"label":{"type":"string","description":"Optional label describing the connection type"},"sourceId":{"type":"string","description":"ID of the source (upstream) resource"},"targetId":{"type":"string","description":"ID of the target (downstream) resource"}},"additionalProperties":false},"description":"Directed connections between resources. For a built-in scenario, pass the hydrated connections from scenario.get; scenario.list cards are graph-free. Directed edges should describe traffic flow between resources; omit when using scenarioId."},"description":{"type":"string","maxLength":500,"description":"Optional description of the simulation's purpose"},"maxInstances":{"type":"integer","minimum":1,"description":"Hard ceiling on the autoscaled compute fleet size, stored as autoscalingConfig.maxInstances. If omitted, the provider default applies (AWS 50, GCP 15, Azure/OCI/DigitalOcean 10) — which may be much larger than your intended fleet size."},"minInstances":{"type":"integer","minimum":1,"description":"Floor on the autoscaled compute fleet size, stored as autoscalingConfig.minInstances."},"responseMode":{"enum":["compact","full"],"type":"string","default":"compact","description":"Response detail level. 'compact' (default) returns id, name, status, traffic, and a per-resource summary (id, name, status, cpuPercent) — keeps the response small for agent loops. 'full' returns the complete simulation object including all resource characteristics and connections."},"resilienceConfig":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Master switch for retry/cascade modeling"},"version":{"type":"number","const":1,"description":"Resilience model version"},"maxStepWork":{"type":"integer","maximum":2048,"minimum":1},"podServices":{"type":"array","items":{"type":"object","required":["resourceId","replicas","perPodCapacityRps"],"properties":{"replicas":{"type":"integer","maximum":1000,"minimum":0},"readiness":{"type":"object","default":{},"properties":{"failureThreshold":{"type":"integer","default":1,"maximum":20,"minimum":1},"successThreshold":{"type":"integer","default":1,"maximum":20,"minimum":1},"startupDelaySeconds":{"type":"number","default":0,"maximum":3600,"minimum":0},"readinessProbePeriodSeconds":{"type":"integer","default":1,"maximum":300,"minimum":1}},"additionalProperties":false},"resourceId":{"type":"string","maxLength":128,"minLength":1},"termination":{"type":"object","default":{},"properties":{"preStopSeconds":{"type":"number","default":0,"maximum":3600,"minimum":0},"inflightDrainBehavior":{"enum":["finish","drop-at-sigkill"],"type":"string","default":"finish"},"requestDurationSeconds":{"type":"number","default":0,"maximum":3600,"minimum":0},"terminationGracePeriodSeconds":{"type":"number","default":30,"maximum":3600,"minimum":0}},"additionalProperties":false},"initialReady":{"type":"boolean","default":true},"rollingUpdate":{"type":"object","required":["startStep"],"properties":{"maxSurge":{"type":"integer","default":1,"maximum":1000,"minimum":0},"startStep":{"type":"integer","maximum":100000,"minimum":0},"maxUnavailable":{"type":"integer","default":0,"maximum":1000,"minimum":0}},"additionalProperties":false},"replicaChanges":{"type":"array","items":{"type":"object","required":["step","replicas"],"properties":{"step":{"type":"integer","maximum":100000,"minimum":0},"replicas":{"type":"integer","maximum":1000,"minimum":0}},"additionalProperties":false},"default":[],"maxItems":100},"readinessChanges":{"type":"array","items":{"type":"object","required":["step","passing"],"properties":{"step":{"type":"integer","maximum":100000,"minimum":0},"passing":{"type":"boolean"}},"additionalProperties":false},"default":[],"maxItems":100},"perPodCapacityRps":{"type":"number","maximum":1000000,"exclusiveMinimum":0},"endpointPropagation":{"type":"object","default":{},"properties":{"addDelaySeconds":{"type":"number","default":0,"maximum":3600,"minimum":0},"removeDelaySeconds":{"type":"number","default":0,"maximum":3600,"minimum":0}},"additionalProperties":false},"hpaUnreadyPodPolicy":{"enum":["excluded","zero","target"],"type":"string","default":"excluded"}},"additionalProperties":false},"maxItems":32,"minItems":1,"description":"Opt-in generic pod lifecycle by resourceId: explicit replicas/perPodCapacityRps, readiness/probe thresholds, endpoint add/remove delays, termination preStop/grace/inflight drain, HPA unready policy, replicaChanges/readinessChanges and rollingUpdate startStep/maxSurge/maxUnavailable. Times are simulated seconds (one ordinary step); full metrics expose resilience.podServices, compact exposes resilienceDiagnostics.podServices. No controller/proxy parity."},"dependencies":{"type":"array","items":{"type":"object","required":["id","sourceId","targetId"],"properties":{"id":{"type":"string","maxLength":128,"minLength":1,"description":"Unique dependency edge ID"},"capacity":{"type":"object","properties":{"maxRps":{"type":"number","maximum":500000,"exclusiveMinimum":0},"maxConcurrent":{"type":"integer","maximum":1000000,"exclusiveMinimum":0},"meanServiceTimeMs":{"type":"number","maximum":120000,"exclusiveMinimum":0}},"additionalProperties":false},"sourceId":{"type":"string","minLength":1,"description":"Upstream resource ID"},"targetId":{"type":"string","minLength":1,"description":"Downstream resource ID"},"protection":{"type":"object","properties":{"loadShedding":{"type":"boolean"},"rateLimitRps":{"type":"number","maximum":500000,"exclusiveMinimum":0},"circuitBreaker":{"type":"object","properties":{"enabled":{"type":"boolean"},"openSteps":{"type":"integer","maximum":120,"minimum":1},"minimumRequests":{"type":"integer","maximum":100000,"minimum":1},"halfOpenMaxRequests":{"type":"integer","maximum":10000,"minimum":1},"failureRateThreshold":{"type":"number","maximum":1,"minimum":0}},"additionalProperties":false}},"additionalProperties":false},"retryPolicy":{"type":"object","properties":{"backoffMs":{"type":"integer","maximum":60000,"minimum":0,"description":"Initial retry backoff in milliseconds (default 100)."},"timeoutMs":{"type":"integer","maximum":120000,"minimum":1,"description":"Per-attempt client deadline in milliseconds (default 2000); includes queue wait, service, and latency."},"maxRetries":{"type":"integer","maximum":8,"minimum":0,"description":"Maximum retries for this dependency edge (0 disables retries; default 2)."},"jitterRatio":{"type":"number","maximum":1,"minimum":0,"description":"Fractional backoff jitter from 0 to 1 (default 0.1)."},"retryActorId":{"type":"string","maxLength":128,"minLength":1,"description":"Actor producing retries, such as a gateway or client"},"retryBudgetRps":{"type":"number","maximum":500000,"minimum":0,"description":"Optional absolute retry RPS cap, also bounded by retryBudgetRatio."},"retryBudgetRatio":{"type":"number","maximum":10,"minimum":0,"description":"Retry RPS budget as a multiple of original edge RPS (default 2)."},"backoffMultiplier":{"type":"number","maximum":10,"minimum":1,"description":"Exponential backoff multiplier (default 2)."}},"additionalProperties":false},"requestRatio":{"type":"number","maximum":20,"minimum":0,"description":"Requests to target per original request"},"authDependencyId":{"type":"string","maxLength":128,"minLength":1,"description":"Dependency receiving generated auth/token traffic"},"authRequestsPerAttempt":{"type":"number","maximum":10,"minimum":0,"description":"Auth/token requests generated per dependency attempt"}},"additionalProperties":false},"maxItems":64,"description":"Dependency edges with retry and protection policies"},"externalMetrics":{"type":"object","required":["errorMode","initialCapacity","triggers"],"properties":{"triggers":{"type":"array","items":{"type":"object","required":["id","targetValue","samples"],"properties":{"id":{"type":"string","maxLength":128,"minLength":1},"samples":{"type":"array","items":{"anyOf":[{"type":"object","required":["step","status","value"],"properties":{"step":{"type":"integer","maximum":100000,"minimum":0},"value":{"type":"number","maximum":1000000000,"minimum":0},"status":{"type":"string","const":"value"}},"additionalProperties":false},{"type":"object","required":["step","status"],"properties":{"step":{"type":"integer","maximum":100000,"minimum":0},"status":{"enum":["no_ready_endpoints","discovery_error","fetch_error"],"type":"string"}},"additionalProperties":false}]},"maxItems":120,"minItems":1},"targetValue":{"type":"number","maximum":1000000000,"minimum":0.000001,"exclusiveMinimum":0},"noReadyEndpointsAsZero":{"type":"boolean","default":false}},"additionalProperties":false},"maxItems":16,"minItems":1},"errorMode":{"enum":["drop_failed_trigger","freeze_combined_decision"],"type":"string"},"maxCapacity":{"type":"integer","default":100,"maximum":10000,"minimum":1},"minCapacity":{"type":"integer","default":0,"maximum":10000,"minimum":0},"initialCapacity":{"type":"integer","maximum":10000,"minimum":0}},"description":"Deterministic per-trigger recommendation inputs. A no_ready_endpoints sample is a successful zero only when that trigger sets noReadyEndpointsAsZero:true; discovery_error and fetch_error always remain errors. This is not a KEDA/provider actuator and does not change resource counts.","additionalProperties":false},"maxCascadeDepth":{"type":"integer","maximum":8,"minimum":1},"maxGeneratedRps":{"type":"number","maximum":500000,"exclusiveMinimum":0},"scalingPolicies":{"type":"array","items":{"type":"object","required":["id","dependencyId","constrainedMetric","observationMetric","scaleOutThresholdPercent"],"properties":{"id":{"type":"string","maxLength":128,"minLength":1},"dependencyId":{"type":"string","maxLength":128,"minLength":1},"constrainedMetric":{"enum":["rps","concurrency"],"type":"string"},"observationMetric":{"enum":["source_cpu","capacity_utilization"],"type":"string"},"observedResourceId":{"type":"string","minLength":1},"scaleOutThresholdPercent":{"type":"number","maximum":100,"minimum":1},"scaleOutCapacityMultiplier":{"type":"number","maximum":20,"minimum":1}},"additionalProperties":false},"maxItems":32,"description":"Capacity-observation policies, including intentional autoscaling blind spots"},"scheduledFaults":{"type":"array","items":{"type":"object","required":["id","type","startStep"],"properties":{"id":{"type":"string","maxLength":128,"minLength":1},"type":{"enum":["capacity_limit","concurrency_limit","latency","error_rate","traffic_surge"],"type":"string","description":"Fault type; traffic_surge increases root client demand"},"endStep":{"type":"integer","minimum":1},"errorRate":{"type":"number","maximum":1,"minimum":0},"startStep":{"type":"integer","minimum":0},"dependencyId":{"type":"string"},"maxConcurrent":{"type":"integer","maximum":1000000,"exclusiveMinimum":0},"addedLatencyMs":{"type":"number","maximum":120000,"minimum":0},"capacityPercent":{"type":"number","maximum":100,"minimum":0},"targetResourceId":{"type":"string"},"trafficMultiplier":{"type":"number","maximum":20,"description":"traffic_surge demand multiplier","exclusiveMinimum":1}},"additionalProperties":false},"maxItems":32,"description":"Scheduled capacity, error, latency, concurrency, or traffic-surge faults"},"retryGeneratedTrafficAffectsCost":{"type":"boolean"}},"description":"Optional retry/cascade resilience model returned by scenario.get. externalMetrics accepts deterministic sampled triggers; no_ready_endpoints is successful zero only when noReadyEndpointsAsZero:true, while discovery_error and fetch_error remain errors. This recommendation model does not actuate KEDA, providers, or simulated resource counts.","additionalProperties":false},"autoscalingConfig":{"type":"object","required":["scaleOutCpuThreshold","scaleInCpuThreshold","scaleOutThroughputThreshold","scaleInThroughputThreshold","scaleOutLatencyThreshold","cooldownSeconds","minInstances","maxInstances"],"properties":{"maxInstances":{"type":"number"},"minInstances":{"type":"number"},"cooldownSeconds":{"type":"number"},"scaleInCpuThreshold":{"type":"number"},"ecsCpuTargetTracking":{"type":"boolean"},"scaleOutCpuThreshold":{"type":"number"},"scaleInCooldownSeconds":{"type":"integer","maximum":86400,"minimum":0},"scaleOutCooldownSeconds":{"type":"integer","maximum":86400,"minimum":0},"scaleOutLatencyThreshold":{"type":"number"},"simulationSecondsPerStep":{"type":"number","maximum":60,"exclusiveMinimum":0},"scaleInThroughputThreshold":{"type":"number"},"scaleOutThroughputThreshold":{"type":"number"}},"description":"Simulation autoscaling thresholds and cooldown. Pass the value from scenario.get when creating from a copied scenario graph.","additionalProperties":false},"scenarioOverrides":{"anyOf":[{"type":"object","required":["awsMultiRegionFailover"],"properties":{"awsMultiRegionFailover":{"type":"object","properties":{"dnsTtlSeconds":{"type":"number","maximum":86400,"exclusiveMinimum":0},"includeRecoveryRamp":{"type":"boolean","default":true},"recoveryRampStartStep":{"type":"integer","maximum":100000,"minimum":40}},"additionalProperties":false}},"additionalProperties":false},{"type":"object","required":["sqsQueueBacklogSaturation"],"properties":{"sqsQueueBacklogSaturation":{"type":"object","properties":{"includeEventBurst":{"type":"boolean","default":true},"eventBurstStartStep":{"type":"integer","maximum":100000,"minimum":6}},"additionalProperties":false}},"additionalProperties":false},{"type":"object","required":["eksSpotInterruption"],"properties":{"eksSpotInterruption":{"type":"object","required":["startupSeconds"],"properties":{"startupSeconds":{"type":"integer","maximum":3600,"minimum":0}},"additionalProperties":false}},"additionalProperties":false},{"type":"object","required":["webAutoscaling"],"properties":{"webAutoscaling":{"type":"object","properties":{"includeTrafficRecovery":{"type":"boolean","default":false}},"additionalProperties":false}},"additionalProperties":false},{"type":"object","required":["redisCacheCrashRecovery"],"properties":{"redisCacheCrashRecovery":{"type":"object","required":["cacheableRequestShare","cacheHitRate"],"properties":{"cacheHitRate":{"type":"number","maximum":1,"minimum":0,"description":"Configured hit rate among requests sent to Redis (0–1; the scenario default is 0.8)."},"cacheableRequestShare":{"type":"number","maximum":1,"minimum":0,"description":"Fraction of offered requests sent to Redis (0–1; the scenario default is 0.8)."}},"additionalProperties":false}},"additionalProperties":false}],"description":"Scenario-only customization; requires scenarioId and exactly one supported override. SQS event-burst start is an absolute post-warm-up step and must be selected before the first simulation.step. Redis cache assumptions affect only this simulation."},"scaleOutCpuPercent":{"type":"number","maximum":100,"minimum":0,"description":"Grok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match."},"autoscalingTargetCpu":{"type":"number","maximum":100,"minimum":0,"description":"Canonical CPU HPA scale-out target percent. CWM synthesizes unrelated autoscaling defaults."},"ecsCpuTargetTracking":{"type":"boolean","description":"Opt into CPU-only ECS Fargate target tracking."},"scaleOutCpuThreshold":{"type":"number","maximum":100,"minimum":0,"description":"Equivalent alias for autoscalingTargetCpu; if both are sent they must match."},"scaleInCooldownSeconds":{"type":"integer","maximum":86400,"minimum":0,"description":"ECS CPU target-tracking scale-in cooldown in simulated seconds."},"scaleOutCooldownSeconds":{"type":"integer","maximum":86400,"minimum":0,"description":"ECS CPU target-tracking scale-out cooldown in simulated seconds."},"simulationSecondsPerStep":{"type":"number","maximum":60,"description":"Simulated seconds per step for ECS cooldowns (default 1).","exclusiveMinimum":0},"autoscaleTargetCpuPercent":{"type":"number","maximum":100,"minimum":0,"description":"Grok-compatible alias for the CPU HPA scale-out target; if multiple target names are sent they must match."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"title":"Create Simulation"},"changes":[{"kind":"name","detail":"Renamed \"simulation.create\" → \"simulation_create\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":9809,"tokensAfter":9809},{"name":"simulation.delete","fixed":{"name":"simulation_delete","description":"Permanently delete an owned temporary anonymous demo simulation and its metrics, events, failures, and capability. This is the explicit way to free a simulation slot; deletion is irreversible, while the existing demo TTL remains the safety net for abandoned simulations. Prerequisite: a simulationId from simulation.create, or an active simulation in the preserved MCP session. The likely next tool is simulation.create to use the freed slot. A successful response is { deleted: true, id }; failed ow","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"simulationId":{"type":"string","description":"Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":true,"destructiveHint":true},"title":"Delete Simulation"},"changes":[{"kind":"name","detail":"Renamed \"simulation.delete\" → \"simulation_delete\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":367,"tokensAfter":367},{"name":"simulation.inject_failure","fixed":{"name":"simulation_inject_failure","description":"Fail one compute/Kubernetes node, database, or cache in a temporary anonymous demo simulation (marked critical, not removed). Targeted database quick failures are bounded and reversible; with no serving database at positive load, simulation.step reports 100% errors, zero goodput and errorBreakdown.dbFailure: 100. simulation.recover_resource can restore a database or cache early. An AWS Aurora writer with characteristics.auroraStandbyResourceId pointing to a healthy related replicaOf database has","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"resourceId":{"type":"string","description":"Optional: ID of the resource to fail. Takes precedence over resourceName."},"resourceName":{"type":"string","description":"Optional: name of the resource to fail (exact match preferred; unambiguous prefix accepted). Ambiguous names return a 400 with a candidate list."},"simulationId":{"type":"string","description":"Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":true},"title":"Inject Failure"},"changes":[{"kind":"name","detail":"Renamed \"simulation.inject_failure\" → \"simulation_inject_failure\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":457,"tokensAfter":457},{"name":"simulation.inject_traffic","fixed":{"name":"simulation_inject_traffic","description":"Change traffic on a demo simulation using targetRps, deltaPercent, or explicit random: true. targetRps takes precedence over deltaPercent; random cannot be combined with either. Missing or unknown selectors are rejected, and no random spike is selected implicitly. Absolute targets are capped at 10000 RPS in demo mode. The change affects metrics after the next simulation.step. For Redis Cache Crash & Recovery, the default 5,000 RPS load has no active pattern, so this controlled traffic update als","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"random":{"type":"boolean","const":true,"description":"Explicitly select a random stress spike; never selected implicitly."},"targetRps":{"type":"integer","minimum":1,"description":"Absolute traffic level in RPS to set. Server-capped at 10000 RPS in demo mode."},"deltaPercent":{"type":"number","description":"Relative traffic change; must be greater than -100.","exclusiveMinimum":-100},"simulationId":{"type":"string","description":"Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"title":"Inject Traffic"},"changes":[{"kind":"name","detail":"Renamed \"simulation.inject_traffic\" → \"simulation_inject_traffic\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":477,"tokensAfter":477},{"name":"simulation.metrics","fixed":{"name":"simulation_metrics","description":"Read the latest metrics and resource states for a temporary anonymous demo simulation: latency, CPU, throughput, error rate, cost per hour, and per-resource health. Use it to inspect current state and metrics history without advancing time; do not use it to move the simulation forward — that is simulation.step. Responses are compact by default: principal current metrics plus explicit modeled goodputRps (a post-step point rate sourced from throughput, with provenance), goodputWindow (recorded onl","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"responseMode":{"enum":["compact","full"],"type":"string","default":"compact","description":"Response detail level. 'compact' (default) returns principal current metrics, errorBreakdown when available, per-resource status (id, name, status, cpuPercent, routedRps, availabilityState, isRoutable, recoveryBlockedReason, and failureLifecycle/routingState when provided), and only the last 10 metrics-history entries — keeps polling cheap for agent loops. 'full' returns the complete simulation object (all resource characteristics and connections) plus the entire metrics history."},"simulationId":{"type":"string","description":"Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link."}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"openWorldHint":false,"idempotentHint":true,"destructiveHint":false},"title":"Get Simulation Metrics"},"changes":[{"kind":"name","detail":"Renamed \"simulation.metrics\" → \"simulation_metrics\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":529,"tokensAfter":529},{"name":"simulation.recover_resource","fixed":{"name":"simulation_recover_resource","description":"Recover one reversible failed resource in a temporary anonymous demo simulation. No API key required for this temporary anonymous demo operation. Lower traffic to a serviceable level first, then provide resourceId or resourceName from simulation.create, simulation.step, or simulation.metrics. This deactivates applicable instance_down/database_overload failures for only the selected resource and returns recoveryProgress with parked, cooling_down, or healthy state plus cooldown counters. It cannot","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"resourceId":{"type":"string","description":"ID of the failed resource to recover"},"resourceName":{"type":"string","description":"Exact case-insensitive name of the failed resource to recover"},"simulationId":{"type":"string","description":"Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"title":"Recover Failed Resource"},"changes":[{"kind":"name","detail":"Renamed \"simulation.recover_resource\" → \"simulation_recover_resource\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":424,"tokensAfter":424},{"name":"simulation.step","fixed":{"name":"simulation_step","description":"Advance a temporary anonymous demo simulation by one time step and return updated metrics — CPU, latency, throughput, error rate, cost (max 20 persisted steps per demo). Concurrent simulation.step calls on one simulation either serialize as distinct consecutive steps (in the browser Workspace queue) or receive HTTP 409 simulation_step_in_progress without advancing or consuming a demo credit. Wait for the running call to finish, then retry only rejected calls; distinct simulations can run concurr","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"traffic":{"type":"number","minimum":0,"description":"Optional RPS override for this step. Applied when no traffic pattern is active; otherwise rejected with STEP_TRAFFIC_PATTERN_ACTIVE. Use simulation.inject_traffic to change load; finalized SQS backlog runs keep the pattern snapshot and apply an explicit target at runtime."},"responseMode":{"enum":["compact","full"],"type":"string","default":"compact","description":"Response detail level. 'compact' (default) returns only principal metrics, errorBreakdown when available, per-resource status (id, name, status, cpuPercent, routedRps, availabilityState, isRoutable, recoveryBlockedReason, and failureLifecycle/routingState when provided), and this step's events — keeps observations small for agent loops. 'full' returns the complete backend step response including the entire simulation object with all resource characteristics and connections."},"simulationId":{"type":"string","description":"Simulation ID returned by simulation.create. Preserve Mcp-Session-Id to omit this field and use the session's current simulation; if your connector starts a fresh MCP session for each call (for example Grok Bot or Cursor), pass this explicit ID after every fresh initialization. A fresh session has no current-simulation pointer and returns NO_ACTIVE_SIMULATION when the ID is omitted. Anonymous capabilities are short-lived (30 minutes by default), unguessable, and revoked when the demo expires or is deleted; proxy IP changes do not invalidate them. Do not treat the ID as a durable share link."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"openWorldHint":false,"idempotentHint":false,"destructiveHint":false},"title":"Simulate Step"},"changes":[{"kind":"name","detail":"Renamed \"simulation.step\" → \"simulation_step\" (letters, digits, _ and - only; max 64). Keep the old name as an alias for a release if clients already call it.","verify":true}],"tokensBefore":617,"tokensAfter":617}],"toolsChanged":9,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}