Skip to content

feat(warm-pool): simlock warm forget forgets a learned kind - #1040

Merged
V3RON merged 18 commits into
callstackincubator:mainfrom
alcpereira:warm-learned-kind-expiry
Oct 29, 2026
Merged

V3RON merged 18 commits into
callstackincubator:mainfrom
alcpereira:warm-learned-kind-expiry

Conversation

@alcpereira

@alcpereira alcpereira commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Problem

A lab worker has 2 Android slots. A quoting mistake leased --device Pixel (avdmanager's generic profile) instead of Pixel 9. Both leases were released, yet the stray "Pixel" emulator stays booted: managed 2/2, running 2, and simlock cleanup --dry-run returns [].

That is ADR 0038 as written: targetedDevices() keeps one ready device of each learned kind, so idle-shutdown spares it. Leasing still evicts it for another model, so nothing is blocked, but the slot and RAM sit wasted. There is no supported way to undo one mistaken lease: device remove is physical-only, and nuke resets everything.

Change

  • Admin operation warm.forget: simlock warm forget <ios|android> <model> [<os>] [--mode] [--image-tag] [--json], and forgetWarmKind on the admin client. It forgets the matching learned kinds; the reaper's idle rules then shut the device down and delete it through the lifecycle. A gateway refuses it.
  • ADR 0050 (Proposed) narrows 0038 §4. Protocol 65. Website docs updated.

Status

Implement: done Review: passed; ADR 0050 flip verified by coordinator (adr-flip-check ok) Hardware: n/a Gate: running

Assumptions

  • Assumption: automatic expiry of learned kinds — left out; 0038 rejected it, and leasing's eviction already bounds the cost.
  • Assumption: virtual-device delete — not built; forgetting the kind hands the device to the idle rules.
  • Assumption: HTTP route and MCP tool — none; CLI and admin client only.

Review

Spec review: skipped. Code review: 2 blocking, 2 fixed, 0 notes. Claims review: 0 blocking, 0 fixed, 0 notes.
Rounds: 2. Tokens: 2.2M.
Runs: 8. Cost USD: 2.9568. Agent seconds: 1305.

Assessment: complete

Written by an agent.

…ets one

A kind the warm pool learned from a lease is now forgotten once no lease
has used it for warmPool.learnedTtlMs (7 days by default), so its idle
device is left to the idle rules. warm.forget (simlock warm forget,
forgetWarmKind) forgets the kinds of one model at once. ADR 0050,
proposed, narrows ADR 0038 §4. Protocol 65.
warmPool.learnedTtlMs and the pass that expired kinds go: ADR 0038
rejected a fixed-time expiry, and leasing's eviction already keeps a
stray kind from blocking anything. ADR 0050 now covers warm.forget only.
@alcpereira alcpereira changed the title feat(warm-pool): a learned kind expires, and simlock warm forget forgets one feat(warm-pool): simlock warm forget forgets a learned kind Oct 28, 2026
@alcpereira
alcpereira marked this pull request as ready for review October 28, 2026 19:11
@V3RON

V3RON commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Review ledger

Round 1: fea9513
Round 2: fd415a7
Round fix-check: 3991a20
Round fix-check: 874653d

Runs: 9. Cost USD: 3.0676. Agent seconds: 1354.
Tokens input 282, output 55972, cache read 5696029, cache write 412681.
- review 1 reviewer: claude-sonnet-5-5 337 s $0.2346
- review 1 code both: claude-opus-5-5 252 s $1.325
- review 1 claims: claude-sonnet-5-5 59 s $0.2281
- fix 1 implementer: claude-sonnet-5-5 153 s $0.3112
- review 2 reviewer: claude-sonnet-5-5 221 s $0.143
- review 2 code-reviewer tests: claude-opus-5-5 155 s $0.487
- fix 2 implementer: claude-sonnet-5-5 81 s $0.1351
- review fix-check reviewer: claude-sonnet-5-5 47 s $0.0928
- fix fix-check implementer: claude-sonnet-5-5 49 s $0.1108
Finding outcomes: {"fixed":2}. Classes: {"testing 10: pass request unasserted":1,"testing 3: daemon wiring untested":1}.
{"findings":[{"id":"R1","role":"code","class":"testing 10: pass request unasserted","outcome":"fixed","path":"src/core/warm-pool/converger.test.ts","round":"1","fix":"fd415a704"},{"id":"R2","role":"code","class":"testing 3: daemon wiring untested","outcome":"fixed","path":"src/daemon/server.ts","round":"1","fix":"3991a20e0"}]}

Written by an agent.

@V3RON

V3RON commented Oct 29, 2026

Copy link
Copy Markdown
Contributor

Handoff

Done: merged main (#1043): protocol 65 → 66, and ADR 0050 now names ADR 0051. Review passed in round 1, round 2 and the fix-check, with R1 and R2 (missing tests) fixed in fd415a704 and 3991a20e0. PR is ready.

Not done: the gate. CI on 3991a20e0 was still running at handoff.

Findings: none open. See the review ledger.

Blocked on: ADR 0050 is still Proposed. Merging would ship a decision the maintainer has not accepted. To merge: set ADR 0050 to Accepted (its status line and its row in the index), then run .agents/scripts/merge-pr.sh 1040.

Written by an agent.

@V3RON
V3RON merged commit 7ac7f18 into callstackincubator:main Oct 29, 2026
42 checks passed
@V3RON

V3RON commented Oct 29, 2026

Copy link
Copy Markdown
Contributor

Delivery run

Merged: #1040
Decided: #1040 — ADR 0050 Proposed → Accepted by the maintainer in session
Asleep: 43 min

Written by an agent.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants