Conversation
…ig file (#148) Adds an operator-only `android.emulator` block (headless, gpu, audio, bootAnimation) that the daemon hands to the Android driver unread. The driver maps each key to one fixed emulator flag after -no-snapshot-save; headless and gpu enter the clean-baseline hash so the snapshot rebuilds when either changes. Defaults launch exactly as before. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PvsMWpwkPBL4Zo2ppLTxDA
…th, tighten gpu docs (#148) `makeReady` now honours `purpose: "recover"`: a recovery boot is a cold boot from disk with no baseline-hash check, no snapshot load, no wipe, and no baseline capture, so a changed `android.emulator.headless`/`gpu` (or any other hash input) can never erase a device that is still leased. The baseline decision moves into `#reconcileBaseline` and `prepareLaunchArgs`. Tests now pin what the launch-option hash inputs promise: a baseline captured before `android.emulator` existed keeps its hash under the default launch, a change between two explicit gpu modes rebuilds the baseline, an audio change under non-default headless keeps it, and recovery boots cold. Narrowed one test title to what its body proves. Docs say the emulator, not Simlock, validates a gpu mode. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PvsMWpwkPBL4Zo2ppLTxDA
…u schema (#148) The recover-purpose test now asserts the mark write, so dropping it goes red. The contract schema's `gpu` requires a non-empty string, matching the loader. The core config comment no longer claims the block is handed over unread. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PvsMWpwkPBL4Zo2ppLTxDA
…one-shot check (#148) Rotation renames daemon.log away and then opens a new one, and with a 200-byte cap nearly every startup line rotates, so a check from another process can land between the two. CI hit that gap once the startup config line grew by the android.emulator block. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PvsMWpwkPBL4Zo2ppLTxDA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #148
Operators can now set how this machine's Android emulators launch, in
~/.simlock/config.jsonunderandroid.emulator(headless,gpu,audio,bootAnimation). It is config-only, likeios.slim: the daemon hands the block to the Android driver, and no lease request, MCP call, or HTTP request can set it.The driver maps each key to one fixed flag after
-no-snapshot-save(-no-window,-gpu <mode>,-no-audio,-no-boot-anim). There is no pass-through: an unknown key underandroid.emulatoris warned about and dropped.headlessandgpuenter the clean-baseline hash, so the snapshot rebuilds on the next boot after either changes. They are added to the hash only when they differ from the defaults, so baselines captured before this change keep their hash and are not wiped on upgrade.Review found that the Android driver ignored
makeReady'spurpose: "recover", so a hash mismatch would have wiped a still-leased device during crash recovery after a restart. A recovery boot is now a cold boot with no baseline check, no snapshot load, no wipe, and no capture; the baseline decision waits for the nextreclaim.docs/CONFIGURATION.mddocuments the keys, their validation, the next-boot and snapshot-rebuild rules, and the gateway-ignored lists.Done when
src/drivers/android/index.test.ts("android.emulator launch options"),src/core/config.test.ts,src/daemon/dispatcher.test.ts(BAD_REQUEST),src/daemon/main.test.ts(threading),e2e/daemon-lifecycle.test.ts(simlock config). Each was broken on purpose and seen to fail; the reviewers' mutations are caught too.pnpm checkgreen on the head commit.simlock configshows the block (e2e); CONFIGURATION.md documents the four keys, the next-boot rule, and the snapshot-rebuild rule.main.Review
Spec review: 6 findings, 1 fixed; round 2: 8 findings, 0 fixed. Code review: 6 findings, 3 fixed; round 2: 4 findings, 3 fixed.
Rejected:
purpose— safety rule 2 and theDriver.makeReadycontract require it, andManagedDeviceLifecycle.recoverLeasedonmainalready passes{ purpose: "recover" }. Spec needs: "a recovery boot never wipes, loads a snapshot, or captures a baseline".lease.*gateway test states.headless/gpuenter the hash only when non-default, not always — deliberate, so a baseline captured before this change keeps its hash and an upgrade does not wipe every device; now pinned by a test against the pre-change hash.#configHashinto#currentConfigHash, and extracting#reconcileBaseline/prepareLaunchArgs— the first puts the hash inputs in one place, the second keepsmakeReadyunder the repo's complexity gate.slow-tagged ones are excluded.audio/bootAnimation— it proves threading with two non-default values; flag mapping is the driver's own tests.ios.slim, the precedent ADR 0002 set.4e9b7a98is unproven as pre-change — it was verified by running the test against the driver checked out frommain.Written by an agent.
🤖 Generated with Claude Code
https://claude.ai/code/session_01PvsMWpwkPBL4Zo2ppLTxDA
Generated by Claude Code