> ## Documentation Index
> Fetch the complete documentation index at: https://docs.scalacomputing.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Release 0.1.2376

> Simulator software 4.8.1 · Released 2026-10-12 · Supersedes release 0.1.1828

Simulator software 4.8.1 · Released 2026-10-12 · Supersedes release 0.1.1828

***

## At a glance

This release adds the Scala UET NIC, a model of a NIC running Ultra Ethernet Transport. Scala Switch 3.7.0 adds a UET buffer policy, packet trimming and dynamic load balancing. Simulator software moves to 4.8.1, and the RoCE NIC's retransmission timer is reworked.

Other changes:

* Chakra simulations of 8,192 ranks or more no longer fail at start.
* On the optimized execution path, a simulation can be terminated at any point before it finishes, and it keeps the results it has produced.
* Traceset uploads now declare their rank count.
* On tracesets you upload, simulations can now run with a custom Chakra mapping file, which sets rank placement and scale-up groups.
* Validation of configurations and traces is stricter.
* New results query modes return transport, utilization, fairness and completion-time data over time.
* The release includes security updates.

Three customer-reported items are resolved in this release. See **Customer-reported issues resolved** below.

| Component | Previous | This release |
| - | - | - |
| Platform | 0.1.1828 | **0.1.2376** |
| Simulator software | 4.7.1 | **4.8.1** |
| ScalaSwitch model | 3.6.0 | **3.7.0** |
| ScalaRoceNic model | 4.5.1 | **4.6.0** |
| ScalaChakraGenerator model | 4.0.1 | **4.0.3** |
| ScalaUETNIC400G model | — | **4.6.0** (new) |
| ScalaMrcNic model | — | **4.0.5** (new, in testing) |

> **Some results change in this release. Check these before comparing runs with 0.1.1828:**
>
> * **RoCE NIC loss recovery.** The RoCE NIC's retransmission timing and NAK handling are reworked; see **Scala RoCE NIC 4.6.0**. Runs in which NAKs, retransmission timeouts or duplicate packets occur produce different results.
> * **Chakra computation time is corrected.** The computation time in `chakra-completion-stats` (`total_chakra_computation_time_us`) and in the results summary was over-counted for any rank that completed more than one computation. Reported values are now lower; simulated timing is unchanged.
> * **The `cdf` summary now sums ranks.** A multi-rank progress curve now reaches 1.0. Previously ranks were averaged and the curve levelled off at 1/N.
> * **Chakra traces that name an undefined process group now fail.** Previously their collectives were dropped silently, and the run could complete without that traffic.
> * **Two reports gain columns at the end of each row.** `roce-transport-stats` and `scala-switch-load-balancing-stats` each gain four columns. Readers that check the column count must be updated. Existing columns do not move.
> * **Remote trace logging is off by default** for new configurations. See **Remote trace logging is off by default**.
>
> The new Scala Switch attributes default to off, so switch behaviour is unchanged for existing configurations.

***

## Customer-reported issues resolved

### 8K-rank simulation failed

Before the simulator reads a Chakra trace, the platform annotates each operation with its position and size. The size field held six digits, so any operation of 1 MB or more misaligned every offset in the annotated trace. The simulator then stopped on the first operation with a parse error (`rapidjson parse error`). Traces of 8,192 ranks or more commonly contain operations that large.

The size field now holds nine digits. If an operation is still too large for it, the run fails while it is being prepared, and the message names the operation.

**No change to your tracesets is needed.** Annotation runs as part of every simulation, so rerunning picks up the fix.

Large multi-rank runs could also fill the compute disk with a debug log. That log is now off by default; see **Remote trace logging is off by default**. If an existing configuration has it set to `true`, set it to `false` before rerunning a large simulation.

### Terminate API works only in running state

On the optimized execution path, a simulation can now be terminated at any point before it finishes:

* while it is queued, including while its compute is still being acquired;
* while it is being prepared;
* while it is running.

What to expect:

* **The request returns the simulation as it is at that moment.**
  * **A run that has started** records `terminationRequestedAt` and settles as `terminated`, typically within 15 minutes.
  * **A run that had not started** settles as `terminated` in about a minute, with no results.
* **Results produced before the stop are kept.** They can be listed and downloaded through the existing results operations. Data the simulator still held in memory is not written out, and a file that was being written at the moment of the stop may be incomplete.
* **Finished or finishing simulations are unaffected.** A request for a simulation that has already finished, or is delivering its results, is accepted and has no effect.

On the standard execution path, termination behaves as in earlier releases.

### List models API reported Rack and Pod as switches

`GET /api/v1/models` now reports `type: "rack"` for ScalaRack and `type: "pod"` for POD. This matches the model detail and components operations. `type=rack` and `type=pod` are also accepted as filters.

Clients generated from the previous API specification may reject the new values. See **Upgrade notes**.

