set_sleep_time"set the sleep bedtime to 9:30 PM and the wake-up time to 11:20 AM" → the model emits
set_sleep_time(bedtime 9:30, wakeup 11:20) — one line, both fields.
The authoring walk records the tool-call as a menu-tree edge
(action.class = set_sleep_time + args), then :verify value "9:30"
bakes a deterministic value proof.
--from-feature sleep code-gens Kotlin: SleepTimeHelper.setSleepTime(...)
+ assertNotNull(...text("9:30")) → connectedAndroidTest passes on-device.
@Test fun sh_sleep_0012() {
// ... launch → Quick add → Sleep time ...
SleepTimeHelper.setSleepTime(device, 9, 30, "pm", 11, 20, "am") // ← the composite tool
// value proof (:verify value "9:30")
val found = device.wait(Until.findObject(
By.res(PKG, "sleep_top_center_duration_bedtime").text("9:30")), NAV)
assertNotNull(found) // ← asserts bedtime 9:30
device.findObject(By.text("Save")).click()
}
The composite tool code-gens to a hand-written
SleepTimeHelper (UiAutomator mirror of the runtime tool). The value proof rides on the
paired :verify — a CI gate now enforces that every set_sleep_time step ships
with a time-shaped value-verify (no vacuous-green).
The first live replay set 9:00, not 9:30 — the byhand helper committed the
hour but not the reflowed minute (fixed by typing digits as key events). The deterministic
:verify caught it; an AI arrival judgment would have hallucinated past it. That is the point:
interaction-mode authoring is 100% reliability-critical, the regression run is allowed to fail — but it must
fail loud on a real value miss.
The SH sleep editor derives wake-up from the current time; a numeric edit re-reads but Done keeps the clock value. The one-line tool still sets both (the impact); only bedtime is the settable/assertable value proof.
Generated by
gen_sleep_demo_report.py from the committed blackboard + screen sidecars (device screenshots
embedded; test rig with dummy data).