Serialize each file's I/O through one queue so a fully evicted file is
truncated as soon as its queued writes land, live or finished. Evict the
least recently written file first. Seal uncapped files when their stream
finishes and close the handle even when sealing fails.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Each capture file is a fixed-size ring on disk. A source keeps its newest
bytes across launches: a later launch evicts the head of an earlier one, so
the final attempt always keeps its tail. Finalization rewrites each ring in
log order and truncates evicted bytes.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Give uploadDeviceRunSessionFileAsync its own suite for empty, missing,
read-error and signal forwarding, and keep one failure case per caller.
Move the early-503 replay to the HTTP suite with a small file. Fold the
memoization and failure-isolation cases into one, test the truncation
metadata through the mocked upload, and give the unused-pipe case
assertions. Drop the capture-side Infinity case that the factory suite
already covers.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
The step and CLI layers hand the parsed source list on unchanged, so
the array value never changes the path. Keep one explicit empty-list
case per step, which also guards the disable-logging contract, and one
repeated-flag case for the CLI. Drop capture-factory ordering checks
that cannot fail, since the capture is an argument of the boot call.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Drop the launch-gate dimension from the source-selection grid; the gate
and the log sources never meet in one expression. Keep one pipe-routing
case and reduce the output test to filename and detach assertions that
no other case covers. Assert prepareLogcatOutputAsync directly instead
of through the -logcat argument.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Revert the gzip and 100 MiB snapshot changes. Retain the first 20 MiB per selected source across session retries and drain excess output without saving it.
* Add function to report resolved version
* Add tests for the parser functions
* Format
* Use fast-xml-parser
* Read archive path from previous step
* Also report app versions in builder files
* Format
* Add tests for the extract functions
* Address review: report the version inside the upload phase, omit missing versions, add changeset
* Fix builder test mock and step order after merging main
* Skip version reporting when there is no build ID, and test the step
* Rename the version metadata helper to use the update verb
* [build-tools] Set the upload step ID in eas/build
* [build-tools] Resolve archive path, keep apostrophes, log to Sentry
* [build-tools] Stop versionName at the split field, treat empty as missing
* [build-tools] Rename the resolved version step to eas/update_resolved_version
* [build-tools] Drain agent-device artifacts before the daemon stops
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [build-tools] Drain warm agent-device artifacts before host shutdown
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
* [build-tools] Move iOS Simulator startup into its own file
Edited-by: Codex
* [build-tools] Match cold startup tests to the VM boot
* [build-tools] Keep preview selection fixtures after cold startup extraction
Edited-by: Codex
* [build-tools] Keep setup draining during preview finalization
Keep expected late preview retirement from aborting setup that finalization is draining. Adapt host retirement fixtures to the tunnel handle contract while retaining separate SDK retry coverage.
Edited-by: Codex
* [worker] Manage warm Simulator services
Edited-by: Codex
* [worker] Use the shared warm Simulator terms in the changeset
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [worker] Stop the recorded Simulator launcher version
* [worker] Skip Simulator stop on images without a startup script
* [worker] Stop current-boot warmup when the script is absent
* [worker] Skip launcher resolution after confirmed cleanup
* [worker] Recognize Bun cache misses alongside warning output
* [worker] Honor the package manager for versioned launcher stop
* [worker] Ignore invalid launcher state when no startup script exists
* [worker] Use existing package-manager helpers directly
Co-authored-by: Codex <[email protected]>
* [worker] Keep the warmup stop changeset scoped to worker
Edited-by: Codex
* [worker] Let the launcher handle Simulator stop state
Edited-by: Codex
* [worker] Stop warm Simulator services in the background
Edited-by: Codex
* [worker] Fix warm stop job fixtures
Edited-by: Codex
* [worker] Let build-tools wait on the launcher state for warm Simulator cleanup
The worker stops warmup in the background and shares nothing with build-tools. Before it boots,
starts or clones a Simulator, build-tools waits until the launcher's state file says disabled.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [build-tools] Require cleanup confirmation from the current boot
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Codex <[email protected]>
Co-authored-by: Codex <[email protected]>
The capability update replaces the identifiers linked to a bundle ID, but only the newly linked ones were sent. Adding a second App Group, Merchant ID or iCloud container unlinked the ones that were already linked.
Fixes#4445
Co-authored-by: Douglas Lowder <[email protected]>
* [simulator-launcher] Preinstall Expo Go and warm additional Simulators
* [simulator-launcher] Describe the shared serve-sim port in the changesets
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Keep the prewarming layer to the launcher
Move the warm Simulator cleanup wait and the Expo Go input out of this layer.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Set up every warm device with one function
startSimulatorSetup disables apsd, then preinstalls Expo Go, once per device. The default device,
the extra devices and the claimed device all use it; a cancelled setup can run again.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Set up all warm devices from one list
startSimulatorsSetup takes the device list: the first device starts when serve-sim is ready, the
others after it and the tools. This removes the separate background warmup and its readiness check.
A setup that a stop or claim aborts is no longer reported as a background failure.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Wait for the default device once before the other devices
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Start device setup without waiting for it
Ready no longer waits for the apsd step. The claim still joins it before it returns, so the job
launches apps only after it. Expo Go failures are logged; stop still reports an unconfirmed install.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Set up all warm devices with one call
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Run apsd and the Expo Go preinstall in parallel after boot
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Finish the default device apsd step before the claim returns
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Say which claim waits for the apsd step
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Keep warmup running after a claim
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Return the claim without waiting for warmup
The claim no longer waits for apsd or Expo Go installs. prepare-tools
waits for an install still running on the claimed device and reports
its version. The default device reuses serve-sim's boot check, and
EXPO_SIMULATOR_PREINSTALL_EXPO_GO=0 turns off the Expo Go preinstall.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Describe installs that adoption can stop
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Remove non-null assertions
Edited-by: Codex
* [simulator-launcher] Return the validated Argent service
Co-Authored-By: Codex <[email protected]>
---------
Co-authored-by: Codex <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Prepare Simulator services at guest startup
Edited-by: Codex
* [simulator-launcher] Claim warm sessions once serve-sim is ready
Report ready after boot and a ready serve-sim. A claim waits only for its
requested tool and stops the others, even mid-startup. Replacement boots
the new device while the old one is released.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Disable apsd during warmup
Disable apsd after each warm device boots, before it is reported ready,
so a job does not do it while it installs and launches its app.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Stop installing ffmpeg during warmup
The VM image provides ffmpeg. Warmup only checks for it and warns when it
is missing, instead of running Homebrew.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Start replacement services without waiting for shutdown
Start serve-sim as its own process group. In replacement, stop the
unclaimed serve-sim by signalling that group, so the children it respawns
stop too and no stale PID is signalled. Start the new serve-sim once the
group is gone and its port is free, and shut the old device down in the
background.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Report the preinstalled Expo Go in the claim record
Read the bundle identifier and versions from the Expo Go app the launcher
installed, and include them in the claim record for the same device.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Handle a failed serve-sim exit while waiting for readiness
Observe both outcomes of the serve-sim process. A rejected exit no longer
becomes an unhandled rejection that ends the launcher.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Read serve-sim readiness from its configured state
Use SERVE_SIM_STATE_DIR when it is set, as serve-sim does. Drop the
bearer header from /readyz, which serve-sim does not gate.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Settle every old stop before failing a replacement
A fast tool-stop failure no longer rejects the release while the old
serve-sim is still stopping, so cleanup cannot race that stop.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Treat an already shut down Simulator as cleaned up
A retried shutdown of a device that is already shut down failed forever.
Check the device state when simctl shutdown fails.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Simplify warm Simulator cleanup
Stop services and the agent-device daemon once, then shut down each owned
device. Remove tool abort listeners when startup settles, and drop the
port wait: the old serve-sim's listener is in the group that was stopped.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Update the README for warm claim and cleanup
Describe per-engine claims, background replacement shutdown, apsd and
ffmpeg handling, and the preinstalled Expo Go record.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Simplify apsd disabling and the claim result
Route the apsd launchctl calls through one helper and build the claim
result in one expression. No behavior change.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Start Simulator tools after serve-sim is ready
Argent and agent-device spawn into the Simulator while serve-sim arms
its own launchctl settings; in round 2 that overlap coincided with simctl
stalls. Start them once serve-sim is ready; readiness does not move.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Treat exited processes awaiting reap as stopped
macOS answers kill with EPERM for a process group whose only members
have exited and await reaping. Check for a live member instead of
failing, in both the replacement group stop and the terminal tree stop.
A live member that cannot be signalled still fails cleanup.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Probe readiness only at the local serve-sim address
Reject serve-sim state whose url is not http://127.0.0.1:3200 instead of
fetching it, the same rule the job applies to the warm session.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Split the warm session into simulator and tool modules
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Use the shared warm Simulator terms in the changeset
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Use the shared warm Simulator terms in the README
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Name the warm session handle type
* [simulator-launcher] Use the package version instead of a copied bundle
* [simulator-launcher] Accept a list of warm Simulator devices
* [simulator-launcher] Warm more devices after the default is ready
* [simulator-launcher] Claim either warm device and release the others
* [simulator-launcher] Prime the launcher cache before ready
* [simulator-launcher] Keep unused-device cleanup from stopping the job
* [simulator-launcher] Keep default warmup after an additional device fails
* [simulator-launcher] Keep the default device for blank configuration
* [simulator-launcher] Bound cache priming and retry once
* [simulator-launcher] Shut owned devices down in parallel at terminal stop
* [simulator-launcher] Finish default warmup before sharing Expo Go with another device
* [simulator-launcher] Start warm serve-sim with explicit orphan ownership
* [simulator-launcher] Start the selected Simulator before returning its claim
* [simulator-launcher] Keep Expo Go failures scoped to their device
* [simulator-launcher] Keep one selected device in session state
Explain claim, stop and replacement ordering.
* [simulator-launcher] Make session startup and cleanup explicit
* [stack] Retain the launcher foundation release entry
Co-authored-by: Codex <[email protected]>
* [simulator-launcher] Add braces to the single-device selection guard
Edited-by: Codex
* [simulator-launcher] Merge the launcher changesets into one
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Shorten the launcher changeset
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Keep the claimed Simulator when an unused tool stop fails
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Prove the stop retries an unused tool
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Codex <[email protected]>
Co-authored-by: Codex <[email protected]>
* [vm-tools] Run guest startup scripts
Edited-by: Codex
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [vm-tools] Use the shared warm Simulator terms in the changeset
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [vm-tools] Keep the startup process handle explicit
* [vm-tools] Describe the VM startup script loader
* [vm-tools] Refresh checks against the current base
No source changes. Refresh the pull-request event after its old base SHA
was compared with a newer GitHub merge checkout.
* [ci] Check the pull-request source for changesets
Do not include main-only changelogs from GitHub merge checkouts when the
stack reports an older base SHA. Keep all existing validation rules.
* [ci] Compare changes with the current base branch
* [vm-tools] Read startup scripts from the local shared directory
Restore the unchanged changelog workflow as requested.
* [simulator-launcher] Add Simulator state and service helpers
Co-authored-by: Codex <[email protected]>
* [simulator-launcher] Keep the package public and versioned
Co-authored-by: Codex <[email protected]>
* [simulator-launcher] Verify readiness and drain intentional tool stops
Edited-by: Codex
* [simulator-launcher] Consolidate package changeset
Edited-by: Codex
* [simulator-launcher] Name process options and remove unused boot helper
Edited-by: Codex
* [simulator-launcher] Keep the launcher private until it has a CLI
Start at the fixed-group version. A release cannot publish this layer alone; #4722 makes the
package public together with its entry point.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Check the claimed device and bound stop commands
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* [simulator-launcher] Attach the claim rejection checks before the claim settles
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Codex <[email protected]>
Co-authored-by: Codex <[email protected]>