***

## Scala UET NIC and UET support in the Scala Switch

The **ScalaUETNIC400G** model (4.6.0) is now available in the model catalog. It models a 400 Gb/s NIC running Ultra Ethernet Transport (UET). It offers:

* packet spraying across equal-cost paths, with a choice of spraying methods;
* UET congestion control, including Quick Adapt;
* failure detection;
* optional per-packet monitoring.

The model reference pages describe every attribute.

**Scala Switch 3.7.0 adds two UET features, both off by default:**

* **UET buffer policy** (`SharedBufferManager.UETPolicyEnabled`). When it is on, every NIC in the topology must be a UET NIC or an MRC NIC. Otherwise the simulation stops before it starts. Turning the policy on while PFC is enabled logs a warning.
* **Packet trimming** (`PacketTrimmer.TrimmingEnabled`, with `TrimmingStatsEnabled` for its statistics). Trimming requires the UET buffer policy, and PFC turned off on every traffic class. With the switch's default PFC settings, a configuration that turns trimming on stops before it starts.

**Results.** Each UET NIC writes `uet-transport-stats` by default. The per-packet `uet-monitor` record is written when `EnableUETMonitor` or one of its triggers is on. A time series of `uet-transport-stats` is available through the results API; see **Results, logs and uploads**.

**Chakra workloads** run on UET NICs. All servers in a Chakra simulation must use the same NIC type.

***

## New in this release

### Simulator software 4.8.1

Simulator software 4.8.1 carries the model updates below and the new UET and MRC NIC models.

### Scala RoCE NIC 4.6.0

**Retransmission timing per queue pair.** The RoCE NIC now times outstanding requests with one InfiniBand-style transport timer per queue pair, replacing the per-packet timers. In addition:

* a NAK now acknowledges the packets before it;
* duplicate packets are acknowledged again;
* acknowledgments for packets never sent, and stale transmit payload, are discarded.

These changes are on by default, and they change results for runs that involve NAKs, retransmission timeouts or duplicate packets. `RetransmitTimeout` keeps its default of 64 ms.

`roce-transport-stats` gains four columns, appended at the end of each row:

| Column (cumulative / interval) | Meaning |
| - | - |
| `num_rx_drops_ghost_ack` / `ivl_…` | ACK or NAK packets discarded because they acknowledge a PSN beyond the highest the queue pair has sent |
| `num_tx_payload_discards` / `ivl_…` | Transmit payload segments discarded before sending because they belong to a stale queue-pair instance |

### Scala Switch 3.7.0: dynamic load balancing

The switch can now move flows between the members of an equal-cost set. **The default, `none`, keeps the previous behaviour**, so 3.6.0 results are unchanged.

| Attribute | Default | Meaning |
| - | - | - |
| `LoadBalancingMethod` | `none` | `flowlet` moves a flow to the member with the least egress occupancy whenever the flow has been idle for at least `Gap` |
| `LoadBalancingFlowlet.Gap` | 100 µs | Idle time that starts a new flowlet |
| `LoadBalancingFlowlet.PFCAware` | `true` | Prefer members whose egress port is not paused by PFC for the packet's traffic class |
| `EnableLoadBalancingStats` | `true` | Write `scala-switch-load-balancing-stats` |
| `LoadBalancingStatsReportInterval` | 1 ms | Reporting interval for that record (minimum 10 µs) |

`scala-switch-load-balancing-stats` gains `paused_skips` and `paused_selections`, with their interval columns, at the end of each row. They count decisions that skipped a member because PFC had paused it, and decisions that selected a member while it was paused.

### Uploaded tracesets declare their rank count

* **New field on upload requests.** `POST /api/v1/tracesets/upload-url` now takes `workloadMetadata`, which declares the traceset's rank count in one of two ways:
  * `shape.rankCount`;
  * parallelism degrees `dp`, `tp`, `sp`, `ep` and `pp`, multiplied together. An absent degree counts as 1.
* **The declaration is required for any upload that includes trace files.** A missing or invalid declaration returns `400` `VALIDATION_ERROR` naming the field.
* **Client support.** The Python client takes `workload_metadata`, and the command-line tool takes `--workload-metadata`.
* **Uploaded tracesets can be used right away.** An upload completes as `ready`, and the traceset can be attached to a configuration immediately. Previously, attaching an uploaded traceset could be refused with a conflict that asked you to retry, and retrying did not help.
* **The count is checked at launch.** Before trace processing begins, the declared count is compared with the per-rank traces in the traceset. A mismatch fails the simulation with `Declared rank count N does not match the M per-rank traces found in the traceset`.
* **A traceset with no rank count cannot be attached.** Attaching it now returns `422` (previously `409`). Upload it again with a declaration.

### Chakra mapping files

