Patch Notes · v0.1.51 (Early Access)

Uptime: A Cloud Provider Sim · published

The game now sends you what you are looking at rather than the whole site, so big builds stutter far less. Plus new pair-capable switches that survive losing one, tidier cable runs, and a long list of fixes.

Added

  • Four new MLAG switches, and only those, can be paired. MLAG Access in 24-port and 48-port, plus an MLAG ToR and an MLAG Leaf. Nothing already in your racks can pair, so this is a purchase.
  • The two MLAG Access models arrive at the basement. They are the first redundancy you can buy, a tier before the rest of the fabric gear. The MLAG ToR and Leaf stay at the data centre.
  • A paired set backs itself up. Cable the two together, pair them from either switch console, and a server wired into both keeps working when one of them dies.
  • Servers can share load across two network cards. The server console now offers three modes: on their own, fail over, or share load. Sharing needs both leads reaching one switch or one paired set.
  • The PAIR socket takes a cable. Every MLAG switch carries one on the front. Run a lead between the pair so they can tell a dead partner from a dead cable, instead of both claiming charge.
  • The shop says which switches can pair. Only the four MLAG models can, and the spec line says so before you buy rather than after racking two boxes.

Changed

  • You choose a bundle's mode when you create it. The switch console's bond button shows the mode and cycles it. Every bundle used to be Static with nothing saying so.

Fixed

Racks and consoles

  • Racked equipment stays visible. A machine could vanish from a rack you were standing at, or draw nothing at all while its cables still hung in the air, until you walked away and came back.
  • A rack no longer shows the same machine twice, or loses one. After a full world update the game could line its machines up wrongly and write one server's details onto another.
  • A device you pick up leaves its rack at once, and stays gone. It used to sit in your hands and stay bolted in its slot at the same time, until the world caught up a moment later.
  • A device you set down is in one place only. Putting one back could leave a copy standing where you dropped it, solid and in the way, until something else redrew the room.
  • A carry can no longer get stuck. Placing a device that was already racked looped forever on an error, and a successful pickup could jump back out of your hands after three seconds. Only restarting cleared either.
  • A device in your hands is the one you picked up. Unracking a switch showed a small 5-port desktop box, and a server showed a plain grey chassis, until the world caught up.
  • Racking a device you just unracked works first time. Putting it back in a different slot could render nothing at all, and only worked if you left the rack, came back, and tried again.
  • Pulling a device out closes the rack view and frees its slot. Unracking left you staring at the rack holding the device, and the space it came from still read as full.
  • A box that will not lift says so, instead of saying it is gone. "Delivery is gone" sent you away from a crate still sitting on the pallet. It now tells you to try again.
  • Signing a prospect signs that prospect. Two leads could share an identity, so accepting one silently signed the other, on their terms and their bonus, while the lead you clicked stayed on the list.
  • The signing card no longer hangs on a click. It closed with the lead still listed, and clicking again did nothing until you reloaded.
  • Fast clicking no longer drops actions. Acting several times in a second could stall the game briefly and lose the last action entirely, with nothing said. Every action is now queued and sent in order.

Cabling

  • Side-hole runs route properly. A cable through a side hole cut diagonally across the rack face, picked up anchors in racks it only passed through, and jumped as you let go because the preview drew a different shape.
  • Cables that would not draw now draw. Runs into add-in network cards were abandoned while the card's socket art was still loading, and parts of a run could be built with no material at all.
  • A rear patch panel socket no longer puts a plug on the front. Clicking one left a connector stuck on the front face, tipped a quarter turn, and nothing ever cleared it.
  • Cables in a cable manager stay put when you unplug one. The rest used to shuffle inward to close the gap. Now the gap stays a gap, as it would on a real rack.

Panels and readouts

  • The world hostility setting shows what the run is actually using. It painted your last saved preference instead, so after loading a save it could show one setting while the game ran another.
  • Panels update when the thing they describe moves. Quests, staff, alarms and the security log refreshed roughly once in three, so a panel could sit still for a minute.
  • Traffic figures keep up across every console. Server, switch, gateway and firewall readings arrived every couple of seconds instead of every tick, so a busy machine read as idle.
  • A bar's verdict keeps up with its number. The saturation pill, bar colour and throttle hint lagged the live figures, so a device could sit at its ceiling without saying so, and a bar under-read exactly when it mattered.
  • A game catching up no longer loses most of its traffic readings. When the connection fell behind, seven machines in eight had their throughput dropped entirely rather than arriving late.
  • The dashboard and the capacity lens agree on load. The front page averaged every machine equally and counted unpowered ones, so it disagreed with the capacity figures one click away.

Performance

  • The game sends you what you are looking at, not the whole site. Machine readings, tenant detail and socket lists now travel scoped to what is on your screen, which is the single biggest cause of stutter gone.
  • A player action redraws what it touched. Unplugging one cable repainted every device on the site; it now repaints the two devices and the cable, so acting on a big build stops jolting.
  • A tenant's row got about two thirds smaller. On a 606-tenant save the customer list fell from 898 KB to 315 KB per full update, so big-site frames arrive without a pause.
  • Distant machines cost less to keep on screen. Readings for racks across the site refresh at a slower rate than the one you are standing at, instead of every machine paying full price.
  • Opening a console no longer resends the world. A console, tenant or network map told the game you held nothing, so every machine, cable and tenant was sent again. One player triggered ten of those in a session.
  • Walking up to racks you have not visited no longer hitches. Coming into range of new racks resent the entire world, so the game stalled for a moment each time you explored somewhere.

Pausing

  • A world that stops on its own starts again. Returning to the window, or leaving photo mode, could stop the clock for the rest of the session with no pause showing anywhere to lift. An unexplained freeze now clears itself within seconds.
  • Escape leaves photo mode. While it was open the pause menu and every other key were dead, so F2 was the only way out and the world stayed frozen until you found it.

Multiplayer

  • A joined player no longer freezes on every action. Shop purchases and console actions each stopped the game for a full trip to the host, and it stuttered once a second asking a question it never needed answered. Whoever hosted never saw either.
  • A rack you move now shows up for everyone straight away. Placing a rack in a floor slot, or pulling one out, did not reach other players until somebody did something unrelated.
  • Leaving a game now leaves its lobby. You stayed listed in a game you had quit, so friends joining you were sent to that finished game to wait for a host never coming.
  • A failed join stops blaming the host. When Steam's relay was not ready yet the game said the host had refused you. It now says to try again, which works.
  • Story cards and achievements survive a dropped connection. A card could be used up and never shown, or an achievement never written, if the link died at the wrong moment.