A Chakra mapping file sets which server runs each Chakra rank, replacing the default in-order placement. It can also declare scale-up groups. Traffic inside a group uses the scale-up fabric instead of the scale-out network.

* **Upload once, attach to a configuration.** Every simulation created from that configuration is launched with the file, and records it in `appliedMappingFile`.
* **Manage files through the API.** Mapping files can be listed, downloaded byte for byte, and deleted. Detaching a file restores in-order placement.
* **Mapped simulations run to completion on tracesets you upload.** The traceset must have a rank count (see above). The file must place every rank on its own Chakra-capable server in the topology.
* **A run never falls back to in-order placement.** A file that cannot be delivered to the simulator fails the simulation, with the reason.
* **The platform owns the mapping parameters while a file is attached.** It sets `UseMapping` and `MappingFileName`, and a change to either returns `422` `MAPPING_PARAMS_LOCKED`.
* **Files can be up to 64,000,000 bytes.**
* **You provide the file.** The platform does not generate mapping files. Write one, or generate it with your own tooling.

The **Chakra mapping files** guide describes the file format, when each rule is checked, and the full upload, attach and simulate flow.

### Stricter validation of configurations and traces

These checks can reject configurations or traces that earlier releases accepted. In each case the configuration or trace could not have run correctly. The problem is now reported before or at the start of the run, with the reason.

* **Parameters are checked against the model catalog.** Configurations and templates are rejected with `400`, listing every issue, for:
  * undeclared parameters;
  * wrong types or enum values;
  * values out of range;
  * malformed units or lists.
* **Range checks are unit-aware** for time, data-rate, byte and queue-size values. Previously only time values were checked.
* **Chakra traces whose collectives name an undefined process group fail** while the simulation is being prepared.
* **A corrupt zip archive anywhere in a traceset fails the simulation** on the standard execution path. Previously a corrupt archive could be skipped silently.
* **Refused launches return a client error.** A launch refused because of its configuration now returns `400` `LAUNCH_CONFIG_INVALID` with the reason, or `422` `LAUNCH_REJECTED`, instead of `503`.
* **Compute requests above 1,024 instances** are rejected with `400` "Invalid compute configuration".

### Results, logs and uploads

New query modes on `GET /api/v1/simulations/{sim_id}/results/data`:

| Metric | Mode | Returns |
| - | - | - |
| `roce-transport-stats`, `uet-transport-stats` | `timeSeries` | Transport counters over time |
| `nd-stats` | `utilizationBins` | Distribution of link utilization over time |
| `nd-stats` | `uplinkFairness` | Uplink port fairness per switch over time |
| `perf` | `completionTimeBins` | Distribution of completion times over time |
| `pfc` | `timeSeries` | Now also returns per-tier head-of-line blocking severity, as groups after the existing group |

A metric and mode that do not combine return `400` `UNSUPPORTED_COMBINATION`. Switch bandwidth by tier is available from `GET /api/v1/configurations/{config_id}/versions/{version}/switch-bandwidth`.

**Changes to existing results behaviour:**

* **Large result sets.** If a summary takes longer than the request allows, computing it now continues, and the result is cached for later requests. Large result files are downloaded in parallel parts.
* **Empty metrics.** A run that finished at least 60 minutes ago and has no data for a metric now returns `200` with an empty summary, instead of `404`.
* **Tier filter on the performance summary.** Every completion is recorded at a host. So for `perf` and `chakra-perf`, `tier=ssw`, `fsw` or `rsw` now returns an empty summary (count 0), instead of repeating the whole-network values. `tier=all` and `tier=nic` are unchanged.
* **Logs.** For log files over 8 MiB on the optimized execution path, the logs operation now returns the last 8 MiB, where failures appear, with a notice that the start is not shown. A pagination cursor obtained before the upgrade gets one `400`; start the walk again.
* **Sorting the simulation list.** `GET /api/v1/simulations` accepts a single sort field. A cursor replayed under a different sort returns `400`.
* **Uploads.** Upload part URLs are valid for one hour, up from 15 minutes. Responses include `size` and `partUrlsExpireAt`. Completing an upload of more than about 1 GB no longer stays stuck in `completing`.

### Remote trace logging is off by default

`EnableRemoteTraceLogging`, a global simulation parameter, now defaults to `false` in the shipped templates and in new configurations. The debug file it enables, `{simulation}-scala-remote-trace-log-{shard}.csv`, is therefore no longer produced by default. On large multi-rank runs that file can reach hundreds of gigabytes, enough to fill the run's disk and stop the simulation.

**Saved configurations keep their stored value.** See **Upgrade notes**.

### Scala MRC NIC (in testing)

The **ScalaMrcNic** model (4.0.5) is now in the model catalog, marked Beta. It models a NIC with Multi-path Reliable Connection (MRC) transport. **The model is still in testing, but it can be used now**, including with Chakra workloads and the RDMA applications.

***

## Model catalog changes

| Model | Previous | This release | Change |
| - | - | - | - |
| ScalaSwitch | 3.6.0 | **3.7.0** | Dynamic load balancing; UET buffer policy and packet trimming attributes now available. Defaults reproduce 3.6.0 |
| ScalaRoceNic | 4.5.1 | **4.6.0** | Per-queue-pair transport timer and NAK handling; no attribute changes |
| ScalaChakraGenerator | 4.0.1 | **4.0.3** | Adds `ScaleUpHeaderSize` (24 B), `ScaleUpMaxPayloadSize` (4096 B) and `ScaleUpStatsEnabled` (`false`). They apply only to ranks that a mapping file places in a scale-up group. Defaults reproduce earlier behaviour |
| ScalaUETNIC400G | — | **4.6.0** | New |
| ScalaMrcNic | — | **4.0.5** | New, in testing (Beta) |

The shipped default templates now reference simulator software 4.8.1 and set remote trace logging off.

***

## Platform reliability and stability

* **Fewer provisioning failures.** When the cloud provider lacks capacity in one availability zone, provisioning now retries in the others before failing.
* **Concurrent requests.** Concurrent simple-simulation requests for the same workload no longer fail each other with a server error.
* **Long-running Python scripts.** The Python client now refreshes its access token, so scripts that run for over an hour no longer fail with `401`.
* **Standard execution path:**
  * A finished simulation no longer shows `running` for hours when a storage sync stalls.
  * A launch that is denied access to its storage now fails promptly, instead of after about 15 minutes of retries.
* **Terminate after a platform restart.** Terminate requests no longer return `503` after a platform restart in which the messaging service started late.

***

## Security updates

**This release contains security updates. We recommend upgrading.**

In keeping with our disclosure practice, we do not publish details of security fixes. Customers with a specific compliance question should contact their Scala representative.

***

## Documentation

* **Model reference pages** for Scala Switch 3.7.0, Scala RoCE NIC 4.6.0, the Chakra workload 4.0.3 and Scala UET NIC 4.6.0. The model pages now sit in the Documentation tab, below the API Reference.
* **A new Chakra mapping files guide.**
* **Output-file reference:** the new `roce-transport-stats` columns, and the remote trace logging default with its disk-use warning.
* **API reference and changelog:** updated for this release.

***

## Not included in this release

The following remain open and are not addressed by 0.1.2376:

* **Mapping files with the platform's own Chakra tracesets.** A mapping file can be attached to a configuration that uses one of the platform's Chakra tracesets. A simulation from that configuration currently fails before the simulator starts, with `Mapping file <name> (<id>) could not be delivered`. Mapping files work on tracesets you upload.
* **Summary metrics for the largest result sets.** Computing a summary now continues after a request times out (see above), so a later request returns the metrics. Summaries for the largest runs, such as 8,192 ranks, can still be refused as too large. Raw result files remain available through the results download operations.
* **Pre-simulation run-time estimation.** There is still no supported way to tell in advance whether a trace will exceed the configured simulation time limit.
* **ECN-marked packet counts received at the NIC.** NIC-side receive counters for ECN-marked packets are not yet reported. Switch-side ECN information remains available.
* **Mixed NIC types in a Chakra simulation.** All servers in a Chakra simulation must use the same NIC type.

***

## Upgrade notes

* **Automatic upgrades.** Simulator software 4.8.1 and the updated models are applied with the platform upgrade.
* **Declare a rank count on traceset uploads.** API callers add `workloadMetadata`. Python client users pass `workload_metadata`, and command-line users pass `--workload-metadata`. Tracesets uploaded earlier that report no rank count must be uploaded again with a declaration; `rankCountDerived` is absent on `GET /api/v1/tracesets/{id}` for those tracesets.
* **Regenerate API clients**, or update hand-written ones, for these changes:
  * model types `rack` and `pod`;
  * component-schema `min`/`max` values are now objects with `value` and `unit`;
  * single-field sort on the simulation list;
  * the launch error codes `LAUNCH_CONFIG_INVALID` (`400`) and `LAUNCH_REJECTED` (`422`).
* **Turn off remote trace logging in saved configurations.** Set `EnableRemoteTraceLogging` to `false` with `PATCH /api/v1/configurations/{config_id}/parameters`, especially before large multi-rank runs.
* **Expect stricter validation.** Configurations with undeclared parameters or out-of-range values, and Chakra traces with undefined process groups, now fail before the run instead of during or after it.
* **Check results comparability** against the list in **At a glance** before comparing runs with 0.1.1828.
* **Update column-count checks.** Readers that check the column count of `roce-transport-stats` or `scala-switch-load-balancing-stats` must allow for the four appended columns.
* **Restart log pagination** that was in progress before the upgrade.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.