Notes

  • Cable manager positions still re-pack when you load a save. Where a cable sits in a bundle is remembered for the session only, so a loaded game closes any gaps once. Unplugging never does.
  • Load once to heal shared prospect identities. Any lead that shared an identity is given its own on load. Nobody is removed, no lead changes its terms, and a tenant already signed in error stays signed.
  • Saves work in both directions with v0.1.50. The format is unchanged. An earlier build of this release could not open a save from a game where you had evicted a tenant; that is fixed, and no action is needed.
  • Load once to heal an unreadable log entry. A save carrying an event this version cannot read now opens, dropping only that log line. Your world, money and machines are untouched.
  • Multiplayer needs everyone on v0.1.51. Switch messages carry two new fields, so a v0.1.50 player cannot join a v0.1.51 game or the reverse.
  • If stale lobbies have bitten you, quit to desktop once. Both people should do it after updating, so the old listing is cleared.
  • API: `SwitchView` gains `pair_id` and `pair_role`. A new `switch_pairs` list carries each pair and its state, and `SwitchSkuView` gains `mlag_capable`, true on four switch SKUs. All additive.
  • API: `SetHostNicTeam` accepts a third mode, `Lacp`. Refused with a keyed error when the server's leads do not reach one switch or one paired set.
  • API: cable endpoints gain `anchor` and `anchor_ordinal`. They name which family of socket a cable lands on, and its position within that family. Additive; no existing field changed meaning.
  • API: `SellCarried` is replaced by `SellCarriedItem` and `SellRack`. One command carried two operations over separate id spaces; each now names its own. Integrations sending `SellCarried` are refused at the handshake.
  • API: the `Save` and `Load` commands are gone. Saving and loading are host-only in a shared game, and these two reached the same machinery without that check. Use the `Save` and `Load` requests, which the game itself has always used; the commands are refused at the handshake.
  • API: `CableView.path` now reports rack side holes as `RailHole`, not `Point`. The variant already existed and carries rack, side and rail. Readers keying on `Point` for these entries will stop seeing them.
  • API: `ports` on `HostView` and `SwitchView` changed meaning, and can now be absent. It used to be a list that was always there. It is now optional: missing means the server did not send that device's ports to you, not that the device has none. A device with genuinely no ports still sends an empty list. Nothing withholds them yet, and `/api/v1/*` never will, but a reader that treats "missing" as "no ports" will be wrong the moment something does.
  • API: `HostView` and `SwitchView` gain `link_count`, `link_capacity_gbps` and `link_mixed`. A count of the cabled data links, the speed most of them negotiated at, and whether they differ. Always present, so a reader never has to walk the port list to get them. Power inlets are excluded.
  • API: `SwitchView` gains `keepalive_port_index`. Which port is the PAIR socket, or absent when the switch has none. Previously only findable by scanning the port list for the `PAIR` label.
  • API: `CustomerView` moved 41 fields into a new `detail` object, and it can be absent. Every field listed below now lives at `detail.<name>` instead of at the top level: `kind_label`, `pending_until_ns`, `health`, `block_quality`, `revenue_total_dollars`, `cpu_load_pct`, `latency_top_term`, `failed_requests_lifetime`, `total_requests_lifetime`, `failed_last_hour`, `sla_p99_budget_ms`, `sla_credits_dollars`, `egress_gbps`, `ingress_gbps`, `distinct_hosts`, `satisfaction`, `attack_class`, `compliance_required`, `required_arch`, `requires_multi_az`, `requires_private_segment`, `demands_audit_logs`, `demands_air_gap`, `required_region`, `requires_gpu`, `gpu_slices_demand`, `growth_ceiling_vms`, `requires_dedicated_hosts`, `requires_uncontended`, `requires_dedicated`, `eviction_fee_dollars`, `requirements_unmet_mask`, `requires_fault_isolation`, `sla_period_availability_frac`, `sla_period_seconds_over_latency`, `sla_period_elapsed_seconds`, `margin_revenue_dollars`, `margin_cost_dollars`, `cost_infrastructure_dollars`, `cost_transit_dollars`. `/api/v1/customers` still sends all of them, every time: the object is only omitted for a game client that has not opened that tenant's console, the same rule `services` has followed since v0.1.44. A missing `detail` means "not sent to you", never "all zero", and `detail_omitted` says the same thing. Everything the customer list itself draws stayed at the top level and did not move: name, tier, revenue this hour, availability, latency, margin, exposure, workload counts and risk flags.
  • API: `CustomersSummary` gains `top_revenue_lifetime` and `top_traffic`. The ten highest-earning tenants by lifetime revenue (in cents) and the eight heaviest by egress (in kbps), each as an id plus its figure. Both are exact, not sampled, and tenants on identical figures are ordered by id. They exist because `revenue_total_dollars` and `egress_gbps` moved into `detail`, so a client that has not opened a tenant can no longer rank the list itself. Join the id back to the customer list for the name.
  • API: `inv_status` on `GatewayView`, `ApplianceView`, `EddView` and `PatchPanelView` changed meaning. These arrays used to hold racked devices only: a device being carried or set down was dropped from its array entirely, so presence meant "racked" and `inv_status` never read anything but `"Mounted"`. The row is now always sent, in every location, and `inv_status` is the location: `"Mounted"`, `"Carried"` or `"Loose"`. A reader that treated presence in one of these arrays as "this is in a rack" will now count carried and loose devices too, and must read the field instead. `HostView` and `SwitchView` are unaffected; they always sent the row.
  • API: `HostView`, `SwitchView`, `GatewayView`, `ApplianceView`, `EddView` and `PatchPanelView` gain `carried_by`. The seat holding the device, or 0. Read it with `inv_status`, never alone: 0 also means "nobody", and 0 is a valid seat. Additive.
  • API: `SellQueued` is documented as a status but nothing produces one. It is listed in the schema for `inv_status` and no code path assigns it, so no client has ever received it. Do not branch on it.
  • A tenant's row on the wire got about two thirds smaller. On a 606-tenant save the customer list went from 898 KB to 315 KB per full update. This is the same idea as the port change above, applied to the biggest thing in the frame: send everyone's headline, send one tenant's detail.