diff --git a/.gitattributes b/.gitattributes index 40ea4f15..ac756d3c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -22,3 +22,6 @@ docs/validation/offline-workflows/** -text -whitespace # Preserve context workflow receipts and native XML bytes. docs/validation/context-workflows/** -text -whitespace + +# Preserve command handoff evidence and native capture bytes. +docs/validation/command-handoff/** -text -whitespace diff --git a/app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt b/app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt new file mode 100644 index 00000000..a26e5f45 --- /dev/null +++ b/app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt @@ -0,0 +1,404 @@ +package dev.tinycast.android + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.view.View +import android.view.ViewGroup +import android.view.inspector.WindowInspector +import android.webkit.WebView +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.semantics.SemanticsActions +import androidx.compose.ui.test.* +import androidx.compose.ui.test.junit4.createEmptyComposeRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry +import androidx.test.runner.lifecycle.Stage +import androidx.test.uiautomator.By +import androidx.test.uiautomator.UiDevice +import androidx.test.uiautomator.Until +import dev.tinycast.android.extensions.* +import org.json.JSONArray +import org.json.JSONObject +import org.junit.* +import org.junit.Assert.* +import org.junit.Assume.assumeTrue +import org.junit.runner.RunWith +import java.io.File +import java.nio.file.Files +import java.nio.file.LinkOption +import java.security.MessageDigest +import java.util.UUID +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import java.util.concurrent.atomic.AtomicReference + +/** Owned real-runtime protocol probes. These are not Store/service workflows. */ +@RunWith(AndroidJUnit4::class) +class ExtensionCommandHandoffDeviceTest { + @get:Rule val compose = createEmptyComposeRule() + @get:Rule val name = org.junit.rules.TestName() + private val instrumentation get() = InstrumentationRegistry.getInstrumentation() + private val context get() = instrumentation.targetContext + private val device get() = UiDevice.getInstance(instrumentation) + private val evidence get() = File(context.filesDir, "reviewed-text-evidence").apply { mkdirs() } + private val catalog get() = activity().store.extensions + private val sentinel = "Owned command handoff clipboard sentinel" + private val caller = "owned-command-handoff-caller" + private val ownedText = "café é 日本 🌱\n\"owned\"" + private var id: String? = null + private var prepared = false + private var sentinelInstalled = false + private var palette = emptyMap() + private var preserved = emptyList() + private var fingerprints = emptyList>() + private var originalDirectories = emptySet() + private val record = JSONObject().put("scope", "Owned JavaScript/native handoff probes; no Store, service, physical-typing or broad parity credit") + + private fun hash(data: ByteArray) = MessageDigest.getInstance("SHA-256").digest(data).joinToString("") { "%02x".format(it) } + private fun fingerprint(file: File): Map = if (!file.exists()) emptyMap() else file.walkTopDown().associate { + it.relativeTo(file).path to if (it.isDirectory) "directory" else hash(it.readBytes()) + } + private fun lease(): JSONObject { + val args = InstrumentationRegistry.getArguments() + val value = JSONObject(File(context.filesDir, "reviewed-text-fixture-lease/owners.json").readText()) + assertEquals("reviewed-text-device-test-v1", value.getString("fixture_kind")) + assertEquals(args.getString("expectedTextInputLeaseOwner"), value.getString("owner_nonce")) + assertEquals(args.getString("expectedClipboardRecoveryOwner"), value.getString("owner_nonce")) + return value + } + private fun currentActivity(): MainActivity? { + var value: MainActivity? = null + instrumentation.runOnMainSync { + value = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED) + .filterIsInstance().singleOrNull { it.window.decorView.hasWindowFocus() && !it.isFinishing } + } + return value + } + private fun activity(): MainActivity { + if (android.os.Looper.myLooper() == android.os.Looper.getMainLooper()) return ActivityLifecycleMonitorRegistry.getInstance() + .getActivitiesInStage(Stage.RESUMED).filterIsInstance().single { it.window.decorView.hasWindowFocus() && !it.isFinishing } + return requireNotNull(currentActivity()) + } + private fun extension() = catalog.installed.single { it.listing.id == id } + private fun command(value: String) = extension().commands.single { it.name == value } + private fun clipboard(): String? { + val value = AtomicReference() + instrumentation.runOnMainSync { value.set(context.getSystemService(ClipboardManager::class.java).primaryClip?.getItemAt(0)?.text?.toString()) } + return value.get() + } + @Before fun prepare() { + val args = InstrumentationRegistry.getArguments() + assumeTrue("Use the guarded input runner", args.getString("reviewedTextFixture") == "true") + assertEquals("Tinycast_Tablet_API_36", args.getString("dedicatedAvd")) + lease() + val root = File(context.filesDir, "extensions") + originalDirectories = root.listFiles().orEmpty().map { it.name }.toSet() + preserved = root.listFiles().orEmpty().flatMap { directory -> listOf(directory, + File(context.filesDir, "extension-data/${directory.name}"), File(context.applicationInfo.dataDir, "shared_prefs/extension-${directory.name}.xml")) } + fingerprints = preserved.map(::fingerprint) + palette = context.getSharedPreferences("palette", Context.MODE_PRIVATE).all.toMap() + prepared = true + val next = "reviewed-text-" + UUID.randomUUID().toString().replace("-", "") + listOf(File(root, next), File(context.cacheDir, next), File(context.filesDir, "extension-data/$next"), + File(context.applicationInfo.dataDir, "shared_prefs/extension-$next.xml"), File(context.applicationInfo.dataDir, "shared_prefs/extension-$next.xml.bak")).forEach { + assertFalse(Files.exists(it.toPath(), LinkOption.NOFOLLOW_LINKS)) + } + val lease = lease(); lease.getJSONArray("owned_extension_ids").put(next) + val file = File(context.filesDir, "reviewed-text-fixture-lease/owners.json") + val temporary = File(file.path + ".tmp"); assertFalse(temporary.exists()) + temporary.writeText(lease.toString()); assertTrue(temporary.renameTo(file)); id = next + val directory = File(root, next).apply { assertTrue(mkdir()) } + val parent = """ + const React=require('react'),api=require('@raycast/api'); + globalThis.__ownedHandoffProbe={attempted:0,acks:0,copiesAttempted:0,copiesResolved:0,statusesAttempted:0,publicationsAttempted:0,rejections:[]}; + const options={name:'child',type:api.LaunchType.UserInitiated,arguments:{topic:'owned-topic'}, + context:{text:${JSONObject.quote(ownedText)},nested:[1,true,null]},fallbackText:'owned fallback'}; + module.exports.default=function(props){ + const [count,setCount]=React.useState(0); + globalThis.__ownedTryLaunch=value=>api.launchCommand(value).then(()=>{globalThis.__ownedHandoffProbe.unexpected=true},error=>{ + globalThis.__ownedHandoffProbe.rejections.push(String(error.message));setCount(n=>n+1)}); + globalThis.__ownedLaunch=duplicate=>{ + const probe=globalThis.__ownedHandoffProbe; + if(probe.attempted)return; + probe.attempted++; + api.launchCommand(options).then(()=>{ + probe.acks++; + api.Clipboard.copy('Owned obsolete parent copy').then(()=>probe.copiesResolved++); + probe.copiesAttempted++; + api.showHUD('Owned obsolete parent status');probe.statusesAttempted++; + globalThis.__tinycastHost.render('owned-retired',JSON.stringify({id:999,type:'Detail',props:{markdown:'Owned obsolete parent publication'},children:[]})); + globalThis.__tinycastHost.finished();globalThis.__tinycastHost.failed('owned-retired','Owned obsolete parent failure');probe.publicationsAttempted++; + },error=>{probe.rejections.push(String(error.message));setCount(n=>n+1)}); + if(duplicate){probe.attempted++;api.launchCommand({...options,context:{text:'Owned second request must not win'}}).then(()=>probe.acks++,()=>{})} + }; + return React.createElement(api.Detail,{markdown:'Owned parent ready\n\nOwned rejection count '+count, + actions:React.createElement(api.ActionPanel,null,React.createElement(api.Action,{title:'Launch owned child',onAction:()=>globalThis.__ownedLaunch(false)}))}); + }; + """.trimIndent() + val child = """ + const React=require('react'),api=require('@raycast/api'); + module.exports.default=function(props){ + const [grant,setGrant]=React.useState('checking'); + React.useEffect(()=>{api.getSelectedText().then(()=>setGrant('unexpectedly available'),()=>setGrant('unavailable'))},[]); + const payload=JSON.stringify({arguments:props.arguments,launchContext:props.launchContext??null,fallbackText:props.fallbackText??null,launchType:props.launchType}); + globalThis.__ownedChildPayload=payload; + return React.createElement(api.Detail,{markdown:'Owned child ready\n\nGrant '+grant+'\n\n'+JSON.stringify(JSON.parse(payload),null,2), + actions:React.createElement(api.ActionPanel,null,React.createElement(api.Action.CopyToClipboard,{title:'Copy owned context',content:payload}))}); + }; + """.trimIndent() + val manifest = JSONObject("""{"name":"owned-handoff","commands":[ + {"name":"parent","title":"Owned handoff parent","mode":"view"}, + {"name":"child","title":"Owned context child","mode":"view","arguments":[{"name":"topic","type":"text","required":false}]}, + {"name":"configured","title":"Owned configuration target","mode":"view","preferences":[{"name":"account","type":"textfield","required":true}]}, + {"name":"required","title":"Owned required argument","mode":"view","arguments":[{"name":"input","type":"text","required":true}]}, + {"name":"disabled","title":"Owned disabled target","mode":"view","disabled":true}, + {"name":"menu","title":"Owned desktop target","mode":"menu-bar"}, + {"name":"gone","title":"Owned unavailable target","mode":"view"}]}""") + File(directory, "package.json").writeText(manifest.toString()) + File(directory, "parent.js").writeText(parent) + for (value in listOf("child", "configured", "required", "disabled", "menu")) File(directory, "$value.js").writeText(child) + File(directory, ".tinycast-store.json").writeText(StoreExtension(next, "owned-handoff", "Owned command handoff probe", "", "Droidcast tests", "test", "", "", "", 7).json().toString()) + record.put("owned_extension_id", next).put("fixture_parent_sha256", hash(parent.toByteArray())) + .put("fixture_child_sha256", hash(child.toByteArray())).put("fixture_manifest_sha256", hash(manifest.toString().toByteArray())) + context.startActivity(Intent().setComponent(ComponentName(context.packageName, MainActivity::class.java.name)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) + assertTrue(device.wait(Until.hasObject(By.pkg(context.packageName).depth(0)), 10000)) + compose.waitUntil(15000) { currentActivity()?.store?.loading == false } + assertTrue(catalog.installed.any { it.listing.id == next }) + dismissClipboardForEvidence() + instrumentation.runOnMainSync { + context.getSystemService(ClipboardManager::class.java).setPrimaryClip(ClipData.newPlainText("Owned handoff fixture", sentinel)) + activity().store.reset(); activity().store.search(caller) + } + sentinelInstalled = true + dismissClipboardForEvidence(requireAction = true) + record.put("font_scale", context.resources.configuration.fontScale).put("width_dp", context.resources.configuration.screenWidthDp) + .put("height_dp", context.resources.configuration.screenHeightDp) + launch("parent") + } + private fun launch(value: String) { + instrumentation.runOnMainSync { activity().store.openExtension(extension(), command(value)) } + compose.waitUntil(10000) { activity().store.dialog in listOf("extension-run", "extension-setup") } + if (activity().store.dialog == "extension-setup") { + compose.onNodeWithTag("run-extension-setup").assertExists() + tap("run-extension-setup") + record.put("ordinary_launch_configuration_explicitly_run", true) + } + compose.waitUntil(25000) { catalog.runtimeError != null || activeRoot(catalog.runtimeTree)?.props()?.optString("markdown")?.contains(if (value == "parent") "Owned parent ready" else "Grant unavailable") == true } + assertNull(catalog.runtimeError, catalog.runtimeError); compose.waitForIdle() + } + private fun engine(): WebView { + val values = mutableListOf() + instrumentation.runOnMainSync { + fun visit(view: View) { if (view is WebView) values += view; if (view is ViewGroup) repeat(view.childCount) { visit(view.getChildAt(it)) } } + WindowInspector.getGlobalWindowViews().forEach(::visit) + } + return values.single() + } + private fun evaluate(web: WebView, script: String): String { + var result: String? = null; val done = CountDownLatch(1) + instrumentation.runOnMainSync { web.evaluateJavascript(script) { result = it; done.countDown() } } + assertTrue(done.await(5, TimeUnit.SECONDS)); return requireNotNull(result) + } + private fun probe(web: WebView) = JSONObject(JSONArray("[${evaluate(web, "JSON.stringify(globalThis.__ownedHandoffProbe)")}]").getString(0)) + private fun payload(): String = JSONArray("[${evaluate(engine(), "globalThis.__ownedChildPayload")}]").getString(0) + private fun awaitChild() { + compose.waitUntil(25000) { catalog.runtimeError != null || activeRoot(catalog.runtimeTree)?.props()?.optString("markdown")?.contains("Grant unavailable") == true } + assertNull(catalog.runtimeError, catalog.runtimeError) + assertEquals("child", catalog.running?.second?.name) + compose.onNodeWithText("Owned child ready", substring = true, useUnmergedTree = true).assertIsDisplayed() + } + private fun capture(phase: String) { + compose.waitForIdle() + val stem = "handoff-" + name.methodName.lowercase(java.util.Locale.ROOT) + "-" + phase + device.dumpWindowHierarchy(File(evidence, "$stem.xml")); assertTrue(device.takeScreenshot(File(evidence, "$stem.png"))) + File(evidence, "$stem-frame.json").writeText(JSONObject().put("phase", phase).put("scope", record.getString("scope")) + .put("font_scale", context.resources.configuration.fontScale).put("launch_epoch", catalog.launchEpoch) + .put("synchronization", "Compose idle; hierarchy before PNG").toString(2)) + } + private fun tap(tag: String) { + val node = compose.onNodeWithTag(tag); val minimum = context.resources.displayMetrics.density * 48f + var steps = 0 + while (node.fetchSemanticsNode().boundsInRoot.let { it.width + 1 < minimum || it.height + 1 < minimum } && steps++ < 30) { + compose.onNodeWithTag("palette-content-scroll").performTouchInput { + if (tag.endsWith("back")) swipe(Offset(4f, height * .2f), Offset(4f, height * .8f), 300) + else swipe(Offset(4f, height * .8f), Offset(4f, height * .2f), 300) + } + } + val bounds = node.fetchSemanticsNode().boundsInRoot + assertTrue("$tag requires a complete 48dp target", bounds.width + 1 >= minimum && bounds.height + 1 >= minimum) + node.assertIsDisplayed().assertIsEnabled().performTouchInput { click(center) } + val taps = record.optJSONArray("pointer_taps") ?: JSONArray().also { record.put("pointer_taps", it) } + taps.put(JSONObject().put("tag", tag).put("bounds", JSONArray(listOf(bounds.left, bounds.top, bounds.right, bounds.bottom))).put("minimum_px", minimum).put("reveal_gestures", steps)) + } + private fun action(text: String): () -> Boolean = requireNotNull(compose.onNodeWithText(text).fetchSemanticsNode().config[SemanticsActions.OnClick].action) + private fun backAction(): () -> Boolean = requireNotNull(compose.onNodeWithTag("extension-back").fetchSemanticsNode().config[SemanticsActions.OnClick].action) + private fun finish() { + tap("extension-back") + assertNull(catalog.running); assertNull(activity().store.dialog); assertEquals(caller, activity().store.query) + record.put("launcher_query_preserved", true).put("passed", true); capture("caller-return") + } + @After fun restore() { + if (!prepared) return + try { if (sentinelInstalled && !record.optBoolean("passed") && currentActivity() != null) capture("failure") } + catch (failure: Throwable) { record.put("failure_capture_error_type", failure.javaClass.simpleName) } + finally { + compose.mainClock.autoAdvance = true + instrumentation.runOnMainSync { + val monitor = ActivityLifecycleMonitorRegistry.getInstance() + listOf(Stage.CREATED, Stage.STARTED, Stage.RESUMED, Stage.PAUSED, Stage.STOPPED).flatMap { monitor.getActivitiesInStage(it) } + .filterIsInstance().distinct().forEach { it.store.extensions.close(); it.store.dialog = null; it.finish() } + } + val deadline = android.os.SystemClock.uptimeMillis() + 10000 + var remaining = true + while (remaining && android.os.SystemClock.uptimeMillis() < deadline) { + instrumentation.waitForIdleSync() + instrumentation.runOnMainSync { remaining = listOf(Stage.CREATED, Stage.STARTED, Stage.RESUMED, Stage.PAUSED, Stage.STOPPED) + .flatMap { ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(it) }.any { it is MainActivity } } + if (remaining) android.os.SystemClock.sleep(50) + } + assertFalse("Owned activities must close before restoring files", remaining) + restorePalettePreferences(context, palette) + id?.let { value -> + assertTrue(lease().getJSONArray("owned_extension_ids").let { ids -> (0 until ids.length()).any { ids.getString(it) == value } }) + listOf(File(context.filesDir, "extensions/$value"), File(context.cacheDir, value), File(context.filesDir, "extension-data/$value")).forEach { it.deleteRecursively(); assertFalse(it.exists()) } + context.deleteSharedPreferences("extension-$value") + listOf(".xml", ".xml.bak").forEach { suffix -> + assertFalse(Files.exists(File(context.applicationInfo.dataDir, "shared_prefs/extension-$value$suffix").toPath(), LinkOption.NOFOLLOW_LINKS)) + } + } + assertEquals(originalDirectories, File(context.filesDir, "extensions").listFiles().orEmpty().map { it.name }.toSet()) + assertEquals(fingerprints, preserved.map(::fingerprint)) + record.put("owned_data_removed", true).put("preexisting_installations_and_data_preserved", true) + .put("clipboard_restoration_scope", "Independent host/test-UID durable recovery; this class does not retain or publish the original clipboard") + File(evidence, "handoff-${name.methodName.lowercase(java.util.Locale.ROOT)}-record.json").writeText(record.toString(2)) + } + } + + @Test fun contextArgumentsAndFallbackReachChildAndCopy() { + capture("parent-ready"); tap("extension-primary"); awaitChild() + val text = payload(); val value = JSONObject(text) + assertEquals("owned-topic", value.getJSONObject("arguments").getString("topic")) + assertEquals(ownedText, value.getJSONObject("launchContext").getString("text")) + assertEquals("[1,true,null]", value.getJSONObject("launchContext").getJSONArray("nested").toString()) + assertEquals("owned fallback", value.getString("fallbackText")); assertEquals("userInitiated", value.getString("launchType")) + val current = requireNotNull(catalog.running) + instrumentation.runOnMainSync { assertNull(catalog.captureText(current.first, current.second).input) } + assertEquals(sentinel, clipboard()); capture("child-context") + tap("extension-primary"); compose.waitUntil(10000) { clipboard() == text } + dismissClipboardForEvidence(requireAction = true); capture("exact-context-copy") + record.put("child_raw_grant_absent", true).put("context_argument_fallback_values_verified", true).put("copy_exact", true) + .put("owned_payload_sha256", hash(text.toByteArray())); finish() + } + + private fun pausedHandoff(duplicate: Boolean) { + val web = engine(); val previous = catalog.launchEpoch; val back = backAction(); val preferences = action("Preferences") + capture("parent-before-queued-handoff") + compose.mainClock.autoAdvance = false + try { + evaluate(web, "globalThis.__ownedLaunch($duplicate);true") + val deadline = android.os.SystemClock.uptimeMillis() + 10000 + var observed = probe(web) + while (observed.optInt("acks") < 1 && android.os.SystemClock.uptimeMillis() < deadline) { + android.os.SystemClock.sleep(50); observed = probe(web) + } + assertEquals(1, observed.getInt("acks")); assertEquals(if (duplicate) 2 else 1, observed.getInt("attempted")) + assertEquals(1, observed.getInt("copiesAttempted")); assertEquals(0, observed.getInt("copiesResolved")) + assertEquals(1, observed.getInt("statusesAttempted")); assertEquals(1, observed.getInt("publicationsAttempted")) + assertEquals(previous + 1, catalog.launchEpoch); assertEquals("child", catalog.running?.second?.name) + assertFalse(catalog.runtimeReady); assertNull(catalog.runtimeTree); assertNull(catalog.runtimeError) + assertEquals("Starting extension…", catalog.runtimeStatus); assertEquals(sentinel, clipboard()) + instrumentation.runOnMainSync { back(); preferences() } + assertEquals("child", catalog.running?.second?.name); assertEquals("extension-run", activity().store.dialog) + record.put("paused_parent_probe", observed).put("one_transfer_before_native_composition", true) + .put("obsolete_host_and_chrome_callbacks_rejected", true) + .put("protocol_setup", "Compose frame clock paused for the logical handoff/acknowledgement and queued-callback probes; child native rendering follows after resuming") + } finally { compose.mainClock.autoAdvance = true } + awaitChild(); assertEquals(ownedText, JSONObject(payload()).getJSONObject("launchContext").getString("text")) + capture("child-after-queued-callbacks"); finish() + } + @Test fun acknowledgementRevokesParentBeforeChildComposition() = pausedHandoff(false) + @Test fun duplicateLaunchRequestsTransferOnlyOnce() = pausedHandoff(true) + + @Test fun queuedRequestCannotLaunchAfterParentCancellation() { + val web = engine(); val previous = catalog.launchEpoch + compose.mainClock.autoAdvance = false + try { + instrumentation.runOnMainSync { + web.evaluateJavascript("globalThis.__ownedLaunch(false);true", null) + activity().store.extensions.close(); activity().store.dialog = null + } + val deadline = android.os.SystemClock.uptimeMillis() + 5000 + var observed = probe(web) + while (observed.optInt("attempted") == 0 && android.os.SystemClock.uptimeMillis() < deadline) { android.os.SystemClock.sleep(50); observed = probe(web) } + assertEquals(1, observed.getInt("attempted")); assertEquals(0, observed.getInt("acks")) + assertNull(catalog.running); assertNull(catalog.runtimeTree); assertEquals(previous, catalog.launchEpoch); assertEquals(sentinel, clipboard()) + record.put("cancelled_before_commit", true).put("cancelled_request_probe", observed) + } finally { compose.mainClock.autoAdvance = true } + compose.waitForIdle(); assertEquals(caller, activity().store.query) + record.put("passed", true); capture("cancelled-caller") + } + + @Test fun invalidRequestsKeepTheParentAndClipboard() { + val web = engine(); val epoch = catalog.launchEpoch + val requests = listOf( + JSONObject("""{"name":"child","type":"background"}"""), + JSONObject("""{"name":"child","type":"userInitiated","extensionName":"another"}"""), + JSONObject("""{"name":"missing","type":"userInitiated"}"""), + JSONObject("""{"name":"disabled","type":"userInitiated"}"""), + JSONObject("""{"name":"menu","type":"userInitiated"}"""), + JSONObject("""{"name":"gone","type":"userInitiated"}"""), + JSONObject("""{"name":"configured","type":"userInitiated"}"""), + JSONObject("""{"name":"required","type":"userInitiated"}"""), + JSONObject("""{"name":"child","type":"userInitiated","arguments":{"unknown":"owned"}}"""), + JSONObject().put("name", "child").put("type", "userInitiated").put("context", JSONObject().put("text", "x".repeat(66000))) + ) + val receipts = JSONArray() + requests.forEachIndexed { index, options -> + evaluate(web, "globalThis.__ownedTryLaunch(${options});true") + compose.waitUntil(10000) { probe(web).getJSONArray("rejections").length() == index + 1 && + activeRoot(catalog.runtimeTree)?.props()?.optString("markdown")?.contains("Owned rejection count ${index + 1}") == true } + compose.onNodeWithText("Owned rejection count ${index + 1}", substring = true, useUnmergedTree = true).assertIsDisplayed() + assertNull(catalog.runtimeError); assertEquals(epoch, catalog.launchEpoch); assertEquals("parent", catalog.running?.second?.name); assertEquals(sentinel, clipboard()) + receipts.put(JSONObject().put("index", index).put("message", probe(web).getJSONArray("rejections").getString(index)).put("same_epoch_and_parent", true)) + } + assertFalse(probe(web).optBoolean("unexpected")); record.put("rejection_receipts", receipts) + capture("rejected-request-feedback"); finish() + } + + @Test fun ordinaryRelaunchClearsContextAndFallback() { + tap("extension-primary"); awaitChild(); assertEquals(ownedText, JSONObject(payload()).getJSONObject("launchContext").getString("text")) + tap("extension-back"); launch("child") + val value = JSONObject(payload()) + assertTrue(value.isNull("launchContext")); assertTrue(value.isNull("fallbackText")); assertEquals(0, value.getJSONObject("arguments").length()) + assertEquals(sentinel, clipboard()); record.put("ordinary_launch_has_no_old_context_arguments_or_fallback", true) + capture("ordinary-child-without-context"); finish() + } + + @Test fun recreatedChildRejectsDisposedBackCallback() { + tap("extension-primary"); awaitChild(); val previous = activity(); val previousCatalog = catalog; val oldBack = backAction(); val expected = payload() + instrumentation.runOnMainSync { previous.recreate() } + compose.waitUntil(20000) { currentActivity()?.let { it !== previous && !it.store.loading } == true } + awaitChild(); assertSame(previousCatalog, catalog); assertEquals(expected, payload()) + instrumentation.runOnMainSync { oldBack() } + assertEquals("Disposed Back must not close the recreated child", "child", catalog.running?.second?.name) + assertEquals("extension-run", activity().store.dialog); assertEquals(sentinel, clipboard()) + record.put("current_invocation_context_survived_recreation", true).put("disposed_back_rejected_after_recreation", true) + capture("recreated-child-retains-context"); finish() + } + + @Test fun returnedCommandRejectsDisposedPreferencesCallback() { + val oldPreferences = action("Preferences"); val previous = catalog.launchEpoch + compose.onNodeWithText("Preferences").performTouchInput { click(center) } + compose.onNodeWithTag("extension-configuration").assertExists() + tap("extension-back") + compose.waitUntil(10000) { activity().store.dialog == "extension-run" } + instrumentation.runOnMainSync { oldPreferences() } + assertEquals("Disposed Preferences must not replace the restored command", "extension-run", activity().store.dialog) + assertEquals(previous, catalog.launchEpoch); assertEquals("parent", catalog.running?.second?.name); assertEquals(sentinel, clipboard()) + record.put("disposed_preferences_rejected_after_route_return", true); capture("restored-parent-rejects-old-preferences"); finish() + } +} diff --git a/app/src/main/java/dev/tinycast/android/PaletteUi.kt b/app/src/main/java/dev/tinycast/android/PaletteUi.kt index fd785587..a03485ba 100644 --- a/app/src/main/java/dev/tinycast/android/PaletteUi.kt +++ b/app/src/main/java/dev/tinycast/android/PaletteUi.kt @@ -72,9 +72,9 @@ fun TinycastApp(store: PaletteStore, globalEnabled: Boolean, run: (Command) -> U // Queued Back/Cancel callbacks from an older surface cannot dismiss // a newer incoming review or a replacement command. if (store.dialog != route) return + if (route in setOf("extension-run", "extension-setup") && store.extensions.launchEpoch != extensionEpoch) return if (reviewOwner != null) { if (store.textReview !== reviewOwner) return - if (route in setOf("extension-run", "extension-setup") && store.extensions.launchEpoch != extensionEpoch) return if (store.returnTextReview(reviewOwner)) dismiss() return } diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt index 421da20c..bb8da203 100644 --- a/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt @@ -97,9 +97,17 @@ class ExtensionCatalog(private val context: Context) { @Volatile private var invocationOwner: Any = Any() private var runtimeStop: Pair Unit>? = null private var commandText: CommandTextInput? = null + private var invocationLaunchProperties = ordinaryLaunchProperties(emptyMap()) + private var commandHandoffDepth = 0 + private var preparedCommandLaunch: PreparedCommandLaunch? = null private class PreparedText(val preview: TextInputPreview, val target: TextInputTarget, val epoch: Int) private var preparedText: PreparedText? = null - internal class RuntimeText(val owner: Any, val target: TextInputTarget, val input: CommandTextInput?) + internal class RuntimeText(val owner: Any, val target: TextInputTarget, val input: CommandTextInput?, val launchProperties: String) + internal class PreparedCommandLaunch internal constructor( + val owner: Any, val extension: InstalledExtension, val source: ExtensionCommand, val target: ExtensionCommand, + val epoch: Int, val preferenceEpoch: Int, val sourceDefinition: String, val targetDefinition: String, + val launchProperties: String, val depth: Int, + ) suspend fun search(query: String, page: Int = 1): List = withContext(Dispatchers.IO) { val q = URLEncoder.encode(query, "UTF-8") @@ -166,11 +174,15 @@ class ExtensionCatalog(private val context: Context) { reviewedText.invalidate(); preparedText = null begin(extension,command,args,Any(),null) } - private fun begin(extension: InstalledExtension, command: ExtensionCommand, args: Map, owner: Any, input: CommandTextInput?) { + private fun ordinaryLaunchProperties(args: Map) = JSONObject().put("arguments", JSONObject(args)).put("launchType", "userInitiated").toString() + private fun begin(extension: InstalledExtension, command: ExtensionCommand, args: Map, owner: Any, input: CommandTextInput?, + launchProperties: String = ordinaryLaunchProperties(args), handoffDepth: Int = 0) { stopRuntime(owner) + preparedCommandLaunch = null commandText?.let(reviewedText::release) commandText = input - running = extension to command; arguments = args; runtimeTree = null; runtimeError = null; runtimeStatus = "Starting extension…"; runtimeReady = false; navigationDepth = 1; launchEpoch++ + invocationLaunchProperties = launchProperties; commandHandoffDepth = handoffDepth + running = extension to command; arguments = args.toMap(); runtimeTree = null; runtimeError = null; runtimeStatus = "Starting extension…"; runtimeReady = false; navigationDepth = 1; launchEpoch++ } internal fun launchReviewed(extension: InstalledExtension, command: ExtensionCommand, preview: TextInputPreview, needsSetup: Boolean) { val target = TextInputTarget(extension.listing.id,command.name) @@ -210,8 +222,55 @@ class ExtensionCatalog(private val context: Context) { return true } internal fun captureText(extension: InstalledExtension, command: ExtensionCommand): RuntimeText { - val input = if (running?.first === extension && running?.second === command) commandText else null - return RuntimeText(invocationOwner,TextInputTarget(extension.listing.id,command.name),input) + val current = running?.first === extension && running?.second === command + return RuntimeText(invocationOwner,TextInputTarget(extension.listing.id,command.name),if (current) commandText else null, + if (current) invocationLaunchProperties else ordinaryLaunchProperties(emptyMap())) + } + private fun requireLaunchFile(extension: InstalledExtension, command: ExtensionCommand) { + val directory = extension.directory.canonicalFile + require(directory.parentFile == root.canonicalFile && directory.name == extension.listing.id) { "The target extension is no longer installed" } + val script = File(directory, "${command.name}.js") + require(script.canonicalFile == script.absoluteFile && script.isFile && script.canRead() && script.length() <= 16L * 1024 * 1024) { + "The target command is unavailable; reinstall the extension before launching it" + } + } + internal fun prepareCommandLaunch(owner: Any, extension: InstalledExtension, source: ExtensionCommand, + request: ExtensionCommandLaunch): PreparedCommandLaunch { + check(ownsRuntime(owner, extension, source) && runtimeError == null) { "This command session has ended" } + preparedCommandLaunch = null + check(busy == null && installed.any { it === extension }) { "Wait for extension installation to finish before launching a command" } + check(extension.commands.any { it.name == source.name && it.definition === source.definition }) { "The source command has changed" } + val target = extension.commands.filter { it.name == request.name }.singleOrNull() + ?: error("The requested command is unavailable in this extension") + require(target.mode in listOf("view", "no-view")) { "The target command requires an unsupported desktop mode" } + require(!target.definition.optBoolean("disabled") && target.definition.opt("enabled") != false) { "The target command is disabled" } + require(commandHandoffDepth < 16) { "The command launch chain reached its Android limit" } + requireLaunchFile(extension, target) + ExtensionCommandLaunch.requireConfigured(extension.fields(target), preferences(extension, target)) + val prepared = PreparedCommandLaunch(owner, extension, source, target, launchEpoch, preferencesEpoch, + source.definition.toString(), target.definition.toString(), request.launchProperties(target.definition), commandHandoffDepth + 1) + preparedCommandLaunch = prepared + return prepared + } + internal fun commitCommandLaunch(prepared: PreparedCommandLaunch): Boolean { + if (preparedCommandLaunch !== prepared) return false + preparedCommandLaunch = null // Every commit attempt consumes its reservation. + if (!ownsRuntime(prepared.owner, prepared.extension, prepared.source) || runtimeError != null || busy != null || + launchEpoch != prepared.epoch || preferencesEpoch != prepared.preferenceEpoch || commandHandoffDepth + 1 != prepared.depth || + installed.none { it === prepared.extension }) return false + if (prepared.extension.commands.none { it.name == prepared.source.name && it.definition === prepared.source.definition && + it.definition.toString() == prepared.sourceDefinition }) return false + val target = prepared.extension.commands.filter { it.name == prepared.target.name }.singleOrNull() ?: return false + if (target.definition !== prepared.target.definition || target.definition.toString() != prepared.targetDefinition) return false + requireLaunchFile(prepared.extension, target) + ExtensionCommandLaunch.requireConfigured(prepared.extension.fields(target), preferences(prepared.extension, target)) + // Context is explicit output of the approved parent. Its raw input lease + // and pending approval are never inherited by the new invocation. + val arguments = JSONObject(prepared.launchProperties).getJSONObject("arguments") + val values = arguments.keys().asSequence().associateWith { arguments.getString(it) } + reviewedText.invalidate(); preparedText = null + begin(prepared.extension, prepared.target, values, Any(), null, prepared.launchProperties, prepared.depth) + return true } internal fun ownsRuntime(owner: Any, extension: InstalledExtension, command: ExtensionCommand): Boolean = invocationOwner === owner && running?.first === extension && running?.second === command @@ -235,6 +294,7 @@ class ExtensionCatalog(private val context: Context) { private fun revokeReviewedText() { stopRuntime(Any()) reviewedText.invalidate(); commandText = null; preparedText = null + preparedCommandLaunch = null; invocationLaunchProperties = ordinaryLaunchProperties(emptyMap()); commandHandoffDepth = 0 } fun close() { revokeReviewedText(); running = null; runtimeTree = null; runtimeError = null; runtimeStatus = ""; runtimeReady = false } } diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt new file mode 100644 index 00000000..bef7346e --- /dev/null +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt @@ -0,0 +1,159 @@ +package dev.tinycast.android.extensions + +import org.json.JSONArray +import org.json.JSONException +import org.json.JSONObject + +/** A copied, bounded foreground launch request. It contains no input grant. */ +internal class ExtensionCommandLaunch private constructor( + val name: String, + private val arguments: Map, + private val contextJson: String?, + private val fallbackText: String?, +) { + fun argumentsFor(definition: JSONObject): Map { + val fields = definition.optJSONArray("arguments").objects() + require(fields.size <= MAX_ARGUMENTS) { "This command has too many arguments for an Android launch" } + val names = fields.map { it.getString("name") } + require(names.distinct().size == names.size && names.all { it.isNotBlank() && it.length <= MAX_KEY_UNITS }) { + "This command has unsupported argument definitions" + } + require(arguments.keys.all { it in names }) { "The launch contains an undeclared command argument" } + require(fields.none { it.optBoolean("required") && arguments[it.getString("name")].isNullOrBlank() }) { + "Complete the target command's required arguments before launching it" + } + return LinkedHashMap(arguments) + } + + fun launchProperties(definition: JSONObject): String { + val value = JSONObject().put("arguments", JSONObject(argumentsFor(definition))).put("launchType", "userInitiated") + contextJson?.let { value.put("launchContext", JSONObject(it)) } + fallbackText?.let { value.put("fallbackText", it) } + return value.toString().also { + require(it.length <= MAX_REQUEST_UNITS && it.toByteArray(Charsets.UTF_8).size <= MAX_REQUEST_BYTES) { + "The command launch data exceeds the Android size limit" + } + } + } + + companion object { + internal const val MAX_REQUEST_UNITS = 64 * 1024 + internal const val MAX_REQUEST_BYTES = 128 * 1024 + private const val MAX_ARGUMENTS = 64 + private const val MAX_KEY_UNITS = 256 + private const val MAX_CONTEXT_VALUES = 2048 + private const val MAX_CONTEXT_DEPTH = 16 + private const val MAX_FALLBACK_UNITS = 16 * 1024 + private val allowedOptions = setOf("name", "type", "arguments", "context", "fallbackText") + + fun parse(raw: String): ExtensionCommandLaunch { + // Check before JSON parsing, including direct calls to the JS bridge. + require(raw.length <= MAX_REQUEST_UNITS && raw.toByteArray(Charsets.UTF_8).size <= MAX_REQUEST_BYTES) { + "The command launch data exceeds the Android size limit" + } + requireBoundedJsonNesting(raw) + val parameters = try { JSONArray(raw) } catch (_: JSONException) { + throw IllegalArgumentException("Command launch requires valid JSON parameters") + } + require(parameters.length() == 1 && parameters.opt(0) is JSONObject) { "Command launch requires one options object" } + val options = parameters.getJSONObject(0) + require(!options.has("extensionName") && !options.has("ownerOrAuthorName")) { + "Launching another extension is unavailable on Android" + } + require(options.keys().asSequence().all { it in allowedOptions }) { "This command requests unsupported launch options" } + require(options.opt("type") == "userInitiated") { "Only foreground user-initiated command launches are supported on Android" } + val name = options.opt("name") as? String + require(name != null && Regex("[A-Za-z0-9_-]{1,128}").matches(name)) { "Command launch requires a valid command name" } + val values = if (options.has("arguments")) { + require(options.opt("arguments") is JSONObject) { "Command arguments must be a string-valued object" } + options.getJSONObject("arguments") + } else JSONObject() + require(values.length() <= MAX_ARGUMENTS) { "The command launch has too many arguments" } + val args = linkedMapOf() + values.keys().forEach { key -> + require(key.isNotBlank() && key.length <= MAX_KEY_UNITS && values.opt(key) is String) { + "Command arguments must have bounded names and string values" + } + args[key] = values.getString(key) + } + val context = if (options.has("context")) { + require(options.opt("context") is JSONObject) { "Launch context must be a JSON object" } + options.getJSONObject("context").also(::validateContext).toString() + } else null + val fallback = if (options.has("fallbackText")) { + val text = options.opt("fallbackText") as? String + require(text != null && text.length <= MAX_FALLBACK_UNITS) { "Fallback text must be a bounded string" } + text + } else null + return ExtensionCommandLaunch(name, args, context, fallback) + } + + private fun requireBoundedJsonNesting(raw: String) { + var depth = 0 + var quoted = false + var escaped = false + var started = false + var ended = false + for (character in raw) { + if (quoted) { + require(character >= ' ') { "Command launch requires valid JSON parameters" } + if (escaped) escaped = false + else if (character == '\\') escaped = true + else if (character == '"') quoted = false + continue + } + if (character in " \t\r\n") continue + require(!ended) { "Command launch requires one JSON parameter array" } + if (!started) { + require(character == '[') { "Command launch requires a JSON parameter array" } + started = true + } + when (character) { + '"' -> quoted = true + '[', '{' -> require(++depth <= MAX_CONTEXT_DEPTH + 4) { "Command launch JSON is too deeply nested" } + ']', '}' -> { + require(--depth >= 0) { "Command launch requires valid JSON parameters" } + if (depth == 0) ended = true + } + '\'', '/', '#' -> throw IllegalArgumentException("Command launch requires JSON without comments or single-quoted strings") + } + } + require(started && ended && !quoted && depth == 0) { "Command launch requires complete JSON parameters" } + } + + private fun validateContext(root: JSONObject) { + var values = 0 + fun visit(value: Any?, depth: Int) { + require(depth <= MAX_CONTEXT_DEPTH && ++values <= MAX_CONTEXT_VALUES) { "Launch context is too deeply nested or has too many values" } + when (value) { + null, JSONObject.NULL -> Unit + is JSONObject -> value.keys().forEach { key -> + require(key.length <= MAX_KEY_UNITS) { "Launch context has an oversized property name" } + visit(value.get(key), depth + 1) + } + is JSONArray -> repeat(value.length()) { visit(value.get(it), depth + 1) } + is Number -> require(value.toDouble().isFinite()) { "Launch context numbers must be finite" } + is String, is Boolean -> Unit + else -> error("Launch context contains an unsupported value") + } + } + visit(root, 0) + } + + fun requireConfigured(fields: List, preferences: JSONObject) { + fields.forEach { field -> + val name = field.getString("name") + val value = preferences.opt(name) + require(!field.optBoolean("required") || field.optString("type") == "checkbox" || + value != null && value != JSONObject.NULL && value.toString().isNotBlank()) { + "Configure the target command from the launcher before launching it here" + } + if (field.optString("type") == "dropdown" && value != null && value != JSONObject.NULL && value.toString().isNotBlank()) { + require(field.optJSONArray("data").objects().any { it.optString("value") == value.toString() }) { + "Choose an available target-command preference before launching it here" + } + } + } + } + } +} diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt index 548f5267..6dba58de 100644 --- a/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt @@ -6,6 +6,8 @@ import android.content.ClipboardManager import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Handler +import android.os.Looper import android.util.Base64 import android.webkit.* import androidx.compose.runtime.* @@ -22,7 +24,10 @@ import dev.tinycast.android.TextInputRejected @SuppressLint("SetJavaScriptEnabled") class ExtensionRuntime(private val context: Context, private val catalog: ExtensionCatalog, - private val extension: InstalledExtension, private val command: ExtensionCommand) { + private val extension: InstalledExtension, private val command: ExtensionCommand, + private val canLaunchCommand: () -> Boolean) { + constructor(context: Context, catalog: ExtensionCatalog, extension: InstalledExtension, command: ExtensionCommand) : + this(context, catalog, extension, command, { false }) private val textContext = catalog.captureText(extension,command) private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate + CoroutineExceptionHandler { _, error -> fail(error.message ?: "Could not start this extension") @@ -33,6 +38,10 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens @Volatile private var destroyed = false private var started = false private var watchdog: Job? = null + private val cleanupHandler = Handler(Looper.getMainLooper()) + private var pendingLaunchAcknowledgement: Any? = null + private var acknowledgementTimeout: Runnable? = null + private var engineDestroyed = false val webView = WebView(context).apply { // This is a headless JavaScript engine; visible native controls own input. isFocusable = false; isFocusableInTouchMode = false @@ -54,12 +63,14 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens override fun onPageFinished(view: WebView?, url: String?) { if(started && active())boot() } override fun onRenderProcessGone(view: WebView?, detail: RenderProcessGoneDetail?): Boolean { fail("The JavaScript engine stopped. Close this command and try again.") - (view?.parent as? android.view.ViewGroup)?.removeView(view) - view?.destroy(); return true + destroyEngine(); return true } } } - private val runtimeRegistration = catalog.attachRuntime(textContext.owner, extension, command) { scope.cancel(); webView.stopLoading() } + private val runtimeRegistration = catalog.attachRuntime(textContext.owner, extension, command) { + scope.cancel() + if (pendingLaunchAcknowledgement == null) webView.stopLoading() + } init { if (runtimeRegistration == null) scope.cancel() } private fun active() = !destroyed && scope.isActive && catalog.ownsRuntime(textContext.owner,extension,command) && catalog.runtimeError == null internal fun isCurrentInvocation(): Boolean = active() @@ -90,7 +101,7 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens val env = JSONObject().put("extensionName", extension.listing.name).put("commandName", command.name).put("commandMode", command.mode) .put("assetsPath", File(extension.directory, "assets").path).put("supportPath", support.path).put("raycastVersion", "2.0.3").put("appearance", "dark").put("textSize", "medium").put("isDevelopment", false) val configuration = JSONObject().put("node", node).put("environment", env).put("preferences", catalog.preferences(extension, command)) - .put("caches", JSONObject(storage.getString("caches", "{}")!!)).put("launchProps", JSONObject().put("arguments", JSONObject(catalog.arguments)).put("launchType", "userInitiated")) + .put("caches", JSONObject(storage.getString("caches", "{}")!!)).put("launchProps", JSONObject(textContext.launchProperties)) evaluate("try { __tinycast.boot(${quote(configuration.toString())}); if(globalThis.process) process.platform='android'; __tinycast.start(${quote(session)},${quote(bundle)},${quote(File(extension.directory,"${command.name}.js").path)},${quote(extension.directory.path)},${quote(command.mode)},${quote(configuration.toString())}); } catch(e) { AndroidHost.failed(String(e.stack || e)); }") } } } @@ -102,7 +113,54 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens if (active() && !handle.isNullOrBlank()) evaluate("__androidDispatchFormFocus(${quote(session)},${quote(handle)},${quote(fieldId)},${quote(if (focused) "focus" else "blur")},${quote(JSONArray().put(value).toString())})") } fun back() { evaluate("__tinycast.popNavigation(${quote(session)})") } - fun close() { if (destroyed) return; destroyed = true; catalog.detachRuntime(runtimeRegistration); textContext.input?.let(catalog.reviewedText::release); scope.cancel(); webView.stopLoading(); webView.removeJavascriptInterface("AndroidHost"); (webView.parent as? android.view.ViewGroup)?.removeView(webView); webView.destroy() } + fun close() { + if (destroyed) return + destroyed = true; catalog.detachRuntime(runtimeRegistration); textContext.input?.let(catalog.reviewedText::release); scope.cancel() + (webView.parent as? android.view.ViewGroup)?.removeView(webView) + // Only the acknowledgement may finish in this retired, detached engine. + // Its authority was revoked before settlement; the timeout is independent + // of the cancelled invocation scope and bounds retention after disposal. + if (pendingLaunchAcknowledgement == null) destroyEngine() + } + private fun destroyEngine() { + if (engineDestroyed) return + engineDestroyed = true + acknowledgementTimeout?.let(cleanupHandler::removeCallbacks); acknowledgementTimeout = null; pendingLaunchAcknowledgement = null + webView.stopLoading(); webView.removeJavascriptInterface("AndroidHost") + (webView.parent as? android.view.ViewGroup)?.removeView(webView); webView.destroy() + } + private fun acknowledgeCommandLaunch(token: Any) { + if (pendingLaunchAcknowledgement !== token) return + pendingLaunchAcknowledgement = null + acknowledgementTimeout?.let(cleanupHandler::removeCallbacks); acknowledgementTimeout = null + if (destroyed) destroyEngine() + } + private fun launchCommand(id: String, raw: String) { + check(canLaunchCommand() && webView.isAttachedToWindow && webView.hasWindowFocus()) { + "Command handoff needs the current command screen in the foreground" + } + val request = ExtensionCommandLaunch.parse(raw) + val prepared = catalog.prepareCommandLaunch(textContext.owner, extension, command, request) + check(canLaunchCommand() && webView.hasWindowFocus()) { "This command screen is no longer current" } + val token = Any() + check(pendingLaunchAcknowledgement == null) { "A command handoff is already pending" } + pendingLaunchAcknowledgement = token + val timeout = Runnable { acknowledgeCommandLaunch(token) } + acknowledgementTimeout = timeout + try { + check(cleanupHandler.postDelayed(timeout, 1000)) { "Could not schedule command handoff" } + check(catalog.commitCommandLaunch(prepared)) { "This command launch is no longer current" } + } catch (failure: Throwable) { + acknowledgeCommandLaunch(token) + throw failure + } + // The target is selected and the parent scope/lease is already revoked. + // Bypass active() solely for its final launch acknowledgement. Old host + // calls, renders and completion notifications cannot affect the child. + try { + webView.evaluateJavascript("__tinycast.settle(${quote(id)},true,${quote("null")})") { acknowledgeCommandLaunch(token) } + } catch (_: RuntimeException) { acknowledgeCommandLaunch(token) } + } private fun ready() { catalog.runtimeReady = true; watchdog?.cancel() } private fun quote(s: String) = JSONObject.quote(s) private fun post(block: () -> Unit) { if (active()) scope.launch { if (active()) block() } } @@ -116,6 +174,10 @@ class ExtensionRuntime(private val context: Context, private val catalog: Extens scope.launch { if(!active())return@launch try { + if (api == "system" && method == "launchCommand") { + launchCommand(id, raw) + return@launch + } val result = asyncCall(api, method, JSONArray(raw)) if(!active())return@launch val encoded = JSONArray().put(result ?: JSONObject.NULL).toString().drop(1).dropLast(1) diff --git a/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt b/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt index 74c8d942..b31c520b 100644 --- a/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt +++ b/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt @@ -128,7 +128,9 @@ private fun ExtensionSession(store: PaletteStore, extension: InstalledExtension, return } val context = LocalContext.current - val runtime = remember { ExtensionRuntime(context, store.extensions, extension, command) } + val runtime = remember { ExtensionRuntime(context, store.extensions, extension, command) { + store.dialog == "extension-run" && !store.backupBusy + } } val images = remember { ExtensionGridImages(extension.directory) } val detailImages = remember { ExtensionDetailImages(extension.directory) } val grids = remember { mutableMapOf() } @@ -446,25 +448,37 @@ internal fun activeRoot(tree:JSONObject?):JSONObject? { return find(start) } +private class CommandChromeLifetime { var active = true } + @Composable private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,command:ExtensionCommand, runtime:ExtensionRuntime,gridImages:ExtensionGridImages,detailImages:ExtensionDetailImages,gridStates:MutableMap, - listStates:MutableMap,detailStates:MutableMap,close:()->Unit){ + listStates:MutableMap,detailStates:MutableMap,closeRoute:()->Unit){ + val catalog=store.extensions + val launchEpoch=remember(runtime){catalog.launchEpoch} + val chrome=remember(runtime){CommandChromeLifetime()} + DisposableEffect(chrome) { onDispose { chrome.active = false } } + fun currentChrome(): Boolean = chrome.active && store.dialog == "extension-run" && + catalog.launchEpoch == launchEpoch && catalog.running?.first === extension && catalog.running?.second === command + val close: () -> Unit = { if (currentChrome()) closeRoute() } + fun configure() { + if (currentChrome() && runtime.isCurrentInvocation()) { + store.extensionSetupFromRun=true;store.dialog="extension-setup" + } + } if(command.mode !in listOf("view","no-view")){ ExtensionWindow(command.title,extension.listing.title,close){Text("This command needs a desktop menu bar. It can be installed, but cannot run on Android.",color=muted,fontSize=15.sp,modifier=Modifier.padding(24.dp))} return } - val catalog=store.extensions - val launchEpoch=remember(runtime){catalog.launchEpoch} fun canReturnCompletedCommand(): Boolean { val running = catalog.running - return command.mode == "no-view" && store.dialog == "extension-run" && + return command.mode == "no-view" && currentChrome() && catalog.launchEpoch == launchEpoch && running != null && running.first === extension && running.second === command && catalog.runtimeReady && catalog.runtimeError == null && activeRoot(catalog.runtimeTree) == null && runtime.isCurrentInvocation() } fun liveRoot():JSONObject? { val running=catalog.running - if(catalog.launchEpoch!=launchEpoch || running?.first!==extension || running?.second!==command || catalog.runtimeError!=null) return null + if(!currentChrome() || running?.first!==extension || running?.second!==command || catalog.runtimeError!=null) return null return activeRoot(catalog.runtimeTree) } val context=LocalContext.current @@ -540,6 +554,7 @@ private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,comman notifyCurrentSelection() } fun back() { + if (!currentChrome()) return if (root?.optString("type") == "List" && listState.detailOnly) { listState.detailRowId = null listState.detailOnly = false @@ -550,7 +565,7 @@ private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,comman if (!failed) notifyCurrentSelection() } fun defaultKeys(event: KeyEvent): Boolean = with(event) { - if(catalog.runtimeError!=null || root?.optString("type")=="Grid" || type!=KeyEventType.KeyDown)false else { + if(!currentChrome() || catalog.runtimeError!=null || root?.optString("type")=="Grid" || type!=KeyEventType.KeyDown)false else { val eventRows=if(key in listOf(Key.DirectionDown,Key.DirectionUp)) liveRows() else emptyList() when{ key==Key.K&&isCtrlPressed->{menu=true;true} @@ -570,8 +585,8 @@ private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,comman },headerActions={ if(failed)TextButton(onClick=close,modifier=Modifier.testTag("extension-error-close")){Text("Close",fontSize=11.sp)} else { - if(catalog.navigationDepth>1)TextButton(onClick=runtime::back){Text("Back",fontSize=11.sp)} - TextButton(onClick={store.extensionSetupFromRun=true;store.dialog="extension-setup"}){Text("Preferences",fontSize=11.sp)} + if(catalog.navigationDepth>1)TextButton(onClick={if(currentChrome())runtime.back()}){Text("Back",fontSize=11.sp)} + TextButton(onClick=::configure, modifier=Modifier.testTag("extension-preferences")){Text("Preferences",fontSize=11.sp)} } }){ if(catalog.runtimeError!=null){ @@ -593,7 +608,7 @@ private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,comman }else when(root.optString("type")){ "Grid" -> Box(Modifier.weight(1f).fillMaxWidth()) { val state = gridStates.getOrPut(root.optString("id")) { ExtensionGridState() } - NativeExtensionGrid(state, { liveRoot()?.takeIf { it.optString("type")=="Grid" } }, gridImages, extension.listing.title, catalog.runtimeStatus, context.getSharedPreferences("extension-${extension.listing.id}", android.content.Context.MODE_PRIVATE), command.name, { handle,args -> if(liveRoot()?.optString("type")=="Grid")runtime.dispatch(handle,args) }, back={ if(catalog.navigationDepth>1)runtime.back() else close() }, configure={store.extensionSetupFromRun=true;store.dialog="extension-setup"}) + NativeExtensionGrid(state, { liveRoot()?.takeIf { it.optString("type")=="Grid" } }, gridImages, extension.listing.title, catalog.runtimeStatus, context.getSharedPreferences("extension-${extension.listing.id}", android.content.Context.MODE_PRIVATE), command.name, { handle,args -> if(liveRoot()?.optString("type")=="Grid")runtime.dispatch(handle,args) }, back=::back, configure=::configure) } "List"->{ NativeExtensionList(root, rows, listState, runtime, detailImages, ::liveRoot, ::liveRows, @@ -601,7 +616,7 @@ private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,comman val current = liveRows().indexOfFirst { it.optString("id") == expected.optString("id") && it.props().opt("title") == expected.props().opt("title") } if (current < 0) false else { selected = current; notifyCurrentSelection(); true } - }, dispatch = { handle, args -> runtime.dispatch(handle, args) }, status = { catalog.runtimeStatus = it }, + }, dispatch = { handle, args -> runtime.dispatch(handle, args) }, status = { if(currentChrome())catalog.runtimeStatus = it }, empty = { modifier -> NativeExtensionEmptyView(extensionEmptyView(root,0,query),root.props().optBoolean("isLoading") && query.isEmpty(),gridImages, "extension-list-empty", modifier) }, modifier = Modifier.weight(1f).fillMaxWidth(), searchHeader = { ExtensionSearchHeader(listSearch,{next-> @@ -609,14 +624,14 @@ private fun CommandRunner(store:PaletteStore,extension:InstalledExtension,comman if(current != null && next.text != query){selected=0;listState.detailRowId=null;runtime.dispatch(current.handle("onSearchTextChange"),JSONArray().put(next.text))} listSearch=next },root.props().optString("searchBarPlaceholder","Search extension…"),"extension-search",::back,keys=::defaultKeys) { - IconButton(onClick={store.extensionSetupFromRun=true;store.dialog="extension-setup"},modifier=Modifier.size(48.dp).semantics{contentDescription="Extension preferences"}){Glyph("settings",muted,16)} + IconButton(onClick=::configure,modifier=Modifier.size(48.dp).semantics{contentDescription="Extension preferences"}){Glyph("settings",muted,16)} } }) } "Detail"->NativeExtensionDetail(root, { liveRoot()?.takeIf { it.optString("type") == "Detail" && it.optString("id") == root.optString("id") } }, runtime, detailImages, - { handle, args -> runtime.dispatch(handle, args) }, { catalog.runtimeStatus = it }, + { handle, args -> runtime.dispatch(handle, args) }, { if(currentChrome())catalog.runtimeStatus = it }, detailStates.getOrPut(root.optString("id")) { ScrollState(0) }, Modifier.weight(1f).fillMaxWidth()) "Form"->NativeExtensionForm(root, { liveRoot()?.takeIf { it.optString("type") == "Form" } }, { handle, args -> runtime.dispatch(handle, args) }, diff --git a/app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt b/app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt new file mode 100644 index 00000000..7c394a1c --- /dev/null +++ b/app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt @@ -0,0 +1,113 @@ +package dev.tinycast.android + +import dev.tinycast.android.extensions.ExtensionCommandLaunch +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Assert.* +import org.junit.Test + +class ExtensionCommandLaunchTest { + private fun options() = JSONObject().put("name", "target").put("type", "userInitiated") + private fun request(options: JSONObject = options()) = ExtensionCommandLaunch.parse(JSONArray().put(options).toString()) + private val noArguments get() = JSONObject() + private fun rejected(block: () -> Unit) = assertThrows(IllegalArgumentException::class.java) { block() } + + @Test fun foregroundContextAndArgumentsArriveAsSeparateCopiedLaunchProperties() { + val context = JSONObject().put("text", "café é 日本 🌱\n\"owned\"") + .put("nested", JSONArray().put(7).put(true).put(JSONObject.NULL)) + val definition = JSONObject().put("arguments", JSONArray().put(JSONObject().put("name", "topic").put("required", true))) + val launch = request(options().put("arguments", JSONObject().put("topic", "owned")) + .put("context", context).put("fallbackText", "owned fallback")) + context.put("text", "later mutation") + val first = JSONObject(launch.launchProperties(definition)) + assertEquals("userInitiated", first.getString("launchType")) + assertEquals("owned", first.getJSONObject("arguments").getString("topic")) + assertEquals("owned fallback", first.getString("fallbackText")) + assertEquals("café é 日本 🌱\n\"owned\"", first.getJSONObject("launchContext").getString("text")) + first.getJSONObject("launchContext").put("text", "consumer mutation") + assertEquals("café é 日本 🌱\n\"owned\"", JSONObject(launch.launchProperties(definition)).getJSONObject("launchContext").getString("text")) + assertFalse(first.has("selectedText")) + } + + @Test fun ordinaryEmptyRequestDoesNotInventContextOrFallback() { + val properties = JSONObject(request().launchProperties(noArguments)) + assertEquals(0, properties.getJSONObject("arguments").length()) + assertFalse(properties.has("launchContext")); assertFalse(properties.has("fallbackText")) + } + + @Test fun crossExtensionRoutingAndBackgroundLaunchesAreRejected() { + rejected { request(options().put("extensionName", "another")) } + rejected { request(options().put("ownerOrAuthorName", "another")) } + rejected { request(options().put("type", "background")) } + rejected { request(JSONObject().put("name", "target")) } + } + + @Test fun unsafeNamesAndUnknownOptionsNeverBecomeLaunches() { + for (name in listOf("", "../outside", "folder/target", "folder\\target", "x".repeat(129))) { + rejected { request(options().put("name", name)) } + } + rejected { request(options().put("unexpected", true)) } + rejected { ExtensionCommandLaunch.parse("[]") } + rejected { ExtensionCommandLaunch.parse("[{},{}]") } + rejected { ExtensionCommandLaunch.parse("[null]") } + } + + @Test fun undeclaredNonstringAndMissingRequiredArgumentsAreRejected() { + val definition = JSONObject("""{"arguments":[{"name":"topic","required":true}]}""") + rejected { request().argumentsFor(definition) } + rejected { request(options().put("arguments", JSONObject().put("topic", " "))).argumentsFor(definition) } + rejected { request(options().put("arguments", JSONObject().put("topic", 7))) } + rejected { request(options().put("arguments", JSONObject().put("other", "owned"))).argumentsFor(definition) } + rejected { request(options().put("arguments", JSONArray())) } + assertEquals(mapOf("topic" to "owned"), request(options().put("arguments", JSONObject().put("topic", "owned"))).argumentsFor(definition)) + } + + @Test fun argumentConsumersCannotChangeThePreparedValues() { + val definition = JSONObject("""{"arguments":[{"name":"a"},{"name":"b"}]}""") + val launch = request(options().put("arguments", JSONObject().put("a", "one").put("b", "two"))) + val values = launch.argumentsFor(definition) as MutableMap + values["a"] = "changed" + assertEquals("one", launch.argumentsFor(definition)["a"]) + } + + @Test fun argumentCountsAndAmbiguousDefinitionsAreBounded() { + val values = JSONObject().also { value -> repeat(65) { value.put("key$it", "owned") } } + rejected { request(options().put("arguments", values)) } + rejected { request().argumentsFor(JSONObject("""{"arguments":[{"name":"a"},{"name":"a"}]}""")) } + } + + @Test fun contextMustBeAnObjectAndNestedCollectionsAreBounded() { + rejected { request(options().put("context", JSONArray())) } + rejected { request(options().put("context", JSONObject.NULL)) } + var nested: Any = "owned" + repeat(18) { nested = JSONArray().put(nested) } + rejected { request(options().put("context", JSONObject().put("deep", nested))) } + val many = JSONArray().also { array -> repeat(2048) { array.put(it) } } + rejected { request(options().put("context", JSONObject().put("many", many))) } + rejected { request(options().put("context", JSONObject().put("x".repeat(257), true))) } + } + + @Test fun requestIsBoundedBeforeParsingByUnitsAndUtf8Bytes() { + rejected { ExtensionCommandLaunch.parse(" ".repeat(ExtensionCommandLaunch.MAX_REQUEST_UNITS + 1)) } + rejected { request(options().put("context", JSONObject().put("text", "界".repeat(45000)))) } + rejected { request(options().put("fallbackText", "x".repeat(16385))) } + } + + @Test fun parserDepthIsCheckedBeforeJsonAllocationAndQuotedBracketsRemainData() { + rejected { ExtensionCommandLaunch.parse("[".repeat(10000) + "]".repeat(10000)) } + rejected { ExtensionCommandLaunch.parse("[] []") } + rejected { ExtensionCommandLaunch.parse("[{\"context\":") } + rejected { ExtensionCommandLaunch.parse("[/* comment */{}]") } + rejected { ExtensionCommandLaunch.parse("[{'name':'target'}]") } + val launch = request(options().put("context", JSONObject().put("text", "[{}] \\\" quoted"))) + assertEquals("[{}] \\\" quoted", JSONObject(launch.launchProperties(noArguments)).getJSONObject("launchContext").getString("text")) + } + + @Test fun requiredPreferencesAndDropdownSelectionsMustBeConfigured() { + val fields = listOf(JSONObject("""{"name":"language","type":"dropdown","required":true,"data":[{"value":"ja"}]}"""), + JSONObject("""{"name":"enabled","type":"checkbox","required":true}""")) + rejected { ExtensionCommandLaunch.requireConfigured(fields, JSONObject()) } + rejected { ExtensionCommandLaunch.requireConfigured(fields, JSONObject().put("language", "unknown")) } + ExtensionCommandLaunch.requireConfigured(fields, JSONObject().put("language", "ja").put("enabled", false)) + } +} diff --git a/docs/EXTENSION-COMMAND-HANDOFF.md b/docs/EXTENSION-COMMAND-HANDOFF.md new file mode 100644 index 00000000..58de3e43 --- /dev/null +++ b/docs/EXTENSION-COMMAND-HANDOFF.md @@ -0,0 +1,81 @@ +# Bounded same-extension command handoff + +Issue [#100](https://github.com/moikdev/droidcast/issues/100), following the frozen observations in [PR #102](https://github.com/moikdev/droidcast/pull/102). #95/#72/#7 remain open. + +## Behavior + +A foreground extension can launch one installed command in the same extension with `LaunchType.UserInitiated`, declared string arguments, a copied JSON context object, and optional fallback text. Android selects a fresh invocation, revokes the parent's raw reviewed-input grant and pending operations, and delivers the explicit context as `launchProps.launchContext`. Existing external source-return state remains separate. An ordinary new launch clears the prior context, arguments and fallback. For the owned ordinary invocation without an active external review, configuration recreation preserves its explicit copied properties. Existing reviewed-input recreation expiry remains unchanged. + +Raycast's [Command API](https://developers.raycast.com/api-reference/command) resolves its Promise after initiation rather than completion. Android acknowledges the selected target after revoking the parent and before waiting for the child's render. The old engine retains only its final acknowledgement and cannot publish, copy, update status, finish, fail, or initiate another command. An independent one-second deadline bounds the final acknowledgement after handoff; disposal destroys the retired engine once settlement finishes. Native request delivery remains gated by its existing invocation scope; this is not full Fetch abort compliance. + +## Android scope + +| Boundary | Policy | +| --- | --- | +| Target | Same currently installed extension; unique manifest name; available readable canonical script; view or no-view mode; enabled target | +| Caller | Current invocation, foreground command route/window, no backup or installation operation | +| Configuration | Required arguments/preferences and available dropdown selections must already be supplied; no implicit setup consent | +| Launch data | One JSON options object; raw request ≤64 Ki UTF-16 units and 128 KiB UTF-8; nesting checked before parsing; copied context ≤16 levels /2,048 values /256-unit keys | +| Arguments/fallback | At most 64 declared string arguments with bounded names; fallback ≤16 Ki units; combined serialized properties also bounded | +| Ownership | Single-use reservation and owner/epoch/manifest/preference checks; maximum 16 handoffs in a chain; stale/duplicate/cancelled parents cannot control the child | +| Unsupported | Background/cross-extension/menu-bar handoff; arbitrary options; implicit raw selected-text inheritance; prototype revival for Dates/Buffers | + +JSON-serialized Date strings and Buffer-shaped plain objects remain plain JSON. Prototype/reviver compatibility is not implemented. The fallback is delivered as launch properties, not inserted into another app or invented as selected text. Generated upstream assets and existing notices remain unchanged. + +## Lifecycle corrections + +Two source-bound native controls reproduced stale chrome defects in the intermediate app. A retained Back callback closed a recreated child; a retained Preferences callback reopened setup after returning to the command. Both controls fail their exact intended assertions with zero JUnit passes. The repaired screen owns a disposable chrome lifetime in addition to route, epoch and exact command identity. Retained Back and Preferences controls cannot act after disposal, while the tested recreated ordinary command retains its context. + +## Frozen identities and local checks + +| APK role | Source | SHA-256 | +| --- | --- | --- | +| Before app | `ed3831303a8319a194f0ae137830acba1f3580d5` | `de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d` | +| Intermediate handoff app, before chrome repair | `10d8798e92dc0334f17f0eded4ab6fc5493326c6` | `ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254` | +| Repaired app used for final observations | `56134f31f74211d7ec4d8faaf18ef5f84658242e` | `2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d` | +| Common frozen Quick Translate instrumentation | `77bec8fcfcc501c58707db2d939236943a14f479` | `7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f` | +| Corrected ordinary-launch/owned instrumentation | `fa7f39430a5259a5549dfeaa58b8a9954b228a3f` | `05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a` | +| Corrected failure-signature protocol instrumentation | `73e719c602bc378c71df83eba34440771bc8d999` | `84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6` | + +All later production/build/JVM sources equal the repaired app source. Instrumentation APKs are distinct; no stamp-only equivalence is assumed. Two historical fixture transitions are explicit: ordinary launcher entry follows its existing argument setup with a real Run tap; the final four protocol observations use the host's full failure signature. The preceding ordinary timeout stays failed. A later legacy-menu preflight refused existing evidence directories before output creation, installation or instrumentation. Its continuation uses a nonce-owned preservation collector to move, restore and verify those originals; the preflight earns zero executions. The four preceding acknowledgement/duplicate cases receive no final-protocol credit. + +Host evidence records 289 JVM passes at the repaired app source, without failures/errors/skips, including eleven launch-contract cases. The JVM sources and production implementation are unchanged by the later AndroidTest-only edits. Python records 111 cases per normal/optimized mode. Debug/benchmark app and test builds pass; both final test variants compile and fresh lint reports zero errors/55 warnings per variant. All ten packaged assets, including the generated runtime and notices, match the before app. No fresh Node, benchmark-device or physical-device execution is claimed. + +## Real Android captures + +The dedicated `Tinycast_Tablet_API_36` runs API36 unprivileged. Tablet is 1920×1200 at 240dpi; phone is 1080×2340 at 420dpi; short landscape is 2340×1080 at 420dpi. Tests cover 100% and selected 200% text profiles. Owned captures wait for Compose idle; reviewed-input captures use Compose or external UiAutomator idle. Every selected capture writes native XML before PNG. No two-frame/stable-tree guarantee is claimed here. + +The first pair shows the actual frozen Quick Translate path. The child initially receives the owned `hello` context; its later `good morning` edit uses an editor test action. Touch Run/Copy/return and fresh exact response/clipboard/source assertions are separate witnesses. No physical-typing or translation-quality claim is made. + +![Before: frozen Quick Translate reaches the unsupported handoff error](screenshots/command-handoff/matched-quick-old-phone100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png) + +![After: actual child result following the owned input edit](screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png) + +![Exact provider output copied before unchanged source return](screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png) + +![External source and original selection after return](screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png) + +The following pair is a controlled retained-callback protocol after actual Activity recreation, not a physical queued-tap reproduction. The same instrumentation invokes the retained Back callback: the intermediate app closes the child; the repaired app keeps it and its explicit context. + +![Before: retained Back callback closes the recreated child](screenshots/command-handoff/matched-lifetime-recreation-old-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-failure.png) + +![After: recreated child remains current after invoking retained Back](screenshots/command-handoff/owned-recreation-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png) + +![Owned Unicode context at 200% phone text, before exact Copy](screenshots/command-handoff/critical-context-phone200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png) + +The complete 48dp bounds apply to recorded primary/Back/ordinary-Run taps. Enlarged profiles establish functional handoff/copy/rejection/return smoke, without comprehensive natural-line, all-form, accessibility or physical-device certification. The acknowledgement protocols explicitly pause the Compose frame clock, observe the old engine before child composition, then resume real native rendering; their screenshots alone do not establish ordering. + +## Evidence and limits + +The [checkpoint](validation/command-handoff/checkpoint.json) binds **44 final positive executions /34 complete cohorts /654 successful restoration checks** on the repaired app. This comprises twelve retained owned cases, four corrected protocol cases, six enlarged/landscape smoke cases, four real Quick Translate paths and eighteen affected Form/Detail/rapid-List/review regressions. Eight owned methods are covered on both 100% layouts; the final acknowledgement/duplicate protocols use the corrected-signature instrumentation. + +Two final same-instrumentation intermediate-app controls retain **zero JUnit passes /two intended assertion failures /36 restoration checks**. Earlier evidence remains separate: nineteen executions /sixteen passes /three failures /350 checks. This preserves two earlier intended stale-chrome failures and the ordinary-setup timeout. Across all retained executed cohorts the total is **65 executions /60 passes /five failures /1,040 restoration checks**. The refused legacy preflight executed zero tests and contributes no pass or native failure. Its original pipeline remains incomplete; the six-cohort continuation completes the remaining work without relabeling it. + +The evidence index covers **459 public files**, **49 selected real PNG/XML/frame sets**, **667 retained capture hashes** and **220 current source/runner hashes**. All **87 public XML files** parse; raw capture XML retains CRLF. Original/public byte transformations and allowlisted runner projections are declared. Original clipboard, durable-state/evidence snapshots and staging archives remain private. Completed cohorts verify restoration on the same dedicated emulator boot, including the twelve pre-existing durable files and 528 pre-existing evidence files. Independent auditors can inspect the permitted receipts and guarded source without opening those originals. + +The old Quick Translate collectors pass while recording the unsupported boundary; these are negative compatibility observations, not JUnit failures or working workflows. The two intermediate Quick Translate successes and other predecessor-harness positives receive no final-runtime credit. Current artifact runs preserve historical outcomes and their own source/binary bindings. Owned fixtures establish protocol/lifecycle behavior; frozen Quick Translate establishes only the recorded configured English-to-Japanese path. Neither establishes translation quality, service reliability, whole-Store parity, accessibility, physical/OEM operation, production signing or resolution of #89. Unsupported paste remains partial under #101. + + +## Merge gates + +Exact-head hosted Android CI, local/android recording, two independent full-change gpt-6.1-sol/high audits and an expected-head merge remain required. Hosted and local results are recorded separately on the PR. #101 paste fallback and the broader parity/platform issues remain open. diff --git a/docs/PARITY-TRACKER.md b/docs/PARITY-TRACKER.md index 11a68abf..91e2f4be 100644 --- a/docs/PARITY-TRACKER.md +++ b/docs/PARITY-TRACKER.md @@ -173,3 +173,7 @@ The offline/touch Return slice merged in [PR #99](https://github.com/moikdev/dro The remaining #95 slice now prepares seven declarations on a separate branch: five Translate/context commands, Lorem's AI generation entry and Weather's desktop menu-bar entry. All frozen command/archive hashes are verified from cached bytes. Source tracing identifies command handoff/context, paste policy, capability denial and desktop-mode entry boundaries; none is credited as a new Android outcome yet. Guarded observation cases are under preparation. Existing default reviewed-input cohorts remain opt-in/filtered separately; the AI case targets the existing denial path and leaves provider behavior unverified. Actual observations, implementation findings and fresh gates remain required. The [remaining frozen command observations](CONTEXT-COMMAND-WORKFLOWS.md) now give all seven later #95 declarations a phase-specific tablet/phone result: three listed translation paths complete, paste is partial with a witnessed native rejection, and command handoff, AI capability and menu-bar reviewed entry remain blocked. The unchanged `ed38313` app has 27 verified positive observation executions / 518 successful restoration checks: 24 retain the `c262fdf` harness and three use the `77bec8f` pointer continuation. This includes fourteen 100% scenarios, twelve selected 200% scenarios and one focused regression; four historical failures remain excluded. The checkpoint binds 68 real capture sets, 217 current source hashes, exact binaries and allowlisted receipts. Python109 per mode, AndroidTest builds and lint0 errors/55 warnings pass; JVM278 is retained for unchanged production/build sources. Exact-head hosted CI and both independent sol/high audits remain PR gates. Next: [bounded same-extension handoff #100](https://github.com/moikdev/droidcast/issues/100), then [explicit Copy fallback #101](https://github.com/moikdev/droidcast/issues/101). #95/#72, whole-Store/platform/accessibility, #89 and signing/migration remain open. + +The remaining-command observation slice merged in [PR #102](https://github.com/moikdev/droidcast/pull/102) as `517a650ddb4d1eb8509ce887b6979a06b774b625`, with the identical tree reviewed at `729f22b5`. Both independent full-change gpt-6.1-sol/high audits cleared that head; root verified exact-head Android run 41871032578 and local/android success, used the expected-head merge guard, confirmed both parents/tree equality and stopped the watch. #95/#72 remain open. The next #100 implementation begins bounded foreground same-extension launch/context and owner transfer; its new Android behavior is not yet verified. + +[Bounded foreground command handoff #100](EXTENSION-COMMAND-HANDOFF.md) now reaches the frozen Quick Translate child with explicit copied context and no inherited raw reviewed-input grant. The repaired `56134f31` app has 44 final positive executions across 34 whole cohorts and 654 successful restoration checks: owned lifecycle/data probes, selected 200%/landscape smoke, four configured real Quick Translate paths and affected caller regressions. Matched stale-Back/Preferences controls fail before the chrome-lifetime fix; the ordinary-setup timeout and an unexecuted legacy-evidence preflight remain distinct from their continuations. The checkpoint binds 49 real capture sets, 220 current source hashes, exact binaries and declared projections. JVM289 and Python111/mode receipts, builds and fresh lint0 errors/55 warnings support the scoped change. Hosted CI, both independent sol/high audits and expected-head merge remain gates. This clears neither full launch API/Store parity nor #95/#72; #101, #89, accessibility/OEM and signing/migration remain open. diff --git a/docs/screenshots/command-handoff/critical-context-landscape100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png b/docs/screenshots/command-handoff/critical-context-landscape100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png new file mode 100644 index 00000000..c7853b20 Binary files /dev/null and b/docs/screenshots/command-handoff/critical-context-landscape100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png differ diff --git a/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png b/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png new file mode 100644 index 00000000..86ed69f1 Binary files /dev/null and b/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png differ diff --git a/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png b/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png new file mode 100644 index 00000000..6a32e80f Binary files /dev/null and b/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png differ diff --git a/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png b/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png new file mode 100644 index 00000000..377d05de Binary files /dev/null and b/docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png differ diff --git a/docs/screenshots/command-handoff/critical-context-phone200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png b/docs/screenshots/command-handoff/critical-context-phone200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png new file mode 100644 index 00000000..8909e2a9 Binary files /dev/null and b/docs/screenshots/command-handoff/critical-context-phone200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png differ diff --git a/docs/screenshots/command-handoff/critical-context-tablet200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png b/docs/screenshots/command-handoff/critical-context-tablet200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png new file mode 100644 index 00000000..81b8661d Binary files /dev/null and b/docs/screenshots/command-handoff/critical-context-tablet200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png differ diff --git a/docs/screenshots/command-handoff/critical-invalid-landscape200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png b/docs/screenshots/command-handoff/critical-invalid-landscape200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png new file mode 100644 index 00000000..a748f701 Binary files /dev/null and b/docs/screenshots/command-handoff/critical-invalid-landscape200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png differ diff --git a/docs/screenshots/command-handoff/critical-invalid-phone200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png b/docs/screenshots/command-handoff/critical-invalid-phone200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png new file mode 100644 index 00000000..692270c0 Binary files /dev/null and b/docs/screenshots/command-handoff/critical-invalid-phone200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png differ diff --git a/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png new file mode 100644 index 00000000..96cf9077 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png differ diff --git a/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png new file mode 100644 index 00000000..4c227127 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png differ diff --git a/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png new file mode 100644 index 00000000..bbc22430 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png differ diff --git a/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png new file mode 100644 index 00000000..f71a5b86 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png new file mode 100644 index 00000000..75c379fd Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png new file mode 100644 index 00000000..99044264 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png new file mode 100644 index 00000000..d2a9a0da Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png new file mode 100644 index 00000000..fb353ee5 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png new file mode 100644 index 00000000..f9249c7b Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png new file mode 100644 index 00000000..706cacce Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png new file mode 100644 index 00000000..e5bf11e5 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png differ diff --git a/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png new file mode 100644 index 00000000..6d1d4f9d Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png differ diff --git a/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png new file mode 100644 index 00000000..cd2d9793 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png differ diff --git a/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png new file mode 100644 index 00000000..8f1b467d Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png differ diff --git a/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png new file mode 100644 index 00000000..36fd8976 Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png differ diff --git a/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png new file mode 100644 index 00000000..f7bd30fe Binary files /dev/null and b/docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png differ diff --git a/docs/screenshots/command-handoff/matched-lifetime-preferences-old-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png b/docs/screenshots/command-handoff/matched-lifetime-preferences-old-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png new file mode 100644 index 00000000..55e185fc Binary files /dev/null and b/docs/screenshots/command-handoff/matched-lifetime-preferences-old-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png differ diff --git a/docs/screenshots/command-handoff/matched-lifetime-recreation-old-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-failure.png b/docs/screenshots/command-handoff/matched-lifetime-recreation-old-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-failure.png new file mode 100644 index 00000000..3fd08380 Binary files /dev/null and b/docs/screenshots/command-handoff/matched-lifetime-recreation-old-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-failure.png differ diff --git a/docs/screenshots/command-handoff/matched-quick-old-phone100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png b/docs/screenshots/command-handoff/matched-quick-old-phone100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png new file mode 100644 index 00000000..b834d506 Binary files /dev/null and b/docs/screenshots/command-handoff/matched-quick-old-phone100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png differ diff --git a/docs/screenshots/command-handoff/matched-quick-old-tablet100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png b/docs/screenshots/command-handoff/matched-quick-old-tablet100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png new file mode 100644 index 00000000..14e13302 Binary files /dev/null and b/docs/screenshots/command-handoff/matched-quick-old-tablet100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png differ diff --git a/docs/screenshots/command-handoff/owned-cancel-phone100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png b/docs/screenshots/command-handoff/owned-cancel-phone100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png new file mode 100644 index 00000000..cba996a2 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-cancel-phone100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png differ diff --git a/docs/screenshots/command-handoff/owned-cancel-tablet100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png b/docs/screenshots/command-handoff/owned-cancel-tablet100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png new file mode 100644 index 00000000..ccb19b49 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-cancel-tablet100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png differ diff --git a/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png b/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png new file mode 100644 index 00000000..c38829c3 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png differ diff --git a/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png b/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png new file mode 100644 index 00000000..338afdfa Binary files /dev/null and b/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png differ diff --git a/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png b/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png new file mode 100644 index 00000000..b156840a Binary files /dev/null and b/docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png differ diff --git a/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png b/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png new file mode 100644 index 00000000..bac59cf8 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png differ diff --git a/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png b/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png new file mode 100644 index 00000000..5b661bef Binary files /dev/null and b/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png differ diff --git a/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png b/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png new file mode 100644 index 00000000..40ccfa5d Binary files /dev/null and b/docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png differ diff --git a/docs/screenshots/command-handoff/owned-invalid-phone100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png b/docs/screenshots/command-handoff/owned-invalid-phone100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png new file mode 100644 index 00000000..cc1f52f5 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-invalid-phone100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png differ diff --git a/docs/screenshots/command-handoff/owned-invalid-tablet100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png b/docs/screenshots/command-handoff/owned-invalid-tablet100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png new file mode 100644 index 00000000..451a249f Binary files /dev/null and b/docs/screenshots/command-handoff/owned-invalid-tablet100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png differ diff --git a/docs/screenshots/command-handoff/owned-ordinary-phone100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png b/docs/screenshots/command-handoff/owned-ordinary-phone100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png new file mode 100644 index 00000000..2d747f81 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-ordinary-phone100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png differ diff --git a/docs/screenshots/command-handoff/owned-ordinary-tablet100-v2/handoff-ordinaryrelaunchclearscontextandfallback-failure.png b/docs/screenshots/command-handoff/owned-ordinary-tablet100-v2/handoff-ordinaryrelaunchclearscontextandfallback-failure.png new file mode 100644 index 00000000..fabe7bab Binary files /dev/null and b/docs/screenshots/command-handoff/owned-ordinary-tablet100-v2/handoff-ordinaryrelaunchclearscontextandfallback-failure.png differ diff --git a/docs/screenshots/command-handoff/owned-ordinary-tablet100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png b/docs/screenshots/command-handoff/owned-ordinary-tablet100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png new file mode 100644 index 00000000..81bf8302 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-ordinary-tablet100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png differ diff --git a/docs/screenshots/command-handoff/owned-preferences-phone100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png b/docs/screenshots/command-handoff/owned-preferences-phone100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png new file mode 100644 index 00000000..2b632867 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-preferences-phone100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png differ diff --git a/docs/screenshots/command-handoff/owned-preferences-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png b/docs/screenshots/command-handoff/owned-preferences-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png new file mode 100644 index 00000000..9b23d5f0 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-preferences-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png differ diff --git a/docs/screenshots/command-handoff/owned-recreation-phone100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png b/docs/screenshots/command-handoff/owned-recreation-phone100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png new file mode 100644 index 00000000..449e907f Binary files /dev/null and b/docs/screenshots/command-handoff/owned-recreation-phone100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png differ diff --git a/docs/screenshots/command-handoff/owned-recreation-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png b/docs/screenshots/command-handoff/owned-recreation-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png new file mode 100644 index 00000000..b173cf13 Binary files /dev/null and b/docs/screenshots/command-handoff/owned-recreation-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png differ diff --git a/docs/screenshots/command-handoff/protocol-ack-phone100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png b/docs/screenshots/command-handoff/protocol-ack-phone100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png new file mode 100644 index 00000000..bef8b268 Binary files /dev/null and b/docs/screenshots/command-handoff/protocol-ack-phone100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png differ diff --git a/docs/screenshots/command-handoff/protocol-ack-tablet100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png b/docs/screenshots/command-handoff/protocol-ack-tablet100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png new file mode 100644 index 00000000..cae1f20a Binary files /dev/null and b/docs/screenshots/command-handoff/protocol-ack-tablet100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png differ diff --git a/docs/screenshots/command-handoff/protocol-duplicate-phone100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png b/docs/screenshots/command-handoff/protocol-duplicate-phone100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png new file mode 100644 index 00000000..c6523732 Binary files /dev/null and b/docs/screenshots/command-handoff/protocol-duplicate-phone100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png differ diff --git a/docs/screenshots/command-handoff/protocol-duplicate-tablet100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png b/docs/screenshots/command-handoff/protocol-duplicate-tablet100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png new file mode 100644 index 00000000..f9c01c30 Binary files /dev/null and b/docs/screenshots/command-handoff/protocol-duplicate-tablet100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png differ diff --git a/docs/validation/command-handoff/checkpoint.json b/docs/validation/command-handoff/checkpoint.json new file mode 100644 index 00000000..2621ff2d --- /dev/null +++ b/docs/validation/command-handoff/checkpoint.json @@ -0,0 +1,8222 @@ +{ + "schema_version": 1, + "scope": "Bounded same-extension foreground handoff; owned lifecycle protocols plus the configured frozen Quick Translate path, not broad parity", + "source_head": "73e719c602bc378c71df83eba34440771bc8d999", + "source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "b66e3faeaab07b8a86bd6eb5b9d8ab27df6ff70b4341d577e98cab64ae4fa584", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "cohorts": [ + { + "name": "critical-context-landscape100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "critical-context-landscape200-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "critical-context-phone200-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "critical-context-tablet200-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "critical-invalid-landscape200-v2", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "critical-invalid-phone200-v2", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "final-quick-landscape200-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "final-quick-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "final-quick-phone200-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "final-quick-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "lifetime-preferences-old-tablet100-v1", + "category": "historical-failure", + "passes": 0, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "lifetime-recreation-old-tablet100-v1", + "category": "historical-failure", + "passes": 0, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "matched-lifetime-preferences-old-tablet100-v3", + "category": "final-matched-negative", + "passes": 0, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "matched-lifetime-recreation-old-tablet100-v3", + "category": "final-matched-negative", + "passes": 0, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "matched-quick-new-phone100-v1", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "matched-quick-new-tablet100-v1", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "matched-quick-old-phone100-v1", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "matched-quick-old-tablet100-v1", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + { + "name": "owned-ack-phone100-v3", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-ack-tablet100-v2", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-ack-tablet100-v3", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-cancel-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-cancel-tablet100-v2", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-cancel-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-context-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-context-tablet100-v1", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-context-tablet100-v2", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-context-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-duplicate-phone100-v3", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-duplicate-tablet100-v2", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-duplicate-tablet100-v3", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-invalid-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-invalid-tablet100-v2", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-invalid-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-ordinary-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-ordinary-tablet100-v2", + "category": "historical-failure", + "passes": 0, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-ordinary-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-preferences-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-preferences-tablet100-v2", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-preferences-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-recreation-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "owned-recreation-tablet100-v2", + "category": "historical-observation", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf" + }, + { + "name": "owned-recreation-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "protocol-ack-phone100-v4", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6" + }, + { + "name": "protocol-ack-tablet100-v4", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6" + }, + { + "name": "protocol-duplicate-phone100-v4", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6" + }, + { + "name": "protocol-duplicate-tablet100-v4", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6" + }, + { + "name": "regression-detail-phone100-v2", + "category": "final-positive", + "passes": 2, + "expected": 2, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "regression-detail-tablet100-v2", + "category": "final-positive", + "passes": 2, + "expected": 2, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "regression-forms-phone100-v2", + "category": "final-positive", + "passes": 4, + "expected": 4, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "regression-forms-tablet100-v2", + "category": "final-positive", + "passes": 4, + "expected": 4, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "regression-menus-phone100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 21, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "regression-menus-tablet100-v3", + "category": "final-positive", + "passes": 1, + "expected": 1, + "cleanup_checks": 19, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "regression-review-phone100-v2", + "category": "final-positive", + "passes": 2, + "expected": 2, + "cleanup_checks": 20, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + }, + { + "name": "regression-review-tablet100-v2", + "category": "final-positive", + "passes": 2, + "expected": 2, + "cleanup_checks": 18, + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a" + } + ], + "original_public_bindings": [ + { + "artifact": "critical-context-landscape100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/tests.log", + "original_sha256": "3b0d74c33224a76d6e09834b6a8b0a3007ce14e3b7bad780b0aeefa889c7febe", + "public_sha256": "3b0d74c33224a76d6e09834b6a8b0a3007ce14e3b7bad780b0aeefa889c7febe", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "8e28e9a4782f7d75e31b609d8e6b25e2f28baca5f28bd00406546d340e8aa41f", + "public_sha256": "8e28e9a4782f7d75e31b609d8e6b25e2f28baca5f28bd00406546d340e8aa41f", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/tests.log", + "original_sha256": "079db6650f608217ce369cfdd136edeff8601bda45160dd411d57b53f2a0288f", + "public_sha256": "079db6650f608217ce369cfdd136edeff8601bda45160dd411d57b53f2a0288f", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "7ae216930c3e449a727751a2ff9c331641031b84b01d3def4cf768e9c1404d95", + "public_sha256": "7ae216930c3e449a727751a2ff9c331641031b84b01d3def4cf768e9c1404d95", + "transformation": "identity" + }, + { + "artifact": "critical-context-phone200-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/tests.log", + "original_sha256": "92b24ab411386dae72a8fdd3384ae55f428f7e3a630c13e0308c064658be82eb", + "public_sha256": "92b24ab411386dae72a8fdd3384ae55f428f7e3a630c13e0308c064658be82eb", + "transformation": "identity" + }, + { + "artifact": "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "9fca631229db83946b63442ba44301ead9d36dc5c67ade3adfcaba87c866ae38", + "public_sha256": "9fca631229db83946b63442ba44301ead9d36dc5c67ade3adfcaba87c866ae38", + "transformation": "identity" + }, + { + "artifact": "critical-context-tablet200-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/tests.log", + "original_sha256": "9c6d4509c044588f809f87d08131373b8e11bbfa61df8c74db4c50d52f296eb8", + "public_sha256": "9c6d4509c044588f809f87d08131373b8e11bbfa61df8c74db4c50d52f296eb8", + "transformation": "identity" + }, + { + "artifact": "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "08447cdbc4246d1dc1f8314c4540566c0d0bf842a29041ec4ec472339d494633", + "public_sha256": "08447cdbc4246d1dc1f8314c4540566c0d0bf842a29041ec4ec472339d494633", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-landscape200-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/tests.log", + "original_sha256": "7f63763d8950d65447701e5bcd593f91f2999e05c1e859e658c97b04d45078b1", + "public_sha256": "7f63763d8950d65447701e5bcd593f91f2999e05c1e859e658c97b04d45078b1", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "original_sha256": "e82d2f3aed99ba4a0de084fd6bd09d0483a3694cc17c6f1fd20cc6e901817d7c", + "public_sha256": "e82d2f3aed99ba4a0de084fd6bd09d0483a3694cc17c6f1fd20cc6e901817d7c", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-phone200-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/tests.log", + "original_sha256": "ec848983571f492e2bad0f307f0aacefdcbb98853670d55e49da452daa51b7c9", + "public_sha256": "ec848983571f492e2bad0f307f0aacefdcbb98853670d55e49da452daa51b7c9", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "original_sha256": "8499938efd1d272a2a5c869b56db3c4e2e4b1b98dd99315544c263ead4d068d5", + "public_sha256": "8499938efd1d272a2a5c869b56db3c4e2e4b1b98dd99315544c263ead4d068d5", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/tests.log", + "original_sha256": "e4309f0ffa80f122f1f3ab478f10120e190575107a2f287e0d0ff15e324145e5", + "public_sha256": "e4309f0ffa80f122f1f3ab478f10120e190575107a2f287e0d0ff15e324145e5", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "944ef9ed484a8222de3e043410e945dc9d570ec07e2de1f7057f87cfb2ae9c17", + "public_sha256": "944ef9ed484a8222de3e043410e945dc9d570ec07e2de1f7057f87cfb2ae9c17", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/tests.log", + "original_sha256": "3801f4c35fb2e2277cb30a0b76869e1ea60a205efe9fe607e5cca943b7eca50b", + "public_sha256": "3801f4c35fb2e2277cb30a0b76869e1ea60a205efe9fe607e5cca943b7eca50b", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "18eac10e1ea8a5cdc52f8027e562fe33688dd7f8a55a36130d851c069b0bf786", + "public_sha256": "18eac10e1ea8a5cdc52f8027e562fe33688dd7f8a55a36130d851c069b0bf786", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/tests.log", + "original_sha256": "5233e57bb3f5502f67c610df6f59308ba4269c812e6af18da47f7d5a91a029a6", + "public_sha256": "5233e57bb3f5502f67c610df6f59308ba4269c812e6af18da47f7d5a91a029a6", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "bcf4200c7cac6dfc06688a5beda2521df0840fcac8713f9ed7bd9396c4219cea", + "public_sha256": "bcf4200c7cac6dfc06688a5beda2521df0840fcac8713f9ed7bd9396c4219cea", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/tests.log", + "original_sha256": "abb0cf96969db72514855c1febbabba9ae60da346e5b6f895fea4baa4a30df87", + "public_sha256": "abb0cf96969db72514855c1febbabba9ae60da346e5b6f895fea4baa4a30df87", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "7b68b335178c7fdf8d69ea8ee6b11d9247f504d090440cf47665dd71d3ffaa59", + "public_sha256": "7b68b335178c7fdf8d69ea8ee6b11d9247f504d090440cf47665dd71d3ffaa59", + "transformation": "identity" + }, + { + "artifact": "lifetime-preferences-old-tablet100-v1/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/tests.log", + "original_sha256": "29c302ecbe282c4602deddb5a624fcd62035017a17b51b1c0121e56a1b2a1f4d", + "public_sha256": "29c302ecbe282c4602deddb5a624fcd62035017a17b51b1c0121e56a1b2a1f4d", + "transformation": "identity" + }, + { + "artifact": "lifetime-preferences-old-tablet100-v1/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "public": "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "original_sha256": "6d3276a448be008c750333e300d1b942e69c57b903ad6513264de3dbe12e14b5", + "public_sha256": "6d3276a448be008c750333e300d1b942e69c57b903ad6513264de3dbe12e14b5", + "transformation": "identity" + }, + { + "artifact": "lifetime-recreation-old-tablet100-v1/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/tests.log", + "original_sha256": "0967c61d61a6d649c61a96ed121bf433575c1129790b116e00c8bfadfb3da62d", + "public_sha256": "0967c61d61a6d649c61a96ed121bf433575c1129790b116e00c8bfadfb3da62d", + "transformation": "identity" + }, + { + "artifact": "lifetime-recreation-old-tablet100-v1/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "public": "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "original_sha256": "8edae1f374953e3f8e51db8d0dee35b9d44fdb3ca7ae2938a3d0f7b870c4132e", + "public_sha256": "8edae1f374953e3f8e51db8d0dee35b9d44fdb3ca7ae2938a3d0f7b870c4132e", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-preferences-old-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/tests.log", + "original_sha256": "8bb5cfc7bbf98da9c6ba052beb4dd56d58ed4fb312b56f52b2e13cf11ff8941e", + "public_sha256": "8bb5cfc7bbf98da9c6ba052beb4dd56d58ed4fb312b56f52b2e13cf11ff8941e", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "original_sha256": "e8bd09a8ce85887161517533e3ea9ce1dd24f3da626debb4ef8bd2f62be42688", + "public_sha256": "e8bd09a8ce85887161517533e3ea9ce1dd24f3da626debb4ef8bd2f62be42688", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-recreation-old-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/tests.log", + "original_sha256": "8a7c3e67af8e8a69931787bd29c1d3372afdf0a7ed93b6e450d429e412fae8d5", + "public_sha256": "8a7c3e67af8e8a69931787bd29c1d3372afdf0a7ed93b6e450d429e412fae8d5", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "original_sha256": "874f128bfa8cb0c29a53de237e3cd4178e40fab8ad0a00d48160494752e9f4b8", + "public_sha256": "874f128bfa8cb0c29a53de237e3cd4178e40fab8ad0a00d48160494752e9f4b8", + "transformation": "identity" + }, + { + "artifact": "matched-quick-new-phone100-v1/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/tests.log", + "original_sha256": "66c258ef247988173b9f9c207999fa202750be460e0c80997ce5a046c08fd851", + "public_sha256": "66c258ef247988173b9f9c207999fa202750be460e0c80997ce5a046c08fd851", + "transformation": "identity" + }, + { + "artifact": "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "f13c55316a079128f361b0cbb8f3e8bed3e643e11e5b3b0a2b32d697ac2468e3", + "public_sha256": "f13c55316a079128f361b0cbb8f3e8bed3e643e11e5b3b0a2b32d697ac2468e3", + "transformation": "identity" + }, + { + "artifact": "matched-quick-new-tablet100-v1/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/tests.log", + "original_sha256": "f15f33493bfe9eeef8a73e0ce9984c65727030606f570321c83794b30fb0cf78", + "public_sha256": "f15f33493bfe9eeef8a73e0ce9984c65727030606f570321c83794b30fb0cf78", + "transformation": "identity" + }, + { + "artifact": "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "e4d37233c850436b58b8d33c944b09edaabde4ef7db70a3ef495b707fc278827", + "public_sha256": "e4d37233c850436b58b8d33c944b09edaabde4ef7db70a3ef495b707fc278827", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-phone100-v1/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/tests.log", + "original_sha256": "493d797366077bca792567ff78b37b668871e25581a537f98119bd35f75c3b31", + "public_sha256": "493d797366077bca792567ff78b37b668871e25581a537f98119bd35f75c3b31", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "037458451c0b74c20c2454f61ad3724035c4c2d65ae0cb8358610b171cc3a0de", + "public_sha256": "037458451c0b74c20c2454f61ad3724035c4c2d65ae0cb8358610b171cc3a0de", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-tablet100-v1/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/tests.log", + "original_sha256": "6a19782d01cda9229de2464c2bae6bf9e9ad13875e067ba53a4c26f6dac638d2", + "public_sha256": "6a19782d01cda9229de2464c2bae6bf9e9ad13875e067ba53a4c26f6dac638d2", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json", + "original_sha256": "e1834caf56b69587c0706db34a91e382c62c267136247986532dd9cdcc452c94", + "public_sha256": "e1834caf56b69587c0706db34a91e382c62c267136247986532dd9cdcc452c94", + "transformation": "identity" + }, + { + "artifact": "owned-ack-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/tests.log", + "original_sha256": "290fbea40d2e39601e0d01b1acdc9f6cb236f9e63b454c70fa3ecdab30df6797", + "public_sha256": "290fbea40d2e39601e0d01b1acdc9f6cb236f9e63b454c70fa3ecdab30df6797", + "transformation": "identity" + }, + { + "artifact": "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "original_sha256": "44dbe6e97b14fdf1799cafda6c7cd9299288e3a469cbbaa35a0aaaedd84b9020", + "public_sha256": "44dbe6e97b14fdf1799cafda6c7cd9299288e3a469cbbaa35a0aaaedd84b9020", + "transformation": "identity" + }, + { + "artifact": "owned-ack-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/tests.log", + "original_sha256": "3e7b766b130f05b877fb8f9baf2ac7c8a4a3c6b81c9b5ea8964ba8cd5fa38c3c", + "public_sha256": "3e7b766b130f05b877fb8f9baf2ac7c8a4a3c6b81c9b5ea8964ba8cd5fa38c3c", + "transformation": "identity" + }, + { + "artifact": "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "original_sha256": "a1e2942e9d7afed367ee76cad4e58f3238e253c1ff12ac011b47317bea20516e", + "public_sha256": "a1e2942e9d7afed367ee76cad4e58f3238e253c1ff12ac011b47317bea20516e", + "transformation": "identity" + }, + { + "artifact": "owned-ack-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/tests.log", + "original_sha256": "b383d4932779b3975867651774464a5445116873ab02c7df175712d23ce44935", + "public_sha256": "b383d4932779b3975867651774464a5445116873ab02c7df175712d23ce44935", + "transformation": "identity" + }, + { + "artifact": "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "original_sha256": "080cc67f9935c9f96378e8aa934a6cf80123155ad12070761c420543d1dfc392", + "public_sha256": "080cc67f9935c9f96378e8aa934a6cf80123155ad12070761c420543d1dfc392", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/tests.log", + "original_sha256": "02cd1bf9a76ec04f9c248225d7c88c1e4819f1c1f5b161f28d9e5480bd0baf66", + "public_sha256": "02cd1bf9a76ec04f9c248225d7c88c1e4819f1c1f5b161f28d9e5480bd0baf66", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json", + "original_sha256": "5fc6e55c648a6f23b2cd867fd1f28bbbc6d7bf0bf8cd3b5df6971924ee0ba6e0", + "public_sha256": "5fc6e55c648a6f23b2cd867fd1f28bbbc6d7bf0bf8cd3b5df6971924ee0ba6e0", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/tests.log", + "original_sha256": "a4a4354c0a5938625f6885ca4b155c8924bc6dd60b6536d65b77e20ce5bc59fc", + "public_sha256": "a4a4354c0a5938625f6885ca4b155c8924bc6dd60b6536d65b77e20ce5bc59fc", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-tablet100-v2/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json", + "original_sha256": "09b65fa722036f3c348a9db21d27c0356fb85afe0742df3387fc2a560728e27a", + "public_sha256": "09b65fa722036f3c348a9db21d27c0356fb85afe0742df3387fc2a560728e27a", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/tests.log", + "original_sha256": "8c038aaa358ecce926a02e24a8d4c88b889ba6e5eb51a6df561e66eedc2c9145", + "public_sha256": "8c038aaa358ecce926a02e24a8d4c88b889ba6e5eb51a6df561e66eedc2c9145", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json", + "original_sha256": "9d5bed02cab05fa0f472cc03c3e97252533c55f5ca5f49f546a05ce891b9736e", + "public_sha256": "9d5bed02cab05fa0f472cc03c3e97252533c55f5ca5f49f546a05ce891b9736e", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/tests.log", + "original_sha256": "394692b9e70016e9e7eb1839176f9f79f9012b8387d1f5844d5b450168dc365b", + "public_sha256": "394692b9e70016e9e7eb1839176f9f79f9012b8387d1f5844d5b450168dc365b", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "1d5afd01fdce55ec472c2ab314005e1f753b14ecf264a66d7de3c87454a766f6", + "public_sha256": "1d5afd01fdce55ec472c2ab314005e1f753b14ecf264a66d7de3c87454a766f6", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v1/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/tests.log", + "original_sha256": "21f3f52b4e620d34e731cd12ecc7e0aff0b764feff798c230c75c2490db3f5a2", + "public_sha256": "21f3f52b4e620d34e731cd12ecc7e0aff0b764feff798c230c75c2490db3f5a2", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "5b35272dac515e70fc9ab65bf7fd91d8f382a49f36eca53b074d795e198ec242", + "public_sha256": "5b35272dac515e70fc9ab65bf7fd91d8f382a49f36eca53b074d795e198ec242", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/tests.log", + "original_sha256": "302ba3d2d3063897852b188bc972bd589f51deaf603b9e3aa52c5698cefc7a26", + "public_sha256": "302ba3d2d3063897852b188bc972bd589f51deaf603b9e3aa52c5698cefc7a26", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "1c3c4e1a79770de4102611ac444bf13cfa15089765a010014875ca1b3ac122ac", + "public_sha256": "1c3c4e1a79770de4102611ac444bf13cfa15089765a010014875ca1b3ac122ac", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/tests.log", + "original_sha256": "baea72436b0941943acb30610b96759a48c0581e66e76d6677ca60fe88c7d9ca", + "public_sha256": "baea72436b0941943acb30610b96759a48c0581e66e76d6677ca60fe88c7d9ca", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json", + "original_sha256": "669fabf0f4aa7f92287c00df6973f036252db9432dc862d8e20ce6b020daa381", + "public_sha256": "669fabf0f4aa7f92287c00df6973f036252db9432dc862d8e20ce6b020daa381", + "transformation": "identity" + }, + { + "artifact": "owned-duplicate-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/tests.log", + "original_sha256": "862ced95ac5ae3e60a125fe575ca85133b141a6e8402070806b9d38c41c9f9e6", + "public_sha256": "862ced95ac5ae3e60a125fe575ca85133b141a6e8402070806b9d38c41c9f9e6", + "transformation": "identity" + }, + { + "artifact": "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "original_sha256": "b73acce37b7223516cb21d1b8c86b6894a96f34c519977ce7519d5e51ace13d0", + "public_sha256": "b73acce37b7223516cb21d1b8c86b6894a96f34c519977ce7519d5e51ace13d0", + "transformation": "identity" + }, + { + "artifact": "owned-duplicate-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/tests.log", + "original_sha256": "db40fee0b8d093df0ddb1811de797add465d9b47b528f6b74c326af2bbe09317", + "public_sha256": "db40fee0b8d093df0ddb1811de797add465d9b47b528f6b74c326af2bbe09317", + "transformation": "identity" + }, + { + "artifact": "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "original_sha256": "ee37c13e13b67784f18d1bc73942f65c4e2e7fc2f0c85fed703417854b29de52", + "public_sha256": "ee37c13e13b67784f18d1bc73942f65c4e2e7fc2f0c85fed703417854b29de52", + "transformation": "identity" + }, + { + "artifact": "owned-duplicate-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/tests.log", + "original_sha256": "18b8c8988ddb05bdff41e499c65596db33b1318b8631c5328bdfa5bed920e4d8", + "public_sha256": "18b8c8988ddb05bdff41e499c65596db33b1318b8631c5328bdfa5bed920e4d8", + "transformation": "identity" + }, + { + "artifact": "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "original_sha256": "e65a9d7dfb62aad90f07d048bb9fb27ea229bf219c4da4c5ad31ad56bd6619d6", + "public_sha256": "e65a9d7dfb62aad90f07d048bb9fb27ea229bf219c4da4c5ad31ad56bd6619d6", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/tests.log", + "original_sha256": "e84efd600af01c2f25b2c81193d5fc04bf6e5e94d59a1b7f3878ecae6ab1238c", + "public_sha256": "e84efd600af01c2f25b2c81193d5fc04bf6e5e94d59a1b7f3878ecae6ab1238c", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "original_sha256": "5a8009f47850dff8b612b6cf78c16ae8f5fc0491607e8f21a6cb89b451ac2697", + "public_sha256": "5a8009f47850dff8b612b6cf78c16ae8f5fc0491607e8f21a6cb89b451ac2697", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/tests.log", + "original_sha256": "f9dbe0d67ffb2f5c8bd9734dd2b4699745558d3600b0fa6e167d7cb9b5e55d76", + "public_sha256": "f9dbe0d67ffb2f5c8bd9734dd2b4699745558d3600b0fa6e167d7cb9b5e55d76", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "original_sha256": "32097bf27a4972766592839d0d1ff1628920d7cb25301bd1efb04fffe22e5ab7", + "public_sha256": "32097bf27a4972766592839d0d1ff1628920d7cb25301bd1efb04fffe22e5ab7", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/tests.log", + "original_sha256": "957342e76cc068baa363031980e5808f15f3354e31b84bb1fb96d54f0bbeadf6", + "public_sha256": "957342e76cc068baa363031980e5808f15f3354e31b84bb1fb96d54f0bbeadf6", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json", + "original_sha256": "42d4ef12b071e6351e533f26ed7c17e82d0d169d4872b86a26271d4ebf0b83d1", + "public_sha256": "42d4ef12b071e6351e533f26ed7c17e82d0d169d4872b86a26271d4ebf0b83d1", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/tests.log", + "original_sha256": "f13b70a8801310d8efc5a383b7a093b648a41aae196e8a0b6d2751dc0ef7854f", + "public_sha256": "f13b70a8801310d8efc5a383b7a093b648a41aae196e8a0b6d2751dc0ef7854f", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json", + "original_sha256": "5325fbd707275c874fa4ee46143e9ca9bcfd6183568772da1592c8abb2681cce", + "public_sha256": "5325fbd707275c874fa4ee46143e9ca9bcfd6183568772da1592c8abb2681cce", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/tests.log", + "original_sha256": "ca84a11955af1f2f83b56d480b7c753b9e38f4e0b8d2dda58b8e903fce735500", + "public_sha256": "ca84a11955af1f2f83b56d480b7c753b9e38f4e0b8d2dda58b8e903fce735500", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json", + "original_sha256": "4f96570ca22a198467ca85e0102b27ecb2a7ce82202fa4e0053be9868826e905", + "public_sha256": "4f96570ca22a198467ca85e0102b27ecb2a7ce82202fa4e0053be9868826e905", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/tests.log", + "original_sha256": "df30ce934fc48e87791e33ba33a8a07a119826b75199743890af2d22432ef583", + "public_sha256": "df30ce934fc48e87791e33ba33a8a07a119826b75199743890af2d22432ef583", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json", + "original_sha256": "0a201aba23b2b4cab4fe2f6ff934a1f3aa12616e7c15c3774d66f8bfd9c0ece5", + "public_sha256": "0a201aba23b2b4cab4fe2f6ff934a1f3aa12616e7c15c3774d66f8bfd9c0ece5", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/tests.log", + "original_sha256": "1ac639b211b0ec58dd33293422da4b26d8bad6fa42cfd3fa448782b5648baabc", + "public_sha256": "1ac639b211b0ec58dd33293422da4b26d8bad6fa42cfd3fa448782b5648baabc", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "original_sha256": "0046bdc0d1c7637ff7dbdeebd1b317729f0a47caa3341ece69fd9a4b2fe751c4", + "public_sha256": "0046bdc0d1c7637ff7dbdeebd1b317729f0a47caa3341ece69fd9a4b2fe751c4", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/tests.log", + "original_sha256": "b37a4c48c5381102c8c57e222e9657c2ac0bfea0bf3f0bf589af8582f780c17a", + "public_sha256": "b37a4c48c5381102c8c57e222e9657c2ac0bfea0bf3f0bf589af8582f780c17a", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "original_sha256": "54c78bac5770b924230e8ce09ab721486af5ec60349918fb282041eff6cd0121", + "public_sha256": "54c78bac5770b924230e8ce09ab721486af5ec60349918fb282041eff6cd0121", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/tests.log", + "original_sha256": "caac7e8f3f1cd84fbdfd44392ad9fd43a0e7963d94f4fd6111ce265bc619a071", + "public_sha256": "caac7e8f3f1cd84fbdfd44392ad9fd43a0e7963d94f4fd6111ce265bc619a071", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json", + "original_sha256": "f541fd0848c0f5b03508aba2bd4f80ea45eb09331baac98117ecd18e26ebb72f", + "public_sha256": "f541fd0848c0f5b03508aba2bd4f80ea45eb09331baac98117ecd18e26ebb72f", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/tests.log", + "original_sha256": "3670d9bb87e5a57bde0b4b8064526be35f3ece0943f741790b7b366423adb175", + "public_sha256": "3670d9bb87e5a57bde0b4b8064526be35f3ece0943f741790b7b366423adb175", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "original_sha256": "848b45803ec2987b50d8c55973b2b31f49cf2534db429eb581753f66734facd0", + "public_sha256": "848b45803ec2987b50d8c55973b2b31f49cf2534db429eb581753f66734facd0", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/tests.log", + "original_sha256": "915aca38afcf710337e3939b4adb2e237be4cc730a9f0e5b5349dfa10a55be58", + "public_sha256": "915aca38afcf710337e3939b4adb2e237be4cc730a9f0e5b5349dfa10a55be58", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "original_sha256": "fb359c77047e275a9b1844d08f3225c7424f33e79586a05cb4e61a7eed578361", + "public_sha256": "fb359c77047e275a9b1844d08f3225c7424f33e79586a05cb4e61a7eed578361", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/tests.log", + "original_sha256": "711321ce660aad4f45e2e351c7147f567e2ff3d253c619bcc8a9fcca26ef3007", + "public_sha256": "711321ce660aad4f45e2e351c7147f567e2ff3d253c619bcc8a9fcca26ef3007", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json", + "original_sha256": "861746c1df8fc8399bc2aae5b9963ffb617ab534dc8f010fa99f9ebe1f95cdcd", + "public_sha256": "861746c1df8fc8399bc2aae5b9963ffb617ab534dc8f010fa99f9ebe1f95cdcd", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-phone100-v4/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/tests.log", + "original_sha256": "5a51bb494c7d51270e167035332e819b7161167d77e1cd6bccf0c5e7c5d72887", + "public_sha256": "5a51bb494c7d51270e167035332e819b7161167d77e1cd6bccf0c5e7c5d72887", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "original_sha256": "62e74db2c20d1d26888441b583a8a257ef6bbdee1ee85eecf4a8adf7670e0d25", + "public_sha256": "62e74db2c20d1d26888441b583a8a257ef6bbdee1ee85eecf4a8adf7670e0d25", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-tablet100-v4/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/tests.log", + "original_sha256": "b43b125eb4ac715a7ea1c19520314470739f6d5943d3a6583be60839193f2ac7", + "public_sha256": "b43b125eb4ac715a7ea1c19520314470739f6d5943d3a6583be60839193f2ac7", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json", + "original_sha256": "2f70aadf4cd367019871f71b1408214cbbdf52079f0daac722491f9f63b78029", + "public_sha256": "2f70aadf4cd367019871f71b1408214cbbdf52079f0daac722491f9f63b78029", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-phone100-v4/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/tests.log", + "original_sha256": "457c31b0a839366d9d1217ae900fba753a9349702e2dfbd6ae20d0d6dd7060bd", + "public_sha256": "457c31b0a839366d9d1217ae900fba753a9349702e2dfbd6ae20d0d6dd7060bd", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "original_sha256": "f1b6356ece1bc3fb64190ef90b995fac53c88b6da8f21aec86d4353531e74ddb", + "public_sha256": "f1b6356ece1bc3fb64190ef90b995fac53c88b6da8f21aec86d4353531e74ddb", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-tablet100-v4/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/tests.log", + "original_sha256": "72695a34f292f38a07b389830c293e41502b027cdee6b816a5a83e759ed3e5fc", + "public_sha256": "72695a34f292f38a07b389830c293e41502b027cdee6b816a5a83e759ed3e5fc", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json", + "original_sha256": "ba80ba361126ab7939114f369bfb1fdfb341b084c339fb2cde75f4beabe27989", + "public_sha256": "ba80ba361126ab7939114f369bfb1fdfb341b084c339fb2cde75f4beabe27989", + "transformation": "identity" + }, + { + "artifact": "regression-detail-phone100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/tests.log", + "original_sha256": "f14366d977912048ce1dd95bd1714a08bdfc4710cceadf95f9729083ef862836", + "public_sha256": "f14366d977912048ce1dd95bd1714a08bdfc4710cceadf95f9729083ef862836", + "transformation": "identity" + }, + { + "artifact": "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json", + "original_sha256": "640546e998d74390479371f23fc4fef1f1c2071acdefb840566b7b94bfa5b203", + "public_sha256": "640546e998d74390479371f23fc4fef1f1c2071acdefb840566b7b94bfa5b203", + "transformation": "identity" + }, + { + "artifact": "regression-detail-phone100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json", + "original_sha256": "79de70b94b21f7976ec777f492156b50b08e25bbc1d04af5dd03e479fec08bd8", + "public_sha256": "79de70b94b21f7976ec777f492156b50b08e25bbc1d04af5dd03e479fec08bd8", + "transformation": "identity" + }, + { + "artifact": "regression-detail-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/tests.log", + "original_sha256": "dabfe896a56ec3c18d232f38dfeeecbda0821ea4f9f82b9d3fc714c2dd148fdb", + "public_sha256": "dabfe896a56ec3c18d232f38dfeeecbda0821ea4f9f82b9d3fc714c2dd148fdb", + "transformation": "identity" + }, + { + "artifact": "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json", + "original_sha256": "b4b1d0a30b159e2949a8fc368fcda592f58776b02407c3072f55df52fefea994", + "public_sha256": "b4b1d0a30b159e2949a8fc368fcda592f58776b02407c3072f55df52fefea994", + "transformation": "identity" + }, + { + "artifact": "regression-detail-tablet100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json", + "original_sha256": "31562ddecc201df18b56fab6209439d928528aa48671f58e5a812d07f4e778eb", + "public_sha256": "31562ddecc201df18b56fab6209439d928528aa48671f58e5a812d07f4e778eb", + "transformation": "identity" + }, + { + "artifact": "regression-forms-phone100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/tests.log", + "original_sha256": "033078a2df40371cf7100b7711bf91854b99d3908810dc3ad102929f2585571b", + "public_sha256": "033078a2df40371cf7100b7711bf91854b99d3908810dc3ad102929f2585571b", + "transformation": "identity" + }, + { + "artifact": "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json", + "original_sha256": "cfba77da3390ed7a598856b96c78a350ba2ef870d5337c1a3aeadfa48017de6c", + "public_sha256": "cfba77da3390ed7a598856b96c78a350ba2ef870d5337c1a3aeadfa48017de6c", + "transformation": "identity" + }, + { + "artifact": "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json", + "original_sha256": "784e5656b6b5bc11129c110689b85bc4945eb3e2d0474ab04e9d870e30b47e9a", + "public_sha256": "784e5656b6b5bc11129c110689b85bc4945eb3e2d0474ab04e9d870e30b47e9a", + "transformation": "identity" + }, + { + "artifact": "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json", + "original_sha256": "c8eea1e6ad24160c08866056687cb8a019f0929aa776a514c4925fdb39320e0c", + "public_sha256": "c8eea1e6ad24160c08866056687cb8a019f0929aa776a514c4925fdb39320e0c", + "transformation": "identity" + }, + { + "artifact": "regression-forms-phone100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json", + "original_sha256": "7e3396563bc7c2dacb6af9d1d424f139384fa743b9063fbb2583533b850e6da4", + "public_sha256": "7e3396563bc7c2dacb6af9d1d424f139384fa743b9063fbb2583533b850e6da4", + "transformation": "identity" + }, + { + "artifact": "regression-forms-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/tests.log", + "original_sha256": "c30b14e555397d33af5b658f81c1fe5f1bcd7bf425a1220ce9682538f5b1f67e", + "public_sha256": "c30b14e555397d33af5b658f81c1fe5f1bcd7bf425a1220ce9682538f5b1f67e", + "transformation": "identity" + }, + { + "artifact": "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json", + "original_sha256": "862b93f2a6d155b3b203d95a9e92aef3adc43d490f5b1d7ab93efc4c49799db9", + "public_sha256": "862b93f2a6d155b3b203d95a9e92aef3adc43d490f5b1d7ab93efc4c49799db9", + "transformation": "identity" + }, + { + "artifact": "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json", + "original_sha256": "8ba93d57f29c23abe7c97e79d460975d37c2efafffaed4549b673a6eda185a5a", + "public_sha256": "8ba93d57f29c23abe7c97e79d460975d37c2efafffaed4549b673a6eda185a5a", + "transformation": "identity" + }, + { + "artifact": "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json", + "original_sha256": "adca0b75cd73e7472ea25cb78d479f7f302326610a41faf684b54270758fc76c", + "public_sha256": "adca0b75cd73e7472ea25cb78d479f7f302326610a41faf684b54270758fc76c", + "transformation": "identity" + }, + { + "artifact": "regression-forms-tablet100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json", + "original_sha256": "b39a7d4e64667a8921e482c48c4311e3b769b197a21efd40098da2b6be1c8ee2", + "public_sha256": "b39a7d4e64667a8921e482c48c4311e3b769b197a21efd40098da2b6be1c8ee2", + "transformation": "identity" + }, + { + "artifact": "regression-menus-phone100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/tests.log", + "original_sha256": "7a7fbb2fcb6d083194e04fe7c74a13b662db265cedbe2893751a4da5550a224b", + "public_sha256": "7a7fbb2fcb6d083194e04fe7c74a13b662db265cedbe2893751a4da5550a224b", + "transformation": "identity" + }, + { + "artifact": "regression-menus-tablet100-v3/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/tests.log", + "original_sha256": "e820264d0865a5f24f69acc18601aeaaaa8757b5dfb1b83b0966067f0e3ad5ae", + "public_sha256": "e820264d0865a5f24f69acc18601aeaaaa8757b5dfb1b83b0966067f0e3ad5ae", + "transformation": "identity" + }, + { + "artifact": "regression-review-phone100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/tests.log", + "original_sha256": "20decc0295da7c296be9a4965127d74737d04bce73cf6a9402f050de5eec214b", + "public_sha256": "20decc0295da7c296be9a4965127d74737d04bce73cf6a9402f050de5eec214b", + "transformation": "identity" + }, + { + "artifact": "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json", + "original_sha256": "f5f4c7523ec578b01639238c9145082ac5e84fbd5fc7a7f4f33d482f0cba0cb8", + "public_sha256": "f5f4c7523ec578b01639238c9145082ac5e84fbd5fc7a7f4f33d482f0cba0cb8", + "transformation": "identity" + }, + { + "artifact": "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json", + "original_sha256": "446143ad9fea601938e120034db937d41d12731dfc2bd58331d024181c3c35d1", + "public_sha256": "446143ad9fea601938e120034db937d41d12731dfc2bd58331d024181c3c35d1", + "transformation": "identity" + }, + { + "artifact": "regression-review-tablet100-v2/cohort/tests.log", + "public": "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/tests.log", + "original_sha256": "7f4cd1a8f93563fee0b468f5a02198ca11ebd7e014842178e73cf42d9d3fdc0b", + "public_sha256": "7f4cd1a8f93563fee0b468f5a02198ca11ebd7e014842178e73cf42d9d3fdc0b", + "transformation": "identity" + }, + { + "artifact": "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json", + "original_sha256": "f77d726a37365160fc897acd02c97e2db689e1df8c7166205eb942acd3a35819", + "public_sha256": "f77d726a37365160fc897acd02c97e2db689e1df8c7166205eb942acd3a35819", + "transformation": "identity" + }, + { + "artifact": "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json", + "original_sha256": "0451639f29a88566a7ac144cfd2f8b4a49bda5e623237af86f83f123d4e78131", + "public_sha256": "0451639f29a88566a7ac144cfd2f8b4a49bda5e623237af86f83f123d4e78131", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png", + "public": "docs/screenshots/command-handoff/owned-ordinary-tablet100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png", + "original_sha256": "888bc15a0ee327444bda08c75a665326a73127318a84bb60e6c6d14b8d828069", + "public_sha256": "888bc15a0ee327444bda08c75a665326a73127318a84bb60e6c6d14b8d828069", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml", + "original_sha256": "c7657f46496e0ca56e1a64dffff99ec8e585f65e856d4e74afec590ef379c908", + "public_sha256": "c7657f46496e0ca56e1a64dffff99ec8e585f65e856d4e74afec590ef379c908", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json", + "original_sha256": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "public_sha256": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png", + "public": "docs/screenshots/command-handoff/owned-recreation-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png", + "original_sha256": "9d28a913a316029556e60ca752a4b81401ac058b1ebe48498815e8b074ccf0e7", + "public_sha256": "9d28a913a316029556e60ca752a4b81401ac058b1ebe48498815e8b074ccf0e7", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml", + "original_sha256": "1bb19b2f8c0bd5ce5b5b0ee2537b528a0e352adc9d87dbd3ee1a064499b2945e", + "public_sha256": "1bb19b2f8c0bd5ce5b5b0ee2537b528a0e352adc9d87dbd3ee1a064499b2945e", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json", + "original_sha256": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "public_sha256": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png", + "public": "docs/screenshots/command-handoff/owned-preferences-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png", + "original_sha256": "3c146f2018e67cc347913383e02c3fa48bc1ad2157645f92725132fb5d5b36ad", + "public_sha256": "3c146f2018e67cc347913383e02c3fa48bc1ad2157645f92725132fb5d5b36ad", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml", + "original_sha256": "dbcdb0830233b87d0b7d921f466a65fdf1618bce77da57d140f0a64ab40b3cf1", + "public_sha256": "dbcdb0830233b87d0b7d921f466a65fdf1618bce77da57d140f0a64ab40b3cf1", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json", + "original_sha256": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "public_sha256": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "public": "docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "original_sha256": "0d821a02c038de1e278555d94c074d3f4a0cda623501eba45564038298e63e1c", + "public_sha256": "0d821a02c038de1e278555d94c074d3f4a0cda623501eba45564038298e63e1c", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "original_sha256": "db8427b9ccf3a0941abbb121961950c6d587ac4b3328167d99767951e8f8edea", + "public_sha256": "db8427b9ccf3a0941abbb121961950c6d587ac4b3328167d99767951e8f8edea", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "original_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "public_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png", + "public": "docs/screenshots/command-handoff/owned-cancel-tablet100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png", + "original_sha256": "b6d01388dd47174bda4a0f754c2b4628e937eba64a7b9cec1ab1ca834304c4af", + "public_sha256": "b6d01388dd47174bda4a0f754c2b4628e937eba64a7b9cec1ab1ca834304c4af", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml", + "original_sha256": "26b7a2f622be1314ae0c46df0704dd978d316a3e2cc8da73d4edf8a0284add6f", + "public_sha256": "26b7a2f622be1314ae0c46df0704dd978d316a3e2cc8da73d4edf8a0284add6f", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json", + "original_sha256": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "public_sha256": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "public": "docs/screenshots/command-handoff/owned-invalid-tablet100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "original_sha256": "59a052bb3ebbf04d160f26d7187554bd399ea0dee8324c6578d83d7b0f2cbd42", + "public_sha256": "59a052bb3ebbf04d160f26d7187554bd399ea0dee8324c6578d83d7b0f2cbd42", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "original_sha256": "e425ca9cc526680a3a5b397f4480470999adb51e830a9bdc97896dfa901f682b", + "public_sha256": "e425ca9cc526680a3a5b397f4480470999adb51e830a9bdc97896dfa901f682b", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "original_sha256": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "public_sha256": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png", + "public": "docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png", + "original_sha256": "becbae7d1658ff6fb100754178720c03a7408dacd6e14e95af0e0a636d3d5f07", + "public_sha256": "becbae7d1658ff6fb100754178720c03a7408dacd6e14e95af0e0a636d3d5f07", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml", + "original_sha256": "3c3c394ae3351b6a753862efeaeefd20f8deb5996b29cb9cb23916886e335436", + "public_sha256": "3c3c394ae3351b6a753862efeaeefd20f8deb5996b29cb9cb23916886e335436", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json", + "original_sha256": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "public_sha256": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "public": "docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "original_sha256": "4e0c7e4f59e911a4890321a0aeccfcc8ce43f4fb1648ba6c12a8c825d0255880", + "public_sha256": "4e0c7e4f59e911a4890321a0aeccfcc8ce43f4fb1648ba6c12a8c825d0255880", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "original_sha256": "cd49276fe4f237a297276f81900161bde4189a129645b843a08292bf6ccd13d3", + "public_sha256": "cd49276fe4f237a297276f81900161bde4189a129645b843a08292bf6ccd13d3", + "transformation": "identity" + }, + { + "artifact": "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "original_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "public_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png", + "public": "docs/screenshots/command-handoff/owned-ordinary-phone100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png", + "original_sha256": "3ef75ab5dffde114e8088b9c40c294019168ca4b2bd892105bf863a00f5f1a5a", + "public_sha256": "3ef75ab5dffde114e8088b9c40c294019168ca4b2bd892105bf863a00f5f1a5a", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml", + "original_sha256": "b148f337b16efe8969518c934c069f02e0efc2be1d5b6a53ff574f38ef6ff6ae", + "public_sha256": "b148f337b16efe8969518c934c069f02e0efc2be1d5b6a53ff574f38ef6ff6ae", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json", + "original_sha256": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "public_sha256": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png", + "public": "docs/screenshots/command-handoff/owned-recreation-phone100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png", + "original_sha256": "0229012efafb9d16c4107f870f8d8c7ad6c0852e031a58ad65f67a707aed88ed", + "public_sha256": "0229012efafb9d16c4107f870f8d8c7ad6c0852e031a58ad65f67a707aed88ed", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml", + "original_sha256": "ed482b83621dd27b96b95efd56db8e43cb029d8185f50a25c910bdd15cce6f8e", + "public_sha256": "ed482b83621dd27b96b95efd56db8e43cb029d8185f50a25c910bdd15cce6f8e", + "transformation": "identity" + }, + { + "artifact": "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json", + "original_sha256": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "public_sha256": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png", + "public": "docs/screenshots/command-handoff/owned-preferences-phone100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png", + "original_sha256": "f39e5b4a87df5779d7cb9d0f25605641ce417a0c5f2771a812ccc4fe7991c738", + "public_sha256": "f39e5b4a87df5779d7cb9d0f25605641ce417a0c5f2771a812ccc4fe7991c738", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml", + "original_sha256": "0f625577eed7ee9abaf22fa5f2a94131467a2ed537f6c418fe3b67061b4e5200", + "public_sha256": "0f625577eed7ee9abaf22fa5f2a94131467a2ed537f6c418fe3b67061b4e5200", + "transformation": "identity" + }, + { + "artifact": "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json", + "original_sha256": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "public_sha256": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "public": "docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "original_sha256": "208b390264230e605b47f3377866233e98dd5fa5038600fd9c61340a5a94aeee", + "public_sha256": "208b390264230e605b47f3377866233e98dd5fa5038600fd9c61340a5a94aeee", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "original_sha256": "c07c9dffbfdb2e92a21a9b034795fe3526d8a3b3c3d6f00e5b3706af5359076c", + "public_sha256": "c07c9dffbfdb2e92a21a9b034795fe3526d8a3b3c3d6f00e5b3706af5359076c", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "original_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "public_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png", + "public": "docs/screenshots/command-handoff/owned-cancel-phone100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png", + "original_sha256": "484e7a4e76cb98052867af38b8fe4b0f7a86b04c1dd463a90d5681ab75cbb475", + "public_sha256": "484e7a4e76cb98052867af38b8fe4b0f7a86b04c1dd463a90d5681ab75cbb475", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml", + "original_sha256": "87adc9a5a3794f72183549e7f7c30fd166c61a8d101bbd9042e547831f2ffff5", + "public_sha256": "87adc9a5a3794f72183549e7f7c30fd166c61a8d101bbd9042e547831f2ffff5", + "transformation": "identity" + }, + { + "artifact": "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json", + "original_sha256": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "public_sha256": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "public": "docs/screenshots/command-handoff/owned-invalid-phone100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "original_sha256": "24a4c9250dbd3a49aa7dcf6c9edf476708f0c1f9f8d08cb5a3114b9f946a22e6", + "public_sha256": "24a4c9250dbd3a49aa7dcf6c9edf476708f0c1f9f8d08cb5a3114b9f946a22e6", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "original_sha256": "9d0c3c1cec85c0a52f25741eeffb686ac4abcb352c50f3656e54bbf271082e5f", + "public_sha256": "9d0c3c1cec85c0a52f25741eeffb686ac4abcb352c50f3656e54bbf271082e5f", + "transformation": "identity" + }, + { + "artifact": "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "original_sha256": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "public_sha256": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png", + "public": "docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png", + "original_sha256": "dade1ca845a51a070bb17b7a2fbab08f40e4de135735cb4d4ac270f1d132916f", + "public_sha256": "dade1ca845a51a070bb17b7a2fbab08f40e4de135735cb4d4ac270f1d132916f", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml", + "original_sha256": "3d166929c12c3d88ef61dc93d731e6ca0e5967162dfd8fce291018df0dba5443", + "public_sha256": "3d166929c12c3d88ef61dc93d731e6ca0e5967162dfd8fce291018df0dba5443", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json", + "original_sha256": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "public_sha256": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "public": "docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "original_sha256": "e90c60bb6b43fdc92e12b48cc252579fa719779a7b00354cc0773c803052f350", + "public_sha256": "e90c60bb6b43fdc92e12b48cc252579fa719779a7b00354cc0773c803052f350", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "original_sha256": "1f9e8817910db84db0f75ed81dcab2b97f416c43fe3ff262a72f9f49810ef6d7", + "public_sha256": "1f9e8817910db84db0f75ed81dcab2b97f416c43fe3ff262a72f9f49810ef6d7", + "transformation": "identity" + }, + { + "artifact": "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "original_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "public_sha256": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png", + "public": "docs/screenshots/command-handoff/protocol-ack-tablet100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png", + "original_sha256": "942c393f6c074f0eb11ae4167b22197d638db3f4bf2e4aefc8c1e562dca27802", + "public_sha256": "942c393f6c074f0eb11ae4167b22197d638db3f4bf2e4aefc8c1e562dca27802", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml", + "original_sha256": "a91535964136181d41b163781300f165053a921b25496435b618df29ed71424d", + "public_sha256": "a91535964136181d41b163781300f165053a921b25496435b618df29ed71424d", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json", + "original_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "public_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png", + "public": "docs/screenshots/command-handoff/protocol-duplicate-tablet100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png", + "original_sha256": "93f8e070532b1a14b77c0a6c7a1124f531d15a520f1f0926852f9504a29724f5", + "public_sha256": "93f8e070532b1a14b77c0a6c7a1124f531d15a520f1f0926852f9504a29724f5", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml", + "original_sha256": "2ae22e7a545618789d11c210c4af409ea8dd76808ef2dc61db5ec20fc89f0fd3", + "public_sha256": "2ae22e7a545618789d11c210c4af409ea8dd76808ef2dc61db5ec20fc89f0fd3", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json", + "original_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "public_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png", + "public": "docs/screenshots/command-handoff/protocol-ack-phone100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png", + "original_sha256": "2141f06b1baa64006a8670fe94b49812ecfbfe60c9093ab1cc460b546e74d2f1", + "public_sha256": "2141f06b1baa64006a8670fe94b49812ecfbfe60c9093ab1cc460b546e74d2f1", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml", + "original_sha256": "63e4810699543f7573fde382cca340547c4d42076949fbed49179cecbc44f6dd", + "public_sha256": "63e4810699543f7573fde382cca340547c4d42076949fbed49179cecbc44f6dd", + "transformation": "identity" + }, + { + "artifact": "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json", + "original_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "public_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png", + "public": "docs/screenshots/command-handoff/protocol-duplicate-phone100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png", + "original_sha256": "6e9edcfe65a987fd257646b749bce5993f3fd6b6f19d590e2ca089bc7764d316", + "public_sha256": "6e9edcfe65a987fd257646b749bce5993f3fd6b6f19d590e2ca089bc7764d316", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml", + "original_sha256": "a03d485cb9833b23827bb17d4be52a345e2da846c50d9b9013056367f372e33a", + "public_sha256": "a03d485cb9833b23827bb17d4be52a345e2da846c50d9b9013056367f372e33a", + "transformation": "identity" + }, + { + "artifact": "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json", + "original_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "public_sha256": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "transformation": "identity" + }, + { + "artifact": "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "public": "docs/screenshots/command-handoff/critical-context-tablet200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "original_sha256": "5dbedbcfe9ea0205da5eaddaf8a8d7420017050d853d3ad2afb4589a3188193b", + "public_sha256": "5dbedbcfe9ea0205da5eaddaf8a8d7420017050d853d3ad2afb4589a3188193b", + "transformation": "identity" + }, + { + "artifact": "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "public": "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "original_sha256": "0d2e007dbe7712b61aa8486decff98f566fbcc2a72f262bfafb81abb432e9d73", + "public_sha256": "0d2e007dbe7712b61aa8486decff98f566fbcc2a72f262bfafb81abb432e9d73", + "transformation": "identity" + }, + { + "artifact": "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "original_sha256": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "public_sha256": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "transformation": "identity" + }, + { + "artifact": "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "public": "docs/screenshots/command-handoff/critical-context-phone200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "original_sha256": "a870be05bb92f8f40fff5057067ae4cabf234c9a88f594843328b4fbadeff02a", + "public_sha256": "a870be05bb92f8f40fff5057067ae4cabf234c9a88f594843328b4fbadeff02a", + "transformation": "identity" + }, + { + "artifact": "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "public": "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "original_sha256": "b18111504de9ea2f1d313dd07cd24ebd3043734f51d0f0e19799a9337770bb2d", + "public_sha256": "b18111504de9ea2f1d313dd07cd24ebd3043734f51d0f0e19799a9337770bb2d", + "transformation": "identity" + }, + { + "artifact": "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "original_sha256": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "public_sha256": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "public": "docs/screenshots/command-handoff/critical-context-landscape100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "original_sha256": "c8330b8656b41b50a755899b3595c297d2c9e22728eeb6dd0f3dc0d11f3febc2", + "public_sha256": "c8330b8656b41b50a755899b3595c297d2c9e22728eeb6dd0f3dc0d11f3febc2", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "original_sha256": "09c343f1131038e4cd15f48344647e12d612d85a5900d171b831d4c3ae067bf5", + "public_sha256": "09c343f1131038e4cd15f48344647e12d612d85a5900d171b831d4c3ae067bf5", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "original_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "public_sha256": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "public": "docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png", + "original_sha256": "6ecb00d1a6338aa18b52cc8a2b3962a396e0581c6c40977bf3f6120097a71219", + "public_sha256": "6ecb00d1a6338aa18b52cc8a2b3962a396e0581c6c40977bf3f6120097a71219", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml", + "original_sha256": "f33cb2636ad4380636cb0efea71f7510757158dc589df291095a78fd29234de5", + "public_sha256": "f33cb2636ad4380636cb0efea71f7510757158dc589df291095a78fd29234de5", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json", + "original_sha256": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "public_sha256": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "public": "docs/screenshots/command-handoff/critical-invalid-phone200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "original_sha256": "99dc95154984719bd9483f7fec9a436b20180809e03053d583da6eb5bbc64d75", + "public_sha256": "99dc95154984719bd9483f7fec9a436b20180809e03053d583da6eb5bbc64d75", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "original_sha256": "915f6f29870b0b8b929d362c7f5d0566934bcdcf696615c69162574e057f99e4", + "public_sha256": "915f6f29870b0b8b929d362c7f5d0566934bcdcf696615c69162574e057f99e4", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "original_sha256": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "public_sha256": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "public": "docs/screenshots/command-handoff/critical-invalid-landscape200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png", + "original_sha256": "8507a076fa913fb5fa4ac39d658013d4e933a2dc9cc2ae4a4a9f5888e20b0d99", + "public_sha256": "8507a076fa913fb5fa4ac39d658013d4e933a2dc9cc2ae4a4a9f5888e20b0d99", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml", + "original_sha256": "584c911791981c410cf40d3611e1311c2b060309397f8e9f17b77ec93cb3202b", + "public_sha256": "584c911791981c410cf40d3611e1311c2b060309397f8e9f17b77ec93cb3202b", + "transformation": "identity" + }, + { + "artifact": "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json", + "original_sha256": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "public_sha256": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "public": "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "original_sha256": "4f3b7dceffb6b8d8b8ff0bc566b2c2150927e6f5ea9fcad5d6c4bbe4436b8386", + "public_sha256": "4f3b7dceffb6b8d8b8ff0bc566b2c2150927e6f5ea9fcad5d6c4bbe4436b8386", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "original_sha256": "13a287eb2efefb3c9ddf715344007ba5ff6a9d4e6c8ccfbb9b7f9af890a47f1b", + "public_sha256": "13a287eb2efefb3c9ddf715344007ba5ff6a9d4e6c8ccfbb9b7f9af890a47f1b", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "original_sha256": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "public_sha256": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "public": "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "original_sha256": "7ccf42628465ffcbcc252db3be5e540cc4828504d243b661ba63cf12ca88fd42", + "public_sha256": "7ccf42628465ffcbcc252db3be5e540cc4828504d243b661ba63cf12ca88fd42", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "original_sha256": "0694f3280ab177f5cbfd5bf61e16965566e1e009b58c0285d45ed1b8458e05da", + "public_sha256": "0694f3280ab177f5cbfd5bf61e16965566e1e009b58c0285d45ed1b8458e05da", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "original_sha256": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "public_sha256": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "public": "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "original_sha256": "a95dc16792511fd0f362806d7d2460e03d462ff9a217eb5d59e29d03899e05fc", + "public_sha256": "a95dc16792511fd0f362806d7d2460e03d462ff9a217eb5d59e29d03899e05fc", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "original_sha256": "50adedb9c19f71d38da29f1a0a9fadf4cd633c0d9bf93228c93fea64bb659354", + "public_sha256": "50adedb9c19f71d38da29f1a0a9fadf4cd633c0d9bf93228c93fea64bb659354", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "original_sha256": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "public_sha256": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "public": "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "original_sha256": "31aa9e61302e68655d6d32e930cc4963c580a36746b07e27f5e06cab9d0e57a0", + "public_sha256": "31aa9e61302e68655d6d32e930cc4963c580a36746b07e27f5e06cab9d0e57a0", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "original_sha256": "651fec5d8835fa976a29bdee080c6ab842b2bf4bd4e50a0a83ab147a8d4909e6", + "public_sha256": "651fec5d8835fa976a29bdee080c6ab842b2bf4bd4e50a0a83ab147a8d4909e6", + "transformation": "identity" + }, + { + "artifact": "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "original_sha256": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "public_sha256": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "public": "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "original_sha256": "e99a256c5a83d08b788c3d69bb3722035f345da169d4a8d129be74492447a275", + "public_sha256": "e99a256c5a83d08b788c3d69bb3722035f345da169d4a8d129be74492447a275", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "original_sha256": "e563b18cc85b789c3e476bf15f7638d14cc83f5ad28374f6da2c24657ce2d01d", + "public_sha256": "e563b18cc85b789c3e476bf15f7638d14cc83f5ad28374f6da2c24657ce2d01d", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "original_sha256": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "public_sha256": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "public": "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "original_sha256": "a4b9f384eecb73527ed763aedcd72fc706fdea9f462d1e62c2dafdd0e58d7f24", + "public_sha256": "a4b9f384eecb73527ed763aedcd72fc706fdea9f462d1e62c2dafdd0e58d7f24", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "original_sha256": "d5c3f9b79dfe7fdb321e5cc4ef9080cc6865b3bad7b80b6f089aff4c66d3a090", + "public_sha256": "d5c3f9b79dfe7fdb321e5cc4ef9080cc6865b3bad7b80b6f089aff4c66d3a090", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "original_sha256": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "public_sha256": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "public": "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "original_sha256": "b997313dc99c8e1643af4a921fd03eec9d604b686656aa3522070f32895af023", + "public_sha256": "b997313dc99c8e1643af4a921fd03eec9d604b686656aa3522070f32895af023", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "original_sha256": "beda2e6bef76b76cbebd274d3fb0c772c6531651ac98a714e18fd6b449bfba25", + "public_sha256": "beda2e6bef76b76cbebd274d3fb0c772c6531651ac98a714e18fd6b449bfba25", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "original_sha256": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "public_sha256": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "public": "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "original_sha256": "d65d5449021e1d7db3ace5fa63a100fee0439126d2384b9ad5361f9f9f4a9fe7", + "public_sha256": "d65d5449021e1d7db3ace5fa63a100fee0439126d2384b9ad5361f9f9f4a9fe7", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "original_sha256": "3c32bf5a87582c1144cad50481dd9e858bab737fb5e1f9d1f334fd881ee7b1ee", + "public_sha256": "3c32bf5a87582c1144cad50481dd9e858bab737fb5e1f9d1f334fd881ee7b1ee", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "original_sha256": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "public_sha256": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "public": "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "original_sha256": "731649dc08f78dbe981a38d23bcc5e3aea31f6badf4c98113760121256a60c4f", + "public_sha256": "731649dc08f78dbe981a38d23bcc5e3aea31f6badf4c98113760121256a60c4f", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "original_sha256": "69a6bbc05c5e8ce15ac788ccb9f6c866c9ee7535aa3ff1ae35b85df925474414", + "public_sha256": "69a6bbc05c5e8ce15ac788ccb9f6c866c9ee7535aa3ff1ae35b85df925474414", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "original_sha256": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "public_sha256": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "public": "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "original_sha256": "a7e12e9173dcb459f9e12a5ab434f63f3e5d93fbbbfddc59d70915d55430fd1d", + "public_sha256": "a7e12e9173dcb459f9e12a5ab434f63f3e5d93fbbbfddc59d70915d55430fd1d", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "original_sha256": "9ea90404e188cff310a29f47e8d3c3044edc84e7778d010c1fee2bf17073e7a8", + "public_sha256": "9ea90404e188cff310a29f47e8d3c3044edc84e7778d010c1fee2bf17073e7a8", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "original_sha256": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "public_sha256": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "public": "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "original_sha256": "2d6503ff19c20a54a077848bf00b27aa8077699f4b5000ceb680ef0344328061", + "public_sha256": "2d6503ff19c20a54a077848bf00b27aa8077699f4b5000ceb680ef0344328061", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "original_sha256": "0180557f2a94dbf167322a221060e51d8cdd7618f685bcd9a9b5baaf75f7c3bc", + "public_sha256": "0180557f2a94dbf167322a221060e51d8cdd7618f685bcd9a9b5baaf75f7c3bc", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "original_sha256": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "public_sha256": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "public": "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "original_sha256": "51e04c3a96e910160ab65423cd0f17562d885952da613da69108005130c1cda4", + "public_sha256": "51e04c3a96e910160ab65423cd0f17562d885952da613da69108005130c1cda4", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "original_sha256": "dd71c738e9d9c253c0192bcb0b4e7cc8614c55e95b5c2c542d8ef2d833d84676", + "public_sha256": "dd71c738e9d9c253c0192bcb0b4e7cc8614c55e95b5c2c542d8ef2d833d84676", + "transformation": "identity" + }, + { + "artifact": "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "original_sha256": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "public_sha256": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "public": "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png", + "original_sha256": "5641be56523dad5022abdbea01b8342ff3b1bd730c10470acae9d053d9c32a24", + "public_sha256": "5641be56523dad5022abdbea01b8342ff3b1bd730c10470acae9d053d9c32a24", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml", + "original_sha256": "a08616a4e42fbaeffd9cd2412ad47d180cdbc39fabee3d8387705eced7368c8d", + "public_sha256": "a08616a4e42fbaeffd9cd2412ad47d180cdbc39fabee3d8387705eced7368c8d", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json", + "original_sha256": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "public_sha256": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "public": "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png", + "original_sha256": "26e476d167c18d9c8178ee110fed30c57a4f7b726b606fb9473066a378684570", + "public_sha256": "26e476d167c18d9c8178ee110fed30c57a4f7b726b606fb9473066a378684570", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml", + "original_sha256": "ce0b196b4c7072804014db6e74282b9443bb735a5b34151012c155d9bc6ae863", + "public_sha256": "ce0b196b4c7072804014db6e74282b9443bb735a5b34151012c155d9bc6ae863", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json", + "original_sha256": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "public_sha256": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "public": "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png", + "original_sha256": "7172da8f16e8749c3df0de623261e8a65d015de6708b27531257e2aa6c493564", + "public_sha256": "7172da8f16e8749c3df0de623261e8a65d015de6708b27531257e2aa6c493564", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml", + "original_sha256": "0ed999ac9001e1b4881f0fdc058684e78da0b41b920e259a6d0fc955d838e42b", + "public_sha256": "0ed999ac9001e1b4881f0fdc058684e78da0b41b920e259a6d0fc955d838e42b", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json", + "original_sha256": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "public_sha256": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "public": "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png", + "original_sha256": "17ba4baf615eb1fceb529ce315e9d2a1262e15223b6f6041d1e5da9e7cdc74be", + "public_sha256": "17ba4baf615eb1fceb529ce315e9d2a1262e15223b6f6041d1e5da9e7cdc74be", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml", + "original_sha256": "4d9435f03098e69dd48532bef3f83d0dbf845bb4d8d9dcd6d06f9bf84428ca41", + "public_sha256": "4d9435f03098e69dd48532bef3f83d0dbf845bb4d8d9dcd6d06f9bf84428ca41", + "transformation": "identity" + }, + { + "artifact": "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json", + "original_sha256": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "public_sha256": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png", + "public": "docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png", + "original_sha256": "f94800f314e58c3dd2cd04e2eeb8aca9af2caa4e59d864770ba2aa27a43de63c", + "public_sha256": "f94800f314e58c3dd2cd04e2eeb8aca9af2caa4e59d864770ba2aa27a43de63c", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml", + "original_sha256": "db51cfb3b6ffa213931d96cc33a3fa704bed1a77b49c4a9cb3038de1f4b06e39", + "public_sha256": "db51cfb3b6ffa213931d96cc33a3fa704bed1a77b49c4a9cb3038de1f4b06e39", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json", + "original_sha256": "c24db44455e1cf40a7a55221c4a33d4fa5ba960cbe6eb9859ae935967c62e916", + "public_sha256": "c24db44455e1cf40a7a55221c4a33d4fa5ba960cbe6eb9859ae935967c62e916", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "public": "docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png", + "original_sha256": "f416570f4108aee70ccddb711aad008a9cf4b5bc7ad02799356f4a972dc4ddc8", + "public_sha256": "f416570f4108aee70ccddb711aad008a9cf4b5bc7ad02799356f4a972dc4ddc8", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml", + "original_sha256": "474ec82d7e922aae95b7aca01604ce61b53f4df7ab50c69cf709a6e45c3ba5d6", + "public_sha256": "474ec82d7e922aae95b7aca01604ce61b53f4df7ab50c69cf709a6e45c3ba5d6", + "transformation": "identity" + }, + { + "artifact": "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json", + "original_sha256": "8056e15ba14929ca11f8d0e9e17eb191b448a095c35685f38b889cdb72ffb6a4", + "public_sha256": "8056e15ba14929ca11f8d0e9e17eb191b448a095c35685f38b889cdb72ffb6a4", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.png", + "public": "docs/screenshots/command-handoff/matched-lifetime-recreation-old-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-failure.png", + "original_sha256": "2d370398f1b2373477a455b5af8a332428c4f39f9174c507fbdfadd06c04bbeb", + "public_sha256": "2d370398f1b2373477a455b5af8a332428c4f39f9174c507fbdfadd06c04bbeb", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml", + "original_sha256": "d8cd62c8b56f5f9227f13ea5e8f1e0a10b25160d9c596e5a3b3bee3f46f16267", + "public_sha256": "d8cd62c8b56f5f9227f13ea5e8f1e0a10b25160d9c596e5a3b3bee3f46f16267", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json", + "original_sha256": "72b4ebb1f451bb69344d3eca55b2acfe0dcacd6968561532c39a14c7622fa3ac", + "public_sha256": "72b4ebb1f451bb69344d3eca55b2acfe0dcacd6968561532c39a14c7622fa3ac", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png", + "public": "docs/screenshots/command-handoff/matched-lifetime-preferences-old-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png", + "original_sha256": "d4409bf9b1b8a3522fe8798cfccdf81a700c843da05a3472516989094ab2be62", + "public_sha256": "d4409bf9b1b8a3522fe8798cfccdf81a700c843da05a3472516989094ab2be62", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml", + "original_sha256": "21adb9d46dc8eb6eccd249660a1fc8de46036a409156fda609e5cce5cc256e95", + "public_sha256": "21adb9d46dc8eb6eccd249660a1fc8de46036a409156fda609e5cce5cc256e95", + "transformation": "identity" + }, + { + "artifact": "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json", + "original_sha256": "1a058ec6faeaf8408bb1b9b5c947c6c25fefc7c3f3fd203890c663ca02a9d0f5", + "public_sha256": "1a058ec6faeaf8408bb1b9b5c947c6c25fefc7c3f3fd203890c663ca02a9d0f5", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png", + "public": "docs/screenshots/command-handoff/matched-quick-old-tablet100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png", + "original_sha256": "285d54e5316430399033af23c61df4491562d29b4fbd4704d294dd806864b38b", + "public_sha256": "285d54e5316430399033af23c61df4491562d29b4fbd4704d294dd806864b38b", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml", + "original_sha256": "c890ff0227b4e83bba4e3202cd8424a235a10e95376d54e1689842d23633e2ed", + "public_sha256": "c890ff0227b4e83bba4e3202cd8424a235a10e95376d54e1689842d23633e2ed", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json", + "original_sha256": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "public_sha256": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png", + "public": "docs/screenshots/command-handoff/matched-quick-old-phone100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png", + "original_sha256": "7b397171db597092e8346636620f90bdd0ffb18c4cae9d916245632f85f6d303", + "public_sha256": "7b397171db597092e8346636620f90bdd0ffb18c4cae9d916245632f85f6d303", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml", + "original_sha256": "373ac540183f6f147988e2fe57cfac42952e654ffaeff1259aff9a69755bf8d6", + "public_sha256": "373ac540183f6f147988e2fe57cfac42952e654ffaeff1259aff9a69755bf8d6", + "transformation": "identity" + }, + { + "artifact": "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json", + "original_sha256": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "public_sha256": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.png", + "public": "docs/screenshots/command-handoff/owned-ordinary-tablet100-v2/handoff-ordinaryrelaunchclearscontextandfallback-failure.png", + "original_sha256": "431eee87dd338c0d371cc8dd8e7a629ba0bdf357933f17056a2e90910f1d01b8", + "public_sha256": "431eee87dd338c0d371cc8dd8e7a629ba0bdf357933f17056a2e90910f1d01b8", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.xml", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.xml", + "original_sha256": "069ca18c2e0df7ed880961fcedb5a5206206abf110163b35abb6e8d74e3be913", + "public_sha256": "069ca18c2e0df7ed880961fcedb5a5206206abf110163b35abb6e8d74e3be913", + "transformation": "identity" + }, + { + "artifact": "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure-frame.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure-frame.json", + "original_sha256": "8d3edab9f4b4099e30c7ac76386b6739b610bb4cc10a5ced017180d3627f6a47", + "public_sha256": "8d3edab9f4b4099e30c7ac76386b6739b610bb4cc10a5ced017180d3627f6a47", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v1/benchmark-build.log", + "public": "docs/validation/command-handoff/checks/build-candidate-v1/benchmark-build.log", + "original_sha256": "2a99f13aed13ff1ee80d253022528acd555f595e1dafa53c402f8761a368df78", + "public_sha256": "6d95a83449121f4b9cbb600254d85a2b372cb0051ef5fd365b3ddf794bfd3f96", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "build-candidate-v1/debug-build.log", + "public": "docs/validation/command-handoff/checks/build-candidate-v1/debug-build.log", + "original_sha256": "c52e93d949efe0a812cc497f4c014a226403a2e3a0f2ed7fb9d9f96cba65a109", + "public_sha256": "cbc4b810e853bbea6e73c9f6f15e5fd4d6c6d5989a4b6e251481e42cdaee8ff2", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "build-candidate-v2/benchmark-build.log", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/benchmark-build.log", + "original_sha256": "a43fa0f536ac88a848af2d02567871ec9818c8fec7ec8835ce4f0a286c00de31", + "public_sha256": "16a96e1dd13d7b1afa55e20e7992a467e903761baf4ad122179b2979a4e7eb37", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "build-candidate-v2/debug-build.log", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/debug-build.log", + "original_sha256": "abd22e092420747ca4046f89543790645dad8a54236e2e4deebbc38549d68e40", + "public_sha256": "903d451b5d391c97bafcb21135927e15ce3283ec7802bb35d22558dc47f95c25", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml", + "original_sha256": "5d20d50b126fe02d45f0eea307917ba3bbcd9818097807a7e68ae79ebb8c967a", + "public_sha256": "5d20d50b126fe02d45f0eea307917ba3bbcd9818097807a7e68ae79ebb8c967a", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml", + "original_sha256": "1fc2f3210d08c692169bcd6282c5bd891f11b02ec358a13cea9a7cd60ecd5778", + "public_sha256": "1fc2f3210d08c692169bcd6282c5bd891f11b02ec358a13cea9a7cd60ecd5778", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml", + "original_sha256": "286eb6015197fab4c40ec8ec4ca011c4e19096b1df7202f8aed6e820ed8bc16e", + "public_sha256": "286eb6015197fab4c40ec8ec4ca011c4e19096b1df7202f8aed6e820ed8bc16e", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml", + "original_sha256": "70324e3c08cd8758486b4715de3e836c8dd7ce37df8d9a38adfea0a1fc0b0103", + "public_sha256": "70324e3c08cd8758486b4715de3e836c8dd7ce37df8d9a38adfea0a1fc0b0103", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml", + "original_sha256": "5a02b70b838c44aabe12161b5cc418b337f1e653573809e7aaf53412f1afd8a2", + "public_sha256": "5a02b70b838c44aabe12161b5cc418b337f1e653573809e7aaf53412f1afd8a2", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml", + "original_sha256": "7ff06812aa573ec0a4a129d97b770ebe05eaa91f0b87e93f7a42f6c89d00f049", + "public_sha256": "7ff06812aa573ec0a4a129d97b770ebe05eaa91f0b87e93f7a42f6c89d00f049", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml", + "original_sha256": "5e489ad15c9168d66756d34aeb3cc6973b2713e28272667025eff84f896593f5", + "public_sha256": "5e489ad15c9168d66756d34aeb3cc6973b2713e28272667025eff84f896593f5", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml", + "original_sha256": "08d68716fae4956c4c1246a1e1af5d7380427dacbd83b21d90abbfddfcf75bac", + "public_sha256": "08d68716fae4956c4c1246a1e1af5d7380427dacbd83b21d90abbfddfcf75bac", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml", + "original_sha256": "170bffe5c9cd5bc3a2053bcc7bd3a21af29216817416f7270c27496179af6096", + "public_sha256": "170bffe5c9cd5bc3a2053bcc7bd3a21af29216817416f7270c27496179af6096", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml", + "original_sha256": "0c8ab042376733b698fb20e0e2c9cf31b2a0588c843201cd0fe671c03ae0a60c", + "public_sha256": "0c8ab042376733b698fb20e0e2c9cf31b2a0588c843201cd0fe671c03ae0a60c", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml", + "original_sha256": "507bcaaa4d12efede426334313deb5382bbe6c31629c7019ad1e8b56680fa647", + "public_sha256": "507bcaaa4d12efede426334313deb5382bbe6c31629c7019ad1e8b56680fa647", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml", + "original_sha256": "d1881bca6c6ff3598945b79bd6a6e957be2cbfc9b550b0a2f17a73945a52e2e4", + "public_sha256": "d1881bca6c6ff3598945b79bd6a6e957be2cbfc9b550b0a2f17a73945a52e2e4", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml", + "original_sha256": "5f02d71b927d64c5921e272b476889c2e32e8cc2119c33ef6ad958d8c98f83d8", + "public_sha256": "5f02d71b927d64c5921e272b476889c2e32e8cc2119c33ef6ad958d8c98f83d8", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml", + "original_sha256": "a7c64adce1d2c1ac6aa523488ee79d43bbe91c442a6acf4b93991f9569dbd4d7", + "public_sha256": "a7c64adce1d2c1ac6aa523488ee79d43bbe91c442a6acf4b93991f9569dbd4d7", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml", + "original_sha256": "709588496e247c1276ef20ac98e76e268662fd7373a650d4b458abe0de222c71", + "public_sha256": "709588496e247c1276ef20ac98e76e268662fd7373a650d4b458abe0de222c71", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml", + "original_sha256": "feca2e186db51d1021b8335c034c08876dc26d226e2919ca6f6388fd2a94d179", + "public_sha256": "feca2e186db51d1021b8335c034c08876dc26d226e2919ca6f6388fd2a94d179", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml", + "original_sha256": "08b5a4ea00dd30ae9bd6aa3532470f1311424b8f15d91a7d937cea9a0b280dd6", + "public_sha256": "08b5a4ea00dd30ae9bd6aa3532470f1311424b8f15d91a7d937cea9a0b280dd6", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml", + "original_sha256": "927af0fd5c2b81d2195975fee4ede1194162fe5cac1679487ce62c80e6443aa0", + "public_sha256": "927af0fd5c2b81d2195975fee4ede1194162fe5cac1679487ce62c80e6443aa0", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml", + "original_sha256": "922ff619aa333473e4ef801e6f1695e29750724f681f99e2b8fc5cf43dee5714", + "public_sha256": "922ff619aa333473e4ef801e6f1695e29750724f681f99e2b8fc5cf43dee5714", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml", + "original_sha256": "79567065d6dd3c01346a9b047520dbf01c31aede9017cbd2353b73a2629d987c", + "public_sha256": "79567065d6dd3c01346a9b047520dbf01c31aede9017cbd2353b73a2629d987c", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml", + "original_sha256": "93d46c22f5ba9b367439a274ec1296d82da23c6feef1630be4693303019c22d5", + "public_sha256": "93d46c22f5ba9b367439a274ec1296d82da23c6feef1630be4693303019c22d5", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml", + "original_sha256": "581a38a041e8e21ce6c2f601d887fb36697541880f656cf855ed43de2f54b185", + "public_sha256": "581a38a041e8e21ce6c2f601d887fb36697541880f656cf855ed43de2f54b185", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml", + "original_sha256": "60fe1d6a0452bc092af333c302848760144aa9239464112aaaace837e91dcd7f", + "public_sha256": "60fe1d6a0452bc092af333c302848760144aa9239464112aaaace837e91dcd7f", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml", + "original_sha256": "a20da0cc2c745d41a7bd768561b75648f118c01ab9a976497f17fee20de0a9bb", + "public_sha256": "a20da0cc2c745d41a7bd768561b75648f118c01ab9a976497f17fee20de0a9bb", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutTest.xml", + "original_sha256": "fed2b9cf855d9b8a3111b417b2fb8562d49c662ec3d2da02c569ef4259a0fdaf", + "public_sha256": "fed2b9cf855d9b8a3111b417b2fb8562d49c662ec3d2da02c569ef4259a0fdaf", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml", + "original_sha256": "c15112ac464ae1e4ecb1a6fe95141c5f77882737463ea375770775c83c917c56", + "public_sha256": "c15112ac464ae1e4ecb1a6fe95141c5f77882737463ea375770775c83c917c56", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml", + "original_sha256": "b44ae358fdb1f44b0f04bae1d51bfaed9687924a5a6bfc78cf4cdfcc571640f1", + "public_sha256": "b44ae358fdb1f44b0f04bae1d51bfaed9687924a5a6bfc78cf4cdfcc571640f1", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml", + "original_sha256": "dadc2294f6147fd018d34e33abc0c65cccb5236acb302fbd7b26124122b2709e", + "public_sha256": "dadc2294f6147fd018d34e33abc0c65cccb5236acb302fbd7b26124122b2709e", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml", + "original_sha256": "302591a00828eef9c67edb1f3bf1a836b7963d3572271f92568a47286486a128", + "public_sha256": "302591a00828eef9c67edb1f3bf1a836b7963d3572271f92568a47286486a128", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml", + "original_sha256": "0e5f372203b271fb5757f1bf5f78a2848d826fdef11e6a505ec929e819d1ab13", + "public_sha256": "0e5f372203b271fb5757f1bf5f78a2848d826fdef11e6a505ec929e819d1ab13", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml", + "original_sha256": "2bd47c00856f437e53eee1aed1877dcad12f97ec573cbdba97d9372255055791", + "public_sha256": "2bd47c00856f437e53eee1aed1877dcad12f97ec573cbdba97d9372255055791", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml", + "original_sha256": "6d67f5ed088bf249c05799b9148461eca21728b0d0ee678993a26a1c63e493c6", + "public_sha256": "6d67f5ed088bf249c05799b9148461eca21728b0d0ee678993a26a1c63e493c6", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v2/reports/lint-results-benchmark.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-benchmark.xml", + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb", + "public_sha256": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "build-candidate-v2/reports/lint-results-debug.xml", + "public": "docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-debug.xml", + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb", + "public_sha256": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "final-harness-reports-v2/lint-results-benchmark.xml", + "public": "docs/validation/command-handoff/checks/final-lint-v2/lint-results-benchmark.xml", + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb", + "public_sha256": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "final-harness-reports-v2/lint-results-debug.xml", + "public": "docs/validation/command-handoff/checks/final-lint-v2/lint-results-debug.xml", + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb", + "public_sha256": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "final-harness-reports-v3/lint-results-benchmark.xml", + "public": "docs/validation/command-handoff/checks/final-lint-v3/lint-results-benchmark.xml", + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb", + "public_sha256": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "final-harness-reports-v3/lint-results-debug.xml", + "public": "docs/validation/command-handoff/checks/final-lint-v3/lint-results-debug.xml", + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb", + "public_sha256": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "common-v5/identity.json", + "public": "docs/validation/command-handoff/identities/common-v5.json", + "original_sha256": "5d4b21aa2b5a1d3107fe2bab9f6ce738de9f68136403cac3c063ef501b578fe5", + "public_sha256": "5d4b21aa2b5a1d3107fe2bab9f6ce738de9f68136403cac3c063ef501b578fe5", + "transformation": "identity" + }, + { + "artifact": "owned-harness-v1/identity.json", + "public": "docs/validation/command-handoff/identities/owned-harness-v1.json", + "original_sha256": "c7f84ce7f761d302392f03ce90acdfcc2ebdbf7d46814fe23bdea544a9c804bc", + "public_sha256": "c7f84ce7f761d302392f03ce90acdfcc2ebdbf7d46814fe23bdea544a9c804bc", + "transformation": "identity" + }, + { + "artifact": "owned-harness-v2/identity.json", + "public": "docs/validation/command-handoff/identities/owned-harness-v2.json", + "original_sha256": "8a216a78a7362e9d32bab536a474ec0986e2abf2d50f8125d7878f960b04fc95", + "public_sha256": "8a216a78a7362e9d32bab536a474ec0986e2abf2d50f8125d7878f960b04fc95", + "transformation": "identity" + }, + { + "artifact": "owned-harness-v3/identity.json", + "public": "docs/validation/command-handoff/identities/owned-harness-v3.json", + "original_sha256": "cbe6915e66da64c8085fa8ce81847b272f0d99f0128a131252f14f8cba49e138", + "public_sha256": "cbe6915e66da64c8085fa8ce81847b272f0d99f0128a131252f14f8cba49e138", + "transformation": "identity" + }, + { + "artifact": "repaired-harness-v2/identity.json", + "public": "docs/validation/command-handoff/identities/repaired-harness-v2.json", + "original_sha256": "95ed271d32bc2b2838249ecb7c486c6daa05778d09ef272372b84f068bb934d8", + "public_sha256": "95ed271d32bc2b2838249ecb7c486c6daa05778d09ef272372b84f068bb934d8", + "transformation": "identity" + }, + { + "artifact": "asset-comparison-v1.json", + "public": "docs/validation/command-handoff/checks/asset-comparison-v1.json", + "original_sha256": "4fee14c5b9083329da51416a2493bc2a0fe028b86a9a62643c62abfd872658b2", + "public_sha256": "4fee14c5b9083329da51416a2493bc2a0fe028b86a9a62643c62abfd872658b2", + "transformation": "identity" + }, + { + "artifact": "harness-transition-v2.json", + "public": "docs/validation/command-handoff/checks/harness-transition-v2.json", + "original_sha256": "4211ee88478cab665885389000ab791b0850265e5165bcbf1dcff2b489e293fe", + "public_sha256": "4211ee88478cab665885389000ab791b0850265e5165bcbf1dcff2b489e293fe", + "transformation": "identity" + }, + { + "artifact": "python-owned-v1.log", + "public": "docs/validation/command-handoff/checks/python-owned-v1.log", + "original_sha256": "e8846c14956dedcaa11e9d9fce4dd80c840ab533f224fdd8343baaf2a1ab21d8", + "public_sha256": "e8846c14956dedcaa11e9d9fce4dd80c840ab533f224fdd8343baaf2a1ab21d8", + "transformation": "identity" + }, + { + "artifact": "python-owned-optimized-v1.log", + "public": "docs/validation/command-handoff/checks/python-owned-optimized-v1.log", + "original_sha256": "8515f4b5d442cf8d164425b96cab9a79e6990ba191d6f61edc94bf2bd67bc0a0", + "public_sha256": "8515f4b5d442cf8d164425b96cab9a79e6990ba191d6f61edc94bf2bd67bc0a0", + "transformation": "identity" + }, + { + "artifact": "owned-harness-v1-build.log", + "public": "docs/validation/command-handoff/checks/owned-harness-v1-build.log", + "original_sha256": "ae704c1a636636ca051a995888a2b04a2eb7759b7e34ebf2d7476d5dd25a6f29", + "public_sha256": "f508d6c57dadd99a45cd31a83bb1cfc75f3548030d9b9cfc4d8cbf3cf67a1bd4", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "owned-harness-v2-build.log", + "public": "docs/validation/command-handoff/checks/owned-harness-v2-build.log", + "original_sha256": "dc059ee2d91e96a8d84ae6feb4bae55f8bfa7d494ded12062dc5abbb7e3a60b7", + "public_sha256": "bac936a11cbc2ec04b81a89ac9481bb42776d2524c99b2bf16097fa98dcae703", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "owned-harness-v2-benchmark-build.log", + "public": "docs/validation/command-handoff/checks/owned-harness-v2-benchmark-build.log", + "original_sha256": "8b903f881fe046f0342f476712d316dae09a6eb6a6b62104bf8b5043d44fac80", + "public_sha256": "e4eb4868ce5f67ae8c1b9dbbdda9d5bd5301d040998eba0da3e87bc0ac64b214", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "owned-harness-v2-debug-lint.log", + "public": "docs/validation/command-handoff/checks/owned-harness-v2-debug-lint.log", + "original_sha256": "1ffe7df4dd01c18138c32e12bc58d7df460a030b1dc2e6eceaf0bc2ab54e35d8", + "public_sha256": "c06b8e0437612bdf0475e9529970542a8efbdfcb74b7eeaa1ad9544fe767ac18", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "final-harness-checks-v2.json", + "public": "docs/validation/command-handoff/checks/final-harness-checks-v2.json", + "original_sha256": "582b8d2e46e5796ae05bcf54650bb81eb2dd2274c41df377c8dc0b5d41da18ea", + "public_sha256": "582b8d2e46e5796ae05bcf54650bb81eb2dd2274c41df377c8dc0b5d41da18ea", + "transformation": "identity" + }, + { + "artifact": "owned-harness-v3-build.log", + "public": "docs/validation/command-handoff/checks/owned-harness-v3-build.log", + "original_sha256": "910d8c79f6ed71e89b2f2b1b7b3dbc6f7a088d21224c409ceb1eb8c370ad23bf", + "public_sha256": "d8abcd99f89579f111d767ee99bca329aa166f81deb09f3406e8065e402671dd", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "owned-harness-v3-benchmark-build.log", + "public": "docs/validation/command-handoff/checks/owned-harness-v3-benchmark-build.log", + "original_sha256": "2334cf2db5b0b9f89105d8f199e1bd468d5ed6a7b9ad951854ea11dd6a663424", + "public_sha256": "debac9ebffeb4c8a66b7a8c424b1ee9efbc034d2a6c7d1d84a3ceb5f950e6ca7", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "owned-harness-v3-debug-lint.log", + "public": "docs/validation/command-handoff/checks/owned-harness-v3-debug-lint.log", + "original_sha256": "3cf984fade0dfe7dc6b20d32248a123a7dee567b4e6bf1edd98e372e61e6d231", + "public_sha256": "50b9c0126e47984c3a8063f6e1346637c43526b262faf7b666c637464dbd0b97", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "final-harness-checks-v3.json", + "public": "docs/validation/command-handoff/checks/final-harness-checks-v3.json", + "original_sha256": "d8418205a5dc6bdd0326995db8d2238344bfdbb0f3b0a0c14fddc16a95c331b3", + "public_sha256": "d8418205a5dc6bdd0326995db8d2238344bfdbb0f3b0a0c14fddc16a95c331b3", + "transformation": "identity" + }, + { + "artifact": "regression-menus-tablet100-v2/host.log", + "public": "docs/validation/command-handoff/checks/menu-preflight.log", + "original_sha256": "39f7d4310c750a571ffabf7e298fa389dea833329404d10be205aa49b3b49c6e", + "public_sha256": "c07e79e72e5f174468a15e5684dcc243d1beb2846a3cf5512967fc15c4b8e302", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "menu-preflight-v1.json", + "public": "docs/validation/command-handoff/checks/menu-preflight-v1.json", + "original_sha256": "27694f616773b7c883906632a985b2c6ba26762c17713ae1a0bc89cd6c768bc8", + "public_sha256": "27694f616773b7c883906632a985b2c6ba26762c17713ae1a0bc89cd6c768bc8", + "transformation": "identity" + }, + { + "artifact": "build-candidate-v1.py", + "public": "docs/validation/command-handoff/collectors/build-candidate-v1.py", + "original_sha256": "5273f7b4c14257da5c4f3670bea3ae0babaf74bd65f5457c175c14fda0d71b27", + "public_sha256": "b1d798cdbe27466d79a5dda83c841ea3293139fe9aca790048b039af9f2fa58c", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "build-candidate-v2.py", + "public": "docs/validation/command-handoff/collectors/build-candidate-v2.py", + "original_sha256": "fd709f4db34497c7f4af8295c0992b07c5c4b59ea3a7868c9b74e35d693cc400", + "public_sha256": "640c2b7934245c7f3916c39cb266cd1760f214e01d9aaea12308180298c45a87", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "preservation.py", + "public": "docs/validation/command-handoff/collectors/preservation.py", + "original_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "public_sha256": "6fe086314a94d694f538fc6b1fb71958aa34cb1d0e80baf6833abe74e5385cc1", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "publish-handoff-v1.py", + "public": "docs/validation/command-handoff/collectors/publish-handoff-v1.py", + "original_sha256": "50953b0720b360ea9a47e4d99cb147939b1ef48b1408f271ff66eb5590072263", + "public_sha256": "4daf8e5dc90575b46b405d5a41cccb988dec83e04d2c1ff88f0616b041d7d4c8", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "run-continuation-v4.py", + "public": "docs/validation/command-handoff/collectors/run-continuation-v4.py", + "original_sha256": "52cd037127ab546a98d0e26f8d8ecd386c32f67c0d9fd081ad9aadcbd1001df8", + "public_sha256": "52cd037127ab546a98d0e26f8d8ecd386c32f67c0d9fd081ad9aadcbd1001df8", + "transformation": "identity" + }, + { + "artifact": "run-final-verification-v2.py", + "public": "docs/validation/command-handoff/collectors/run-final-verification-v2.py", + "original_sha256": "a352abd9ffc00dcf991ada8fb255e5b4d780cdd41c9f23e701398ca2fa9c1dad", + "public_sha256": "a352abd9ffc00dcf991ada8fb255e5b4d780cdd41c9f23e701398ca2fa9c1dad", + "transformation": "identity" + }, + { + "artifact": "run-final-verification-v3.py", + "public": "docs/validation/command-handoff/collectors/run-final-verification-v3.py", + "original_sha256": "0a9927e21f702d129a18bee014d540f36aac13a17c178fe23b44cf778a1ebeb0", + "public_sha256": "0a9927e21f702d129a18bee014d540f36aac13a17c178fe23b44cf778a1ebeb0", + "transformation": "identity" + }, + { + "artifact": "run-matched-quick-v1.py", + "public": "docs/validation/command-handoff/collectors/run-matched-quick-v1.py", + "original_sha256": "f62cd9b45a0a7af592a2f3c6da9967f5b57a037633fc437c43cef2f00d6a6c19", + "public_sha256": "f62cd9b45a0a7af592a2f3c6da9967f5b57a037633fc437c43cef2f00d6a6c19", + "transformation": "identity" + }, + { + "artifact": "run-menu-regression-v1.py", + "public": "docs/validation/command-handoff/collectors/run-menu-regression-v1.py", + "original_sha256": "2e35e2349b8868c1b559087e7d96850bafbd6b36914592346ef87c8d0aeba3b7", + "public_sha256": "88e991a891d0fb687ee8940c0235e856860e713c9521edbb7ef59e6623a378c6", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "run-owned-matrix-v2.py", + "public": "docs/validation/command-handoff/collectors/run-owned-matrix-v2.py", + "original_sha256": "9a9283329a03bcb168cba775f51f624ad9aad515547404a10276b383337d0c1d", + "public_sha256": "9a9283329a03bcb168cba775f51f624ad9aad515547404a10276b383337d0c1d", + "transformation": "identity" + }, + { + "artifact": "run-owned-matrix-v3.py", + "public": "docs/validation/command-handoff/collectors/run-owned-matrix-v3.py", + "original_sha256": "194fae2c45d4e6c0f76e02bda9744af054e1e1f0d722123c780cf04aa8a4d333", + "public_sha256": "194fae2c45d4e6c0f76e02bda9744af054e1e1f0d722123c780cf04aa8a4d333", + "transformation": "identity" + }, + { + "artifact": "run-owned-v1.py", + "public": "docs/validation/command-handoff/collectors/run-owned-v1.py", + "original_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "public_sha256": "b7e57f3455109376cc10024e71763f188410a4ea791e7f5bba25eb8525a7243a", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "run-quick-control-v1.py", + "public": "docs/validation/command-handoff/collectors/run-quick-control-v1.py", + "original_sha256": "5aec7c6af8b013dca9880bf670760c13080849508f143484d1d62b2ec734abcd", + "public_sha256": "f23941164030c7e19426e96d24663c5ea3349603d5190066128add6b47dab477", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "run-quick-control-v2.py", + "public": "docs/validation/command-handoff/collectors/run-quick-control-v2.py", + "original_sha256": "5b49028a588b5029d224e7c55b560632c7be8ca2ca655d6a4f95d4647f9c39a5", + "public_sha256": "9cd283362b0f9f87548dd8412c01c8c0c4010e9a7224ea3638f93920335809bb", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "run-regression-v1.py", + "public": "docs/validation/command-handoff/collectors/run-regression-v1.py", + "original_sha256": "2d89e0751c303383fdf31125799778f4f8c39865f23ebf814faca51bc19d4c9e", + "public_sha256": "697b65d91f5eac63048ec698aa837455afc4da291139dcf40a1dfb171dec3bf1", + "transformation": "UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere" + }, + { + "artifact": "verify-handoff-v1.py", + "public": "docs/validation/command-handoff/collectors/verify-handoff-v1.py", + "original_sha256": "5b54856220afc057ea7990fcfe76705a969b37cf36d78818ffa65cf7bf17f3f1", + "public_sha256": "5b54856220afc057ea7990fcfe76705a969b37cf36d78818ffa65cf7bf17f3f1", + "transformation": "identity" + } + ], + "allowlisted_projections": [ + { + "artifact": "critical-context-landscape100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "critical-context-landscape100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "critical-context-landscape200-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "critical-context-landscape200-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "critical-context-phone200-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "critical-context-phone200-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "critical-context-tablet200-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "critical-context-tablet200-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "critical-invalid-landscape200-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "critical-invalid-landscape200-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "critical-invalid-phone200-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "critical-invalid-phone200-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "final-quick-landscape200-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "final-quick-landscape200-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "final-quick-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "final-quick-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "final-quick-phone200-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "final-quick-phone200-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "final-quick-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "final-quick-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "lifetime-preferences-old-tablet100-v1/state.json", + "public": "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "lifetime-preferences-old-tablet100-v1/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "lifetime-recreation-old-tablet100-v1/state.json", + "public": "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "lifetime-recreation-old-tablet100-v1/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "matched-lifetime-preferences-old-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "matched-lifetime-preferences-old-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "matched-lifetime-recreation-old-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "matched-lifetime-recreation-old-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "matched-quick-new-phone100-v1/state.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "matched-quick-new-phone100-v1/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "matched-quick-new-tablet100-v1/state.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "matched-quick-new-tablet100-v1/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "matched-quick-old-phone100-v1/state.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "matched-quick-old-phone100-v1/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "matched-quick-old-tablet100-v1/state.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "matched-quick-old-tablet100-v1/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-ack-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-ack-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-ack-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-ack-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-ack-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-ack-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-cancel-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-cancel-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-cancel-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-cancel-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-cancel-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-cancel-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-context-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-context-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-context-tablet100-v1/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-context-tablet100-v1/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-context-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-context-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-context-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-context-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-duplicate-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-duplicate-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-duplicate-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-duplicate-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-duplicate-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-duplicate-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-invalid-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-invalid-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-invalid-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-invalid-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-invalid-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-invalid-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-ordinary-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-ordinary-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-ordinary-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-ordinary-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-ordinary-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-ordinary-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-preferences-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-preferences-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-preferences-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-preferences-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-preferences-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-preferences-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-recreation-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-recreation-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-recreation-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-recreation-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "owned-recreation-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-recreation-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "protocol-ack-phone100-v4/state.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "protocol-ack-phone100-v4/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "protocol-ack-tablet100-v4/state.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "protocol-ack-tablet100-v4/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "protocol-duplicate-phone100-v4/state.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "protocol-duplicate-phone100-v4/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "protocol-duplicate-tablet100-v4/state.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "protocol-duplicate-tablet100-v4/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-detail-phone100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-detail-phone100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-detail-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-detail-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-forms-phone100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-forms-phone100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-forms-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-forms-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-menus-phone100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-menus-phone100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-menus-tablet100-v3/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-menus-tablet100-v3/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-review-phone100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-review-phone100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "regression-review-tablet100-v2/state.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/state.json", + "allowed_keys": [ + "completed", + "runtime_source_commit", + "test_source_commit", + "app_sha256", + "test_apk_sha256", + "layout", + "font", + "method", + "expected_failure", + "collector_sha256", + "preservation_helper_sha256", + "durable_file_count", + "evidence_file_count", + "runner_exit_code", + "passes", + "cleanup_checks", + "cleanup_passed", + "same_boot", + "durable_data_unchanged", + "pre_existing_evidence_unchanged", + "native_case_records", + "native_completed", + "preservation_owner_released", + "original_evidence_restored", + "app", + "phase_outcome", + "expected_phase", + "compatible_listed_workflow", + "negative_capability_observed" + ], + "cleanup_projection": null + }, + { + "artifact": "regression-review-tablet100-v2/cohort/record.json", + "public": "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/runner-record.json", + "allowed_keys": [ + "completed", + "serial", + "avd", + "layout", + "font_scale", + "classes", + "expected", + "runner_sha256", + "archive_sha256", + "typed_workflow_archive_sha256", + "cleanup_helper_sha256", + "clipboard_helper_sha256", + "document_helper_sha256", + "instrumentation_excluded_tests", + "reviewed_json_command", + "reviewed_translation_command", + "expect_completion_return", + "apk_sha256", + "test_apk_sha256", + "installed_apks_match", + "instrumentation_exit_code", + "passes", + "tests_completed", + "owned_extension_count" + ], + "cleanup_projection": "passed boolean only" + }, + { + "artifact": "build-candidate-v1/state.json", + "public": "docs/validation/command-handoff/identities/build-candidate-v1.json", + "allowed_keys": [ + "completed", + "source_commit", + "runtime_source_commit", + "test_source_commit", + "source_hashes", + "commands", + "runs", + "apk_hashes", + "benchmark_apk_hashes", + "lint", + "jvm_cases" + ], + "cleanup_projection": null + }, + { + "artifact": "build-candidate-v2/state.json", + "public": "docs/validation/command-handoff/identities/build-candidate-v2.json", + "allowed_keys": [ + "completed", + "source_commit", + "runtime_source_commit", + "test_source_commit", + "source_hashes", + "commands", + "runs", + "apk_hashes", + "benchmark_apk_hashes", + "lint", + "jvm_cases" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-matrix-v2/record.json", + "public": "docs/validation/command-handoff/pipelines/owned-matrix-v2.json", + "allowed_keys": [ + "completed", + "runs" + ], + "cleanup_projection": null + }, + { + "artifact": "owned-matrix-v3/record.json", + "public": "docs/validation/command-handoff/pipelines/owned-matrix-v3.json", + "allowed_keys": [ + "completed", + "runs" + ], + "cleanup_projection": null + }, + { + "artifact": "final-verification-v3/record.json", + "public": "docs/validation/command-handoff/pipelines/final-verification-v3.json", + "allowed_keys": [ + "completed", + "runs" + ], + "cleanup_projection": null + }, + { + "artifact": "continuation-v4/record.json", + "public": "docs/validation/command-handoff/pipelines/continuation-v4.json", + "allowed_keys": [ + "completed", + "runs" + ], + "cleanup_projection": null + } + ], + "retained_capture_hashes": { + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "67d397004af6241239ae0c62543c94feb478264044ee41524efaa710d8b711ee", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "a91726fa8afe001443d5230990cb9e297393e75691bf2d817e08efd178e57986", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "c8330b8656b41b50a755899b3595c297d2c9e22728eeb6dd0f3dc0d11f3febc2", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "09c343f1131038e4cd15f48344647e12d612d85a5900d171b831d4c3ae067bf5", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "b1998ab2806afe885235a8cca9c6dbc1f53ffdca49937d93763312ca79b53377", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "4786dd29c2a43cd9c9ced508ca9202195564c6376543215d828473ed5b897ff9", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "92e1049dc076859977581893efa8945343d21ab9a6377a196b0d18e8a45166c8", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "0349ef375679fd9816c706e75d98c4164979a7583e3a65e06a7cf9449febd0d5", + "critical-context-landscape100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "8e28e9a4782f7d75e31b609d8e6b25e2f28baca5f28bd00406546d340e8aa41f", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "8056e15ba14929ca11f8d0e9e17eb191b448a095c35685f38b889cdb72ffb6a4", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "f416570f4108aee70ccddb711aad008a9cf4b5bc7ad02799356f4a972dc4ddc8", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "474ec82d7e922aae95b7aca01604ce61b53f4df7ab50c69cf709a6e45c3ba5d6", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "6ecb00d1a6338aa18b52cc8a2b3962a396e0581c6c40977bf3f6120097a71219", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "f33cb2636ad4380636cb0efea71f7510757158dc589df291095a78fd29234de5", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "c24db44455e1cf40a7a55221c4a33d4fa5ba960cbe6eb9859ae935967c62e916", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "f94800f314e58c3dd2cd04e2eeb8aca9af2caa4e59d864770ba2aa27a43de63c", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "db51cfb3b6ffa213931d96cc33a3fa704bed1a77b49c4a9cb3038de1f4b06e39", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "e0a1ed577277e61779a6289c91cd04ce621e17ae45b7c3cf05c5a358c907f39a", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "a75bf0dac3799b8cda4107b43f595393e02028bbeae2e92b023bd1b5e787ccb1", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "b0a43e90728cf076ac97f3a1d6331b67fd17835bfa6bc06a7b55e182849ff281", + "critical-context-landscape200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "7ae216930c3e449a727751a2ff9c331641031b84b01d3def4cf768e9c1404d95", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "8056e15ba14929ca11f8d0e9e17eb191b448a095c35685f38b889cdb72ffb6a4", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "aa10e66c1d5d0cfa1b7271a81787ce2abed36ebe8f08979bb7d8eae0fab2ee27", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "77cc74c1f268f93fbee0d95bd3d907e495b6796f76050e8aac7c1d0dbcb8a40f", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "a870be05bb92f8f40fff5057067ae4cabf234c9a88f594843328b4fbadeff02a", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "b18111504de9ea2f1d313dd07cd24ebd3043734f51d0f0e19799a9337770bb2d", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "c24db44455e1cf40a7a55221c4a33d4fa5ba960cbe6eb9859ae935967c62e916", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "d6ae0506dc0865d83078091fdcb6da2dde6658846a5481264aae08775cec121f", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "64511b8f080797d152f21386b8dadfb7f4c6cf539f742715406b46622c43e3d1", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "e0a1ed577277e61779a6289c91cd04ce621e17ae45b7c3cf05c5a358c907f39a", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "4ca086af65160f78a88627920ba52be7bdc76f59304c9ea0e69363d06144b966", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "9a64df180faef9f2565f3741a2f41ce96af8ce0d00b7b0b229da2b8f2270e31a", + "critical-context-phone200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "9fca631229db83946b63442ba44301ead9d36dc5c67ade3adfcaba87c866ae38", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "8056e15ba14929ca11f8d0e9e17eb191b448a095c35685f38b889cdb72ffb6a4", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "09400d18d10399430df3fe183ac4286656ccb0917da9e1c6c9034efc5309237e", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "cbb13cef4add691d1c2faf14fc34c5eccb44956532a960b55aed04bd5c38480a", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "5dbedbcfe9ea0205da5eaddaf8a8d7420017050d853d3ad2afb4589a3188193b", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "0d2e007dbe7712b61aa8486decff98f566fbcc2a72f262bfafb81abb432e9d73", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "c24db44455e1cf40a7a55221c4a33d4fa5ba960cbe6eb9859ae935967c62e916", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "9ff3b0e403beb12df253098c9fd01385d8a607d231aa5581cdf0de0fc65e0d5e", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "c20a8144711a0bdf5a366c886cab2fa94e2d797351504cd7c0346ff942e56ff6", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "e0a1ed577277e61779a6289c91cd04ce621e17ae45b7c3cf05c5a358c907f39a", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "5875aa5f18344651a3b83054492d574291521e18a3429eed21ea37ae9fcb1b40", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "ee0b8904673dd59fbf3264707d028cf6e3017c58399c1e9a9559cc058891f001", + "critical-context-tablet200-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "08447cdbc4246d1dc1f8314c4540566c0d0bf842a29041ec4ec472339d494633", + "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return-frame.json": "9fc23f41cb222db40bfff8757a15ce91cda6483d241c0f0be6f02113652e0a42", + "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.png": "cb2145b700e4c2278ac9a843e5512e1b94b48ba7b1a6b89f5d2f07784b3174df", + "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.xml": "549cfbcd71a7e438fc8bf8fa5395665e507b18e38c517ec829dc3698c03a96da", + "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json": "e82d2f3aed99ba4a0de084fd6bd09d0483a3694cc17c6f1fd20cc6e901817d7c", + "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "8507a076fa913fb5fa4ac39d658013d4e933a2dc9cc2ae4a4a9f5888e20b0d99", + "critical-invalid-landscape200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "584c911791981c410cf40d3611e1311c2b060309397f8e9f17b77ec93cb3202b", + "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return-frame.json": "9fc23f41cb222db40bfff8757a15ce91cda6483d241c0f0be6f02113652e0a42", + "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.png": "86bce5a931ae9a7b309a520219645bfcd39fc205aa0006d5d7d53261055491f0", + "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.xml": "3f85f969269166d0dfccc68d78eaec1c5f4d751b7fe50de1f847d5d76907c51d", + "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json": "8499938efd1d272a2a5c869b56db3c4e2e4b1b98dd99315544c263ead4d068d5", + "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "99dc95154984719bd9483f7fec9a436b20180809e03053d583da6eb5bbc64d75", + "critical-invalid-phone200-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "915f6f29870b0b8b929d362c7f5d0566934bcdcf696615c69162574e057f99e4", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "29e329db15bc155bb92bec63fd6ade7e5d1fe9ccf24a0caa4890a3294012d62b", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "675e1ec8d5edb46c1018b0f24064741d9d46f4eaa34218c79473059041565ee7", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "2e0e0acf1b26c2bb9c6c1ca983746e3173a5dae6dae63cff348e73bee6f784a3", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "944ef9ed484a8222de3e043410e945dc9d570ec07e2de1f7057f87cfb2ae9c17", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "af612a2967a3864b7a8021c81ace1ff16d42c5b60a4d2e3ce55a881898ad5970", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "00303671a031f1e977157478b172671f166998721f6db439a4008fd1b1aded48", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "f84466727699f096e1117d631f5253742b2a9d0bd1079f8b518ece39c2afe70a", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "5641be56523dad5022abdbea01b8342ff3b1bd730c10470acae9d053d9c32a24", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "a08616a4e42fbaeffd9cd2412ad47d180cdbc39fabee3d8387705eced7368c8d", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "17ba4baf615eb1fceb529ce315e9d2a1262e15223b6f6041d1e5da9e7cdc74be", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "4d9435f03098e69dd48532bef3f83d0dbf845bb4d8d9dcd6d06f9bf84428ca41", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "7172da8f16e8749c3df0de623261e8a65d015de6708b27531257e2aa6c493564", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "0ed999ac9001e1b4881f0fdc058684e78da0b41b920e259a6d0fc955d838e42b", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "26e476d167c18d9c8178ee110fed30c57a4f7b726b606fb9473066a378684570", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "ce0b196b4c7072804014db6e74282b9443bb735a5b34151012c155d9bc6ae863", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return-frame.json": "818f7b153a0b0ec1baf98d98b300afb888275f98a776a17ff0a62f237d56f39a", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.png": "364fc58c531234b4d3cc624566318c2be59a62db2b7bec0b3374f6502383f004", + "final-quick-landscape200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.xml": "f28d1152692e61df69f7992ad03dd11cac4ace15a03f5c5d56075198935bb1b7", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "7e6da9330a01b47c90358a05bf457b5c80bd158d90ceaefd06b1554cf061ce1d", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "4039e31addb2fa808ca781da781119d07e246163cc87599ddafec1517cc98a89", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "a7870976e5ce22a0b801f1d2d752b5e4e348bb89ace545fb5c952803b1eed267", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "18eac10e1ea8a5cdc52f8027e562fe33688dd7f8a55a36130d851c069b0bf786", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "7084681fa41a53ec816833ac7260f00c87dea7042a63c468d1d39dc723279e66", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "d65d5449021e1d7db3ace5fa63a100fee0439126d2384b9ad5361f9f9f4a9fe7", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "3c32bf5a87582c1144cad50481dd9e858bab737fb5e1f9d1f334fd881ee7b1ee", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "e99a256c5a83d08b788c3d69bb3722035f345da169d4a8d129be74492447a275", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "e563b18cc85b789c3e476bf15f7638d14cc83f5ad28374f6da2c24657ce2d01d", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "d65d5449021e1d7db3ace5fa63a100fee0439126d2384b9ad5361f9f9f4a9fe7", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "3c32bf5a87582c1144cad50481dd9e858bab737fb5e1f9d1f334fd881ee7b1ee", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "b997313dc99c8e1643af4a921fd03eec9d604b686656aa3522070f32895af023", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "beda2e6bef76b76cbebd274d3fb0c772c6531651ac98a714e18fd6b449bfba25", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "a4b9f384eecb73527ed763aedcd72fc706fdea9f462d1e62c2dafdd0e58d7f24", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "d5c3f9b79dfe7fdb321e5cc4ef9080cc6865b3bad7b80b6f089aff4c66d3a090", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return-frame.json": "7455efb3b5a98d9c7ea4d61c4052f976df5b398e20a7f88e61c6b070adf826b5", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.png": "8dbd52981a605f57112bf88f23152d8ad51ff551d6697e1ca72817dd3a030d1f", + "final-quick-phone100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.xml": "b1af7692f9a4b05d0aaadde5ef9605e0cb409e74cfdfeabf3e79bc0806e3194f", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "29e329db15bc155bb92bec63fd6ade7e5d1fe9ccf24a0caa4890a3294012d62b", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "f067f005eed4fa75dc4c2dce50111bc63280a16f14e1c0684ec884e379264898", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "9ffc87564c4eeb013b05106439ab6358ac358d484255c24e61d6b972ec23d2a2", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "bcf4200c7cac6dfc06688a5beda2521df0840fcac8713f9ed7bd9396c4219cea", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "af612a2967a3864b7a8021c81ace1ff16d42c5b60a4d2e3ce55a881898ad5970", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "b575e7ec1fa29c9ebba63c0d76856d5f9431394821b97653bba3b8600f003c0b", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "1b1988e0797eae3dcdcf353fc1f97b4f9e90ab94943a9dab47dd34750648d0d7", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "731649dc08f78dbe981a38d23bcc5e3aea31f6badf4c98113760121256a60c4f", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "69a6bbc05c5e8ce15ac788ccb9f6c866c9ee7535aa3ff1ae35b85df925474414", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "51e04c3a96e910160ab65423cd0f17562d885952da613da69108005130c1cda4", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "dd71c738e9d9c253c0192bcb0b4e7cc8614c55e95b5c2c542d8ef2d833d84676", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "2d6503ff19c20a54a077848bf00b27aa8077699f4b5000ceb680ef0344328061", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "0180557f2a94dbf167322a221060e51d8cdd7618f685bcd9a9b5baaf75f7c3bc", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "a7e12e9173dcb459f9e12a5ab434f63f3e5d93fbbbfddc59d70915d55430fd1d", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "9ea90404e188cff310a29f47e8d3c3044edc84e7778d010c1fee2bf17073e7a8", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return-frame.json": "71501b5ed4414261e4922f84fbc7cf8857f297c4e2a12c52063dfc7c1ba84f37", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.png": "ec68b908160d927659467f799ade08445c253d9616f1bd5dfab746bcd663b3d5", + "final-quick-phone200-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.xml": "d92901898d380400ae069a50e8c923fb7755bbf6e2479fc584df75ad53b1be15", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "7e6da9330a01b47c90358a05bf457b5c80bd158d90ceaefd06b1554cf061ce1d", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "4e1393b15bebcdbbba3b563a2ba8f699b30386eddca973268fdc7fcac1b65be6", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "4cbf9c2645b2237efc00a8345af87e946f542936d62519ec65bdb4e1fb7936fc", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "7b68b335178c7fdf8d69ea8ee6b11d9247f504d090440cf47665dd71d3ffaa59", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "7084681fa41a53ec816833ac7260f00c87dea7042a63c468d1d39dc723279e66", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "31aa9e61302e68655d6d32e930cc4963c580a36746b07e27f5e06cab9d0e57a0", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "651fec5d8835fa976a29bdee080c6ab842b2bf4bd4e50a0a83ab147a8d4909e6", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "4f3b7dceffb6b8d8b8ff0bc566b2c2150927e6f5ea9fcad5d6c4bbe4436b8386", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "13a287eb2efefb3c9ddf715344007ba5ff6a9d4e6c8ccfbb9b7f9af890a47f1b", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "31aa9e61302e68655d6d32e930cc4963c580a36746b07e27f5e06cab9d0e57a0", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "651fec5d8835fa976a29bdee080c6ab842b2bf4bd4e50a0a83ab147a8d4909e6", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "a95dc16792511fd0f362806d7d2460e03d462ff9a217eb5d59e29d03899e05fc", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "50adedb9c19f71d38da29f1a0a9fadf4cd633c0d9bf93228c93fea64bb659354", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "7ccf42628465ffcbcc252db3be5e540cc4828504d243b661ba63cf12ca88fd42", + "final-quick-tablet100-v3/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "0694f3280ab177f5cbfd5bf61e16965566e1e009b58c0285d45ed1b8458e05da", + "lifetime-preferences-old-tablet100-v1/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json": "1a058ec6faeaf8408bb1b9b5c947c6c25fefc7c3f3fd203890c663ca02a9d0f5", + "lifetime-preferences-old-tablet100-v1/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png": "95734505ecfaf225c181567e848d17f28bf7d3e77a7a65c1a8988440df5aa952", + "lifetime-preferences-old-tablet100-v1/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml": "43f4b34869c21a94cb0eff9abd82b194d5eac64e770e2b7f58c3f14518e98a50", + "lifetime-preferences-old-tablet100-v1/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "6d3276a448be008c750333e300d1b942e69c57b903ad6513264de3dbe12e14b5", + "lifetime-recreation-old-tablet100-v1/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json": "72b4ebb1f451bb69344d3eca55b2acfe0dcacd6968561532c39a14c7622fa3ac", + "lifetime-recreation-old-tablet100-v1/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.png": "94fcd890328f230bf29b7165701d128773bdf77a9ffcd14475a3fb57fdf25cae", + "lifetime-recreation-old-tablet100-v1/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml": "b582c841140725138c1bd4abdc1d31f50ac47af0ce384433b77852709d89d224", + "lifetime-recreation-old-tablet100-v1/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "8edae1f374953e3f8e51db8d0dee35b9d44fdb3ca7ae2938a3d0f7b870c4132e", + "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json": "1a058ec6faeaf8408bb1b9b5c947c6c25fefc7c3f3fd203890c663ca02a9d0f5", + "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png": "d4409bf9b1b8a3522fe8798cfccdf81a700c843da05a3472516989094ab2be62", + "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml": "21adb9d46dc8eb6eccd249660a1fc8de46036a409156fda609e5cce5cc256e95", + "matched-lifetime-preferences-old-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "e8bd09a8ce85887161517533e3ea9ce1dd24f3da626debb4ef8bd2f62be42688", + "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json": "72b4ebb1f451bb69344d3eca55b2acfe0dcacd6968561532c39a14c7622fa3ac", + "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.png": "2d370398f1b2373477a455b5af8a332428c4f39f9174c507fbdfadd06c04bbeb", + "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml": "d8cd62c8b56f5f9227f13ea5e8f1e0a10b25160d9c596e5a3b3bee3f46f16267", + "matched-lifetime-recreation-old-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "874f128bfa8cb0c29a53de237e3cd4178e40fab8ad0a00d48160494752e9f4b8", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "7e6da9330a01b47c90358a05bf457b5c80bd158d90ceaefd06b1554cf061ce1d", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "68bfd50332a70287ac540c2bc395ed267ecd1b4d0db438914ba5b4ab5c414506", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "c2d4c6205d7660e1eb2a0ce52befc2e7af1407b9adb7e3f03890dc4e7daa9409", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "f13c55316a079128f361b0cbb8f3e8bed3e643e11e5b3b0a2b32d697ac2468e3", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "7084681fa41a53ec816833ac7260f00c87dea7042a63c468d1d39dc723279e66", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "1905a1f685924c510ba3d8f666fdac94dcee734e4b1d44cc5316460c45003397", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "69222e162cea9b5e590e5d581778a0562b6604d2f10741a2d83fbed12aeec5ea", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "e0fe660bebfa940addaea3c12c39ccbb1b12f08e2c3e4a05ac7caa5b0acc4dd1", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "366fba5e82bd1efee101f65dec6c0137e3619dac7e785e6fcb545679838c4900", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "be5207ca6db92f9f737576165396a1f1c69fbf7defcf3151e0d88043894126ca", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "f1fd19ed025239b070529e56e6ecdbdc78e7c446a2822b19e59028cf0f3e16f3", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "6defa5051364595b286816793b68b76b8bb55c928357477452b63c1566d61537", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "9ccc4a3fffa0f85bee3bfa37ebe1b76b4998664706b226fb145f6772d52de4c7", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "c5d32c3225e0054faef06fc70bec0f492dc5750260500c85c1c8b6fd58951aa8", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "f22f60c2a3e37a7505a98dca22978dc074443fa00300064435c364ffc6f1f9d2", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return-frame.json": "7455efb3b5a98d9c7ea4d61c4052f976df5b398e20a7f88e61c6b070adf826b5", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.png": "bc772940aa5cd71efa0ab0c65aba36dbc4939c1ca3da111ae03fc9b9d8e8f482", + "matched-quick-new-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-results-return.xml": "60cfb20c647da068baacd8c23250dfe785d191a869aeffcc2a9d57c7d8998617", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "7e6da9330a01b47c90358a05bf457b5c80bd158d90ceaefd06b1554cf061ce1d", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "e5c05825f7b5a53264ff9dddf7fae454c676e118ebbf814d3361c0d326a686ee", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "ebcc4fb41ef7b98a5a84de075978bb862b1ea689eae611677488432f0c16e002", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "e4d37233c850436b58b8d33c944b09edaabde4ef7db70a3ef495b707fc278827", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "7084681fa41a53ec816833ac7260f00c87dea7042a63c468d1d39dc723279e66", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "993ff2fcf91f006cd55e9ad2f5e30599e929e8f2a25e2565983d49e9c568295f", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "16fdfd78f02cf04815a211fa3d93126f69742cb3b162541edcc453eec7852818", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "655946d366220a228a3c0aa8a17e81bb57c358f1c0c9dede635994944b8897a8", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "275b11ff09b3df83524b0fedadd91647993a10480298d48843cec8b767026bd3", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "993ff2fcf91f006cd55e9ad2f5e30599e929e8f2a25e2565983d49e9c568295f", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "16fdfd78f02cf04815a211fa3d93126f69742cb3b162541edcc453eec7852818", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "30597df33732425de53417cb6dda2842d0a07a307063dd15e0f51ebc6aa90c26", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "c254bbe92116d1385d72c00c5c15f47147b39c7228ba437b29df84eea56ec451", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "2b37234fa6e7ee5e3b49aae101caacfb9ff6c5a26067e476f4da4a7c3f5834c2", + "matched-quick-new-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "fe4b6f1c94918ee1208a962ad8fffbbadfbcadc226a9e54c34b2abeecdfff146", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "7e6da9330a01b47c90358a05bf457b5c80bd158d90ceaefd06b1554cf061ce1d", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "68bfd50332a70287ac540c2bc395ed267ecd1b4d0db438914ba5b4ab5c414506", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "c2d4c6205d7660e1eb2a0ce52befc2e7af1407b9adb7e3f03890dc4e7daa9409", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "037458451c0b74c20c2454f61ad3724035c4c2d65ae0cb8358610b171cc3a0de", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "7084681fa41a53ec816833ac7260f00c87dea7042a63c468d1d39dc723279e66", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "1905a1f685924c510ba3d8f666fdac94dcee734e4b1d44cc5316460c45003397", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "69222e162cea9b5e590e5d581778a0562b6604d2f10741a2d83fbed12aeec5ea", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "e0fe660bebfa940addaea3c12c39ccbb1b12f08e2c3e4a05ac7caa5b0acc4dd1", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "366fba5e82bd1efee101f65dec6c0137e3619dac7e785e6fcb545679838c4900", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "1905a1f685924c510ba3d8f666fdac94dcee734e4b1d44cc5316460c45003397", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "69222e162cea9b5e590e5d581778a0562b6604d2f10741a2d83fbed12aeec5ea", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png": "7b397171db597092e8346636620f90bdd0ffb18c4cae9d916245632f85f6d303", + "matched-quick-old-phone100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml": "373ac540183f6f147988e2fe57cfac42952e654ffaeff1259aff9a69755bf8d6", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry-frame.json": "7e6da9330a01b47c90358a05bf457b5c80bd158d90ceaefd06b1554cf061ce1d", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.png": "968f5fc6bf74446a6b79443130e3c470d59d2bfc8d4e7050386932e8d973dc9f", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-entry.xml": "d7660dbed276e7e97d56b4630a3ba0b8ebd81d7618226d5d5bded4e3c30b48bd", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "e1834caf56b69587c0706db34a91e382c62c267136247986532dd9cdcc452c94", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller-frame.json": "7084681fa41a53ec816833ac7260f00c87dea7042a63c468d1d39dc723279e66", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.png": "10e51e1b7b563e73dd36ac779ec01ea58e34ab3d14acfb6e3ed0f66e6f56bfaf", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-caller.xml": "4a60c76a96935ce53058aa8dc6140b1930a8a566de570c8ced61814d6dd9ba4b", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "9753af4a9448df48bfe13e244d1ad9eea7058d94384955d4478ee344855bc23b", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "131400d0fa357f845f93b2315f9ab58408c8341e52dcce37f1d48382b4f317ff", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "10e51e1b7b563e73dd36ac779ec01ea58e34ab3d14acfb6e3ed0f66e6f56bfaf", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "4a60c76a96935ce53058aa8dc6140b1930a8a566de570c8ced61814d6dd9ba4b", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png": "285d54e5316430399033af23c61df4491562d29b4fbd4704d294dd806864b38b", + "matched-quick-old-tablet100-v1/cohort/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml": "c890ff0227b4e83bba4e3202cd8424a235a10e95376d54e1689842d23633e2ed", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png": "0b24665a6ae2a85eb8250f6ae6e0294615dbd48d7487344cfa59dd5090802994", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml": "0883ef5e7921975c5ad57eedae157f5713b19d864052450cd5d0bdad56752b8c", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "45777ad9c6c730d56dd9457a41394af2d217f97cad32fab30f20cc517b90e53f", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "baf5fb9f6509f2df8e271c5f8b78e5933302f70fca376150cca508fa45e89de3", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png": "4c94887bea461996201fe8e54affdf494b476e123a96af803bacfa9665efbb78", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml": "e75064e7f92a407025cdfce179ebc21b10b0fc590ebdf43ed3bf5cc403305219", + "owned-ack-phone100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "44dbe6e97b14fdf1799cafda6c7cd9299288e3a469cbbaa35a0aaaedd84b9020", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png": "43fd69ff2093ce17bd27df457edc98ab5422deca9a7f2fc3351f021282956acc", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml": "3ea2321e8f7f777f5e37e6d0ffe65acccd3967ecafd64670078a9a23e73c951a", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "df1882430c3f0224197400daac606df5233b8e5ba147c58c6c77a27e10fb69ff", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "a9ded4552b0324942ffeb4808321baed492d36e699184602cff7e6f6b5712ce4", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png": "c12bbf38dbabd709903f5eeb071191671cdf4a6fc4ec291589cf6b960d0b106e", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml": "bc5f5fd63351420be1672073c2def5182debae1a32869e08abbbc267b8f559a6", + "owned-ack-tablet100-v2/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "a1e2942e9d7afed367ee76cad4e58f3238e253c1ff12ac011b47317bea20516e", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png": "79338f1dd41ff94727a968fad1c83d43953d1599a1158c75e5d7efac394eb1b6", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml": "e9150903bdde8f0fc45056a2f6c1d36cd69f739d271808314365c67112423040", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "13a43a96599a7bd5510d9471a7963a9f3dfe5e639d46040117c0624f2aace528", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "e8d24bbdd1136193b16ec7688499ed9d9dfcbcafc4bc708d5d6368ed4a6062c6", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png": "3ba8cfffe020dd91a21e410af19f3ca927bb95004d7aba2fdedfbac023e05e73", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml": "d7d9d3f8b92ea52bcc745805e7cd2cb08464ea6120013f9fb7126ae2454508b4", + "owned-ack-tablet100-v3/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "080cc67f9935c9f96378e8aa934a6cf80123155ad12070761c420543d1dfc392", + "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png": "484e7a4e76cb98052867af38b8fe4b0f7a86b04c1dd463a90d5681ab75cbb475", + "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml": "87adc9a5a3794f72183549e7f7c30fd166c61a8d101bbd9042e547831f2ffff5", + "owned-cancel-phone100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json": "5fc6e55c648a6f23b2cd867fd1f28bbbc6d7bf0bf8cd3b5df6971924ee0ba6e0", + "owned-cancel-tablet100-v2/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "owned-cancel-tablet100-v2/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png": "e3deb516eff99f3ce7dfc66e71e3cb86363c3ec819160fa32f9d33808754809e", + "owned-cancel-tablet100-v2/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml": "fe81594cf7fa65712598025ead85d25453d34e7829fae2bc5398791a89a3eba1", + "owned-cancel-tablet100-v2/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json": "09b65fa722036f3c348a9db21d27c0356fb85afe0742df3387fc2a560728e27a", + "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png": "b6d01388dd47174bda4a0f754c2b4628e937eba64a7b9cec1ab1ca834304c4af", + "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml": "26b7a2f622be1314ae0c46df0704dd978d316a3e2cc8da73d4edf8a0284add6f", + "owned-cancel-tablet100-v3/cohort/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json": "9d5bed02cab05fa0f472cc03c3e97252533c55f5ca5f49f546a05ce891b9736e", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "e90c60bb6b43fdc92e12b48cc252579fa719779a7b00354cc0773c803052f350", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "1f9e8817910db84db0f75ed81dcab2b97f416c43fe3ff262a72f9f49810ef6d7", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "208b390264230e605b47f3377866233e98dd5fa5038600fd9c61340a5a94aeee", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "c07c9dffbfdb2e92a21a9b034795fe3526d8a3b3c3d6f00e5b3706af5359076c", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "7d3956c45e54c3935db63496742a609ccdd576a0d1aa4196087dcb8bfe23b8cc", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "06127141e08417a55db6b4bdd5fbafe4ec95724a1dc3b904c1bdd8ce2b625164", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "dade1ca845a51a070bb17b7a2fbab08f40e4de135735cb4d4ac270f1d132916f", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "3d166929c12c3d88ef61dc93d731e6ca0e5967162dfd8fce291018df0dba5443", + "owned-context-phone100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "1d5afd01fdce55ec472c2ab314005e1f753b14ecf264a66d7de3c87454a766f6", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "ed4472626e8373ede171a984fe0c1897fa2581a444a36e570df274158e06483a", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "57568be96bfda2fe0e69a6f86f327a10b87e2a1bbfb499398c9f85cb84d6795d", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "70745ce0779110c154ffcea3f371525917078aa990afdd3b392dd56f34ccb1e9", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "e938b0e9fc678094530d849f809337b9edd2151c3591790dac082a9b99083332", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "0b06ac64e783a17f64c7fec9c2680004331417ee6bc3a67cfa2224308d010e05", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "18d72dcfbfc06c00ac9fc53bd1a14a40bfd2b9941fa17fd40976a87729c76272", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "1f8afcabaf8f57067483d96db471a01dcd2174c52a3c05ef1dbd18267b273b72", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "c43cc3c81df240dfc6542cc2ca44b75dcfd8dddc4b3735ef2e5f03837cb406f0", + "owned-context-tablet100-v1/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "5b35272dac515e70fc9ab65bf7fd91d8f382a49f36eca53b074d795e198ec242", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "9ac6ff52c29d5335861aed898caa90794857e7c6622ddabef3866444cb6b8e87", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "02afa0c07e6d53fd8ce78db9c3f2046f1ff9326355ecffe34abd4bfafedc5687", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "0d373145aed9c81482f4c82e3acdb6530c757797b1d6371a3f116621f0183f6d", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "0d2952679128efbeff2d8c9806cff228992380fcedc26086a44af3b0f5f8f276", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "477dbfc962485eaf2842d07954deb3c10e5a0b051db71b6081eae58d0564ac3d", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "58b6dcb98ff9247de5c86575a682c34f12c69f35611225df90aeef31a84f4f2c", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "2774be263285d388fe3b6a09a6061ab7217a154baddb8dd075a7b54f68598d8b", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "d4c2de07235509320879a2fb8a2e40c44909e1102540c6e9db3bff1a57bd8590", + "owned-context-tablet100-v2/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "1c3c4e1a79770de4102611ac444bf13cfa15089765a010014875ca1b3ac122ac", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "4e0c7e4f59e911a4890321a0aeccfcc8ce43f4fb1648ba6c12a8c825d0255880", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "cd49276fe4f237a297276f81900161bde4189a129645b843a08292bf6ccd13d3", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "0d821a02c038de1e278555d94c074d3f4a0cda623501eba45564038298e63e1c", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "db8427b9ccf3a0941abbb121961950c6d587ac4b3328167d99767951e8f8edea", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "13c9846e045ab1cf74a37b2ad6ca10f51f99f89e886148d57d3fbb3a8d4b8426", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "9802b18e8be185bd6b0c59bbf8483c0d465480734d37f4b73eac412c30fdb342", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "923ff12f9d75550437164448037b0ce922b02a1c64131dba7f8ada1938130142", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "becbae7d1658ff6fb100754178720c03a7408dacd6e14e95af0e0a636d3d5f07", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "3c3c394ae3351b6a753862efeaeefd20f8deb5996b29cb9cb23916886e335436", + "owned-context-tablet100-v3/cohort/captures/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "669fabf0f4aa7f92287c00df6973f036252db9432dc862d8e20ce6b020daa381", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.png": "c3edca224034addc702cae1050ab8fd178e4b4588a0ce6a4dd7cfa4106206f5f", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.xml": "d631939228c0715edca633f3272369b384a25409e0567404b0a0dd58b6ca951c", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png": "9c0200938f7ae4519d07df2ecbe175902c23f5a4ddea576b38be4907def4bd32", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml": "adc8cdb2d528e8b2f2a3848917794625f81e4af1ce7496f13db0a6c121f495e7", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.png": "c5dabb0203d768f3d818ab513923b0a4b9a8688ae2088715a16df417fc7513e2", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.xml": "473a6b819c821fe4870a7aa3a6a066f05d7fc329aaa4e318f8f063ae345f7883", + "owned-duplicate-phone100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "b73acce37b7223516cb21d1b8c86b6894a96f34c519977ce7519d5e51ace13d0", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.png": "583a6b2bcfbcdec5c8551a2d49f47b6ac2f542748ae7cbe5ee63dc59fec874bb", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.xml": "69519b9b29ad8af6a406c00cd4ec21047bec5112d9dd64890443e9eb70b4c793", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png": "6606d334e68a6d4d0f6a9d56aeab435d66a81c8f96f55fe2021f63ced708bd30", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml": "681e6fbbc16345422625a058a0056214c6a0182b88fb05927a6199c12af0df6e", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.png": "63cf7b0e25980f44758a4c9864f88b97b103c1283210e6041f34f01da1bb31f4", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.xml": "49215ee759ceb64e9449b4957f52ea46a2b2811b6dc1e88043cdd171a4ecbf80", + "owned-duplicate-tablet100-v2/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "ee37c13e13b67784f18d1bc73942f65c4e2e7fc2f0c85fed703417854b29de52", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.png": "14d6c7064d695eee3d207d1ca4ced902ad6cb9e56231b9b97308762151b3727a", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.xml": "18728661924e5e9e0042f6cdeafea2fa50aa1dc07f54844ee6857d5f13758a2a", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png": "9d4d9eef4731b7d386f962b289653edac2e86c9cf5ee6ce400faa9b6f6f2fb68", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml": "757c1895aba745e1e0e603d1e705fcf4aab5027b029eacbfcdfdb6ee1f631184", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.png": "8e536e002cef6adb1d21741a1ab8ab0ab1fbe44e2368bd9328dad5692010db71", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.xml": "ab4a3e98a8b96b5c9c37e22d54ef66c304a5de5ddf4e5aed640aaf2a3cf9e87f", + "owned-duplicate-tablet100-v3/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "e65a9d7dfb62aad90f07d048bb9fb27ea229bf219c4da4c5ad31ad56bd6619d6", + "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return-frame.json": "98cc340703fd974888e17451b5f66f87314d76eaad3aa28ffd082e0f32fd9815", + "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.png": "7e4c0b7596c070dab0e039d47df336433816b27434dd46282d1366ae4be230de", + "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.xml": "18b899d9cc44d76a51a67b069e51edfd3e6260738e413e3353e2dfb3d22d0c1b", + "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json": "5a8009f47850dff8b612b6cf78c16ae8f5fc0491607e8f21a6cb89b451ac2697", + "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "24a4c9250dbd3a49aa7dcf6c9edf476708f0c1f9f8d08cb5a3114b9f946a22e6", + "owned-invalid-phone100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "9d0c3c1cec85c0a52f25741eeffb686ac4abcb352c50f3656e54bbf271082e5f", + "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return-frame.json": "98cc340703fd974888e17451b5f66f87314d76eaad3aa28ffd082e0f32fd9815", + "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.png": "a0f99784f25fdb21e9eaa85bf569a9632a651badd7f0b7f917b8f7ab36ff83ea", + "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.xml": "6ee4f2aface9d1126df8cd8e256307e02eed9aff70a357955adbda7515e3966c", + "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json": "32097bf27a4972766592839d0d1ff1628920d7cb25301bd1efb04fffe22e5ab7", + "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "f6467bdacdee292861c1b757d8e22c0bd9d349f865ea47106fe7c6407ad6a657", + "owned-invalid-tablet100-v2/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "719402918795305781da36f154a3c8254b50c237967c135dd3fd89c8f69dd387", + "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return-frame.json": "98cc340703fd974888e17451b5f66f87314d76eaad3aa28ffd082e0f32fd9815", + "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.png": "8f82a401f5a295788dc374eb218cfc4b42d3d677815d86e9874a85453cd4fdcb", + "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-caller-return.xml": "8d1d3b6b4d50e2c4802109fd03193a30769a06ae4e464529056e7820127be5a3", + "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-record.json": "42d4ef12b071e6351e533f26ed7c17e82d0d169d4872b86a26271d4ebf0b83d1", + "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "59a052bb3ebbf04d160f26d7187554bd399ea0dee8324c6578d83d7b0f2cbd42", + "owned-invalid-tablet100-v3/cohort/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "e425ca9cc526680a3a5b397f4480470999adb51e830a9bdc97896dfa901f682b", + "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-caller-return-frame.json": "7a75592fe9b5a8e13de8ce32f36d7edadb83343fc23eb53f47501271b9d7a57c", + "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-caller-return.png": "c09d9328659a61b114344c68d6e81c082d82a6c5f2f5f0eb766b61b5a49cceb6", + "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-caller-return.xml": "191f8cd4c4254c667946eb7b09863cb76cd908de517c248d25bb6f4f59c67b20", + "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png": "3ef75ab5dffde114e8088b9c40c294019168ca4b2bd892105bf863a00f5f1a5a", + "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml": "b148f337b16efe8969518c934c069f02e0efc2be1d5b6a53ff574f38ef6ff6ae", + "owned-ordinary-phone100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-record.json": "5325fbd707275c874fa4ee46143e9ca9bcfd6183568772da1592c8abb2681cce", + "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure-frame.json": "8d3edab9f4b4099e30c7ac76386b6739b610bb4cc10a5ced017180d3627f6a47", + "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.png": "431eee87dd338c0d371cc8dd8e7a629ba0bdf357933f17056a2e90910f1d01b8", + "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.xml": "069ca18c2e0df7ed880961fcedb5a5206206abf110163b35abb6e8d74e3be913", + "owned-ordinary-tablet100-v2/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-record.json": "4f96570ca22a198467ca85e0102b27ecb2a7ce82202fa4e0053be9868826e905", + "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-caller-return-frame.json": "7a75592fe9b5a8e13de8ce32f36d7edadb83343fc23eb53f47501271b9d7a57c", + "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-caller-return.png": "681e053fe93d452669165d4fa05c4ef8aa2031fc39e587eafe10e4b2948ed258", + "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-caller-return.xml": "8cd00fa85322373efaf79f30029d791f5add5666627db0653189034e7f5f6853", + "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png": "888bc15a0ee327444bda08c75a665326a73127318a84bb60e6c6d14b8d828069", + "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml": "c7657f46496e0ca56e1a64dffff99ec8e585f65e856d4e74afec590ef379c908", + "owned-ordinary-tablet100-v3/cohort/captures/handoff-ordinaryrelaunchclearscontextandfallback-record.json": "0a201aba23b2b4cab4fe2f6ff934a1f3aa12616e7c15c3774d66f8bfd9c0ece5", + "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return-frame.json": "98cc340703fd974888e17451b5f66f87314d76eaad3aa28ffd082e0f32fd9815", + "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return.png": "8195c9486d94d3f7a87a55ab98669bb1a294c1ff21aaf630ddadac67bf55fad7", + "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return.xml": "6962a1cf71e3eb7f8b10fdd282f2165d38bee376cadd28630a22d6c9148f58ef", + "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "0046bdc0d1c7637ff7dbdeebd1b317729f0a47caa3341ece69fd9a4b2fe751c4", + "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png": "f39e5b4a87df5779d7cb9d0f25605641ce417a0c5f2771a812ccc4fe7991c738", + "owned-preferences-phone100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml": "0f625577eed7ee9abaf22fa5f2a94131467a2ed537f6c418fe3b67061b4e5200", + "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return-frame.json": "98cc340703fd974888e17451b5f66f87314d76eaad3aa28ffd082e0f32fd9815", + "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return.png": "f3b2df63e0914473ac9607cd0e64a962917182149d747f26308a78520b5184ee", + "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return.xml": "ce4f36d89f7b2901b9901bcb3ba0bff399092328784d9a48f01b3b731a62db38", + "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "54c78bac5770b924230e8ce09ab721486af5ec60349918fb282041eff6cd0121", + "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png": "b05f66254abea0c4dda3aec9b857937ec31435ba31833d506d4a9fcba20ab42b", + "owned-preferences-tablet100-v2/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml": "15fbffd94d6aa03a5ed1731d474329a4c4e56b8a3be6aebab9a5c6ee93f075e9", + "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return-frame.json": "98cc340703fd974888e17451b5f66f87314d76eaad3aa28ffd082e0f32fd9815", + "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return.png": "02f9f94727c09e10784d833bb71837e135be7b0e87039c2e66777981da6d741c", + "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-caller-return.xml": "51beac6766165a3456978a0eb5e9d2094b04b2ff7412fbe37711d71acb4a9286", + "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "f541fd0848c0f5b03508aba2bd4f80ea45eb09331baac98117ecd18e26ebb72f", + "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png": "3c146f2018e67cc347913383e02c3fa48bc1ad2157645f92725132fb5d5b36ad", + "owned-preferences-tablet100-v3/cohort/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml": "dbcdb0830233b87d0b7d921f466a65fdf1618bce77da57d140f0a64ab40b3cf1", + "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return.png": "4c02c7bda2ef366e29dc601849c1514ffdbd0d5a678c17501f0d5767d5b5ddd0", + "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return.xml": "710d75086f6c6c151e21de29bae4f754af99e0b9c467136578b1009fdf60c8c5", + "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "848b45803ec2987b50d8c55973b2b31f49cf2534db429eb581753f66734facd0", + "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png": "0229012efafb9d16c4107f870f8d8c7ad6c0852e031a58ad65f67a707aed88ed", + "owned-recreation-phone100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml": "ed482b83621dd27b96b95efd56db8e43cb029d8185f50a25c910bdd15cce6f8e", + "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return.png": "b590eedd7128c5bd294a7ee3143bc116d473604ff5d85957cebf28eab24b3102", + "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return.xml": "3f49aa788298e68a2f2a24a0db65048eded9483cbf226dc400ae495e757d59af", + "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "fb359c77047e275a9b1844d08f3225c7424f33e79586a05cb4e61a7eed578361", + "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png": "e2c16d3b2f0a2df2bf5fda7b35c22f267bdbb24ef18864231de75f34e94980bd", + "owned-recreation-tablet100-v2/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml": "655534e59d633744b4a90ecc51b5bedea76f97db14eb9c65616ff151dd18fff0", + "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return.png": "7ca853c7fc8b0170b0056472fbd9cb0e0bb7edd0b1fa9801585cf66254ec47ec", + "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-caller-return.xml": "8cd00fa85322373efaf79f30029d791f5add5666627db0653189034e7f5f6853", + "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "861746c1df8fc8399bc2aae5b9963ffb617ab534dc8f010fa99f9ebe1f95cdcd", + "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png": "9d28a913a316029556e60ca752a4b81401ac058b1ebe48498815e8b074ccf0e7", + "owned-recreation-tablet100-v3/cohort/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml": "1bb19b2f8c0bd5ce5b5b0ee2537b528a0e352adc9d87dbd3ee1a064499b2945e", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png": "5fba00224ffb833edf69d3f1985a9856dbdb217bb45fdb40604a1380931ac0c1", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml": "53b82ac52269d70c5bd7897a802c235a3eda85bfeb3151d3aa071c3e2482361a", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "2141f06b1baa64006a8670fe94b49812ecfbfe60c9093ab1cc460b546e74d2f1", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "63e4810699543f7573fde382cca340547c4d42076949fbed49179cecbc44f6dd", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png": "d72d497c8a26b0e3fe48a8fce4d712bc42f0cc724e75f8eae76d2f2eee943274", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml": "7b4ad2f6d710b090edb327b5d2a2eeb0a60402e864e2ba7888973d1ef2cb9877", + "protocol-ack-phone100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "62e74db2c20d1d26888441b583a8a257ef6bbdee1ee85eecf4a8adf7670e0d25", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.png": "401a4ab34c3f88a3ecb1320395d236231f2cc58bdb124206dfdbf286c4e1022f", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-caller-return.xml": "c1370af2c14f7ccd08e955b3a8635ac236e4532f984ca6910f7020d4f38d378f", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "942c393f6c074f0eb11ae4167b22197d638db3f4bf2e4aefc8c1e562dca27802", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "a91535964136181d41b163781300f165053a921b25496435b618df29ed71424d", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.png": "e20b98138f2c5cccabe36abdf05df0ca280b4cbf398214912c4cc332108ef5a4", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-parent-before-queued-handoff.xml": "15f3aebc6cd0734c6afcd9ba050fd4261216ad76611e6598430d740ac1148486", + "protocol-ack-tablet100-v4/cohort/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "2f70aadf4cd367019871f71b1408214cbbdf52079f0daac722491f9f63b78029", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.png": "e1cabba674ea3885788b96bc204055723cee9d7d8163fda84f222c8ea13135e8", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.xml": "b5d90937ff12abbb50bf007e9b52deaa1a875f57251e85290a43b180c749d715", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png": "6e9edcfe65a987fd257646b749bce5993f3fd6b6f19d590e2ca089bc7764d316", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml": "a03d485cb9833b23827bb17d4be52a345e2da846c50d9b9013056367f372e33a", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.png": "2e5c5373a6cb5d3a85f63c291fc02ef06aee43721910ea954f72a3b4e6a2743e", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.xml": "43f32ed77ae0a1cd1ebf46cbc8a30baf3b105ee8636be145d6015c70c26fd780", + "protocol-duplicate-phone100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "f1b6356ece1bc3fb64190ef90b995fac53c88b6da8f21aec86d4353531e74ddb", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.png": "4bd81ca59c3da4990ca306ad5fd4ce703c2e90cce225106461fd3e036d70e05b", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-caller-return.xml": "808d9898533ce9126ac27dc94ca49272a3e637f14e867ef1537122ef323b2343", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png": "93f8e070532b1a14b77c0a6c7a1124f531d15a520f1f0926852f9504a29724f5", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml": "2ae22e7a545618789d11c210c4af409ea8dd76808ef2dc61db5ec20fc89f0fd3", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff-frame.json": "f83631d5eeeec3e4bc51a3e26de9eb55d25a7665dcfa909c880298b5f78e1814", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.png": "cb1a2358630638faa240e811187073466040d8c9829438cf3024ddd270c14cac", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-parent-before-queued-handoff.xml": "ecf9f29dd7b3f5b781bd62d8e9c40c6b45641e03314eba3e125c4c016a341e61", + "protocol-duplicate-tablet100-v4/cohort/captures/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "ba80ba361126ab7939114f369bfb1fdfb341b084c339fb2cde75f4beabe27989", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-caller-return-frame.json": "7a310bfa70126abf0d4149c0af3df055faf2f49d8d006c00d532848f42a293ab", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-caller-return.png": "b8192418cc055a3aef0b4a6a3ef6556cdb8718f6ef9fe1f53ecdd5717108643a", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-caller-return.xml": "dbb7338b16c1c4f778afe2c5c5f11c8efa0b37401a9f6d60a60f1382a38007aa", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-entry-frame.json": "e0c574f563a217bb58b3d58730efada18b228f67bbea75a9ee4a90cdde268ba1", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-entry.png": "87d1d06e47a8722360ee7a5c9c5bca94ce13a3f98232e3b916bbc1005f9d76b3", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-entry.xml": "36e087dbe27ba381ef13ffd73f2a97d65f5bb5be8b7feb59bd0693d8d5744d67", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-closed-frame.json": "79554390814ae45fcc0f912f5f98db5d1d6a09024fa454894d6e9d20ef237f7b", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-closed.png": "87d1d06e47a8722360ee7a5c9c5bca94ce13a3f98232e3b916bbc1005f9d76b3", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-closed.xml": "36e087dbe27ba381ef13ffd73f2a97d65f5bb5be8b7feb59bd0693d8d5744d67", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-open-frame.json": "4c7327ffe0306df59026bb661b4b1dd34e636bcf5be0433d3890fb1797a6507d", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-open.png": "663a8e86d9a45895ce2fe8701ed6f9605c6dab22487c8f2f0a1c2ca09131ac2a", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-open.xml": "6f129e133e7c5eaa780fea0c58ecf58f2aa9b071beb5afb2ac6572b3610ce41d", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json": "640546e998d74390479371f23fc4fef1f1c2071acdefb840566b7b94bfa5b203", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-results-query-preserved-frame.json": "8118c420b017d00429ada4690eaee6e3d4c9e31566f8b63afbce2d5d2c9acf10", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-results-query-preserved.png": "e3cb2a5eaec44322f15d1c3db307dff1d6aeaf079d2282a5d80a44020bd21525", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-results-query-preserved.xml": "ff7dfb051f8fdb496752a8e0dd9cbf56e6cde63ac36891065a207419598bb559", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-selected-detail-frame.json": "c28e5a908a83820176796bc40927a916fec76883a97d62110bca136081750bee", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-selected-detail.png": "7fa0701d065cd69d1e3d11086aca46e6b03662a3e08a5bd9900abcd7dda7cb44", + "regression-detail-phone100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-selected-detail.xml": "aa739ce53cc51201ab08ecb65d0b9e610039fa1b85282914002811992035e90a", + "regression-detail-phone100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json": "79de70b94b21f7976ec777f492156b50b08e25bbc1d04af5dd03e479fec08bd8", + "regression-detail-phone100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-recreated-fresh-owner-frame.json": "4b55d7784dce90ab4ecc3731d8c9400e289eaa0aeee7fa5668ad9ebb8ce6a653", + "regression-detail-phone100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-recreated-fresh-owner.png": "028b828ba19b2439ffd974c8bc1854de96adf59d61323f75e4ef7e6935ea2c34", + "regression-detail-phone100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-recreated-fresh-owner.xml": "3fddb10b3a81b45a3ab71e23472d9978785658159485fa3aeeae21773997f742", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-caller-return-frame.json": "81dfb0778886f9cccd26b556845aee2d942eefa1b99862ced6f6efb75603c542", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-caller-return.png": "6686cab1e8a3e1bb227381a47150455de574e2d1e0d406028acd6c0d8065e710", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-caller-return.xml": "5d188cd782c2ad3e3ec314dece07f7331f6450ecd6718b7711523b88740c635c", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-entry-frame.json": "e0c574f563a217bb58b3d58730efada18b228f67bbea75a9ee4a90cdde268ba1", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-entry.png": "9393fdce43eb12dadd458dc54298e3eae6ef81b572bc87cdb9aa879d780497f9", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-entry.xml": "9daf6e7735cdd0a04f0576ee43cfd711fd01632ded9f55f7351dcecbd95d6e53", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-closed-frame.json": "79554390814ae45fcc0f912f5f98db5d1d6a09024fa454894d6e9d20ef237f7b", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-closed.png": "9035567c1d238263f14c6ffe94b20bee82099ba2cc1fed9350e232191dd3c289", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-closed.xml": "9daf6e7735cdd0a04f0576ee43cfd711fd01632ded9f55f7351dcecbd95d6e53", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-open-frame.json": "4c7327ffe0306df59026bb661b4b1dd34e636bcf5be0433d3890fb1797a6507d", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-open.png": "e4d1622c634da70d076d9daa0979f9aa9c2ed00176d87a1769282d1f07ca6903", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-list-search-ime-open.xml": "7fa022baa63fd5e88f06173097eb165967c4794d7b73b0356e53a6c634870745", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json": "b4b1d0a30b159e2949a8fc368fcda592f58776b02407c3072f55df52fefea994", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-results-query-preserved-frame.json": "8c5ef03abb3f44c82887b733b2e23b3bac3238d3e0718216fdbcbfee34c31888", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-results-query-preserved.png": "c9493b7cc1fe0b99a4f855b1d5589d5d313700ada5ba8bf4612618bcbff356b8", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-results-query-preserved.xml": "5b5bc18b555376f615a7d04d5f8973437429868ec5f1f86099f420ff6b2a2506", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-selected-detail-frame.json": "c28e5a908a83820176796bc40927a916fec76883a97d62110bca136081750bee", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-selected-detail.png": "b93747871ba0558ea0d98a27dccacfc015c879831c9e5d4759db44c716d4552b", + "regression-detail-tablet100-v2/cohort/captures/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-selected-detail.xml": "36449c6d6d7f1eb41d3a19ce8b91e20d2f3847319a782b056566050bce5700a4", + "regression-detail-tablet100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json": "31562ddecc201df18b56fab6209439d928528aa48671f58e5a812d07f4e778eb", + "regression-detail-tablet100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-recreated-fresh-owner-frame.json": "4b55d7784dce90ab4ecc3731d8c9400e289eaa0aeee7fa5668ad9ebb8ce6a653", + "regression-detail-tablet100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-recreated-fresh-owner.png": "35b6b2df6d43419b2736542ce070cbdecc2efa971e06b180fc3d08f145400af0", + "regression-detail-tablet100-v2/cohort/captures/detail-recreationstartsanewownerandrejectsthepriornativecallback-recreated-fresh-owner.xml": "0af8ecb173731c32a79d3f4994cc708c678a9116da2ea33a4881d9a782b26e9a", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-destination-frame.json": "a511b86e8763fc90d2f63eb79d9081aac01f236a7edf56f993cd14dd0f94c76d", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-destination.png": "936627a66e309b92870ebb64d682ed94ebadaf4191402c546698b5a988515818", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-destination.xml": "c138eca871459144c0f39fe7bb7285000e533115d947dd0d1f27e32a474fd17f", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-edited-frame.json": "66018f4f65ee189197cadbfdb6fe3f488b781382f937dfc529cb07f012108758", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-edited.png": "2df624df1893fde8b1937191fa37e8a452324b41d29521ee1cef157baf6dc66a", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-edited.xml": "71766aafc7748fa4e96dfaf7e0c568750f4577bf6346d872e73f82e87f6e2f2a", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-password-editor-frame.json": "3f8f265efdf7fd3a4f4a7d097875613cd90685aa6f8168946295650d4b48b501", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-password-editor.png": "9973b8218a660deee128f7b3187b395f93b8d06379f9d9214ab8032a065afbd0", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-password-editor.xml": "6e546028ea464e3d2b154b0a908f24b342de0ae2478c52dcfdf378e64dafb44d", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-bottom-frame.json": "f387e258b8c70ae9e39627d759553c05f047a45a475cf5a2d4197ce60b90daa6", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-bottom.png": "e66385d9af892119a8891513c2cdca8b3227905626cfee606cd5ecdd726705ec", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-bottom.xml": "1aaf100b795888ca3474a8b42746ab98457eb2ab9c3aa7195aec1972ed3cb90c", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-top-frame.json": "0bf5672707e5a3545385acb87dee6b1c22eae06545a48a21fbf2e080f97c63dc", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-top.png": "4bf16e260e64ff66633533791dd6d02d7ab32ba23e674ea20f1bb12afb694c32", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-top.xml": "9a0a765768674790dfcb556c2c44d5fe03eeb108ce9d8cd67d89dec1f645427c", + "regression-forms-phone100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-record.json": "cfba77da3390ed7a598856b96c78a350ba2ef870d5337c1a3aeadfa48017de6c", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-before-escape-frame.json": "76dafdd80f45444c45e57bece915756104b762d090ab1025d2f7b585fd60ea74", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-before-escape.png": "26a4415a372105f9e4317b9ca09ac54f89cdf337485e0c8e8eb640c17bdd1236", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-before-escape.xml": "dd215cf7c60261bd133ab43ffee1d4d896ad11f7286220ee5cefbf80467b5794", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-focused-return-frame.json": "37896650eacef121448be053eb41036284572d744338cb1b559c4ad54fc3b44a", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-focused-return.png": "98120877878edc523ce6e9928b93841c9dc15f489180d0cfc09903806b682902", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-focused-return.xml": "79d92528e77aefff1b7e06759bc630fccececc3e34f7c8b96fe010e3806f500b", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-keyboard-caller-return-frame.json": "3b54beaa3ac7ed7a00ce9a523c124d912272c96b7e7ad6cd67dca4f5b143bb92", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-keyboard-caller-return.png": "355bdd78b7d1b3439cd82f68dab8950165199fd0074ab7fcdc1acebcc0ffa7f3", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-keyboard-caller-return.xml": "f6cb2a664350776a92d45b5b39a533f71bc8077971a7e3153d5a788b095e8763", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json": "784e5656b6b5bc11129c110689b85bc4945eb3e2d0474ab04e9d870e30b47e9a", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-caller-return-frame.json": "f1f932f9ec94a14e12a4a8c44cd783bca0c50bfda686d88291756d5604a02012", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-caller-return.png": "355bdd78b7d1b3439cd82f68dab8950165199fd0074ab7fcdc1acebcc0ffa7f3", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-caller-return.xml": "135eba2b1991d84b5f76d3721746984b6d0f07d294e841195172781d6b141a50", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-ready-frame.json": "245736cb35ba72392c0a2e789097cc3c3410f589c5656b6924d9b1b1a0bd4c37", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-ready.png": "d33fa4e889105685514d0598688df310cbea3fb4288284d026dd116c1a506241", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-ready.xml": "1f9b3610025b63fcf5014e973081602a40049a0a12f16843f6a909cf4ee67adf", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-replacement-ready-frame.json": "60ba03c62433859348388d314acb40e3aa87c0f302d146cd9a6cd3245a1b6cc5", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-replacement-ready.png": "26a4415a372105f9e4317b9ca09ac54f89cdf337485e0c8e8eb640c17bdd1236", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-replacement-ready.xml": "acd135cf6db88532d47962eb8e95f7c5e581e4777d837c0761e677ff4e558a0b", + "regression-forms-phone100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json": "c8eea1e6ad24160c08866056687cb8a019f0929aa776a514c4925fdb39320e0c", + "regression-forms-phone100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-record.json": "7e3396563bc7c2dacb6af9d1d424f139384fa743b9063fbb2583533b850e6da4", + "regression-forms-phone100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-stale-configuration-rejected-frame.json": "6687f6e9eb8860be3846cdf8c34fbf863fafac8b34f5cd1f7cd8c0026154c1cf", + "regression-forms-phone100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-stale-configuration-rejected.png": "9729bb59ba9998b2bed44e7e8cb4f3b15d87c77c7b4de675f05eb7a988618299", + "regression-forms-phone100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-stale-configuration-rejected.xml": "a994def28594d9af275fc8dbffcfb4cd2d3612e12dbfd66fb4e5579821ced017", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-destination-frame.json": "a511b86e8763fc90d2f63eb79d9081aac01f236a7edf56f993cd14dd0f94c76d", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-destination.png": "e1deb94fa432473fdda776cd4236b2cd74d7d17d877a943944acb07766c0ef7d", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-destination.xml": "fbabba8b9938afbad3cf5fdd6f15cc0a97ae3106ec077c67b9704b1f0f5edd4a", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-edited-frame.json": "66018f4f65ee189197cadbfdb6fe3f488b781382f937dfc529cb07f012108758", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-edited.png": "8665b324a45c13a43a66b6e02566693b58567a4473645d3ffe766399f53ed8eb", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-edited.xml": "28c7ad0a667bb7f1b9520f1728ab1057bc9a0fc8f4de94b5014d3e218a41dcab", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-password-editor-frame.json": "3f8f265efdf7fd3a4f4a7d097875613cd90685aa6f8168946295650d4b48b501", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-password-editor.png": "a8b206e3bf5859fadd3e99694f2090dc740e96a5955f83116b746f4e0954180e", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-password-editor.xml": "a68f0aa03dc09ac0e7fdac4fee88561a2ffaad619179ee33f79cb46a4f381be3", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-bottom-frame.json": "f387e258b8c70ae9e39627d759553c05f047a45a475cf5a2d4197ce60b90daa6", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-bottom.png": "99e4b5cb502dd848dac16040257e98d65acd104feee7bdd0ee14cd9b1e11b891", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-bottom.xml": "1c8319aedb3777511b4c1af57b8d34fc8d5663531210cd497d06bb2ffba76f1f", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-top-frame.json": "0bf5672707e5a3545385acb87dee6b1c22eae06545a48a21fbf2e080f97c63dc", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-top.png": "f6c56ecf220d984350f624e56d94340c119476e02f77a0442f24ddb549441c59", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-configuration-required-top.xml": "924a3ff137078c6bb877b277db5817aa919a53f6db62b266a7e608301b20da9b", + "regression-forms-tablet100-v2/cohort/captures/form-nativeconfigurationeditsvalidatecancelandrun-record.json": "862b93f2a6d155b3b203d95a9e92aef3adc43d490f5b1d7ab93efc4c49799db9", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-before-escape-frame.json": "76dafdd80f45444c45e57bece915756104b762d090ab1025d2f7b585fd60ea74", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-before-escape.png": "29a589ec6705c70de31e43a428e621c5b898674ae1a9504f8b7bb5041a8ea927", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-before-escape.xml": "ed889356ace92637091213342a945cefbd009fddee870857b039a5334a9af38d", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-focused-return-frame.json": "37896650eacef121448be053eb41036284572d744338cb1b559c4ad54fc3b44a", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-focused-return.png": "04a6e4f81f8de9b8c71ea526ad32d6ab3fa1c4e46005db8c09c8895760d42380", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-focused-return.xml": "556f8ad8bb41f4176bea965bed6d220d4dd14b314709df920050c2b973afcc85", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-keyboard-caller-return-frame.json": "3548181436526b20a81de65219f2fd97cd32f914f541dfcc2b075e5c616bc539", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-keyboard-caller-return.png": "ae4314c8053db3cce289df30980fc60fa12c4552747439415e6a19f12988e986", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-completion-keyboard-caller-return.xml": "05ff20e8f479fdb0e293533d0593208e8456691a5b7504d3b3a2f8859731436d", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json": "8ba93d57f29c23abe7c97e79d460975d37c2efafffaed4549b673a6eda185a5a", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-caller-return-frame.json": "30848a57ef79e494c5b14a76256941f1872fa6ea9180a0fb02119bddde263269", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-caller-return.png": "83c11b1f0647858767c9f1bf75e37c75e9fdee31768f35fb64c14c73ab583c0e", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-caller-return.xml": "d9cc381879f0b0354ada4e85bf3f8454d18b2763d44019c2a626cebd403913d3", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-ready-frame.json": "245736cb35ba72392c0a2e789097cc3c3410f589c5656b6924d9b1b1a0bd4c37", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-ready.png": "3628dd4e8feb56bb8bfcd5c1c73db690e5edbc40b61a943056840fedd5e43492", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-ready.xml": "1122186088cabd52127ce39cd508f189e25a64ce2daa6cc51a15218b76b91191", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-replacement-ready-frame.json": "60ba03c62433859348388d314acb40e3aa87c0f302d146cd9a6cd3245a1b6cc5", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-replacement-ready.png": "5d95fe32a71ec607e035c5da0d7aaaa659a70670c67f197d9b6fcff81cc9c076", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-completion-replacement-ready.xml": "1122186088cabd52127ce39cd508f189e25a64ce2daa6cc51a15218b76b91191", + "regression-forms-tablet100-v2/cohort/captures/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json": "adca0b75cd73e7472ea25cb78d479f7f302326610a41faf684b54270758fc76c", + "regression-forms-tablet100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-record.json": "b39a7d4e64667a8921e482c48c4311e3b769b197a21efd40098da2b6be1c8ee2", + "regression-forms-tablet100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-stale-configuration-rejected-frame.json": "6687f6e9eb8860be3846cdf8c34fbf863fafac8b34f5cd1f7cd8c0026154c1cf", + "regression-forms-tablet100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-stale-configuration-rejected.png": "c875fd9588a22e1b153d86de7c021c6e280a48f50bcec5b7efb536ffe9c5993c", + "regression-forms-tablet100-v2/cohort/captures/form-replacedconfigurationrejectsqueuededitsrunandback-stale-configuration-rejected.xml": "8bad78d128b5403fee796c18cc0972d5b26a714734f0b0c685e2bdb4f1dff6c0", + "regression-menus-phone100-v3/cohort/readiness-evidence/rapid-extension-list.png": "6bd1fc988adb51db8ec870eeeae4ac02071e09770d70e748e6d5319dc4806fea", + "regression-menus-phone100-v3/cohort/readiness-evidence/rapid-extension-list.xml": "1958115722ceafd1485be2b87c60b7147e4ffa638281eb6c2033f96c55c47ceb", + "regression-menus-tablet100-v3/cohort/readiness-evidence/rapid-extension-list.png": "0ffc5a2cf63672eaaa198724b27d8e15619f01471b8d7322bb2b3460191f7afb", + "regression-menus-tablet100-v3/cohort/readiness-evidence/rapid-extension-list.xml": "1ebc8432ca28917a2e12ed95f7a69acde8401f3446b559683773defc76a795eb", + "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json": "e291b2bb6228faf6a662154e4e8ea2376812a0a945ac5bbe0db42dcfbda8c316", + "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png": "9954696a8db0b7eda2a11bcc74e9541f410755a22cba5ed8a2814016a5fb16dd", + "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml": "a306a337a982d6ec5c08710139b7b8672b78802e7a2b898927a545f17f031a57", + "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png": "20c9ce2e48dd1d15f67a2e1822b3c55a86406a68bad66180506eba9a590d49cd", + "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml": "334f1f0e31a510a404242a6ab3953a8000c11cea351fd3da78646b79bb240102", + "regression-review-phone100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json": "f5f4c7523ec578b01639238c9145082ac5e84fbd5fc7a7f4f33d482f0cba0cb8", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json": "dcda984651e6dcddca79b4776dd9fc8235291821417ad3b109f45f37b94e0a15", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png": "9954696a8db0b7eda2a11bcc74e9541f410755a22cba5ed8a2814016a5fb16dd", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml": "a306a337a982d6ec5c08710139b7b8672b78802e7a2b898927a545f17f031a57", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json": "60c0c159c9e36b1a542ba5778673a034c91d347f8a8aad59b1623d6b382b4715", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png": "705f755708a5a7a0b58ad3b3f55e880c8cf6f3e9d3788a5c04dd939388a5ec95", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml": "73410277d7cde76aa4ad9512b3f5e58b33ff34f83b98766d76e7b9b9f4c7096e", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json": "5b03454166f2f06c9db84891704d3b48666b0528cf6f3037467027edf37aaad6", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png": "2216974b14c6ab2aca5bc04c526dbb4f7c824b38e0ebd2fca970df987e239c0d", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml": "4d2b3e0c083fd88536e48f8ccefd1d949a7e4dcbe713f500789ba78680628b15", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png": "20c9ce2e48dd1d15f67a2e1822b3c55a86406a68bad66180506eba9a590d49cd", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml": "334f1f0e31a510a404242a6ab3953a8000c11cea351fd3da78646b79bb240102", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json": "9eeea03503affe7cbe65913e35b0f5833913c1e5b02cec5b8bbb41fd2b2c565c", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png": "161557cf1819805837ccc43a1d772767b64d859c2e0cc34b49c89210e9d6a606", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml": "ae1b9e2d3898db2bb3ab3176141771d67674de7689d3c2b10450a44e5334742b", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json": "446143ad9fea601938e120034db937d41d12731dfc2bd58331d024181c3c35d1", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json": "2f8d654d925fd6bebafb5766ec96ecf4ad0da2cdfc099d0deca5f11d26246a67", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png": "9954696a8db0b7eda2a11bcc74e9541f410755a22cba5ed8a2814016a5fb16dd", + "regression-review-phone100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml": "a306a337a982d6ec5c08710139b7b8672b78802e7a2b898927a545f17f031a57", + "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return-frame.json": "e291b2bb6228faf6a662154e4e8ea2376812a0a945ac5bbe0db42dcfbda8c316", + "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.png": "6b8719ea8208a01d2759af39f7e6384d0d1430ea16ed19daec166d055b9748de", + "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-cancelled-return.xml": "558c58c6c5c93dff9a966f7c0c9cd601688aaf0382a3e7d89c71e732fe10e103", + "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.png": "939ffb54c063700e4a002aa4de89eb8862575302407d8b0893cd7558d565f86e", + "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-entry.xml": "cfb93fe0ffafeed40192b8ec2ededdf4310daec605e62c6fbe11cc5447086e84", + "regression-review-tablet100-v2/cohort/captures/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json": "f77d726a37365160fc897acd02c97e2db689e1df8c7166205eb942acd3a35819", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller-frame.json": "dcda984651e6dcddca79b4776dd9fc8235291821417ad3b109f45f37b94e0a15", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.png": "6b8719ea8208a01d2759af39f7e6384d0d1430ea16ed19daec166d055b9748de", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-caller.xml": "558c58c6c5c93dff9a966f7c0c9cd601688aaf0382a3e7d89c71e732fe10e103", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen-frame.json": "60c0c159c9e36b1a542ba5778673a034c91d347f8a8aad59b1623d6b382b4715", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.png": "013f2bd95c5c993b8cb7a14dfd7e9fbbca64224afc7e263e6d898257a3d2a649", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-chosen.xml": "ee2015c034c0c9321b4bdde56eff111630718c31447a8747b08aed32c2258255", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied-frame.json": "5b03454166f2f06c9db84891704d3b48666b0528cf6f3037467027edf37aaad6", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.png": "5548fec4332573133b0d52e3c3b50f18b78a5a6a6d5a13eff5523c444bfb06a7", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-copied.xml": "6dcb9741261e5c7828a29cfd61cf1a0657599834c2f35f6093d03b214d894e47", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry-frame.json": "69cff66da139e6e5a9ac81c87c7264bea875e5c7d3dcbd61ec4052a3cf6e5774", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.png": "939ffb54c063700e4a002aa4de89eb8862575302407d8b0893cd7558d565f86e", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-entry.xml": "cfb93fe0ffafeed40192b8ec2ededdf4310daec605e62c6fbe11cc5447086e84", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted-frame.json": "9eeea03503affe7cbe65913e35b0f5833913c1e5b02cec5b8bbb41fd2b2c565c", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.png": "44bdae29d433b75e7e92c8ff8bb3b0aa477ad361adf62cce806ad7bf7bdea55a", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-formatted.xml": "0e72afcd11fc3d327b6b6807f99dba183ba3329532b620817d6a736f7b988edd", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json": "0451639f29a88566a7ac144cfd2f8b4a49bda5e623237af86f83f123d4e78131", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return-frame.json": "2f8d654d925fd6bebafb5766ec96ecf4ad0da2cdfc099d0deca5f11d26246a67", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.png": "6b8719ea8208a01d2759af39f7e6384d0d1430ea16ed19daec166d055b9748de", + "regression-review-tablet100-v2/cohort/captures/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-return.xml": "558c58c6c5c93dff9a966f7c0c9cd601688aaf0382a3e7d89c71e732fe10e103" + }, + "selected_frame_sets": [ + { + "cohort": "owned-ordinary-tablet100-v3", + "stem": "handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context" + }, + { + "cohort": "owned-recreation-tablet100-v3", + "stem": "handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context" + }, + { + "cohort": "owned-preferences-tablet100-v3", + "stem": "handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences" + }, + { + "cohort": "owned-context-tablet100-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-child-context" + }, + { + "cohort": "owned-cancel-tablet100-v3", + "stem": "handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller" + }, + { + "cohort": "owned-invalid-tablet100-v3", + "stem": "handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback" + }, + { + "cohort": "owned-context-tablet100-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-parent-ready" + }, + { + "cohort": "owned-context-tablet100-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-caller-return" + }, + { + "cohort": "owned-ordinary-phone100-v3", + "stem": "handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context" + }, + { + "cohort": "owned-recreation-phone100-v3", + "stem": "handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context" + }, + { + "cohort": "owned-preferences-phone100-v3", + "stem": "handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences" + }, + { + "cohort": "owned-context-phone100-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-child-context" + }, + { + "cohort": "owned-cancel-phone100-v3", + "stem": "handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller" + }, + { + "cohort": "owned-invalid-phone100-v3", + "stem": "handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback" + }, + { + "cohort": "owned-context-phone100-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-parent-ready" + }, + { + "cohort": "owned-context-phone100-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-caller-return" + }, + { + "cohort": "protocol-ack-tablet100-v4", + "stem": "handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks" + }, + { + "cohort": "protocol-duplicate-tablet100-v4", + "stem": "handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks" + }, + { + "cohort": "protocol-ack-phone100-v4", + "stem": "handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks" + }, + { + "cohort": "protocol-duplicate-phone100-v4", + "stem": "handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks" + }, + { + "cohort": "critical-context-tablet200-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-child-context" + }, + { + "cohort": "critical-context-phone200-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-child-context" + }, + { + "cohort": "critical-context-landscape100-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-child-context" + }, + { + "cohort": "critical-context-landscape200-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-child-context" + }, + { + "cohort": "critical-invalid-phone200-v2", + "stem": "handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback" + }, + { + "cohort": "critical-invalid-landscape200-v2", + "stem": "handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback" + }, + { + "cohort": "final-quick-tablet100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen" + }, + { + "cohort": "final-quick-tablet100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result" + }, + { + "cohort": "final-quick-tablet100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy" + }, + { + "cohort": "final-quick-tablet100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return" + }, + { + "cohort": "final-quick-phone100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen" + }, + { + "cohort": "final-quick-phone100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result" + }, + { + "cohort": "final-quick-phone100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy" + }, + { + "cohort": "final-quick-phone100-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return" + }, + { + "cohort": "final-quick-phone200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen" + }, + { + "cohort": "final-quick-phone200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result" + }, + { + "cohort": "final-quick-phone200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy" + }, + { + "cohort": "final-quick-phone200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return" + }, + { + "cohort": "final-quick-landscape200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen" + }, + { + "cohort": "final-quick-landscape200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result" + }, + { + "cohort": "final-quick-landscape200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy" + }, + { + "cohort": "final-quick-landscape200-v3", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return" + }, + { + "cohort": "critical-context-landscape200-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy" + }, + { + "cohort": "critical-context-landscape200-v3", + "stem": "handoff-contextargumentsandfallbackreachchildandcopy-caller-return" + }, + { + "cohort": "matched-lifetime-recreation-old-tablet100-v3", + "stem": "handoff-recreatedchildrejectsdisposedbackcallback-failure" + }, + { + "cohort": "matched-lifetime-preferences-old-tablet100-v3", + "stem": "handoff-returnedcommandrejectsdisposedpreferencescallback-failure" + }, + { + "cohort": "matched-quick-old-tablet100-v1", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary" + }, + { + "cohort": "matched-quick-old-phone100-v1", + "stem": "text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary" + }, + { + "cohort": "owned-ordinary-tablet100-v2", + "stem": "handoff-ordinaryrelaunchclearscontextandfallback-failure" + } + ], + "public_files": { + "docs/validation/command-handoff/checks/asset-comparison-v1.json": "4fee14c5b9083329da51416a2493bc2a0fe028b86a9a62643c62abfd872658b2", + "docs/validation/command-handoff/checks/build-candidate-v1/benchmark-build.log": "6d95a83449121f4b9cbb600254d85a2b372cb0051ef5fd365b3ddf794bfd3f96", + "docs/validation/command-handoff/checks/build-candidate-v1/debug-build.log": "cbc4b810e853bbea6e73c9f6f15e5fd4d6c6d5989a4b6e251481e42cdaee8ff2", + "docs/validation/command-handoff/checks/build-candidate-v2/benchmark-build.log": "16a96e1dd13d7b1afa55e20e7992a467e903761baf4ad122179b2979a4e7eb37", + "docs/validation/command-handoff/checks/build-candidate-v2/debug-build.log": "903d451b5d391c97bafcb21135927e15ce3283ec7802bb35d22558dc47f95c25", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml": "5d20d50b126fe02d45f0eea307917ba3bbcd9818097807a7e68ae79ebb8c967a", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml": "1fc2f3210d08c692169bcd6282c5bd891f11b02ec358a13cea9a7cd60ecd5778", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml": "286eb6015197fab4c40ec8ec4ca011c4e19096b1df7202f8aed6e820ed8bc16e", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml": "70324e3c08cd8758486b4715de3e836c8dd7ce37df8d9a38adfea0a1fc0b0103", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml": "5a02b70b838c44aabe12161b5cc418b337f1e653573809e7aaf53412f1afd8a2", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml": "7ff06812aa573ec0a4a129d97b770ebe05eaa91f0b87e93f7a42f6c89d00f049", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml": "5e489ad15c9168d66756d34aeb3cc6973b2713e28272667025eff84f896593f5", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml": "08d68716fae4956c4c1246a1e1af5d7380427dacbd83b21d90abbfddfcf75bac", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml": "170bffe5c9cd5bc3a2053bcc7bd3a21af29216817416f7270c27496179af6096", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml": "0c8ab042376733b698fb20e0e2c9cf31b2a0588c843201cd0fe671c03ae0a60c", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml": "507bcaaa4d12efede426334313deb5382bbe6c31629c7019ad1e8b56680fa647", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml": "d1881bca6c6ff3598945b79bd6a6e957be2cbfc9b550b0a2f17a73945a52e2e4", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml": "5f02d71b927d64c5921e272b476889c2e32e8cc2119c33ef6ad958d8c98f83d8", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml": "a7c64adce1d2c1ac6aa523488ee79d43bbe91c442a6acf4b93991f9569dbd4d7", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml": "709588496e247c1276ef20ac98e76e268662fd7373a650d4b458abe0de222c71", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml": "feca2e186db51d1021b8335c034c08876dc26d226e2919ca6f6388fd2a94d179", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml": "08b5a4ea00dd30ae9bd6aa3532470f1311424b8f15d91a7d937cea9a0b280dd6", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml": "927af0fd5c2b81d2195975fee4ede1194162fe5cac1679487ce62c80e6443aa0", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml": "922ff619aa333473e4ef801e6f1695e29750724f681f99e2b8fc5cf43dee5714", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml": "79567065d6dd3c01346a9b047520dbf01c31aede9017cbd2353b73a2629d987c", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml": "93d46c22f5ba9b367439a274ec1296d82da23c6feef1630be4693303019c22d5", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml": "581a38a041e8e21ce6c2f601d887fb36697541880f656cf855ed43de2f54b185", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml": "60fe1d6a0452bc092af333c302848760144aa9239464112aaaace837e91dcd7f", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml": "a20da0cc2c745d41a7bd768561b75648f118c01ab9a976497f17fee20de0a9bb", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutTest.xml": "fed2b9cf855d9b8a3111b417b2fb8562d49c662ec3d2da02c569ef4259a0fdaf", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml": "c15112ac464ae1e4ecb1a6fe95141c5f77882737463ea375770775c83c917c56", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml": "b44ae358fdb1f44b0f04bae1d51bfaed9687924a5a6bfc78cf4cdfcc571640f1", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml": "dadc2294f6147fd018d34e33abc0c65cccb5236acb302fbd7b26124122b2709e", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml": "302591a00828eef9c67edb1f3bf1a836b7963d3572271f92568a47286486a128", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml": "0e5f372203b271fb5757f1bf5f78a2848d826fdef11e6a505ec929e819d1ab13", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml": "2bd47c00856f437e53eee1aed1877dcad12f97ec573cbdba97d9372255055791", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml": "6d67f5ed088bf249c05799b9148461eca21728b0d0ee678993a26a1c63e493c6", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-benchmark.xml": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-debug.xml": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "docs/validation/command-handoff/checks/final-harness-checks-v2.json": "582b8d2e46e5796ae05bcf54650bb81eb2dd2274c41df377c8dc0b5d41da18ea", + "docs/validation/command-handoff/checks/final-harness-checks-v3.json": "d8418205a5dc6bdd0326995db8d2238344bfdbb0f3b0a0c14fddc16a95c331b3", + "docs/validation/command-handoff/checks/final-lint-v2/lint-results-benchmark.xml": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "docs/validation/command-handoff/checks/final-lint-v2/lint-results-debug.xml": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "docs/validation/command-handoff/checks/final-lint-v3/lint-results-benchmark.xml": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "docs/validation/command-handoff/checks/final-lint-v3/lint-results-debug.xml": "f4be50be5ebaaca6690462121069cfd3508065b820ef25a90f10e4d720b2aaee", + "docs/validation/command-handoff/checks/harness-transition-v2.json": "4211ee88478cab665885389000ab791b0850265e5165bcbf1dcff2b489e293fe", + "docs/validation/command-handoff/checks/menu-preflight-v1.json": "27694f616773b7c883906632a985b2c6ba26762c17713ae1a0bc89cd6c768bc8", + "docs/validation/command-handoff/checks/menu-preflight.log": "c07e79e72e5f174468a15e5684dcc243d1beb2846a3cf5512967fc15c4b8e302", + "docs/validation/command-handoff/checks/owned-harness-v1-build.log": "f508d6c57dadd99a45cd31a83bb1cfc75f3548030d9b9cfc4d8cbf3cf67a1bd4", + "docs/validation/command-handoff/checks/owned-harness-v2-benchmark-build.log": "e4eb4868ce5f67ae8c1b9dbbdda9d5bd5301d040998eba0da3e87bc0ac64b214", + "docs/validation/command-handoff/checks/owned-harness-v2-build.log": "bac936a11cbc2ec04b81a89ac9481bb42776d2524c99b2bf16097fa98dcae703", + "docs/validation/command-handoff/checks/owned-harness-v2-debug-lint.log": "c06b8e0437612bdf0475e9529970542a8efbdfcb74b7eeaa1ad9544fe767ac18", + "docs/validation/command-handoff/checks/owned-harness-v3-benchmark-build.log": "debac9ebffeb4c8a66b7a8c424b1ee9efbc034d2a6c7d1d84a3ceb5f950e6ca7", + "docs/validation/command-handoff/checks/owned-harness-v3-build.log": "d8abcd99f89579f111d767ee99bca329aa166f81deb09f3406e8065e402671dd", + "docs/validation/command-handoff/checks/owned-harness-v3-debug-lint.log": "50b9c0126e47984c3a8063f6e1346637c43526b262faf7b666c637464dbd0b97", + "docs/validation/command-handoff/checks/python-owned-optimized-v1.log": "8515f4b5d442cf8d164425b96cab9a79e6990ba191d6f61edc94bf2bd67bc0a0", + "docs/validation/command-handoff/checks/python-owned-v1.log": "e8846c14956dedcaa11e9d9fce4dd80c840ab533f224fdd8343baaf2a1ab21d8", + "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "09c343f1131038e4cd15f48344647e12d612d85a5900d171b831d4c3ae067bf5", + "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "8e28e9a4782f7d75e31b609d8e6b25e2f28baca5f28bd00406546d340e8aa41f", + "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/runner-record.json": "b11c4b12a6d9eb4c883a56fcd6c2ce4afae043f8433538315a8cb5ff1cb08e84", + "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/state.json": "af9de6e46594b67892a0878c963b2928d9fd0a05e9d7d6ca483e9b45f836e318", + "docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/tests.log": "3b0d74c33224a76d6e09834b6a8b0a3007ce14e3b7bad780b0aeefa889c7febe", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "8056e15ba14929ca11f8d0e9e17eb191b448a095c35685f38b889cdb72ffb6a4", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "474ec82d7e922aae95b7aca01604ce61b53f4df7ab50c69cf709a6e45c3ba5d6", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "f33cb2636ad4380636cb0efea71f7510757158dc589df291095a78fd29234de5", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json": "c24db44455e1cf40a7a55221c4a33d4fa5ba960cbe6eb9859ae935967c62e916", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml": "db51cfb3b6ffa213931d96cc33a3fa704bed1a77b49c4a9cb3038de1f4b06e39", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "7ae216930c3e449a727751a2ff9c331641031b84b01d3def4cf768e9c1404d95", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/runner-record.json": "7e514174554cc8618944cf77a2f099720d61a3b6619fdfcc7ce3507403b93e86", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/state.json": "26bdad94aa039b1b2635a3263005d911483a9e55488b61065143f1dc024f6277", + "docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/tests.log": "079db6650f608217ce369cfdd136edeff8601bda45160dd411d57b53f2a0288f", + "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "b18111504de9ea2f1d313dd07cd24ebd3043734f51d0f0e19799a9337770bb2d", + "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "9fca631229db83946b63442ba44301ead9d36dc5c67ade3adfcaba87c866ae38", + "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/runner-record.json": "cbad9d4f58f154d1a84a889639ee6d461dfd5a6b28300ed1738567f93fd1210f", + "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/state.json": "1c20568f6dc8f4362c995f8a0f0caa41f8d92dcd35983c0ad9ad0289c1fea9b1", + "docs/validation/command-handoff/cohorts/critical-context-phone200-v3/tests.log": "92b24ab411386dae72a8fdd3384ae55f428f7e3a630c13e0308c064658be82eb", + "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "7541192c03d747062c01f88fe66ab3237812fb341d621c7ca16250a5f3bca226", + "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "0d2e007dbe7712b61aa8486decff98f566fbcc2a72f262bfafb81abb432e9d73", + "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "08447cdbc4246d1dc1f8314c4540566c0d0bf842a29041ec4ec472339d494633", + "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/runner-record.json": "d85febd28cdda437d291397315fa68f5a7a0661009cf6fece04a7c7ff8ae7424", + "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/state.json": "01cc5347973545431d376043ba52f36aed7c1ef2efd4b1bfb6c84cca45cf35dd", + "docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/tests.log": "9c6d4509c044588f809f87d08131373b8e11bbfa61df8c74db4c50d52f296eb8", + "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "584c911791981c410cf40d3611e1311c2b060309397f8e9f17b77ec93cb3202b", + "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json": "e82d2f3aed99ba4a0de084fd6bd09d0483a3694cc17c6f1fd20cc6e901817d7c", + "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/runner-record.json": "cba78a7ef839061fabf29e5d861057bbb04e80db4293208f6ea04b12a2fc9108", + "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/state.json": "1ca6aa05f1a164865a4ffa56880c174c218bfac4d18139e34f2e1a19d2efa053", + "docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/tests.log": "7f63763d8950d65447701e5bcd593f91f2999e05c1e859e658c97b04d45078b1", + "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "59b653b0b28f4f4dda6eeee889a583bb2b8bf780e381ab52474be941cf2df208", + "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "915f6f29870b0b8b929d362c7f5d0566934bcdcf696615c69162574e057f99e4", + "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json": "8499938efd1d272a2a5c869b56db3c4e2e4b1b98dd99315544c263ead4d068d5", + "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/runner-record.json": "d3d97facd471c35b4cab9efc26d0bda022227e03dba9922369d2f84c91fde406", + "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/state.json": "290354a4e9d20332fd170ec20366b3fe81af28f7d39b3bae9bca0daf8fa58b02", + "docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/tests.log": "ec848983571f492e2bad0f307f0aacefdcbb98853670d55e49da452daa51b7c9", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "a08616a4e42fbaeffd9cd2412ad47d180cdbc39fabee3d8387705eced7368c8d", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "4d9435f03098e69dd48532bef3f83d0dbf845bb4d8d9dcd6d06f9bf84428ca41", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "0ed999ac9001e1b4881f0fdc058684e78da0b41b920e259a6d0fc955d838e42b", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "ce0b196b4c7072804014db6e74282b9443bb735a5b34151012c155d9bc6ae863", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "944ef9ed484a8222de3e043410e945dc9d570ec07e2de1f7057f87cfb2ae9c17", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/runner-record.json": "2e79b90f699d51f6ef76a09b161d065073113ab2085e9263b7cd18506b576775", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/state.json": "fd02016a59409d45a262235a723bb87d0a0860f4545e77dd1b40e092b58abd8d", + "docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/tests.log": "e4309f0ffa80f122f1f3ab478f10120e190575107a2f287e0d0ff15e324145e5", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "e563b18cc85b789c3e476bf15f7638d14cc83f5ad28374f6da2c24657ce2d01d", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "3c32bf5a87582c1144cad50481dd9e858bab737fb5e1f9d1f334fd881ee7b1ee", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "beda2e6bef76b76cbebd274d3fb0c772c6531651ac98a714e18fd6b449bfba25", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "d5c3f9b79dfe7fdb321e5cc4ef9080cc6865b3bad7b80b6f089aff4c66d3a090", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "18eac10e1ea8a5cdc52f8027e562fe33688dd7f8a55a36130d851c069b0bf786", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/runner-record.json": "cb548b701be8f1ec7545c28015f0bd82823f8ed0133e2c95f7bf0157fc45ffa8", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/state.json": "ab41ed9c8417d0cc4a16b73e6fae5503431fa46f552e5153e6064e931b741588", + "docs/validation/command-handoff/cohorts/final-quick-phone100-v3/tests.log": "3801f4c35fb2e2277cb30a0b76869e1ea60a205efe9fe607e5cca943b7eca50b", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "03268b17f76c6b4e0e9be9cd16e541c2dbb0f69e4ec24f585143f29afd9aff8f", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "69a6bbc05c5e8ce15ac788ccb9f6c866c9ee7535aa3ff1ae35b85df925474414", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "769d2f0b1f33bd29bd546690c08ade79c705e2168ac71fe79d5ac44311e1268b", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "dd71c738e9d9c253c0192bcb0b4e7cc8614c55e95b5c2c542d8ef2d833d84676", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "0d5edbe5fbf7d937fd1788550a4fe51dd09e35ad477d32297d94950a04fbfbff", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "0180557f2a94dbf167322a221060e51d8cdd7618f685bcd9a9b5baaf75f7c3bc", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "1477a4ee3a373a27e4297f62124c25fb1ebe42ba6e8714a82a50b2ee6bd5bea9", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "9ea90404e188cff310a29f47e8d3c3044edc84e7778d010c1fee2bf17073e7a8", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "bcf4200c7cac6dfc06688a5beda2521df0840fcac8713f9ed7bd9396c4219cea", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/runner-record.json": "7ca1c0a5faae7aa1d22c05893e4a5d5890d91377ae635bf7e4e779f91a1128d8", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/state.json": "ef3b512d87fcfd6a68c6d57de4209bf8fa09a58b8f10326f25b36ea6044f53fe", + "docs/validation/command-handoff/cohorts/final-quick-phone200-v3/tests.log": "5233e57bb3f5502f67c610df6f59308ba4269c812e6af18da47f7d5a91a029a6", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json": "6571c0a28b76b180baa09d342b0af487c4bec410cef4341de69a8edd8711bbd3", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml": "13a287eb2efefb3c9ddf715344007ba5ff6a9d4e6c8ccfbb9b7f9af890a47f1b", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json": "33cb0e46786c85dfa3181483e88d3ffcd59b3727d858d37eb700170c4c2f9dbf", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml": "651fec5d8835fa976a29bdee080c6ab842b2bf4bd4e50a0a83ab147a8d4909e6", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json": "2ccfee8afc167e956cf78ea672cc196f536ffb9e37a599c2970cc0cd414f0cee", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml": "50adedb9c19f71d38da29f1a0a9fadf4cd633c0d9bf93228c93fea64bb659354", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json": "fe98c56fc55674b02160a0b52249623ae7548c0e53cda004416869a73d4181ef", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml": "0694f3280ab177f5cbfd5bf61e16965566e1e009b58c0285d45ed1b8458e05da", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "7b68b335178c7fdf8d69ea8ee6b11d9247f504d090440cf47665dd71d3ffaa59", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/runner-record.json": "872bc2e0b822c70863d7340613ac79c6fa3e730cd6e4869b5fcb21984403e930", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/state.json": "963d12ca65e4c3fd7a05bb2741bf75c7a2c3ee94b2b79784268b3a1c03c502df", + "docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/tests.log": "abb0cf96969db72514855c1febbabba9ae60da346e5b6f895fea4baa4a30df87", + "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "6d3276a448be008c750333e300d1b942e69c57b903ad6513264de3dbe12e14b5", + "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/runner-record.json": "f58d7c3c630efcd2aca432e80aad3c074e324930aab8bab1f39fe8e78ab2b8f1", + "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/state.json": "7b8bff1616bd0387d2963ab07415ea9421e18b584446ae4cca50cd0c227e551c", + "docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/tests.log": "29c302ecbe282c4602deddb5a624fcd62035017a17b51b1c0121e56a1b2a1f4d", + "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "8edae1f374953e3f8e51db8d0dee35b9d44fdb3ca7ae2938a3d0f7b870c4132e", + "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/runner-record.json": "9fd090f4f1d7b423262804c4d1619031758568a1e61830705c6a09e92a3e1aa3", + "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/state.json": "ad0c89f23aab5ac983683a3d97570e8c5752cdb1f3de91dadecfc547c518be35", + "docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/tests.log": "0967c61d61a6d649c61a96ed121bf433575c1129790b116e00c8bfadfb3da62d", + "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json": "1a058ec6faeaf8408bb1b9b5c947c6c25fefc7c3f3fd203890c663ca02a9d0f5", + "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml": "21adb9d46dc8eb6eccd249660a1fc8de46036a409156fda609e5cce5cc256e95", + "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "e8bd09a8ce85887161517533e3ea9ce1dd24f3da626debb4ef8bd2f62be42688", + "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/runner-record.json": "e7597f1f04072c55b4eca2f1badbadcaefe6e58896eb91c3f3e774ea47872005", + "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/state.json": "1496ce48f7930dce1d6123ca0aa2d05e47654d5be1b2f53ba58299597092bed1", + "docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/tests.log": "8bb5cfc7bbf98da9c6ba052beb4dd56d58ed4fb312b56f52b2e13cf11ff8941e", + "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json": "72b4ebb1f451bb69344d3eca55b2acfe0dcacd6968561532c39a14c7622fa3ac", + "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml": "d8cd62c8b56f5f9227f13ea5e8f1e0a10b25160d9c596e5a3b3bee3f46f16267", + "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "874f128bfa8cb0c29a53de237e3cd4178e40fab8ad0a00d48160494752e9f4b8", + "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/runner-record.json": "99e584117970f2ad6327fd97de423957f30574fa4265ec1d07bd223902d00192", + "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/state.json": "f414127d06885d38c6ddca122a6a02e27d7e5f02e9747a5b82c1e3b79fd49f2e", + "docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/tests.log": "8a7c3e67af8e8a69931787bd29c1d3372afdf0a7ed93b6e450d429e412fae8d5", + "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "f13c55316a079128f361b0cbb8f3e8bed3e643e11e5b3b0a2b32d697ac2468e3", + "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/runner-record.json": "6af857046b9548d65331724f894ae4611962a1afaa256a49d47d3974f3fad72b", + "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/state.json": "2dec3b2cc36867fad2ccf7883a7f45b43f1cf403af3d642b23fae355f8d6d0f6", + "docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/tests.log": "66c258ef247988173b9f9c207999fa202750be460e0c80997ce5a046c08fd851", + "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "e4d37233c850436b58b8d33c944b09edaabde4ef7db70a3ef495b707fc278827", + "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/runner-record.json": "c5f236220aef2938ca6be1a25642822f2176d2d6ba970aea5f25f1bba16e4d44", + "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/state.json": "801432a6c753f0c451b076936692da40774f375d82298b35eae7e2a29afd038a", + "docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/tests.log": "f15f33493bfe9eeef8a73e0ce9984c65727030606f570321c83794b30fb0cf78", + "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml": "373ac540183f6f147988e2fe57cfac42952e654ffaeff1259aff9a69755bf8d6", + "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "037458451c0b74c20c2454f61ad3724035c4c2d65ae0cb8358610b171cc3a0de", + "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/runner-record.json": "25f567d18932ffad3c11f2f04c89a70bc3b4ad6a3926cd93878e12c5703dec49", + "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/state.json": "0b65c474d27c73298e1c2ce4e828a0a6347935715b7bdad2fd4cecbb5bf629a8", + "docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/tests.log": "493d797366077bca792567ff78b37b668871e25581a537f98119bd35f75c3b31", + "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json": "8c00e9d03ccefccbfee69c6825574fbefb3d9d2df1e54adb65a53397289a2bed", + "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml": "c890ff0227b4e83bba4e3202cd8424a235a10e95376d54e1689842d23633e2ed", + "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json": "e1834caf56b69587c0706db34a91e382c62c267136247986532dd9cdcc452c94", + "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/runner-record.json": "6f012a816ed13e03a30b78455cdd94a297271c789e425cbb61c6e1b9eeb260de", + "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/state.json": "c69cc3f1432736b2c0ed9ce8d2332a9e403ae46d7c157120b70f7b0fd263aae6", + "docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/tests.log": "6a19782d01cda9229de2464c2bae6bf9e9ad13875e067ba53a4c26f6dac638d2", + "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "44dbe6e97b14fdf1799cafda6c7cd9299288e3a469cbbaa35a0aaaedd84b9020", + "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/runner-record.json": "4ed38cead6508c53842d58a8280df44c3b1a79c38b23242afc4ed831e3359d90", + "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/state.json": "514b02db9ef75d30f253e52bdaac510931d08b7c54dd145dab5c8be337357756", + "docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/tests.log": "290fbea40d2e39601e0d01b1acdc9f6cb236f9e63b454c70fa3ecdab30df6797", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "a1e2942e9d7afed367ee76cad4e58f3238e253c1ff12ac011b47317bea20516e", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/runner-record.json": "56ade2c8494a5d4285afb582a3944b7675a597d95f19f0a1858595634e5c55f4", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/state.json": "e1aa9b70f419d37a1cd13569f503f4e855c331a4b74a2fab55a4dcbbd23cfb3b", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/tests.log": "3e7b766b130f05b877fb8f9baf2ac7c8a4a3c6b81c9b5ea8964ba8cd5fa38c3c", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "080cc67f9935c9f96378e8aa934a6cf80123155ad12070761c420543d1dfc392", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/runner-record.json": "ade91adb1a545f08d976ce10fa670cb1510bc51ceb91d1d72ee572a2b60f4438", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/state.json": "ccf381bfb9a9568e4ad09023a876a76db0c26af6461f3a39533dd97dbcba0526", + "docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/tests.log": "b383d4932779b3975867651774464a5445116873ab02c7df175712d23ce44935", + "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml": "87adc9a5a3794f72183549e7f7c30fd166c61a8d101bbd9042e547831f2ffff5", + "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json": "5fc6e55c648a6f23b2cd867fd1f28bbbc6d7bf0bf8cd3b5df6971924ee0ba6e0", + "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/runner-record.json": "ba3faf72dbd5c943c45167be95618f0e3a0ff34b11adc7dc1cee40bbc95e2468", + "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/state.json": "8279f80c8375daac5521b49bea72b002c00d34cf0e4a49c9ff73d714831917e0", + "docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/tests.log": "02cd1bf9a76ec04f9c248225d7c88c1e4819f1c1f5b161f28d9e5480bd0baf66", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json": "09b65fa722036f3c348a9db21d27c0356fb85afe0742df3387fc2a560728e27a", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/runner-record.json": "3cdc42adffc0a1e470cf11102df2acfbbfb383af5e0d9b9bc25dd89ff7f985b9", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/state.json": "d715fc0b43ab244d12fc72c147937c439bf75e61aa7be7712be6d1660495321d", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/tests.log": "a4a4354c0a5938625f6885ca4b155c8924bc6dd60b6536d65b77e20ce5bc59fc", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json": "7cf746c90ce169d6cf28ef0ebecc964d2c92502548a6ef1064bd0bf007b6f976", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml": "26b7a2f622be1314ae0c46df0704dd978d316a3e2cc8da73d4edf8a0284add6f", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json": "9d5bed02cab05fa0f472cc03c3e97252533c55f5ca5f49f546a05ce891b9736e", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/runner-record.json": "fbd7b46e1cbf574f2e3e04e4fb82a57b2975ca1f2254654b02909aafbd26b6de", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/state.json": "d7aa334f92682532cc73a657dd4c632e325d3a70c231dc13c48020a3018316a4", + "docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/tests.log": "8c038aaa358ecce926a02e24a8d4c88b889ba6e5eb51a6df561e66eedc2c9145", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "1f9e8817910db84db0f75ed81dcab2b97f416c43fe3ff262a72f9f49810ef6d7", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "c07c9dffbfdb2e92a21a9b034795fe3526d8a3b3c3d6f00e5b3706af5359076c", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "3d166929c12c3d88ef61dc93d731e6ca0e5967162dfd8fce291018df0dba5443", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "1d5afd01fdce55ec472c2ab314005e1f753b14ecf264a66d7de3c87454a766f6", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/runner-record.json": "b2f76a816fd92b37aa96b80dd3838cb6778e6f5b6f22669372ca8b590825d76a", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/state.json": "6188de9a3ba33ba414f7195df9e6f4812e7fdc279894e0dec2dd54ee655bd15a", + "docs/validation/command-handoff/cohorts/owned-context-phone100-v3/tests.log": "394692b9e70016e9e7eb1839176f9f79f9012b8387d1f5844d5b450168dc365b", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "5b35272dac515e70fc9ab65bf7fd91d8f382a49f36eca53b074d795e198ec242", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/runner-record.json": "d89bb9762bb872c35996d6feb57e9d2151fa27983d9fd28e62e7f767ffeffb62", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/state.json": "9e86c4a1042b0ac8b82f37a5f71821752be176b263d1d3276fb844694a5100ae", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/tests.log": "21f3f52b4e620d34e731cd12ecc7e0aff0b764feff798c230c75c2490db3f5a2", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "1c3c4e1a79770de4102611ac444bf13cfa15089765a010014875ca1b3ac122ac", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/runner-record.json": "65ba6c54830d27ce2b5c8a09766472bc088f9166bed122fd224396d2eb1bc4c0", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/state.json": "0885781d8f01ad16acaa26aa93ef4cf608f520e71e4d530247a5fc8a331788be", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/tests.log": "302ba3d2d3063897852b188bc972bd589f51deaf603b9e3aa52c5698cefc7a26", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json": "09ab93f7af3e8b29049fc3c833c8415d832f6f6440c37bef3a5413c9ee102717", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml": "cd49276fe4f237a297276f81900161bde4189a129645b843a08292bf6ccd13d3", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json": "653798a474ce567cb64c9b07c506c2688205fe418ccf29b20db318bf08138bcc", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml": "db8427b9ccf3a0941abbb121961950c6d587ac4b3328167d99767951e8f8edea", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json": "3933d117dcbadba331b8ce58020b422d0b1e4094df287fc46c7a25d94cdb97f0", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml": "3c3c394ae3351b6a753862efeaeefd20f8deb5996b29cb9cb23916886e335436", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json": "669fabf0f4aa7f92287c00df6973f036252db9432dc862d8e20ce6b020daa381", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/runner-record.json": "dec0a4b3c068ea6fa9bdacaecea97a370cec4056bf3354b8542092b0366ceed5", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/state.json": "ff7a50df295e87a7d6809611c6648d24993953ad6eaa0d044568d1b8434ff561", + "docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/tests.log": "baea72436b0941943acb30610b96759a48c0581e66e76d6677ca60fe88c7d9ca", + "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "b73acce37b7223516cb21d1b8c86b6894a96f34c519977ce7519d5e51ace13d0", + "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/runner-record.json": "3dff99d39df9891b068c19592ac921dc54598fe6ef15c912d09fb73d4ba1f8cd", + "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/state.json": "428ae20b4dd6bb3a1d7008614911ac55f999751bc46f0adc972c742cf82c413d", + "docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/tests.log": "862ced95ac5ae3e60a125fe575ca85133b141a6e8402070806b9d38c41c9f9e6", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "ee37c13e13b67784f18d1bc73942f65c4e2e7fc2f0c85fed703417854b29de52", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/runner-record.json": "c10848268e23bcea794bab0956cf2de0f8d168974693f80fff9adb04f4add22b", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/state.json": "f06a9bc6e63d7429cfd975b8d21026b396a1f24fb3feb2ec259b17eb890e25e5", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/tests.log": "db40fee0b8d093df0ddb1811de797add465d9b47b528f6b74c326af2bbe09317", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "e65a9d7dfb62aad90f07d048bb9fb27ea229bf219c4da4c5ad31ad56bd6619d6", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/runner-record.json": "6eb1a274f7b7bb19b0803d1236f8e74dbbe1dafe0c83c3710431ecad5a625a3f", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/state.json": "d8b8eea1f59d2e260e69578467d2ca7fa6fcd6518d56e9c673ad40326fb4675e", + "docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/tests.log": "18b8c8988ddb05bdff41e499c65596db33b1318b8631c5328bdfa5bed920e4d8", + "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "9d0c3c1cec85c0a52f25741eeffb686ac4abcb352c50f3656e54bbf271082e5f", + "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json": "5a8009f47850dff8b612b6cf78c16ae8f5fc0491607e8f21a6cb89b451ac2697", + "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/runner-record.json": "661c214aefa78873c550719316f648f585e740ed7994686bccc45cac710fb465", + "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/state.json": "010b60eda989c13cffa22783313a0e2775b884b70a471b6ee5d7965ad84152b7", + "docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/tests.log": "e84efd600af01c2f25b2c81193d5fc04bf6e5e94d59a1b7f3878ecae6ab1238c", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json": "32097bf27a4972766592839d0d1ff1628920d7cb25301bd1efb04fffe22e5ab7", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/runner-record.json": "a6866986ebdceff7378cb1605cccc7ffd5574bb83ed6d5587eb0cfd4705c29bc", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/state.json": "2cca25b76dd6822acc6827adeb2abb8842962cd3c936c350700abbfb8dc053b9", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/tests.log": "f9dbe0d67ffb2f5c8bd9734dd2b4699745558d3600b0fa6e167d7cb9b5e55d76", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json": "9a3386063581719dd59c9eae35cf489c39d612bf321df38a091a7e2604e1d388", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml": "e425ca9cc526680a3a5b397f4480470999adb51e830a9bdc97896dfa901f682b", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json": "42d4ef12b071e6351e533f26ed7c17e82d0d169d4872b86a26271d4ebf0b83d1", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/runner-record.json": "a8ebef662e82adfaeacb1fa597e83b5cd136fbd933638c50b998156b7e9d3e96", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/state.json": "0d538c473eecb5a371b758c6859a3e53ae255a30d64296df67101d4cb4966765", + "docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/tests.log": "957342e76cc068baa363031980e5808f15f3354e31b84bb1fb96d54f0bbeadf6", + "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml": "b148f337b16efe8969518c934c069f02e0efc2be1d5b6a53ff574f38ef6ff6ae", + "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json": "5325fbd707275c874fa4ee46143e9ca9bcfd6183568772da1592c8abb2681cce", + "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/runner-record.json": "36ad8e932bb68a36fd79eaef1c2a6cf449023a8868caa2eed528daf6c8f39b54", + "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/state.json": "6ed690eb3d24af6c19b70b31e330fdda22af4e4eb7bf7ca0aae1a9bd13fc6582", + "docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/tests.log": "f13b70a8801310d8efc5a383b7a093b648a41aae196e8a0b6d2751dc0ef7854f", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure-frame.json": "8d3edab9f4b4099e30c7ac76386b6739b610bb4cc10a5ced017180d3627f6a47", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.xml": "069ca18c2e0df7ed880961fcedb5a5206206abf110163b35abb6e8d74e3be913", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json": "4f96570ca22a198467ca85e0102b27ecb2a7ce82202fa4e0053be9868826e905", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/runner-record.json": "66b9aaf869c0c9a6e3c487799358114475115a95081fbe53088b4062e040a8a3", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/state.json": "519782f8faa4513a833d075fd22d124b60dac857e1b1aace4e9fe99dbf818a3b", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/tests.log": "ca84a11955af1f2f83b56d480b7c753b9e38f4e0b8d2dda58b8e903fce735500", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json": "d1224eac695c26684c201836d0efd4c326c76fa6a7556064220034dbeacd89af", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml": "c7657f46496e0ca56e1a64dffff99ec8e585f65e856d4e74afec590ef379c908", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json": "0a201aba23b2b4cab4fe2f6ff934a1f3aa12616e7c15c3774d66f8bfd9c0ece5", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/runner-record.json": "3ffb0b24241c83765533f3e130b802725b4bcf94b033da55150b822d085d50c7", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/state.json": "786effc97bd93fdff112e1ee8a3af231b470e1876a4074f74ce75c54ae757edd", + "docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/tests.log": "df30ce934fc48e87791e33ba33a8a07a119826b75199743890af2d22432ef583", + "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml": "0f625577eed7ee9abaf22fa5f2a94131467a2ed537f6c418fe3b67061b4e5200", + "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "0046bdc0d1c7637ff7dbdeebd1b317729f0a47caa3341ece69fd9a4b2fe751c4", + "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/runner-record.json": "ceb48d96639591bbee5dbdfde50bfdec2dbaabff709eddd54149dbc3a0336c25", + "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/state.json": "4274c3f895a3148650396e62504fec75c9370da06eec416d20308f6697a1c147", + "docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/tests.log": "1ac639b211b0ec58dd33293422da4b26d8bad6fa42cfd3fa448782b5648baabc", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "54c78bac5770b924230e8ce09ab721486af5ec60349918fb282041eff6cd0121", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/runner-record.json": "9d24c8e381cb6649de6f3ed08a6617925660a26b0e0c40fd3e609bf459ea630a", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/state.json": "4aef73191e74e2754cefff93b0f587355fb828e17269de822fc8a8f53ac585f8", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/tests.log": "b37a4c48c5381102c8c57e222e9657c2ac0bfea0bf3f0bf589af8582f780c17a", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json": "956c5a93da812bbab211271b9f2690c128a281ef73b6ebba477b41c5d0303bd7", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml": "dbcdb0830233b87d0b7d921f466a65fdf1618bce77da57d140f0a64ab40b3cf1", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json": "f541fd0848c0f5b03508aba2bd4f80ea45eb09331baac98117ecd18e26ebb72f", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/runner-record.json": "0cddcbf170a0e39c5b5d8ae5c00df89a5ce9d759760a804e3ece3c1d4dfe6c95", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/state.json": "60b74f8d9fa3dfe10cc71418ecdc9d424b051841edc0039065342e576a7fa6c1", + "docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/tests.log": "caac7e8f3f1cd84fbdfd44392ad9fd43a0e7963d94f4fd6111ce265bc619a071", + "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml": "ed482b83621dd27b96b95efd56db8e43cb029d8185f50a25c910bdd15cce6f8e", + "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "848b45803ec2987b50d8c55973b2b31f49cf2534db429eb581753f66734facd0", + "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/runner-record.json": "96ad250180fbc5cd460f542b42045f5e2fac6ab774c46586bf8a68b69424344b", + "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/state.json": "88262edf2d618f70f7c8c1d6850f9ff01ac3f89557703cda3728bc18af3e5632", + "docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/tests.log": "3670d9bb87e5a57bde0b4b8064526be35f3ece0943f741790b7b366423adb175", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "fb359c77047e275a9b1844d08f3225c7424f33e79586a05cb4e61a7eed578361", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/runner-record.json": "1070b196918e9bee550ff2c0dc1d4640dd24729301e1631eb5b77d2f11ea87a8", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/state.json": "5dd87c8d19c552999879fd0efeb20e6252696b0e043c364b891f799c5d27295d", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/tests.log": "915aca38afcf710337e3939b4adb2e237be4cc730a9f0e5b5349dfa10a55be58", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json": "83440af91b63de81635c5610e8395a899c5be7477ccda40b028bee435614d4b1", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml": "1bb19b2f8c0bd5ce5b5b0ee2537b528a0e352adc9d87dbd3ee1a064499b2945e", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json": "861746c1df8fc8399bc2aae5b9963ffb617ab534dc8f010fa99f9ebe1f95cdcd", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/runner-record.json": "0cb3d20987f37edd4a3a4b9c8f0d96464443580d84a4be08540fa537964e0260", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/state.json": "c48d82a9a70cfb2c5abcfe8d23e24205a432e4ff8dc08c72fa3b257c431d4de0", + "docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/tests.log": "711321ce660aad4f45e2e351c7147f567e2ff3d253c619bcc8a9fcca26ef3007", + "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "63e4810699543f7573fde382cca340547c4d42076949fbed49179cecbc44f6dd", + "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "62e74db2c20d1d26888441b583a8a257ef6bbdee1ee85eecf4a8adf7670e0d25", + "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/runner-record.json": "1f0e41326b5c475601e85bcd2b8d5527966bdad72f6d218272e06563711f9a5f", + "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/state.json": "8a6470a887b89d23669141f9f9f0adef30265ce60a0a4f5b690bafd5d784e326", + "docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/tests.log": "5a51bb494c7d51270e167035332e819b7161167d77e1cd6bccf0c5e7c5d72887", + "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml": "a91535964136181d41b163781300f165053a921b25496435b618df29ed71424d", + "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json": "2f70aadf4cd367019871f71b1408214cbbdf52079f0daac722491f9f63b78029", + "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/runner-record.json": "dde4a1f001497b3ad5c1b8233f3f63854e11d6ca2043f6dc7aba75bafb608ffe", + "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/state.json": "84a86b553408420dea1206f8438f657c00211dc36aed3812ccc5f98ec539d0ec", + "docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/tests.log": "b43b125eb4ac715a7ea1c19520314470739f6d5943d3a6583be60839193f2ac7", + "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml": "a03d485cb9833b23827bb17d4be52a345e2da846c50d9b9013056367f372e33a", + "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "f1b6356ece1bc3fb64190ef90b995fac53c88b6da8f21aec86d4353531e74ddb", + "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/runner-record.json": "1da5e784932edda53230b454e258056b1406acbeb5ac66da24841409505725d1", + "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/state.json": "feb83620d2c02555ee6516c273ff76a395aa07be818df4ca6cc2fcc736795c23", + "docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/tests.log": "457c31b0a839366d9d1217ae900fba753a9349702e2dfbd6ae20d0d6dd7060bd", + "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json": "df318fadc365ca2cf7c9d230c4ac9962924a62cf4b710ef7cf23b2fbbdd6871e", + "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml": "2ae22e7a545618789d11c210c4af409ea8dd76808ef2dc61db5ec20fc89f0fd3", + "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json": "ba80ba361126ab7939114f369bfb1fdfb341b084c339fb2cde75f4beabe27989", + "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/runner-record.json": "731bc72b850a118c113fd15ad30bed737a9d70d8bbd6195eea3178c45ad95f8f", + "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/state.json": "8d3ab3102a58e84461e2791916bcfc7966f144ea1d1372b12fce0a032f6705ee", + "docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/tests.log": "72695a34f292f38a07b389830c293e41502b027cdee6b816a5a83e759ed3e5fc", + "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json": "640546e998d74390479371f23fc4fef1f1c2071acdefb840566b7b94bfa5b203", + "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json": "79de70b94b21f7976ec777f492156b50b08e25bbc1d04af5dd03e479fec08bd8", + "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/runner-record.json": "e7dd3b14690bcc8c7951c410a2f90b992ed9abd8a34b5aae208c3ecc7bc02324", + "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/state.json": "617747f85bd8a81f5b72f4ec00cfa9d39efba4756e58e324d44f492613290164", + "docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/tests.log": "f14366d977912048ce1dd95bd1714a08bdfc4710cceadf95f9729083ef862836", + "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json": "b4b1d0a30b159e2949a8fc368fcda592f58776b02407c3072f55df52fefea994", + "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json": "31562ddecc201df18b56fab6209439d928528aa48671f58e5a812d07f4e778eb", + "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/runner-record.json": "75313eaa510e49fdbe3dc092f6b8f5b30274dfb2cd1e49d64d1ef0200448faa2", + "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/state.json": "be8ea26df6cd1807a43dc5ed8f203e388f1958e546f89fc9c455f168dd994b80", + "docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/tests.log": "dabfe896a56ec3c18d232f38dfeeecbda0821ea4f9f82b9d3fc714c2dd148fdb", + "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json": "cfba77da3390ed7a598856b96c78a350ba2ef870d5337c1a3aeadfa48017de6c", + "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json": "784e5656b6b5bc11129c110689b85bc4945eb3e2d0474ab04e9d870e30b47e9a", + "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json": "c8eea1e6ad24160c08866056687cb8a019f0929aa776a514c4925fdb39320e0c", + "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json": "7e3396563bc7c2dacb6af9d1d424f139384fa743b9063fbb2583533b850e6da4", + "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/runner-record.json": "bb23be100dab47d5a9905afa3d844aba89fb99d0b9322c7cc8b523bf2422b320", + "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/state.json": "6832408199117ce5e0c1f17f1c2383470db47bc4ae678610b681a0de95b4170b", + "docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/tests.log": "033078a2df40371cf7100b7711bf91854b99d3908810dc3ad102929f2585571b", + "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json": "862b93f2a6d155b3b203d95a9e92aef3adc43d490f5b1d7ab93efc4c49799db9", + "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json": "8ba93d57f29c23abe7c97e79d460975d37c2efafffaed4549b673a6eda185a5a", + "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json": "adca0b75cd73e7472ea25cb78d479f7f302326610a41faf684b54270758fc76c", + "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json": "b39a7d4e64667a8921e482c48c4311e3b769b197a21efd40098da2b6be1c8ee2", + "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/runner-record.json": "466c216712fb2759768c1a8ad50f7075f432804c6502cc3f0070272126a80f85", + "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/state.json": "e0e32c4d173037c3d3cbd0e79908701ae62952bbccecdd9329a8d88cabe02a1c", + "docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/tests.log": "c30b14e555397d33af5b658f81c1fe5f1bcd7bf425a1220ce9682538f5b1f67e", + "docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/runner-record.json": "0a2a5bd6574756654b3258cd6e32d3e1bc936f73932118db8e11461ba570cc14", + "docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/state.json": "4bea5f1c75a06798b48b033459ec80c8609c548352d514d7d87bc0e2e1f005d3", + "docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/tests.log": "7a7fbb2fcb6d083194e04fe7c74a13b662db265cedbe2893751a4da5550a224b", + "docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/runner-record.json": "bc56b1d82ffe2f7cbc36b774f56d0db81ee63b7adb807aedfe11591ed018a92e", + "docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/state.json": "866a43bb06bc3d37b976b5c08deb46feb162c3e27738e2cea61eef055332834c", + "docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/tests.log": "e820264d0865a5f24f69acc18601aeaaaa8757b5dfb1b83b0966067f0e3ad5ae", + "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json": "f5f4c7523ec578b01639238c9145082ac5e84fbd5fc7a7f4f33d482f0cba0cb8", + "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json": "446143ad9fea601938e120034db937d41d12731dfc2bd58331d024181c3c35d1", + "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/runner-record.json": "b957e0473306d6bde401c9e006fddc898509802e7d697f0700125265ad37eec5", + "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/state.json": "deba35c7520008c9fc4001d15fe8605eb10dd23a530e03711cf4ab7d5190cb98", + "docs/validation/command-handoff/cohorts/regression-review-phone100-v2/tests.log": "20decc0295da7c296be9a4965127d74737d04bce73cf6a9402f050de5eec214b", + "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json": "f77d726a37365160fc897acd02c97e2db689e1df8c7166205eb942acd3a35819", + "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json": "0451639f29a88566a7ac144cfd2f8b4a49bda5e623237af86f83f123d4e78131", + "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/runner-record.json": "82fecc0337e74b5296963e762819eca459016eb5dde15ba9d862ee4374fc3f96", + "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/state.json": "786a71d620a9d8a360028d27f769aa736ed24ade19ff383dac41236acc6950d4", + "docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/tests.log": "7f4cd1a8f93563fee0b468f5a02198ca11ebd7e014842178e73cf42d9d3fdc0b", + "docs/validation/command-handoff/collectors/build-candidate-v1.py": "b1d798cdbe27466d79a5dda83c841ea3293139fe9aca790048b039af9f2fa58c", + "docs/validation/command-handoff/collectors/build-candidate-v2.py": "640c2b7934245c7f3916c39cb266cd1760f214e01d9aaea12308180298c45a87", + "docs/validation/command-handoff/collectors/preservation.py": "6fe086314a94d694f538fc6b1fb71958aa34cb1d0e80baf6833abe74e5385cc1", + "docs/validation/command-handoff/collectors/publish-handoff-v1.py": "4daf8e5dc90575b46b405d5a41cccb988dec83e04d2c1ff88f0616b041d7d4c8", + "docs/validation/command-handoff/collectors/run-continuation-v4.py": "52cd037127ab546a98d0e26f8d8ecd386c32f67c0d9fd081ad9aadcbd1001df8", + "docs/validation/command-handoff/collectors/run-final-verification-v2.py": "a352abd9ffc00dcf991ada8fb255e5b4d780cdd41c9f23e701398ca2fa9c1dad", + "docs/validation/command-handoff/collectors/run-final-verification-v3.py": "0a9927e21f702d129a18bee014d540f36aac13a17c178fe23b44cf778a1ebeb0", + "docs/validation/command-handoff/collectors/run-matched-quick-v1.py": "f62cd9b45a0a7af592a2f3c6da9967f5b57a037633fc437c43cef2f00d6a6c19", + "docs/validation/command-handoff/collectors/run-menu-regression-v1.py": "88e991a891d0fb687ee8940c0235e856860e713c9521edbb7ef59e6623a378c6", + "docs/validation/command-handoff/collectors/run-owned-matrix-v2.py": "9a9283329a03bcb168cba775f51f624ad9aad515547404a10276b383337d0c1d", + "docs/validation/command-handoff/collectors/run-owned-matrix-v3.py": "194fae2c45d4e6c0f76e02bda9744af054e1e1f0d722123c780cf04aa8a4d333", + "docs/validation/command-handoff/collectors/run-owned-v1.py": "b7e57f3455109376cc10024e71763f188410a4ea791e7f5bba25eb8525a7243a", + "docs/validation/command-handoff/collectors/run-quick-control-v1.py": "f23941164030c7e19426e96d24663c5ea3349603d5190066128add6b47dab477", + "docs/validation/command-handoff/collectors/run-quick-control-v2.py": "9cd283362b0f9f87548dd8412c01c8c0c4010e9a7224ea3638f93920335809bb", + "docs/validation/command-handoff/collectors/run-regression-v1.py": "697b65d91f5eac63048ec698aa837455afc4da291139dcf40a1dfb171dec3bf1", + "docs/validation/command-handoff/collectors/verify-handoff-v1.py": "5b54856220afc057ea7990fcfe76705a969b37cf36d78818ffa65cf7bf17f3f1", + "docs/validation/command-handoff/identities/build-candidate-v1.json": "6557f08c3a0267d6468a69df3cbcdc55260446385f63bbfa26468bdd8e48821f", + "docs/validation/command-handoff/identities/build-candidate-v2.json": "c50383c2d467861a22597b0cf09c79902a351ea25d0a5fd589c300ea58455fe3", + "docs/validation/command-handoff/identities/common-v5.json": "5d4b21aa2b5a1d3107fe2bab9f6ce738de9f68136403cac3c063ef501b578fe5", + "docs/validation/command-handoff/identities/owned-harness-v1.json": "c7f84ce7f761d302392f03ce90acdfcc2ebdbf7d46814fe23bdea544a9c804bc", + "docs/validation/command-handoff/identities/owned-harness-v2.json": "8a216a78a7362e9d32bab536a474ec0986e2abf2d50f8125d7878f960b04fc95", + "docs/validation/command-handoff/identities/owned-harness-v3.json": "cbe6915e66da64c8085fa8ce81847b272f0d99f0128a131252f14f8cba49e138", + "docs/validation/command-handoff/identities/repaired-harness-v2.json": "95ed271d32bc2b2838249ecb7c486c6daa05778d09ef272372b84f068bb934d8", + "docs/validation/command-handoff/pipelines/continuation-v4.json": "6fd0e489a42d97583517664702f63a818f096986affccb0632af3810fb4ce6e1", + "docs/validation/command-handoff/pipelines/final-verification-v3.json": "8dfea9f311661adca567783ef3792670ea9daaa88e780c98a4ed421d0fc06ef2", + "docs/validation/command-handoff/pipelines/owned-matrix-v2.json": "c87d93fd94ca5334a56b72251eda5965fc346690b1e8c3e7892a560d14d38d3c", + "docs/validation/command-handoff/pipelines/owned-matrix-v3.json": "8931b2640717c7de59912816895dbe7650c6a42853af4ddee961ddd4108aca97", + "docs/screenshots/command-handoff/critical-context-landscape100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "c8330b8656b41b50a755899b3595c297d2c9e22728eeb6dd0f3dc0d11f3febc2", + "docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "f416570f4108aee70ccddb711aad008a9cf4b5bc7ad02799356f4a972dc4ddc8", + "docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "6ecb00d1a6338aa18b52cc8a2b3962a396e0581c6c40977bf3f6120097a71219", + "docs/screenshots/command-handoff/critical-context-landscape200-v3/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.png": "f94800f314e58c3dd2cd04e2eeb8aca9af2caa4e59d864770ba2aa27a43de63c", + "docs/screenshots/command-handoff/critical-context-phone200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "a870be05bb92f8f40fff5057067ae4cabf234c9a88f594843328b4fbadeff02a", + "docs/screenshots/command-handoff/critical-context-tablet200-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "5dbedbcfe9ea0205da5eaddaf8a8d7420017050d853d3ad2afb4589a3188193b", + "docs/screenshots/command-handoff/critical-invalid-landscape200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "8507a076fa913fb5fa4ac39d658013d4e933a2dc9cc2ae4a4a9f5888e20b0d99", + "docs/screenshots/command-handoff/critical-invalid-phone200-v2/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "99dc95154984719bd9483f7fec9a436b20180809e03053d583da6eb5bbc64d75", + "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "5641be56523dad5022abdbea01b8342ff3b1bd730c10470acae9d053d9c32a24", + "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "17ba4baf615eb1fceb529ce315e9d2a1262e15223b6f6041d1e5da9e7cdc74be", + "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "7172da8f16e8749c3df0de623261e8a65d015de6708b27531257e2aa6c493564", + "docs/screenshots/command-handoff/final-quick-landscape200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "26e476d167c18d9c8178ee110fed30c57a4f7b726b606fb9473066a378684570", + "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "e99a256c5a83d08b788c3d69bb3722035f345da169d4a8d129be74492447a275", + "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "d65d5449021e1d7db3ace5fa63a100fee0439126d2384b9ad5361f9f9f4a9fe7", + "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "b997313dc99c8e1643af4a921fd03eec9d604b686656aa3522070f32895af023", + "docs/screenshots/command-handoff/final-quick-phone100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "a4b9f384eecb73527ed763aedcd72fc706fdea9f462d1e62c2dafdd0e58d7f24", + "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "731649dc08f78dbe981a38d23bcc5e3aea31f6badf4c98113760121256a60c4f", + "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "51e04c3a96e910160ab65423cd0f17562d885952da613da69108005130c1cda4", + "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "2d6503ff19c20a54a077848bf00b27aa8077699f4b5000ceb680ef0344328061", + "docs/screenshots/command-handoff/final-quick-phone200-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "a7e12e9173dcb459f9e12a5ab434f63f3e5d93fbbbfddc59d70915d55430fd1d", + "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.png": "4f3b7dceffb6b8d8b8ff0bc566b2c2150927e6f5ea9fcad5d6c4bbe4436b8386", + "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.png": "31aa9e61302e68655d6d32e930cc4963c580a36746b07e27f5e06cab9d0e57a0", + "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.png": "a95dc16792511fd0f362806d7d2460e03d462ff9a217eb5d59e29d03899e05fc", + "docs/screenshots/command-handoff/final-quick-tablet100-v3/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.png": "7ccf42628465ffcbcc252db3be5e540cc4828504d243b661ba63cf12ca88fd42", + "docs/screenshots/command-handoff/matched-lifetime-preferences-old-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.png": "d4409bf9b1b8a3522fe8798cfccdf81a700c843da05a3472516989094ab2be62", + "docs/screenshots/command-handoff/matched-lifetime-recreation-old-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-failure.png": "2d370398f1b2373477a455b5af8a332428c4f39f9174c507fbdfadd06c04bbeb", + "docs/screenshots/command-handoff/matched-quick-old-phone100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png": "7b397171db597092e8346636620f90bdd0ffb18c4cae9d916245632f85f6d303", + "docs/screenshots/command-handoff/matched-quick-old-tablet100-v1/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.png": "285d54e5316430399033af23c61df4491562d29b4fbd4704d294dd806864b38b", + "docs/screenshots/command-handoff/owned-cancel-phone100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png": "484e7a4e76cb98052867af38b8fe4b0f7a86b04c1dd463a90d5681ab75cbb475", + "docs/screenshots/command-handoff/owned-cancel-tablet100-v3/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.png": "b6d01388dd47174bda4a0f754c2b4628e937eba64a7b9cec1ab1ca834304c4af", + "docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "e90c60bb6b43fdc92e12b48cc252579fa719779a7b00354cc0773c803052f350", + "docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "208b390264230e605b47f3377866233e98dd5fa5038600fd9c61340a5a94aeee", + "docs/screenshots/command-handoff/owned-context-phone100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "dade1ca845a51a070bb17b7a2fbab08f40e4de135735cb4d4ac270f1d132916f", + "docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.png": "4e0c7e4f59e911a4890321a0aeccfcc8ce43f4fb1648ba6c12a8c825d0255880", + "docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-child-context.png": "0d821a02c038de1e278555d94c074d3f4a0cda623501eba45564038298e63e1c", + "docs/screenshots/command-handoff/owned-context-tablet100-v3/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.png": "becbae7d1658ff6fb100754178720c03a7408dacd6e14e95af0e0a636d3d5f07", + "docs/screenshots/command-handoff/owned-invalid-phone100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "24a4c9250dbd3a49aa7dcf6c9edf476708f0c1f9f8d08cb5a3114b9f946a22e6", + "docs/screenshots/command-handoff/owned-invalid-tablet100-v3/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.png": "59a052bb3ebbf04d160f26d7187554bd399ea0dee8324c6578d83d7b0f2cbd42", + "docs/screenshots/command-handoff/owned-ordinary-phone100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png": "3ef75ab5dffde114e8088b9c40c294019168ca4b2bd892105bf863a00f5f1a5a", + "docs/screenshots/command-handoff/owned-ordinary-tablet100-v2/handoff-ordinaryrelaunchclearscontextandfallback-failure.png": "431eee87dd338c0d371cc8dd8e7a629ba0bdf357933f17056a2e90910f1d01b8", + "docs/screenshots/command-handoff/owned-ordinary-tablet100-v3/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.png": "888bc15a0ee327444bda08c75a665326a73127318a84bb60e6c6d14b8d828069", + "docs/screenshots/command-handoff/owned-preferences-phone100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png": "f39e5b4a87df5779d7cb9d0f25605641ce417a0c5f2771a812ccc4fe7991c738", + "docs/screenshots/command-handoff/owned-preferences-tablet100-v3/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.png": "3c146f2018e67cc347913383e02c3fa48bc1ad2157645f92725132fb5d5b36ad", + "docs/screenshots/command-handoff/owned-recreation-phone100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png": "0229012efafb9d16c4107f870f8d8c7ad6c0852e031a58ad65f67a707aed88ed", + "docs/screenshots/command-handoff/owned-recreation-tablet100-v3/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.png": "9d28a913a316029556e60ca752a4b81401ac058b1ebe48498815e8b074ccf0e7", + "docs/screenshots/command-handoff/protocol-ack-phone100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "2141f06b1baa64006a8670fe94b49812ecfbfe60c9093ab1cc460b546e74d2f1", + "docs/screenshots/command-handoff/protocol-ack-tablet100-v4/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.png": "942c393f6c074f0eb11ae4167b22197d638db3f4bf2e4aefc8c1e562dca27802", + "docs/screenshots/command-handoff/protocol-duplicate-phone100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png": "6e9edcfe65a987fd257646b749bce5993f3fd6b6f19d590e2ca089bc7764d316", + "docs/screenshots/command-handoff/protocol-duplicate-tablet100-v4/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.png": "93f8e070532b1a14b77c0a6c7a1124f531d15a520f1f0926852f9504a29724f5" + }, + "final_native_executions": 44, + "final_cleanup_checks": 654, + "final_cohorts": 34, + "matched_negative_executions": 2, + "matched_negative_cleanup_checks": 36, + "total_executions": 65, + "total_passes": 60, + "total_cleanup_checks": 1040 +} diff --git a/docs/validation/command-handoff/checks/asset-comparison-v1.json b/docs/validation/command-handoff/checks/asset-comparison-v1.json new file mode 100644 index 00000000..9ae7c213 --- /dev/null +++ b/docs/validation/command-handoff/checks/asset-comparison-v1.json @@ -0,0 +1,46 @@ +{ + "all_ten_packaged_assets_unchanged": true, + "asset_hashes": { + "old": { + "assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66" + }, + "intermediate": { + "assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66" + }, + "repaired": { + "assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66" + } + }, + "apk_sha256": { + "old": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "intermediate": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "repaired": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d" + } +} diff --git a/docs/validation/command-handoff/checks/build-candidate-v1/benchmark-build.log b/docs/validation/command-handoff/checks/build-candidate-v1/benchmark-build.log new file mode 100644 index 00000000..b9ec8640 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v1/benchmark-build.log @@ -0,0 +1,142 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preBenchmarkBuild UP-TO-DATE +> Task :app:mergeBenchmarkJniLibFolders +> Task :app:mergeBenchmarkNativeLibs +> Task :app:desugarBenchmarkFileDependencies +> Task :app:mergeBenchmarkArtProfile + +> Task :app:stripBenchmarkDebugSymbols +Unable to strip the following libraries, packaging them as they are: libandroidx.graphics.path.so. Run with --info option to learn more. + +> Task :app:generateBenchmarkBuildConfig +> Task :app:extractBenchmarkNativeSymbolTables +> Task :app:generateBenchmarkResources +> Task :app:mergeBenchmarkNativeDebugMetadata NO-SOURCE +> Task :app:packageBenchmarkResources +> Task :app:processBenchmarkNavigationResources +> Task :app:javaPreCompileBenchmark +> Task :app:parseBenchmarkLocalResources +> Task :app:mapBenchmarkSourceSetPaths +> Task :app:checkBenchmarkAarMetadata +> Task :app:generateBenchmarkRFile +> Task :app:compileBenchmarkNavigationResources +> Task :app:createBenchmarkCompatibleScreenManifests +> Task :app:extractDeepLinksBenchmark +> Task :app:processBenchmarkMainManifest +> Task :app:processBenchmarkManifest +> Task :app:processBenchmarkManifestForPackage +> Task :app:mergeBenchmarkStartupProfile +> Task :app:generateBenchmarkAssets UP-TO-DATE +> Task :app:mergeBenchmarkResources +> Task :app:checkBenchmarkDuplicateClasses +> Task :app:mergeBenchmarkAssets +> Task :app:extractBenchmarkVersionControlInfo +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:compressBenchmarkAssets +> Task :app:collectBenchmarkDependencies +> Task :app:sdkBenchmarkDependencyData +> Task :app:validateSigningBenchmark +> Task :app:writeBenchmarkAppMetadata +> Task :app:writeBenchmarkSigningConfigVersions +> Task :app:preBenchmarkAndroidTestBuild SKIPPED +> Task :app:processBenchmarkResources +> Task :app:processBenchmarkAndroidTestManifest +> Task :app:generateBenchmarkAndroidTestBuildConfig +> Task :app:generateBenchmarkAndroidTestResources +> Task :app:packageBenchmarkAndroidTestResources +> Task :app:processBenchmarkAndroidTestNavigationResources +> Task :app:javaPreCompileBenchmarkAndroidTest +> Task :app:optimizeBenchmarkResources +> Task :app:parseBenchmarkAndroidTestLocalResources +> Task :app:generateBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestRFile +> Task :app:mergeBenchmarkAndroidTestAssets +> Task :app:compressBenchmarkAndroidTestAssets +> Task :app:desugarBenchmarkAndroidTestFileDependencies +> Task :app:checkBenchmarkAndroidTestAarMetadata +> Task :app:mapBenchmarkAndroidTestSourceSetPaths +> Task :app:compileBenchmarkAndroidTestNavigationResources +> Task :app:checkBenchmarkAndroidTestDuplicateClasses +> Task :app:mergeBenchmarkAndroidTestJniLibFolders +> Task :app:mergeBenchmarkAndroidTestNativeLibs NO-SOURCE +> Task :app:stripBenchmarkAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningBenchmarkAndroidTest +> Task :app:writeBenchmarkAndroidTestSigningConfigVersions +> Task :app:preBenchmarkUnitTestBuild UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestResources +> Task :app:processBenchmarkAndroidTestResources +> Task :app:mergeExtDexBenchmarkAndroidTest +> Task :app:mergeExtDexBenchmark + +> Task :app:compileBenchmarkKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/CalculatorActions.kt:13:46 Non-public primary constructor is exposed via the generated 'copy()' method of the 'data' class. + +The generated 'copy()' will change its visibility in future releases. + +To suppress the warning do one of the following: +- Annotate the data class with the '@ConsistentCopyVisibility' annotation. +- Use the '-Xconsistent-data-class-copy-visibility' compiler flag. +- Annotate the data class with the '@ExposedCopyVisibility' annotation + (Discouraged, but can be used to keep binary compatibility). + +To learn more, see the documentation of the '@ConsistentCopyVisibility' and '@ExposedCopyVisibility' annotations. + +This will become an error in language version 2.3. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/EmojiUi.kt:98:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/PaletteMenus.kt:325:43 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/PaletteMenus.kt:389:63 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/PaletteUi.kt:180:51 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/PaletteUi.kt:257:51 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/SettingsActivity.kt:50:205 'static field SOFT_INPUT_ADJUST_RESIZE: Int' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt:25:128 'static field SOFT_INPUT_ADJUST_RESIZE: Int' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt:30:118 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type 'Any?'. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:210:43 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:224:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkJavaWithJavac +> Task :app:dexBuilderBenchmark +> Task :app:mergeBenchmarkGlobalSynthetics +> Task :app:generateBenchmarkLintVitalReportModel +> Task :app:processBenchmarkJavaRes +> Task :app:generateBenchmarkLintReportModel +> Task :app:bundleBenchmarkClassesToCompileJar +> Task :app:mergeBenchmarkJavaResource +> Task :app:generateBenchmarkAndroidTestLintModel +> Task :app:generateBenchmarkUnitTestLintModel +> Task :app:mergeDexBenchmark +> Task :app:compileBenchmarkArtProfile +> Task :app:lintAnalyzeBenchmarkUnitTest + +> Task :app:compileBenchmarkAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt:544:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt:261:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt:597:60 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkAndroidTestJavaWithJavac +> Task :app:lintVitalAnalyzeBenchmark +> Task :app:dexBuilderBenchmarkAndroidTest +> Task :app:lintVitalReportBenchmark SKIPPED +> Task :app:lintVitalBenchmark SKIPPED +> Task :app:mergeBenchmarkAndroidTestGlobalSynthetics +> Task :app:processBenchmarkAndroidTestJavaRes +> Task :app:mergeBenchmarkAndroidTestJavaResource +> Task :app:packageBenchmark +> Task :app:createBenchmarkApkListingFileRedirect +> Task :app:assembleBenchmark +> Task :app:mergeDexBenchmarkAndroidTest +> Task :app:packageBenchmarkAndroidTest +> Task :app:createBenchmarkAndroidTestApkListingFileRedirect +> Task :app:assembleBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmark + +> Task :app:lintReportBenchmark +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-benchmark.html + +> Task :app:lintBenchmark + +BUILD SUCCESSFUL in 53s +87 actionable tasks: 86 executed, 1 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/build-candidate-v1/debug-build.log b/docs/validation/command-handoff/checks/build-candidate-v1/debug-build.log new file mode 100644 index 00000000..1d3fc423 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v1/debug-build.log @@ -0,0 +1,119 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE +> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE +> Task :app:generateDebugAssets UP-TO-DATE +> Task :app:mergeDebugAssets +> Task :app:processDebugManifestForPackage +> Task :app:compressDebugAssets +> Task :app:generateDebugGlobalSynthetics +> Task :app:desugarDebugFileDependencies +> Task :app:mergeDebugJniLibFolders +> Task :app:processDebugResources +> Task :app:mergeDebugNativeLibs +> Task :app:validateSigningDebug +> Task :app:checkDebugDuplicateClasses + +> Task :app:stripDebugDebugSymbols +Unable to strip the following libraries, packaging them as they are: libandroidx.graphics.path.so. Run with --info option to learn more. + +> Task :app:mergeLibDexDebug +> Task :app:writeDebugAppMetadata +> Task :app:writeDebugSigningConfigVersions +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest +> Task :app:generateDebugAndroidTestBuildConfig +> Task :app:generateDebugAndroidTestResources +> Task :app:packageDebugAndroidTestResources +> Task :app:processDebugAndroidTestNavigationResources +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:parseDebugAndroidTestLocalResources +> Task :app:javaPreCompileDebugAndroidTest +> Task :app:mergeDebugAndroidTestAssets +> Task :app:generateDebugAndroidTestRFile +> Task :app:compressDebugAndroidTestAssets +> Task :app:generateDebugAndroidTestGlobalSynthetics +> Task :app:desugarDebugAndroidTestFileDependencies +> Task :app:checkDebugAndroidTestAarMetadata +> Task :app:mapDebugAndroidTestSourceSetPaths +> Task :app:checkDebugAndroidTestDuplicateClasses +> Task :app:compileDebugAndroidTestNavigationResources +> Task :app:mergeDebugAndroidTestJniLibFolders +> Task :app:mergeLibDexDebugAndroidTest +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest +> Task :app:writeDebugAndroidTestSigningConfigVersions +> Task :app:extractProguardFiles +> Task :app:mergeDebugAndroidTestResources +> Task :app:mergeExtDexDebugAndroidTest +> Task :app:processDebugAndroidTestResources +> Task :app:mergeExtDexDebug + +> Task :app:compileDebugKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/PaletteUi.kt:180:51 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/PaletteUi.kt:257:51 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:210:43 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:224:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugJavaWithJavac +> Task :app:processDebugJavaRes UP-TO-DATE +> Task :app:bundleDebugClassesToRuntimeJar +> Task :app:bundleDebugClassesToCompileJar +> Task :app:mergeDebugJavaResource +> Task :app:dexBuilderDebug +> Task :app:mergeProjectDexDebug +> Task :app:compileDebugUnitTestKotlin +> Task :app:generateDebugAndroidTestLintModel +> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE +> Task :app:processDebugUnitTestJavaRes UP-TO-DATE +> Task :app:testDebugUnitTest +> Task :app:generateDebugLintReportModel +> Task :app:generateDebugUnitTestLintModel +> Task :app:packageDebug +> Task :app:createDebugApkListingFileRedirect +> Task :app:assembleDebug + +> Task :app:compileDebugAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt:544:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt:261:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt:597:60 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugAndroidTestJavaWithJavac +> Task :app:processDebugAndroidTestJavaRes +> Task :app:mergeDebugAndroidTestJavaResource +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect +> Task :app:assembleDebugAndroidTest +> Task :app:lintAnalyzeDebugUnitTest +> Task :app:lintAnalyzeDebugAndroidTest +> Task :app:lintAnalyzeDebug + +> Task :app:lintReportDebug +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-debug.html + +> Task :app:lintDebug + +BUILD SUCCESSFUL in 1m 4s +84 actionable tasks: 71 executed, 13 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/benchmark-build.log b/docs/validation/command-handoff/checks/build-candidate-v2/benchmark-build.log new file mode 100644 index 00000000..c83cc1a9 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/benchmark-build.log @@ -0,0 +1,115 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preBenchmarkBuild UP-TO-DATE +> Task :app:mergeBenchmarkJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkNativeLibs UP-TO-DATE +> Task :app:stripBenchmarkDebugSymbols UP-TO-DATE +> Task :app:extractBenchmarkNativeSymbolTables UP-TO-DATE +> Task :app:mergeBenchmarkNativeDebugMetadata NO-SOURCE +> Task :app:mergeBenchmarkArtProfile UP-TO-DATE +> Task :app:desugarBenchmarkFileDependencies UP-TO-DATE +> Task :app:generateBenchmarkBuildConfig +> Task :app:generateBenchmarkResources UP-TO-DATE +> Task :app:packageBenchmarkResources UP-TO-DATE +> Task :app:processBenchmarkNavigationResources +> Task :app:parseBenchmarkLocalResources UP-TO-DATE +> Task :app:generateBenchmarkRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmark UP-TO-DATE +> Task :app:checkBenchmarkAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkResources UP-TO-DATE +> Task :app:createBenchmarkCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksBenchmark +> Task :app:processBenchmarkMainManifest +> Task :app:processBenchmarkManifest +> Task :app:checkBenchmarkDuplicateClasses UP-TO-DATE +> Task :app:mergeBenchmarkStartupProfile UP-TO-DATE +> Task :app:mergeExtDexBenchmark UP-TO-DATE +> Task :app:generateBenchmarkAssets UP-TO-DATE +> Task :app:mergeBenchmarkAssets UP-TO-DATE +> Task :app:compressBenchmarkAssets UP-TO-DATE +> Task :app:extractBenchmarkVersionControlInfo UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:collectBenchmarkDependencies UP-TO-DATE +> Task :app:sdkBenchmarkDependencyData UP-TO-DATE +> Task :app:validateSigningBenchmark UP-TO-DATE +> Task :app:writeBenchmarkAppMetadata UP-TO-DATE +> Task :app:writeBenchmarkSigningConfigVersions UP-TO-DATE +> Task :app:preBenchmarkAndroidTestBuild SKIPPED +> Task :app:processBenchmarkAndroidTestManifest +> Task :app:generateBenchmarkAndroidTestBuildConfig +> Task :app:generateBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:packageBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestNavigationResources +> Task :app:parseBenchmarkAndroidTestLocalResources UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmarkAndroidTest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:compressBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:desugarBenchmarkAndroidTestFileDependencies UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:mergeExtDexBenchmarkAndroidTest UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestNativeLibs NO-SOURCE +> Task :app:stripBenchmarkAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningBenchmarkAndroidTest UP-TO-DATE +> Task :app:writeBenchmarkAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:preBenchmarkUnitTestBuild UP-TO-DATE +> Task :app:processBenchmarkManifestForPackage +> Task :app:processBenchmarkResources +> Task :app:optimizeBenchmarkResources + +> Task :app:compileBenchmarkKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:210:43 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:224:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkJavaWithJavac +> Task :app:dexBuilderBenchmark +> Task :app:mergeBenchmarkGlobalSynthetics UP-TO-DATE +> Task :app:generateBenchmarkLintVitalReportModel +> Task :app:processBenchmarkJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkJavaResource UP-TO-DATE +> Task :app:generateBenchmarkLintReportModel +> Task :app:bundleBenchmarkClassesToCompileJar +> Task :app:generateBenchmarkAndroidTestLintModel +> Task :app:generateBenchmarkUnitTestLintModel + +> Task :app:compileBenchmarkAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkAndroidTestJavaWithJavac +> Task :app:dexBuilderBenchmarkAndroidTest +> Task :app:mergeBenchmarkAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:processBenchmarkAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJavaResource UP-TO-DATE +> Task :app:mergeDexBenchmarkAndroidTest +> Task :app:packageBenchmarkAndroidTest +> Task :app:createBenchmarkAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmarkUnitTest +> Task :app:mergeDexBenchmark +> Task :app:compileBenchmarkArtProfile +> Task :app:lintVitalAnalyzeBenchmark +> Task :app:lintVitalReportBenchmark SKIPPED +> Task :app:lintVitalBenchmark SKIPPED +> Task :app:packageBenchmark +> Task :app:createBenchmarkApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmark +> Task :app:lintAnalyzeBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmark + +> Task :app:lintReportBenchmark +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-benchmark.html + +> Task :app:lintBenchmark + +BUILD SUCCESSFUL in 47s +87 actionable tasks: 33 executed, 54 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/debug-build.log b/docs/validation/command-handoff/checks/build-candidate-v2/debug-build.log new file mode 100644 index 00000000..f1bfcd1e --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/debug-build.log @@ -0,0 +1,111 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:javaPreCompileDebugUnitTest UP-TO-DATE +> Task :app:mergeDebugNativeDebugMetadata NO-SOURCE +> Task :app:generateDebugAssets UP-TO-DATE +> Task :app:mergeDebugAssets UP-TO-DATE +> Task :app:compressDebugAssets UP-TO-DATE +> Task :app:generateDebugGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebug UP-TO-DATE +> Task :app:mergeLibDexDebug UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:stripDebugDebugSymbols UP-TO-DATE +> Task :app:validateSigningDebug UP-TO-DATE +> Task :app:writeDebugAppMetadata UP-TO-DATE +> Task :app:writeDebugSigningConfigVersions UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest +> Task :app:generateDebugAndroidTestBuildConfig +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugManifestForPackage +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:processDebugResources + +> Task :app:compileDebugKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:210:43 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt:224:47 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugJavaWithJavac +> Task :app:processDebugJavaRes UP-TO-DATE +> Task :app:mergeDebugJavaResource UP-TO-DATE +> Task :app:bundleDebugClassesToRuntimeJar +> Task :app:bundleDebugClassesToCompileJar +> Task :app:dexBuilderDebug +> Task :app:compileDebugUnitTestKotlin +> Task :app:generateDebugAndroidTestLintModel +> Task :app:compileDebugUnitTestJavaWithJavac NO-SOURCE +> Task :app:processDebugUnitTestJavaRes UP-TO-DATE +> Task :app:mergeProjectDexDebug + +> Task :app:compileDebugAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:testDebugUnitTest +> Task :app:compileDebugAndroidTestJavaWithJavac +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:packageDebug +> Task :app:createDebugApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebug +> Task :app:generateDebugLintReportModel +> Task :app:generateDebugUnitTestLintModel +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest +> Task :app:lintAnalyzeDebugUnitTest +> Task :app:lintAnalyzeDebug +> Task :app:lintAnalyzeDebugAndroidTest + +> Task :app:lintReportDebug +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-debug.html + +> Task :app:lintDebug + +BUILD SUCCESSFUL in 1m 26s +84 actionable tasks: 32 executed, 52 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml new file mode 100644 index 00000000..77e05175 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.BackupPlannerTest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml new file mode 100644 index 00000000..5f0c1fa4 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CalculatorActionsTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml new file mode 100644 index 00000000..466861f1 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.CommandEngineTest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml new file mode 100644 index 00000000..c4d4a65a --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.EmojiCatalogTest.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml new file mode 100644 index 00000000..fcea0894 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionCommandLaunchTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml new file mode 100644 index 00000000..7faaeeff --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionDetailImageTimeoutTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml new file mode 100644 index 00000000..70d81c29 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormContractTest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml new file mode 100644 index 00000000..f785dd51 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormFileImportTest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml new file mode 100644 index 00000000..761dbbfb --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormSubmissionTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml new file mode 100644 index 00000000..96e264d8 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormTypedValuesTest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml new file mode 100644 index 00000000..66352b56 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionFormValuesTest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml new file mode 100644 index 00000000..f803ccb0 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridContractTest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml new file mode 100644 index 00000000..97f0bfef --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionGridNavigationTest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml new file mode 100644 index 00000000..4c3d4949 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionHttpTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml new file mode 100644 index 00000000..903a9ac7 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMarkdownModelTest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml new file mode 100644 index 00000000..3e8ba907 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionMetadataVisualsTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml new file mode 100644 index 00000000..ad62f79f --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ExtensionSelectionDeliveryTest.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml new file mode 100644 index 00000000..53d7e484 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderGrantTransactionTest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml new file mode 100644 index 00000000..c02f000d --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.FolderIndexTest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml new file mode 100644 index 00000000..31445c1e --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ModifierTapTest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml new file mode 100644 index 00000000..6549251f --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteMenuOwnershipTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml new file mode 100644 index 00000000..867cc336 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.PaletteScrollHistoryTest.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml new file mode 100644 index 00000000..9d3629ad --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ReviewedTextInputTest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml new file mode 100644 index 00000000..fe9615c1 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutReadinessTest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutTest.xml new file mode 100644 index 00000000..7d650092 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.ShortcutTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml new file mode 100644 index 00000000..28feadaa --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.SystemSettingsTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml new file mode 100644 index 00000000..2d9fbf5a --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.TinycastGridParityTest.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml new file mode 100644 index 00000000..13e05764 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.UpdatePolicyTest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml new file mode 100644 index 00000000..7a994c8d --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.WeakValueTokensTest.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml new file mode 100644 index 00000000..022a81c3 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml new file mode 100644 index 00000000..67209d85 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml new file mode 100644 index 00000000..bc5a991e --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/jvm/TEST-dev.tinycast.android.extensions.NodeCpuInfoTest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-benchmark.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-benchmark.xml new file mode 100644 index 00000000..65a73f72 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-benchmark.xml @@ -0,0 +1,886 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-debug.xml b/docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-debug.xml new file mode 100644 index 00000000..65a73f72 --- /dev/null +++ b/docs/validation/command-handoff/checks/build-candidate-v2/reports/lint-results-debug.xml @@ -0,0 +1,886 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/final-harness-checks-v2.json b/docs/validation/command-handoff/checks/final-harness-checks-v2.json new file mode 100644 index 00000000..a9304b63 --- /dev/null +++ b/docs/validation/command-handoff/checks/final-harness-checks-v2.json @@ -0,0 +1,252 @@ +{ + "completed": true, + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "current_source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "40db20d8a320bad2f5de185ed4f6df73398989ecf1d9bacfa47d91aa72e94769", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "b66e3faeaab07b8a86bd6eb5b9d8ab27df6ff70b4341d577e98cab64ae4fa584", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "debug_test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "benchmark_test_apk_sha256": "5c79ad1f033bcc45bdd2a5d53b04517c406200d180bcbe0554e85b0e7a67627d", + "lint": { + "debug": { + "counts": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + }, + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb" + }, + "benchmark": { + "counts": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + }, + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb" + } + }, + "build_log_sha256": { + "owned-harness-v2-build.log": "dc059ee2d91e96a8d84ae6feb4bae55f8bfa7d494ded12062dc5abbb7e3a60b7", + "owned-harness-v2-benchmark-build.log": "8b903f881fe046f0342f476712d316dae09a6eb6a6b62104bf8b5043d44fac80", + "owned-harness-v2-debug-lint.log": "1ffe7df4dd01c18138c32e12bc58d7df460a030b1dc2e6eceaf0bc2ab54e35d8" + }, + "reused_jvm_scope": "289 passes from 56134f31; only the new AndroidTest launch helper differs afterward; main/build/JVM/Node/asset sources unchanged" +} diff --git a/docs/validation/command-handoff/checks/final-harness-checks-v3.json b/docs/validation/command-handoff/checks/final-harness-checks-v3.json new file mode 100644 index 00000000..8a269bcf --- /dev/null +++ b/docs/validation/command-handoff/checks/final-harness-checks-v3.json @@ -0,0 +1,252 @@ +{ + "completed": true, + "test_source_commit": "73e719c602bc378c71df83eba34440771bc8d999", + "current_source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "b66e3faeaab07b8a86bd6eb5b9d8ab27df6ff70b4341d577e98cab64ae4fa584", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "debug_test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "benchmark_test_apk_sha256": "db242021250c35836b877a059d238e219cf5ddfa3b4d86385f052d8f2fae1e60", + "lint": { + "debug": { + "counts": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + }, + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb" + }, + "benchmark": { + "counts": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + }, + "original_sha256": "cdb8397326bdfb63ea94a0ad50a50f7a535a67dbaf667181cc2c7db89f424ecb" + } + }, + "build_log_sha256": { + "owned-harness-v3-build.log": "910d8c79f6ed71e89b2f2b1b7b3dbc6f7a088d21224c409ceb1eb8c370ad23bf", + "owned-harness-v3-benchmark-build.log": "2334cf2db5b0b9f89105d8f199e1bd468d5ed6a7b9ad951854ea11dd6a663424", + "owned-harness-v3-debug-lint.log": "3cf984fade0dfe7dc6b20d32248a123a7dee567b4e6bf1edd98e372e61e6d231" + }, + "reused_jvm_scope": "289 passes from 56134f31; only the new AndroidTest launch helper and fixture failure signature differ afterward; main/build/JVM/Node/asset sources unchanged" +} diff --git a/docs/validation/command-handoff/checks/final-lint-v2/lint-results-benchmark.xml b/docs/validation/command-handoff/checks/final-lint-v2/lint-results-benchmark.xml new file mode 100644 index 00000000..65a73f72 --- /dev/null +++ b/docs/validation/command-handoff/checks/final-lint-v2/lint-results-benchmark.xml @@ -0,0 +1,886 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/final-lint-v2/lint-results-debug.xml b/docs/validation/command-handoff/checks/final-lint-v2/lint-results-debug.xml new file mode 100644 index 00000000..65a73f72 --- /dev/null +++ b/docs/validation/command-handoff/checks/final-lint-v2/lint-results-debug.xml @@ -0,0 +1,886 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/final-lint-v3/lint-results-benchmark.xml b/docs/validation/command-handoff/checks/final-lint-v3/lint-results-benchmark.xml new file mode 100644 index 00000000..65a73f72 --- /dev/null +++ b/docs/validation/command-handoff/checks/final-lint-v3/lint-results-benchmark.xml @@ -0,0 +1,886 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/final-lint-v3/lint-results-debug.xml b/docs/validation/command-handoff/checks/final-lint-v3/lint-results-debug.xml new file mode 100644 index 00000000..65a73f72 --- /dev/null +++ b/docs/validation/command-handoff/checks/final-lint-v3/lint-results-debug.xml @@ -0,0 +1,886 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/validation/command-handoff/checks/harness-transition-v2.json b/docs/validation/command-handoff/checks/harness-transition-v2.json new file mode 100644 index 00000000..27d9c5d9 --- /dev/null +++ b/docs/validation/command-handoff/checks/harness-transition-v2.json @@ -0,0 +1,13 @@ +{ + "source_changes": [ + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt" + ], + "apk_payload_changes": [ + "classes3.dex", + "classes4.dex" + ], + "initial_test_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "current_test_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "scope": "The helper follows the existing ordinary argument setup. Production sources differ here only because the independently built repaired app includes its prior chrome fix." +} diff --git a/docs/validation/command-handoff/checks/menu-preflight-v1.json b/docs/validation/command-handoff/checks/menu-preflight-v1.json new file mode 100644 index 00000000..ff42657d --- /dev/null +++ b/docs/validation/command-handoff/checks/menu-preflight-v1.json @@ -0,0 +1,8 @@ +{ + "native_executions": 0, + "runner_output_created": false, + "runner_lease_acquired": false, + "reason": "Existing legacy regression evidence directories; guarded runner refused before output/install/instrumentation", + "host_log_sha256": "39f7d4310c750a571ffabf7e298fa389dea833329404d10be205aa49b3b49c6e", + "continuation": "Nonce-owned preservation collector retains/restores the two original legacy evidence directories; original preflight remains unexecuted" +} diff --git a/docs/validation/command-handoff/checks/menu-preflight.log b/docs/validation/command-handoff/checks/menu-preflight.log new file mode 100644 index 00000000..ca82a8d3 --- /dev/null +++ b/docs/validation/command-handoff/checks/menu-preflight.log @@ -0,0 +1,10 @@ +Traceback (most recent call last): + File "/.t3/scratch/droidcast-command-handoff-27caf3/scripts/test-reviewed-text-input.py", line 365, in + main() + ~~~~^^ + File "/.t3/scratch/droidcast-command-handoff-27caf3/scripts/test-reviewed-text-input.py", line 203, in main + require(absent('files/' + folder), 'Retain or archive an earlier evidence directory before continuing') + ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/.t3/scratch/droidcast-command-handoff-27caf3/scripts/test-reviewed-text-input.py", line 24, in require + raise ValueError(message) +ValueError: Retain or archive an earlier evidence directory before continuing diff --git a/docs/validation/command-handoff/checks/owned-harness-v1-build.log b/docs/validation/command-handoff/checks/owned-harness-v1-build.log new file mode 100644 index 00000000..40c639be --- /dev/null +++ b/docs/validation/command-handoff/checks/owned-harness-v1-build.log @@ -0,0 +1,68 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest +> Task :app:generateDebugAndroidTestBuildConfig +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:processDebugManifestForPackage +> Task :app:processDebugResources +> Task :app:compileDebugKotlin +> Task :app:compileDebugJavaWithJavac +> Task :app:bundleDebugClassesToCompileJar + +> Task :app:compileDebugAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugAndroidTestJavaWithJavac +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest + +BUILD SUCCESSFUL in 9s +53 actionable tasks: 18 executed, 35 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/owned-harness-v2-benchmark-build.log b/docs/validation/command-handoff/checks/owned-harness-v2-benchmark-build.log new file mode 100644 index 00000000..359535aa --- /dev/null +++ b/docs/validation/command-handoff/checks/owned-harness-v2-benchmark-build.log @@ -0,0 +1,80 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preBenchmarkBuild UP-TO-DATE +> Task :app:generateBenchmarkBuildConfig +> Task :app:generateBenchmarkResources UP-TO-DATE +> Task :app:packageBenchmarkResources UP-TO-DATE +> Task :app:processBenchmarkNavigationResources +> Task :app:parseBenchmarkLocalResources UP-TO-DATE +> Task :app:generateBenchmarkRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmark UP-TO-DATE +> Task :app:checkBenchmarkAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkResources UP-TO-DATE +> Task :app:createBenchmarkCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksBenchmark +> Task :app:processBenchmarkMainManifest +> Task :app:processBenchmarkManifest +> Task :app:preBenchmarkAndroidTestBuild SKIPPED +> Task :app:processBenchmarkAndroidTestManifest +> Task :app:generateBenchmarkAndroidTestBuildConfig +> Task :app:generateBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:packageBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestNavigationResources +> Task :app:parseBenchmarkAndroidTestLocalResources UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmarkAndroidTest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:compressBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:desugarBenchmarkAndroidTestFileDependencies UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:mergeExtDexBenchmarkAndroidTest UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkNativeLibs UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestNativeLibs NO-SOURCE +> Task :app:stripBenchmarkAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningBenchmarkAndroidTest UP-TO-DATE +> Task :app:writeBenchmarkAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:preBenchmarkUnitTestBuild UP-TO-DATE +> Task :app:processBenchmarkManifestForPackage +> Task :app:processBenchmarkResources +> Task :app:compileBenchmarkKotlin +> Task :app:compileBenchmarkJavaWithJavac +> Task :app:generateBenchmarkLintReportModel +> Task :app:bundleBenchmarkClassesToCompileJar +> Task :app:generateBenchmarkAndroidTestLintModel +> Task :app:generateBenchmarkUnitTestLintModel + +> Task :app:compileBenchmarkAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkAndroidTestJavaWithJavac +> Task :app:dexBuilderBenchmarkAndroidTest +> Task :app:mergeBenchmarkAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:processBenchmarkAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJavaResource UP-TO-DATE +> Task :app:mergeDexBenchmarkAndroidTest +> Task :app:packageBenchmarkAndroidTest +> Task :app:createBenchmarkAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmarkUnitTest +> Task :app:lintAnalyzeBenchmark +> Task :app:lintAnalyzeBenchmarkAndroidTest + +> Task :app:lintReportBenchmark +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-benchmark.html + +> Task :app:lintBenchmark + +BUILD SUCCESSFUL in 1m 8s +61 actionable tasks: 26 executed, 35 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/owned-harness-v2-build.log b/docs/validation/command-handoff/checks/owned-harness-v2-build.log new file mode 100644 index 00000000..2f8b7aa1 --- /dev/null +++ b/docs/validation/command-handoff/checks/owned-harness-v2-build.log @@ -0,0 +1,68 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:processDebugManifestForPackage +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest +> Task :app:generateDebugAndroidTestBuildConfig +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:processDebugResources +> Task :app:compileDebugKotlin +> Task :app:compileDebugJavaWithJavac +> Task :app:bundleDebugClassesToCompileJar + +> Task :app:compileDebugAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugAndroidTestJavaWithJavac +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest + +BUILD SUCCESSFUL in 6s +53 actionable tasks: 18 executed, 35 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/owned-harness-v2-debug-lint.log b/docs/validation/command-handoff/checks/owned-harness-v2-debug-lint.log new file mode 100644 index 00000000..4e7b449f --- /dev/null +++ b/docs/validation/command-handoff/checks/owned-harness-v2-debug-lint.log @@ -0,0 +1,40 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:generateDebugAndroidTestLintModel +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:generateDebugLintReportModel +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:generateDebugUnitTestLintModel +> Task :app:lintAnalyzeDebugUnitTest +> Task :app:lintAnalyzeDebugAndroidTest +> Task :app:lintAnalyzeDebug + +> Task :app:lintReportDebug +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-debug.html + +> Task :app:lintDebug + +BUILD SUCCESSFUL in 30s +29 actionable tasks: 8 executed, 21 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/owned-harness-v3-benchmark-build.log b/docs/validation/command-handoff/checks/owned-harness-v3-benchmark-build.log new file mode 100644 index 00000000..adec4b72 --- /dev/null +++ b/docs/validation/command-handoff/checks/owned-harness-v3-benchmark-build.log @@ -0,0 +1,80 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preBenchmarkBuild UP-TO-DATE +> Task :app:generateBenchmarkBuildConfig +> Task :app:generateBenchmarkResources UP-TO-DATE +> Task :app:packageBenchmarkResources UP-TO-DATE +> Task :app:processBenchmarkNavigationResources +> Task :app:parseBenchmarkLocalResources UP-TO-DATE +> Task :app:generateBenchmarkRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmark UP-TO-DATE +> Task :app:checkBenchmarkAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkResources UP-TO-DATE +> Task :app:createBenchmarkCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksBenchmark +> Task :app:processBenchmarkMainManifest +> Task :app:processBenchmarkManifest +> Task :app:preBenchmarkAndroidTestBuild SKIPPED +> Task :app:processBenchmarkAndroidTestManifest +> Task :app:generateBenchmarkAndroidTestBuildConfig +> Task :app:generateBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:packageBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestNavigationResources +> Task :app:parseBenchmarkAndroidTestLocalResources UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileBenchmarkAndroidTest UP-TO-DATE +> Task :app:generateBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:compressBenchmarkAndroidTestAssets UP-TO-DATE +> Task :app:desugarBenchmarkAndroidTestFileDependencies UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapBenchmarkAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileBenchmarkAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:processBenchmarkAndroidTestResources UP-TO-DATE +> Task :app:checkBenchmarkAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:mergeExtDexBenchmarkAndroidTest UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkJniLibFolders UP-TO-DATE +> Task :app:mergeBenchmarkNativeLibs UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestNativeLibs NO-SOURCE +> Task :app:stripBenchmarkAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningBenchmarkAndroidTest UP-TO-DATE +> Task :app:writeBenchmarkAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:preBenchmarkUnitTestBuild UP-TO-DATE +> Task :app:processBenchmarkManifestForPackage +> Task :app:processBenchmarkResources +> Task :app:compileBenchmarkKotlin +> Task :app:compileBenchmarkJavaWithJavac +> Task :app:generateBenchmarkLintReportModel +> Task :app:bundleBenchmarkClassesToCompileJar +> Task :app:generateBenchmarkAndroidTestLintModel +> Task :app:generateBenchmarkUnitTestLintModel + +> Task :app:compileBenchmarkAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileBenchmarkAndroidTestJavaWithJavac +> Task :app:dexBuilderBenchmarkAndroidTest +> Task :app:mergeBenchmarkAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:processBenchmarkAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeBenchmarkAndroidTestJavaResource UP-TO-DATE +> Task :app:mergeDexBenchmarkAndroidTest +> Task :app:packageBenchmarkAndroidTest +> Task :app:createBenchmarkAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmarkUnitTest +> Task :app:lintAnalyzeBenchmarkAndroidTest +> Task :app:lintAnalyzeBenchmark + +> Task :app:lintReportBenchmark +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-benchmark.html + +> Task :app:lintBenchmark + +BUILD SUCCESSFUL in 33s +61 actionable tasks: 26 executed, 35 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/owned-harness-v3-build.log b/docs/validation/command-handoff/checks/owned-harness-v3-build.log new file mode 100644 index 00000000..16a1aca9 --- /dev/null +++ b/docs/validation/command-handoff/checks/owned-harness-v3-build.log @@ -0,0 +1,68 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug +> Task :app:processDebugMainManifest +> Task :app:processDebugManifest +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:processDebugAndroidTestManifest +> Task :app:generateDebugAndroidTestBuildConfig +> Task :app:generateDebugAndroidTestResources UP-TO-DATE +> Task :app:packageDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestNavigationResources +> Task :app:parseDebugAndroidTestLocalResources UP-TO-DATE +> Task :app:generateDebugAndroidTestRFile UP-TO-DATE +> Task :app:javaPreCompileDebugAndroidTest UP-TO-DATE +> Task :app:generateDebugAndroidTestAssets UP-TO-DATE +> Task :app:mergeDebugAndroidTestAssets UP-TO-DATE +> Task :app:compressDebugAndroidTestAssets UP-TO-DATE +> Task :app:generateDebugAndroidTestGlobalSynthetics UP-TO-DATE +> Task :app:checkDebugAndroidTestDuplicateClasses UP-TO-DATE +> Task :app:desugarDebugAndroidTestFileDependencies UP-TO-DATE +> Task :app:mergeExtDexDebugAndroidTest UP-TO-DATE +> Task :app:mergeLibDexDebugAndroidTest UP-TO-DATE +> Task :app:checkDebugAndroidTestAarMetadata UP-TO-DATE +> Task :app:mapDebugAndroidTestSourceSetPaths UP-TO-DATE +> Task :app:compileDebugAndroidTestNavigationResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestResources UP-TO-DATE +> Task :app:processDebugAndroidTestResources UP-TO-DATE +> Task :app:mergeDebugAndroidTestJniLibFolders UP-TO-DATE +> Task :app:mergeDebugJniLibFolders UP-TO-DATE +> Task :app:mergeDebugNativeLibs UP-TO-DATE +> Task :app:mergeDebugAndroidTestNativeLibs NO-SOURCE +> Task :app:stripDebugAndroidTestDebugSymbols NO-SOURCE +> Task :app:validateSigningDebugAndroidTest UP-TO-DATE +> Task :app:writeDebugAndroidTestSigningConfigVersions UP-TO-DATE +> Task :app:processDebugManifestForPackage +> Task :app:processDebugResources +> Task :app:compileDebugKotlin +> Task :app:compileDebugJavaWithJavac +> Task :app:bundleDebugClassesToCompileJar + +> Task :app:compileDebugAndroidTestKotlin +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:171:41 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. +w: file:///.t3/scratch/droidcast-command-handoff-27caf3/app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt:176:48 'static fun getWindowInsetsController(p0: View): WindowInsetsControllerCompat?' is deprecated. Deprecated in Java. + +> Task :app:compileDebugAndroidTestJavaWithJavac +> Task :app:processDebugAndroidTestJavaRes UP-TO-DATE +> Task :app:mergeDebugAndroidTestJavaResource UP-TO-DATE +> Task :app:dexBuilderDebugAndroidTest +> Task :app:mergeProjectDexDebugAndroidTest +> Task :app:packageDebugAndroidTest +> Task :app:createDebugAndroidTestApkListingFileRedirect UP-TO-DATE +> Task :app:assembleDebugAndroidTest + +BUILD SUCCESSFUL in 6s +53 actionable tasks: 18 executed, 35 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/owned-harness-v3-debug-lint.log b/docs/validation/command-handoff/checks/owned-harness-v3-debug-lint.log new file mode 100644 index 00000000..294a1005 --- /dev/null +++ b/docs/validation/command-handoff/checks/owned-harness-v3-debug-lint.log @@ -0,0 +1,40 @@ +> Task :app:preBuild UP-TO-DATE +> Task :app:preDebugBuild UP-TO-DATE +> Task :app:generateDebugBuildConfig UP-TO-DATE +> Task :app:generateDebugResources UP-TO-DATE +> Task :app:packageDebugResources UP-TO-DATE +> Task :app:processDebugNavigationResources UP-TO-DATE +> Task :app:parseDebugLocalResources UP-TO-DATE +> Task :app:generateDebugRFile UP-TO-DATE +> Task :app:compileDebugKotlin UP-TO-DATE +> Task :app:javaPreCompileDebug UP-TO-DATE +> Task :app:compileDebugJavaWithJavac UP-TO-DATE +> Task :app:checkDebugAarMetadata UP-TO-DATE +> Task :app:mapDebugSourceSetPaths UP-TO-DATE +> Task :app:compileDebugNavigationResources UP-TO-DATE +> Task :app:mergeDebugResources UP-TO-DATE +> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE +> Task :app:extractDeepLinksDebug UP-TO-DATE +> Task :app:processDebugMainManifest UP-TO-DATE +> Task :app:processDebugManifest UP-TO-DATE +> Task :app:processDebugManifestForPackage UP-TO-DATE +> Task :app:processDebugResources UP-TO-DATE +> Task :app:bundleDebugClassesToCompileJar UP-TO-DATE +> Task :app:preDebugAndroidTestBuild SKIPPED +> Task :app:generateDebugAndroidTestLintModel +> Task :app:extractProguardFiles UP-TO-DATE +> Task :app:generateDebugLintReportModel +> Task :app:preDebugUnitTestBuild UP-TO-DATE +> Task :app:generateDebugUnitTestLintModel +> Task :app:lintAnalyzeDebugUnitTest +> Task :app:lintAnalyzeDebugAndroidTest +> Task :app:lintAnalyzeDebug + +> Task :app:lintReportDebug +Wrote HTML report to file:///.t3/scratch/droidcast-command-handoff-27caf3/app/build/reports/lint-results-debug.html + +> Task :app:lintDebug + +BUILD SUCCESSFUL in 28s +29 actionable tasks: 8 executed, 21 up-to-date +Consider enabling configuration cache to speed up this build: https://docs.gradle.org/9.4.1/userguide/configuration_cache_enabling.html diff --git a/docs/validation/command-handoff/checks/python-owned-optimized-v1.log b/docs/validation/command-handoff/checks/python-owned-optimized-v1.log new file mode 100644 index 00000000..b19208aa --- /dev/null +++ b/docs/validation/command-handoff/checks/python-owned-optimized-v1.log @@ -0,0 +1,6 @@ +............................................................................................................... +---------------------------------------------------------------------- +Ran 111 tests in 14.575s + +OK +{"all_directories_attempted": false, "declared_commands": 0, "directory_count": 2, "independently_anchored_manifests": 0, "manifest_discovery_complete": false, "manifests_read": 0, "not_yet_inspected": 2, "retrieval_or_manifest_errors": 0, "runtime_tested_commands": 0, "runtime_untested_commands": 0} diff --git a/docs/validation/command-handoff/checks/python-owned-v1.log b/docs/validation/command-handoff/checks/python-owned-v1.log new file mode 100644 index 00000000..6bcc2e4f --- /dev/null +++ b/docs/validation/command-handoff/checks/python-owned-v1.log @@ -0,0 +1,6 @@ +............................................................................................................... +---------------------------------------------------------------------- +Ran 111 tests in 13.976s + +OK +{"all_directories_attempted": false, "declared_commands": 0, "directory_count": 2, "independently_anchored_manifests": 0, "manifest_discovery_complete": false, "manifests_read": 0, "not_yet_inspected": 2, "retrieval_or_manifest_errors": 0, "runtime_tested_commands": 0, "runtime_untested_commands": 0} diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json new file mode 100644 index 00000000..6f04e9cf --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml new file mode 100644 index 00000000..bca96a14 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..b3d31712 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-dd7e7f6d144d457a850dcdf2f8b7a63e", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 891, + "height_dp": 411, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1338, + 849, + 1805, + 975 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1330, + 849, + 1805, + 975 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 186, + 106, + 312, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/runner-record.json new file mode 100644 index 00000000..6ab58a51 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "landscape", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/state.json b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/state.json new file mode 100644 index 00000000..9dad44c7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "landscape", + "font": 1.0, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/tests.log b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/tests.log new file mode 100644 index 00000000..0b88511f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.476 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json new file mode 100644 index 00000000..1e64be26 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "caller-return", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 2, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml new file mode 100644 index 00000000..05879828 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json new file mode 100644 index 00000000..f3c240eb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 2, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml new file mode 100644 index 00000000..df82bf07 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json new file mode 100644 index 00000000..0dc8706d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "exact-context-copy", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 2, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml new file mode 100644 index 00000000..643605bc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-exact-context-copy.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..f1f78395 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-4d4672de5acc4c3784517f88f9bac079", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 2, + "width_dp": 891, + "height_dp": 411, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1031, + 817, + 1820, + 970 + ], + "minimum_px": 126, + "reveal_gestures": 1 + }, + { + "tag": "extension-primary", + "bounds": [ + 1031, + 817, + 1820, + 970 + ], + "minimum_px": 126, + "reveal_gestures": 1 + }, + { + "tag": "extension-back", + "bounds": [ + 186, + 117, + 312, + 243 + ], + "minimum_px": 126, + "reveal_gestures": 1 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/runner-record.json b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/runner-record.json new file mode 100644 index 00000000..f5aaaa30 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "landscape", + "font_scale": 2.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/state.json b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/state.json new file mode 100644 index 00000000..315f5bac --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "landscape", + "font": 2.0, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/tests.log b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/tests.log new file mode 100644 index 00000000..1fe2a965 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-landscape200-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.628 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json new file mode 100644 index 00000000..f3c240eb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 2, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml new file mode 100644 index 00000000..eeafd42a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..e9e3096b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-c25815a61323430b8e962e33c0c51913", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 2, + "width_dp": 411, + "height_dp": 891, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 53, + 1701, + 713, + 1949 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 53, + 1701, + 713, + 1949 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 117, + 158, + 243 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/runner-record.json b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/runner-record.json new file mode 100644 index 00000000..b13e0a82 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 2.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/state.json b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/state.json new file mode 100644 index 00000000..32b51824 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 2.0, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/tests.log b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/tests.log new file mode 100644 index 00000000..81fe984d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-phone200-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.125 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json new file mode 100644 index 00000000..f3c240eb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 2, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml new file mode 100644 index 00000000..cfe5ee72 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..3dadef7b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-6a5c5904f3a7442e8c5fbc44bc6e4ce8", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 2, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 881, + 1037, + 1333, + 1125 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 881, + 1037, + 1333, + 1125 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 249, + 470, + 321 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/runner-record.json b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/runner-record.json new file mode 100644 index 00000000..f6718245 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 2.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/state.json b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/state.json new file mode 100644 index 00000000..3adf85c9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 2.0, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/tests.log b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/tests.log new file mode 100644 index 00000000..7a774472 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-context-tablet200-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 9.521 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json new file mode 100644 index 00000000..1d431d3d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "rejected-request-feedback", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 2, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml new file mode 100644 index 00000000..eb48af9a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json new file mode 100644 index 00000000..b55330c1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json @@ -0,0 +1,80 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-f278ddc5fe744df7919ba46c728b3af0", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 2, + "width_dp": 891, + "height_dp": 411, + "rejection_receipts": [ + { + "index": 0, + "message": "Only foreground user-initiated command launches are supported on Android", + "same_epoch_and_parent": true + }, + { + "index": 1, + "message": "Launching another extension is unavailable on Android", + "same_epoch_and_parent": true + }, + { + "index": 2, + "message": "The requested command is unavailable in this extension", + "same_epoch_and_parent": true + }, + { + "index": 3, + "message": "The target command is disabled", + "same_epoch_and_parent": true + }, + { + "index": 4, + "message": "The target command requires an unsupported desktop mode", + "same_epoch_and_parent": true + }, + { + "index": 5, + "message": "The target command is unavailable; reinstall the extension before launching it", + "same_epoch_and_parent": true + }, + { + "index": 6, + "message": "Configure the target command from the launcher before launching it here", + "same_epoch_and_parent": true + }, + { + "index": 7, + "message": "Complete the target command's required arguments before launching it", + "same_epoch_and_parent": true + }, + { + "index": 8, + "message": "The launch contains an undeclared command argument", + "same_epoch_and_parent": true + }, + { + "index": 9, + "message": "The command launch data exceeds the Android size limit", + "same_epoch_and_parent": true + } + ], + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 186, + 117, + 312, + 243 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/runner-record.json b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/runner-record.json new file mode 100644 index 00000000..a3263e92 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "landscape", + "font_scale": 2.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#invalidRequestsKeepTheParentAndClipboard", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/state.json b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/state.json new file mode 100644 index 00000000..79f076f2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "landscape", + "font": 2.0, + "method": "invalidRequestsKeepTheParentAndClipboard", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/tests.log b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/tests.log new file mode 100644 index 00000000..474355b7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-landscape200-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.678 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json new file mode 100644 index 00000000..1d431d3d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "rejected-request-feedback", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 2, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml new file mode 100644 index 00000000..1b81d2bb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json new file mode 100644 index 00000000..5e8d7e40 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json @@ -0,0 +1,80 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-908dc71505d24a439ea007b8439e7a89", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 2, + "width_dp": 411, + "height_dp": 891, + "rejection_receipts": [ + { + "index": 0, + "message": "Only foreground user-initiated command launches are supported on Android", + "same_epoch_and_parent": true + }, + { + "index": 1, + "message": "Launching another extension is unavailable on Android", + "same_epoch_and_parent": true + }, + { + "index": 2, + "message": "The requested command is unavailable in this extension", + "same_epoch_and_parent": true + }, + { + "index": 3, + "message": "The target command is disabled", + "same_epoch_and_parent": true + }, + { + "index": 4, + "message": "The target command requires an unsupported desktop mode", + "same_epoch_and_parent": true + }, + { + "index": 5, + "message": "The target command is unavailable; reinstall the extension before launching it", + "same_epoch_and_parent": true + }, + { + "index": 6, + "message": "Configure the target command from the launcher before launching it here", + "same_epoch_and_parent": true + }, + { + "index": 7, + "message": "Complete the target command's required arguments before launching it", + "same_epoch_and_parent": true + }, + { + "index": 8, + "message": "The launch contains an undeclared command argument", + "same_epoch_and_parent": true + }, + { + "index": 9, + "message": "The command launch data exceeds the Android size limit", + "same_epoch_and_parent": true + } + ], + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 117, + 158, + 243 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/runner-record.json b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/runner-record.json new file mode 100644 index 00000000..9ddcce85 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 2.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#invalidRequestsKeepTheParentAndClipboard", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/state.json b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/state.json new file mode 100644 index 00000000..8fd95b10 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 2.0, + "method": "invalidRequestsKeepTheParentAndClipboard", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/tests.log b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/tests.log new file mode 100644 index 00000000..1677f1c1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/critical-invalid-phone200-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.584 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json new file mode 100644 index 00000000..190eb3c3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-chosen", + "external_caller": false, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml new file mode 100644 index 00000000..ac44f633 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json new file mode 100644 index 00000000..30d0ad70 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-context-return", + "external_caller": true, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": null, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml new file mode 100644 index 00000000..3edbfa06 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json new file mode 100644 index 00000000..65c91c46 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-exact-copy", + "external_caller": false, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml new file mode 100644 index 00000000..861c069f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json new file mode 100644 index 00000000..2b57d2b6 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-native-result", + "external_caller": false, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml new file mode 100644 index 00000000..7564598c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..04024427 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,166 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-902e870415d94becb4b5d3fc269ef133", + "reviewed-text-7a3ef842e1ea45e1bde72ab6993519ac", + "reviewed-text-ca3083082a2843e3895fe824e8fafb89" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 2, + "width_dp": 891, + "height_dp": 411, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "handoff_target": "quick-translate-view", + "child_raw_input_grant_absent": true, + "reviewed_input_initially_consumed": true, + "input_setup": "Native editor test replacement after actual pointer focus; no physical-typing claim", + "owned_edited_query": "good morning", + "network_observation": { + "errors": 0, + "overflow": 0, + "decodeErrors": 0, + "requests": [ + { + "sequence": 1, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 2, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 3, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 4, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 5, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 6, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + } + ], + "pasteRejected": false + }, + "network_observer_scope": "Only subsequent requests; known owned response translation decoded for native output\/Copy equality; unrelated payloads, queries, headers and bodies are not retained", + "observation_deadline_reached": false, + "runtime_status": "", + "context_pointer_targets": [ + { + "tag": "extension-row-0", + "bounds": [ + 228, + 288, + 2113, + 555 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1031, + 817, + 1820, + 970 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 1 + }, + { + "tag": "extension-detail-back", + "bounds": [ + 186, + 106, + 312, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 1 + }, + { + "tag": "extension-back", + "bounds": [ + 186, + 106, + 312, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + } + ], + "selected_owned_response_row": 0, + "copy_exact": true, + "observed_phase_outcome": "working-observed-path", + "owned_provider_output_sha256": "4314662c3426676a1dd586be6a6f1bddf8dae143c7e8514c50af525f9dc6cec8", + "owned_provider_output_characters": 4, + "native_detail_returned_to_results": true, + "edited_query_preserved_on_native_back": true, + "workflow_outcome": "working-observed-path", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/runner-record.json b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/runner-record.json new file mode 100644 index 00000000..0e2b4265 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/runner-record.json @@ -0,0 +1,92 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "landscape", + "font_scale": 2.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/state.json b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/state.json new file mode 100644 index 00000000..5443a809 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/state.json @@ -0,0 +1,24 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "landscape", + "font": 2.0, + "collector_sha256": "5b49028a588b5029d224e7c55b560632c7be8ca2ca655d6a4f95d4647f9c39a5", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "new", + "phase_outcome": "working-observed-path", + "expected_phase": "working-observed-path", + "compatible_listed_workflow": true +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/tests.log b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/tests.log new file mode 100644 index 00000000..b4bcf3d5 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-landscape200-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 24.22 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json new file mode 100644 index 00000000..91a9a03e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-chosen", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml new file mode 100644 index 00000000..2356942a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json new file mode 100644 index 00000000..783ddbfa --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-context-return", + "external_caller": true, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": null, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml new file mode 100644 index 00000000..da72024a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json new file mode 100644 index 00000000..7d8264a3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-exact-copy", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml new file mode 100644 index 00000000..a23ee2ab --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json new file mode 100644 index 00000000..95d2f9d0 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-native-result", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml new file mode 100644 index 00000000..76a73a48 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..e145acae --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,166 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-81bceb96a6f74cac8d5723a3b016abd0", + "reviewed-text-6ebe158e33744a7f96f78a5a54554e63", + "reviewed-text-f245162db96d4271bd4596045f5b6d4b" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "handoff_target": "quick-translate-view", + "child_raw_input_grant_absent": true, + "reviewed_input_initially_consumed": true, + "input_setup": "Native editor test replacement after actual pointer focus; no physical-typing claim", + "owned_edited_query": "good morning", + "network_observation": { + "errors": 0, + "overflow": 0, + "decodeErrors": 0, + "requests": [ + { + "sequence": 1, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 2, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 3, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 4, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 5, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 6, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + } + ], + "pasteRejected": false + }, + "network_observer_scope": "Only subsequent requests; known owned response translation decoded for native output\/Copy equality; unrelated payloads, queries, headers and bodies are not retained", + "observation_deadline_reached": false, + "runtime_status": "", + "context_pointer_targets": [ + { + "tag": "extension-row-0", + "bounds": [ + 74, + 288, + 1006, + 463 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 53, + 1200, + 826, + 1326 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-detail-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + } + ], + "selected_owned_response_row": 0, + "copy_exact": true, + "observed_phase_outcome": "working-observed-path", + "owned_provider_output_sha256": "4314662c3426676a1dd586be6a6f1bddf8dae143c7e8514c50af525f9dc6cec8", + "owned_provider_output_characters": 4, + "native_detail_returned_to_results": true, + "edited_query_preserved_on_native_back": true, + "workflow_outcome": "working-observed-path", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/runner-record.json new file mode 100644 index 00000000..788b3c50 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/runner-record.json @@ -0,0 +1,92 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/state.json new file mode 100644 index 00000000..cdacd787 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/state.json @@ -0,0 +1,24 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "phone", + "font": 1.0, + "collector_sha256": "5b49028a588b5029d224e7c55b560632c7be8ca2ca655d6a4f95d4647f9c39a5", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "new", + "phase_outcome": "working-observed-path", + "expected_phase": "working-observed-path", + "compatible_listed_workflow": true +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/tests.log new file mode 100644 index 00000000..14015e77 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 16.415 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json new file mode 100644 index 00000000..190eb3c3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-chosen", + "external_caller": false, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml new file mode 100644 index 00000000..33c76566 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json new file mode 100644 index 00000000..30d0ad70 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-context-return", + "external_caller": true, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": null, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml new file mode 100644 index 00000000..38b46fd4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json new file mode 100644 index 00000000..65c91c46 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-exact-copy", + "external_caller": false, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml new file mode 100644 index 00000000..b2816c2a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json new file mode 100644 index 00000000..2b57d2b6 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-native-result", + "external_caller": false, + "font_scale": 2, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml new file mode 100644 index 00000000..62275768 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..f4378339 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,166 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-8392c380ef924f08b81a518b3b62473c", + "reviewed-text-87914bdc840d4c9c96d0430193bd2bc7", + "reviewed-text-3b0667ee4140458f8932a401ae835bf1" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 2, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "handoff_target": "quick-translate-view", + "child_raw_input_grant_absent": true, + "reviewed_input_initially_consumed": true, + "input_setup": "Native editor test replacement after actual pointer focus; no physical-typing claim", + "owned_edited_query": "good morning", + "network_observation": { + "errors": 0, + "overflow": 0, + "decodeErrors": 0, + "requests": [ + { + "sequence": 1, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 2, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 3, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 4, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 5, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 6, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + } + ], + "pasteRejected": false + }, + "network_observer_scope": "Only subsequent requests; known owned response translation decoded for native output\/Copy equality; unrelated payloads, queries, headers and bodies are not retained", + "observation_deadline_reached": false, + "runtime_status": "", + "context_pointer_targets": [ + { + "tag": "extension-row-0", + "bounds": [ + 74, + 288, + 1006, + 555 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 53, + 1796, + 713, + 1949 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-detail-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + } + ], + "selected_owned_response_row": 0, + "copy_exact": true, + "observed_phase_outcome": "working-observed-path", + "owned_provider_output_sha256": "4314662c3426676a1dd586be6a6f1bddf8dae143c7e8514c50af525f9dc6cec8", + "owned_provider_output_characters": 4, + "native_detail_returned_to_results": true, + "edited_query_preserved_on_native_back": true, + "workflow_outcome": "working-observed-path", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/runner-record.json b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/runner-record.json new file mode 100644 index 00000000..6a68cfb7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/runner-record.json @@ -0,0 +1,92 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 2.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/state.json b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/state.json new file mode 100644 index 00000000..fb6b2e5a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/state.json @@ -0,0 +1,24 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "phone", + "font": 2.0, + "collector_sha256": "5b49028a588b5029d224e7c55b560632c7be8ca2ca655d6a4f95d4647f9c39a5", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "new", + "phase_outcome": "working-observed-path", + "expected_phase": "working-observed-path", + "compatible_listed_workflow": true +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/tests.log b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/tests.log new file mode 100644 index 00000000..ea741cbb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-phone200-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 15.545 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json new file mode 100644 index 00000000..91a9a03e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-chosen", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml new file mode 100644 index 00000000..8d8987f3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-chosen.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json new file mode 100644 index 00000000..783ddbfa --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-context-return", + "external_caller": true, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": null, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml new file mode 100644 index 00000000..fee3b6da --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-context-return.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json new file mode 100644 index 00000000..7d8264a3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-exact-copy", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml new file mode 100644 index 00000000..4a9cde83 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-exact-copy.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json new file mode 100644 index 00000000..95d2f9d0 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-native-result", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml new file mode 100644 index 00000000..4b3a0de9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-native-result.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..03b55486 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,153 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-fe979b5a95374082aa67dcc4347bf3f5", + "reviewed-text-47b5d05a9ab74b5d86f55307a9528a66", + "reviewed-text-d80f9ea9f9a445c290eaae6342a0d76a" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "handoff_target": "quick-translate-view", + "child_raw_input_grant_absent": true, + "reviewed_input_initially_consumed": true, + "input_setup": "Native editor test replacement after actual pointer focus; no physical-typing claim", + "owned_edited_query": "good morning", + "network_observation": { + "errors": 0, + "overflow": 0, + "decodeErrors": 0, + "requests": [ + { + "sequence": 1, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 2, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 3, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 4, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 5, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 6, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + } + ], + "pasteRejected": false + }, + "network_observer_scope": "Only subsequent requests; known owned response translation decoded for native output\/Copy equality; unrelated payloads, queries, headers and bodies are not retained", + "observation_deadline_reached": false, + "runtime_status": "", + "context_pointer_targets": [ + { + "tag": "extension-row-0", + "bounds": [ + 422, + 347, + 846, + 447 + ], + "minimum_px": 72, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1079, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "pointer_reveal_gestures": 0 + } + ], + "selected_owned_response_row": 0, + "copy_exact": true, + "observed_phase_outcome": "working-observed-path", + "owned_provider_output_sha256": "4314662c3426676a1dd586be6a6f1bddf8dae143c7e8514c50af525f9dc6cec8", + "owned_provider_output_characters": 4, + "workflow_outcome": "working-observed-path", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/runner-record.json new file mode 100644 index 00000000..b0c729c1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/runner-record.json @@ -0,0 +1,86 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/state.json new file mode 100644 index 00000000..f7d274f5 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/state.json @@ -0,0 +1,24 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "tablet", + "font": 1.0, + "collector_sha256": "5b49028a588b5029d224e7c55b560632c7be8ca2ca655d6a4f95d4647f9c39a5", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "new", + "phase_outcome": "working-observed-path", + "expected_phase": "working-observed-path", + "compatible_listed_workflow": true +} diff --git a/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/tests.log new file mode 100644 index 00000000..72afa6e5 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/final-quick-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 14.631 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json new file mode 100644 index 00000000..128905e7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json @@ -0,0 +1,26 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-3d76eee2be1b4358a516fc51ffb8ab4b", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/runner-record.json b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/runner-record.json new file mode 100644 index 00000000..7a358b3e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": false, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#returnedCommandRejectsDisposedPreferencesCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 0, + "tests_completed": false, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/state.json b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/state.json new file mode 100644 index 00000000..a99160cd --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "returnedCommandRejectsDisposedPreferencesCallback", + "expected_failure": true, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 1, + "passes": 0, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/tests.log b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/tests.log new file mode 100644 index 00000000..1c2c51d3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-preferences-old-tablet100-v1/tests.log @@ -0,0 +1,38 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stack=org.junit.ComparisonFailure: Disposed Preferences must not replace the restored command expected: but was: + at org.junit.Assert.assertEquals(Assert.java:117) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.returnedCommandRejectsDisposedPreferencesCallback(ExtensionCommandHandoffDeviceTest.kt:394) + +INSTRUMENTATION_STATUS: stream= +Error in returnedCommandRejectsDisposedPreferencesCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest): +org.junit.ComparisonFailure: Disposed Preferences must not replace the restored command expected: but was: + at org.junit.Assert.assertEquals(Assert.java:117) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.returnedCommandRejectsDisposedPreferencesCallback(ExtensionCommandHandoffDeviceTest.kt:394) + +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 6.274 +There was 1 failure: +1) returnedCommandRejectsDisposedPreferencesCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest) +org.junit.ComparisonFailure: Disposed Preferences must not replace the restored command expected: but was: + at org.junit.Assert.assertEquals(Assert.java:117) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.returnedCommandRejectsDisposedPreferencesCallback(ExtensionCommandHandoffDeviceTest.kt:394) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json new file mode 100644 index 00000000..f8f99b3d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json @@ -0,0 +1,26 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-d44ee674a26b47ceb802d22bac0d99ad", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/runner-record.json b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/runner-record.json new file mode 100644 index 00000000..1963b155 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": false, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#recreatedChildRejectsDisposedBackCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 0, + "tests_completed": false, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/state.json b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/state.json new file mode 100644 index 00000000..8146b62b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "recreatedChildRejectsDisposedBackCallback", + "expected_failure": true, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 1, + "passes": 0, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/tests.log b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/tests.log new file mode 100644 index 00000000..c91afd02 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/lifetime-recreation-old-tablet100-v1/tests.log @@ -0,0 +1,44 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: Disposed Back must not close the recreated child expected: but was: + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.failNotEquals(Assert.java:835) + at org.junit.Assert.assertEquals(Assert.java:120) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.recreatedChildRejectsDisposedBackCallback(ExtensionCommandHandoffDeviceTest.kt:381) + +INSTRUMENTATION_STATUS: stream= +Error in recreatedChildRejectsDisposedBackCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest): +java.lang.AssertionError: Disposed Back must not close the recreated child expected: but was: + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.failNotEquals(Assert.java:835) + at org.junit.Assert.assertEquals(Assert.java:120) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.recreatedChildRejectsDisposedBackCallback(ExtensionCommandHandoffDeviceTest.kt:381) + +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 6.586 +There was 1 failure: +1) recreatedChildRejectsDisposedBackCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest) +java.lang.AssertionError: Disposed Back must not close the recreated child expected: but was: + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.failNotEquals(Assert.java:835) + at org.junit.Assert.assertEquals(Assert.java:120) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.recreatedChildRejectsDisposedBackCallback(ExtensionCommandHandoffDeviceTest.kt:381) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json new file mode 100644 index 00000000..4188e1ef --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "failure", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml new file mode 100644 index 00000000..851fdf4d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-failure.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json new file mode 100644 index 00000000..25c3749a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json @@ -0,0 +1,26 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-55f93a83a2954c55b5056e31b41cf3f6", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/runner-record.json new file mode 100644 index 00000000..0ab58b6e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": false, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#returnedCommandRejectsDisposedPreferencesCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 0, + "tests_completed": false, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/state.json new file mode 100644 index 00000000..cefbf6aa --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "returnedCommandRejectsDisposedPreferencesCallback", + "expected_failure": true, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 1, + "passes": 0, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/tests.log new file mode 100644 index 00000000..c57015ea --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-preferences-old-tablet100-v3/tests.log @@ -0,0 +1,38 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stack=org.junit.ComparisonFailure: Disposed Preferences must not replace the restored command expected: but was: + at org.junit.Assert.assertEquals(Assert.java:117) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.returnedCommandRejectsDisposedPreferencesCallback(ExtensionCommandHandoffDeviceTest.kt:400) + +INSTRUMENTATION_STATUS: stream= +Error in returnedCommandRejectsDisposedPreferencesCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest): +org.junit.ComparisonFailure: Disposed Preferences must not replace the restored command expected: but was: + at org.junit.Assert.assertEquals(Assert.java:117) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.returnedCommandRejectsDisposedPreferencesCallback(ExtensionCommandHandoffDeviceTest.kt:400) + +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 6.046 +There was 1 failure: +1) returnedCommandRejectsDisposedPreferencesCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest) +org.junit.ComparisonFailure: Disposed Preferences must not replace the restored command expected: but was: + at org.junit.Assert.assertEquals(Assert.java:117) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.returnedCommandRejectsDisposedPreferencesCallback(ExtensionCommandHandoffDeviceTest.kt:400) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json new file mode 100644 index 00000000..46fde501 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "failure", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml new file mode 100644 index 00000000..a6da6585 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-failure.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json new file mode 100644 index 00000000..2079bae8 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json @@ -0,0 +1,26 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-6bad2353fe744dfbb7cea7c8aa92231e", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/runner-record.json new file mode 100644 index 00000000..40a4f76f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": false, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#recreatedChildRejectsDisposedBackCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 0, + "tests_completed": false, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/state.json new file mode 100644 index 00000000..2c93a6f1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "recreatedChildRejectsDisposedBackCallback", + "expected_failure": true, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 1, + "passes": 0, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/tests.log new file mode 100644 index 00000000..f0f016bb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-lifetime-recreation-old-tablet100-v3/tests.log @@ -0,0 +1,44 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: Disposed Back must not close the recreated child expected: but was: + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.failNotEquals(Assert.java:835) + at org.junit.Assert.assertEquals(Assert.java:120) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.recreatedChildRejectsDisposedBackCallback(ExtensionCommandHandoffDeviceTest.kt:387) + +INSTRUMENTATION_STATUS: stream= +Error in recreatedChildRejectsDisposedBackCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest): +java.lang.AssertionError: Disposed Back must not close the recreated child expected: but was: + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.failNotEquals(Assert.java:835) + at org.junit.Assert.assertEquals(Assert.java:120) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.recreatedChildRejectsDisposedBackCallback(ExtensionCommandHandoffDeviceTest.kt:387) + +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 6.518 +There was 1 failure: +1) recreatedChildRejectsDisposedBackCallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest) +java.lang.AssertionError: Disposed Back must not close the recreated child expected: but was: + at org.junit.Assert.fail(Assert.java:89) + at org.junit.Assert.failNotEquals(Assert.java:835) + at org.junit.Assert.assertEquals(Assert.java:120) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.recreatedChildRejectsDisposedBackCallback(ExtensionCommandHandoffDeviceTest.kt:387) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..7086e0f7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,166 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-9a570e5ff03d482ea0d929f1e1d515b7", + "reviewed-text-736e91b047714f85904128f7064fc571", + "reviewed-text-105575a662a447b1b9d4d324459171b4" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "handoff_target": "quick-translate-view", + "child_raw_input_grant_absent": true, + "reviewed_input_initially_consumed": true, + "input_setup": "Native editor test replacement after actual pointer focus; no physical-typing claim", + "owned_edited_query": "good morning", + "network_observation": { + "errors": 0, + "overflow": 0, + "decodeErrors": 0, + "requests": [ + { + "sequence": 1, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 2, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 3, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 4, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 5, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 6, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + } + ], + "pasteRejected": false + }, + "network_observer_scope": "Only subsequent requests; known owned response translation decoded for native output\/Copy equality; unrelated payloads, queries, headers and bodies are not retained", + "observation_deadline_reached": false, + "runtime_status": "", + "context_pointer_targets": [ + { + "tag": "extension-row-0", + "bounds": [ + 74, + 288, + 1006, + 463 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 53, + 1200, + 826, + 1326 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-detail-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + } + ], + "selected_owned_response_row": 0, + "copy_exact": true, + "observed_phase_outcome": "working-observed-path", + "owned_provider_output_sha256": "4314662c3426676a1dd586be6a6f1bddf8dae143c7e8514c50af525f9dc6cec8", + "owned_provider_output_characters": 4, + "native_detail_returned_to_results": true, + "edited_query_preserved_on_native_back": true, + "workflow_outcome": "working-observed-path", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/runner-record.json b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/runner-record.json new file mode 100644 index 00000000..8d0da23a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/runner-record.json @@ -0,0 +1,92 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "0d19429376081de7f4f7b5ebe0d954a2b3aa82bc15d9c03af10184412f33e9a1", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/state.json b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/state.json new file mode 100644 index 00000000..382f2dac --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/state.json @@ -0,0 +1,24 @@ +{ + "completed": true, + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "phone", + "font": 1, + "collector_sha256": "5aec7c6af8b013dca9880bf670760c13080849508f143484d1d62b2ec734abcd", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "new", + "phase_outcome": "working-observed-path", + "expected_phase": "working-observed-path", + "compatible_listed_workflow": true +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/tests.log b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/tests.log new file mode 100644 index 00000000..3b1ae997 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-phone100-v1/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 15.259 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..b7a32a68 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,151 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-a5b14b3222ff4d6d9cbfaeb1cd59304d", + "reviewed-text-fa859135e06a407fac40d5d69ad64833", + "reviewed-text-9909b5f67dd04a9f8981fff11f105bf3" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "installed_build_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "handoff_target": "quick-translate-view", + "child_raw_input_grant_absent": true, + "reviewed_input_initially_consumed": true, + "input_setup": "Native editor test replacement after actual pointer focus; no physical-typing claim", + "owned_edited_query": "good morning", + "network_observation": { + "errors": 0, + "overflow": 0, + "decodeErrors": 0, + "requests": [ + { + "sequence": 1, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 2, + "endpoint": "other-redacted", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 3, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": true, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 4, + "endpoint": "google-translate", + "ownedInputQuery": true, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 5, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": false, + "completed": true, + "transportSucceeded": true, + "status": 200 + }, + { + "sequence": 6, + "endpoint": "google-translate", + "ownedInputQuery": false, + "ownedJapaneseTarget": true, + "completed": false + } + ], + "pasteRejected": false + }, + "network_observer_scope": "Only subsequent requests; known owned response translation decoded for native output\/Copy equality; unrelated payloads, queries, headers and bodies are not retained", + "observation_deadline_reached": false, + "runtime_status": "", + "context_pointer_targets": [ + { + "tag": "extension-row-0", + "bounds": [ + 422, + 347, + 846, + 447 + ], + "minimum_px": 72, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1079, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "pointer_reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "pointer_reveal_gestures": 0 + } + ], + "selected_owned_response_row": 0, + "copy_exact": true, + "observed_phase_outcome": "working-observed-path", + "owned_provider_output_sha256": "4314662c3426676a1dd586be6a6f1bddf8dae143c7e8514c50af525f9dc6cec8", + "owned_provider_output_characters": 4, + "workflow_outcome": "working-observed-path", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/runner-record.json b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/runner-record.json new file mode 100644 index 00000000..dda150e3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/runner-record.json @@ -0,0 +1,86 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "0d19429376081de7f4f7b5ebe0d954a2b3aa82bc15d9c03af10184412f33e9a1", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/state.json b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/state.json new file mode 100644 index 00000000..4ea1ad70 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/state.json @@ -0,0 +1,24 @@ +{ + "completed": true, + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "tablet", + "font": 1, + "collector_sha256": "5aec7c6af8b013dca9880bf670760c13080849508f143484d1d62b2ec734abcd", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "new", + "phase_outcome": "working-observed-path", + "expected_phase": "working-observed-path", + "compatible_listed_workflow": true +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/tests.log b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/tests.log new file mode 100644 index 00000000..411f0aea --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-new-tablet100-v1/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 14.645 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json new file mode 100644 index 00000000..050efaf3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-runtime-boundary", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml new file mode 100644 index 00000000..2a000d97 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..cf24a192 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,58 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-84f3ff95d74244a1bfcd381f176e35a0", + "reviewed-text-0418d37ec6bb4e369da35c308fb888e8", + "reviewed-text-ad1aaf8da4af44ec95f303c0974fc6e3" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "ed3831303a8319a194f0ae137830acba1f3580d5", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "observed_runtime_error": "Error: launchCommand is not supported on Android\n at Object.om [as settle] (:13:2346)\n at :1:12", + "observed_phase_outcome": "blocked-command-handoff", + "context_pointer_targets": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "pointer_reveal_gestures": 0 + } + ], + "workflow_outcome": "blocked-command-handoff", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/runner-record.json b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/runner-record.json new file mode 100644 index 00000000..742714b1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/runner-record.json @@ -0,0 +1,92 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "0d19429376081de7f4f7b5ebe0d954a2b3aa82bc15d9c03af10184412f33e9a1", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/state.json b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/state.json new file mode 100644 index 00000000..83148773 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/state.json @@ -0,0 +1,25 @@ +{ + "completed": true, + "runtime_source_commit": "ed3831303a8319a194f0ae137830acba1f3580d5", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "phone", + "font": 1, + "collector_sha256": "5aec7c6af8b013dca9880bf670760c13080849508f143484d1d62b2ec734abcd", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "old", + "phase_outcome": "blocked-command-handoff", + "expected_phase": "blocked-command-handoff", + "compatible_listed_workflow": false, + "negative_capability_observed": true +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/tests.log b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/tests.log new file mode 100644 index 00000000..1a5eebb8 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-phone100-v1/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 9.795 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json new file mode 100644 index 00000000..050efaf3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary-frame.json @@ -0,0 +1,8 @@ +{ + "phase": "translation-runtime-boundary", + "external_caller": false, + "font_scale": 1, + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "ime_visible": false, + "synchronization": "Idle native\/Compose state; hierarchy captured before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml new file mode 100644 index 00000000..ef9c7a93 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/captures/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-translation-runtime-boundary.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json new file mode 100644 index 00000000..67002b38 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/cases/text-selectedtranslationrunsonlyafterreviewandreportsexactcopyorservicefailure-record.json @@ -0,0 +1,58 @@ +{ + "scope": "Unmodified frozen quick-translate after explicit review\/Run from a separate owned Android caller; collector success is separate from service success", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-f74873798c194e14bb24a18cb920b309", + "reviewed-text-29b3d7728cb44e6a8109a6f187f7dbb4", + "reviewed-text-8f60f68e134b4c58a89270ffe07875e5" + ], + "executed_command": "quick-translate", + "translation_archive_sha256": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2", + "translation_command_sha256": "597e079da9f40604482472c94e3810d6654415aaf04477371441c9c7fbfdf521", + "translation_preferences": { + "langFrom": "en", + "lang1": "ja", + "lang2": "en", + "autoInput": true, + "defaultAction": "copy", + "prioritizeCrossLanguage": false, + "proxy": "" + }, + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "installed_build_commit": "ed3831303a8319a194f0ae137830acba1f3580d5", + "preview_no_execution_and_clipboard_unchanged": true, + "startup_gate": "Compose-driven wait for native List, JavaScript engine or runtime error", + "observed_runtime_error": "Error: launchCommand is not supported on Android\n at Object.om [as settle] (:13:2346)\n at :1:12", + "observed_phase_outcome": "blocked-command-handoff", + "context_pointer_targets": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "pointer_reveal_gestures": 0 + } + ], + "workflow_outcome": "blocked-command-handoff", + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "observation_collector_passed": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/runner-record.json b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/runner-record.json new file mode 100644 index 00000000..7e6ee60f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/runner-record.json @@ -0,0 +1,86 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "expected": 1, + "runner_sha256": "0d19429376081de7f4f7b5ebe0d954a2b3aa82bc15d9c03af10184412f33e9a1", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": { + "translate": "9ecbb40257fbc1d0d32778efa95c1392fc6c46d03eb6099e3995a73b6e16eec2" + }, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "quick-translate", + "expect_completion_return": false, + "apk_sha256": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 3, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/state.json b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/state.json new file mode 100644 index 00000000..96b51358 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/state.json @@ -0,0 +1,25 @@ +{ + "completed": true, + "runtime_source_commit": "ed3831303a8319a194f0ae137830acba1f3580d5", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "app_sha256": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "test_apk_sha256": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f", + "layout": "tablet", + "font": 1, + "collector_sha256": "5aec7c6af8b013dca9880bf670760c13080849508f143484d1d62b2ec734abcd", + "preservation_helper_sha256": "e2fd1aca5d584d268c57ccb65a5831226c9bdd3820a2f36874bd8b0d6485d8ee", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "app": "old", + "phase_outcome": "blocked-command-handoff", + "expected_phase": "blocked-command-handoff", + "compatible_listed_workflow": false, + "negative_capability_observed": true +} diff --git a/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/tests.log b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/tests.log new file mode 100644 index 00000000..c502a3ef --- /dev/null +++ b/docs/validation/command-handoff/cohorts/matched-quick-old-tablet100-v1/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 10.306 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json new file mode 100644 index 00000000..ab4cef95 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-b214fc6ba13342b698239e4fda91e249", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "paused_parent_probe": { + "attempted": 1, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/runner-record.json new file mode 100644 index 00000000..014adfed --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#acknowledgementRevokesParentBeforeChildComposition", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/state.json new file mode 100644 index 00000000..19020b05 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "acknowledgementRevokesParentBeforeChildComposition", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/tests.log new file mode 100644 index 00000000..3088cada --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.043 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json new file mode 100644 index 00000000..f111ace6 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-91c09d2452f64e49bcd4f94e4e42bfd3", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "paused_parent_probe": { + "attempted": 1, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/runner-record.json new file mode 100644 index 00000000..41b56157 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#acknowledgementRevokesParentBeforeChildComposition", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/state.json new file mode 100644 index 00000000..ed87e0c5 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "acknowledgementRevokesParentBeforeChildComposition", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/tests.log new file mode 100644 index 00000000..f4babc1b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.497 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json new file mode 100644 index 00000000..5a52743c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-79e189483bcb401baac42006acc39663", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "paused_parent_probe": { + "attempted": 1, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/runner-record.json new file mode 100644 index 00000000..42995bc6 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#acknowledgementRevokesParentBeforeChildComposition", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/state.json new file mode 100644 index 00000000..d2229fa9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "acknowledgementRevokesParentBeforeChildComposition", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/tests.log new file mode 100644 index 00000000..c25b661c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ack-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.457 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json new file mode 100644 index 00000000..ed4afdcc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "cancelled-caller", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml new file mode 100644 index 00000000..1a6118dd --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json new file mode 100644 index 00000000..8fd0c9ea --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json @@ -0,0 +1,24 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-b348f216e59842e796b3ec97533fe54f", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "cancelled_before_commit": true, + "cancelled_request_probe": { + "attempted": 1, + "acks": 0, + "copiesAttempted": 0, + "copiesResolved": 0, + "statusesAttempted": 0, + "publicationsAttempted": 0, + "rejections": [] + }, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/runner-record.json new file mode 100644 index 00000000..1ce9281a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#queuedRequestCannotLaunchAfterParentCancellation", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/state.json new file mode 100644 index 00000000..af5267e4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "queuedRequestCannotLaunchAfterParentCancellation", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/tests.log new file mode 100644 index 00000000..5a297b3f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=queuedRequestCannotLaunchAfterParentCancellation +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=queuedRequestCannotLaunchAfterParentCancellation +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 5.302 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json new file mode 100644 index 00000000..5e01b82d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json @@ -0,0 +1,24 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-b8d2eee8dfba429aaa9d14725aadb7c4", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "cancelled_before_commit": true, + "cancelled_request_probe": { + "attempted": 1, + "acks": 0, + "copiesAttempted": 0, + "copiesResolved": 0, + "statusesAttempted": 0, + "publicationsAttempted": 0, + "rejections": [] + }, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/runner-record.json new file mode 100644 index 00000000..c4651224 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#queuedRequestCannotLaunchAfterParentCancellation", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/state.json new file mode 100644 index 00000000..ef15d3c7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "queuedRequestCannotLaunchAfterParentCancellation", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/tests.log new file mode 100644 index 00000000..013585df --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=queuedRequestCannotLaunchAfterParentCancellation +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=queuedRequestCannotLaunchAfterParentCancellation +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 4.852 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json new file mode 100644 index 00000000..ed4afdcc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "cancelled-caller", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml new file mode 100644 index 00000000..afd846a5 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/captures/handoff-queuedrequestcannotlaunchafterparentcancellation-cancelled-caller.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json new file mode 100644 index 00000000..85550d36 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/cases/handoff-queuedrequestcannotlaunchafterparentcancellation-record.json @@ -0,0 +1,24 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-0ea775e888864b33b5d806c4180bf26d", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "cancelled_before_commit": true, + "cancelled_request_probe": { + "attempted": 1, + "acks": 0, + "copiesAttempted": 0, + "copiesResolved": 0, + "statusesAttempted": 0, + "publicationsAttempted": 0, + "rejections": [] + }, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/runner-record.json new file mode 100644 index 00000000..62cd2196 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#queuedRequestCannotLaunchAfterParentCancellation", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/state.json new file mode 100644 index 00000000..6c9cc217 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "queuedRequestCannotLaunchAfterParentCancellation", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/tests.log new file mode 100644 index 00000000..0928631b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-cancel-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=queuedRequestCannotLaunchAfterParentCancellation +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=queuedRequestCannotLaunchAfterParentCancellation +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 5.705 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json new file mode 100644 index 00000000..cb7bf091 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "caller-return", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml new file mode 100644 index 00000000..5ed88260 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json new file mode 100644 index 00000000..6f04e9cf --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml new file mode 100644 index 00000000..86441ac4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json new file mode 100644 index 00000000..3445558a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "parent-ready", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml new file mode 100644 index 00000000..566be0c3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..e758257c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-f84f79af1021480caaa2fdc67a7d4d80", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 53, + 1200, + 826, + 1326 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 53, + 1200, + 826, + 1326 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/runner-record.json new file mode 100644 index 00000000..a9281f09 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/state.json new file mode 100644 index 00000000..24cc47dc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/tests.log new file mode 100644 index 00000000..d0d2ade0 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.418 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..7bb704bb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-a07e9019912147249d2928bd51a9e154", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1044, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/runner-record.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/runner-record.json new file mode 100644 index 00000000..e7888c7d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/state.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/state.json new file mode 100644 index 00000000..fb83219f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/tests.log b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/tests.log new file mode 100644 index 00000000..33f2ed8c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v1/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.931 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..f17ffea2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-3bcc638ae3d04cf89ffd7a864cca3b4a", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1044, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/runner-record.json new file mode 100644 index 00000000..2ee0cd1d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/state.json new file mode 100644 index 00000000..66e951b7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/tests.log new file mode 100644 index 00000000..1b83e7c0 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 9.352 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json new file mode 100644 index 00000000..cb7bf091 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "caller-return", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml new file mode 100644 index 00000000..e3eb537a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-caller-return.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json new file mode 100644 index 00000000..6f04e9cf --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml new file mode 100644 index 00000000..9bb51d7b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-child-context.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json new file mode 100644 index 00000000..3445558a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "parent-ready", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml new file mode 100644 index 00000000..d9170ad7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/captures/handoff-contextargumentsandfallbackreachchildandcopy-parent-ready.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json new file mode 100644 index 00000000..66291248 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/cases/handoff-contextargumentsandfallbackreachchildandcopy-record.json @@ -0,0 +1,54 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-1a140f0ff4a747709bf9fa76b82687d9", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-primary", + "bounds": [ + 1044, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "child_raw_grant_absent": true, + "context_argument_fallback_values_verified": true, + "copy_exact": true, + "owned_payload_sha256": "2e7bb2f77bbbd2595f18bc40df44ebe7f0bd1712594337a89f6d9b5d34600d38", + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/runner-record.json new file mode 100644 index 00000000..bc67f80e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#contextArgumentsAndFallbackReachChildAndCopy", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/state.json new file mode 100644 index 00000000..f461c424 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "contextArgumentsAndFallbackReachChildAndCopy", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/tests.log new file mode 100644 index 00000000..097f4bc2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-context-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=contextArgumentsAndFallbackReachChildAndCopy +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 10.664 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json new file mode 100644 index 00000000..cfb1e811 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-44155ed7904649a3b851cb651c562053", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "paused_parent_probe": { + "attempted": 2, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/runner-record.json new file mode 100644 index 00000000..3132dd01 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#duplicateLaunchRequestsTransferOnlyOnce", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/state.json new file mode 100644 index 00000000..f7bf5070 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "duplicateLaunchRequestsTransferOnlyOnce", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/tests.log new file mode 100644 index 00000000..8ea4ec44 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.715 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json new file mode 100644 index 00000000..442924a1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-afaf92c8ea7a4d3aad6f63f17a0f08c1", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "paused_parent_probe": { + "attempted": 2, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/runner-record.json new file mode 100644 index 00000000..b8baf0aa --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#duplicateLaunchRequestsTransferOnlyOnce", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/state.json new file mode 100644 index 00000000..dd63432a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "duplicateLaunchRequestsTransferOnlyOnce", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/tests.log new file mode 100644 index 00000000..91ba63b8 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.305 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json new file mode 100644 index 00000000..617b965c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-859f13adfc3b48368aa02b0820f42f66", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "paused_parent_probe": { + "attempted": 2, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/runner-record.json new file mode 100644 index 00000000..818c7d60 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#duplicateLaunchRequestsTransferOnlyOnce", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/state.json new file mode 100644 index 00000000..56ba34d9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "duplicateLaunchRequestsTransferOnlyOnce", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/tests.log new file mode 100644 index 00000000..7916fe37 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-duplicate-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.525 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json new file mode 100644 index 00000000..050ac34c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "rejected-request-feedback", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml new file mode 100644 index 00000000..54d4bc4c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json new file mode 100644 index 00000000..42899ea5 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json @@ -0,0 +1,80 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-c479455c62ee4dc692cc34711b0a6b66", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "rejection_receipts": [ + { + "index": 0, + "message": "Only foreground user-initiated command launches are supported on Android", + "same_epoch_and_parent": true + }, + { + "index": 1, + "message": "Launching another extension is unavailable on Android", + "same_epoch_and_parent": true + }, + { + "index": 2, + "message": "The requested command is unavailable in this extension", + "same_epoch_and_parent": true + }, + { + "index": 3, + "message": "The target command is disabled", + "same_epoch_and_parent": true + }, + { + "index": 4, + "message": "The target command requires an unsupported desktop mode", + "same_epoch_and_parent": true + }, + { + "index": 5, + "message": "The target command is unavailable; reinstall the extension before launching it", + "same_epoch_and_parent": true + }, + { + "index": 6, + "message": "Configure the target command from the launcher before launching it here", + "same_epoch_and_parent": true + }, + { + "index": 7, + "message": "Complete the target command's required arguments before launching it", + "same_epoch_and_parent": true + }, + { + "index": 8, + "message": "The launch contains an undeclared command argument", + "same_epoch_and_parent": true + }, + { + "index": 9, + "message": "The command launch data exceeds the Android size limit", + "same_epoch_and_parent": true + } + ], + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/runner-record.json new file mode 100644 index 00000000..035796e9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#invalidRequestsKeepTheParentAndClipboard", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/state.json new file mode 100644 index 00000000..61613227 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "invalidRequestsKeepTheParentAndClipboard", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/tests.log new file mode 100644 index 00000000..835615b2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.143 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json new file mode 100644 index 00000000..3ac49fe2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json @@ -0,0 +1,80 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-9f50b1a17540461faeecacfa137f98ee", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "rejection_receipts": [ + { + "index": 0, + "message": "Only foreground user-initiated command launches are supported on Android", + "same_epoch_and_parent": true + }, + { + "index": 1, + "message": "Launching another extension is unavailable on Android", + "same_epoch_and_parent": true + }, + { + "index": 2, + "message": "The requested command is unavailable in this extension", + "same_epoch_and_parent": true + }, + { + "index": 3, + "message": "The target command is disabled", + "same_epoch_and_parent": true + }, + { + "index": 4, + "message": "The target command requires an unsupported desktop mode", + "same_epoch_and_parent": true + }, + { + "index": 5, + "message": "The target command is unavailable; reinstall the extension before launching it", + "same_epoch_and_parent": true + }, + { + "index": 6, + "message": "Configure the target command from the launcher before launching it here", + "same_epoch_and_parent": true + }, + { + "index": 7, + "message": "Complete the target command's required arguments before launching it", + "same_epoch_and_parent": true + }, + { + "index": 8, + "message": "The launch contains an undeclared command argument", + "same_epoch_and_parent": true + }, + { + "index": 9, + "message": "The command launch data exceeds the Android size limit", + "same_epoch_and_parent": true + } + ], + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/runner-record.json new file mode 100644 index 00000000..029a90b1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#invalidRequestsKeepTheParentAndClipboard", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/state.json new file mode 100644 index 00000000..c6d31f88 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "invalidRequestsKeepTheParentAndClipboard", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/tests.log new file mode 100644 index 00000000..a59931e9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.482 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json new file mode 100644 index 00000000..050ac34c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "rejected-request-feedback", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml new file mode 100644 index 00000000..a52622f6 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/captures/handoff-invalidrequestskeeptheparentandclipboard-rejected-request-feedback.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json new file mode 100644 index 00000000..76cdb2dc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/cases/handoff-invalidrequestskeeptheparentandclipboard-record.json @@ -0,0 +1,80 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-612010d76b614c9485edbaedea8622f8", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "rejection_receipts": [ + { + "index": 0, + "message": "Only foreground user-initiated command launches are supported on Android", + "same_epoch_and_parent": true + }, + { + "index": 1, + "message": "Launching another extension is unavailable on Android", + "same_epoch_and_parent": true + }, + { + "index": 2, + "message": "The requested command is unavailable in this extension", + "same_epoch_and_parent": true + }, + { + "index": 3, + "message": "The target command is disabled", + "same_epoch_and_parent": true + }, + { + "index": 4, + "message": "The target command requires an unsupported desktop mode", + "same_epoch_and_parent": true + }, + { + "index": 5, + "message": "The target command is unavailable; reinstall the extension before launching it", + "same_epoch_and_parent": true + }, + { + "index": 6, + "message": "Configure the target command from the launcher before launching it here", + "same_epoch_and_parent": true + }, + { + "index": 7, + "message": "Complete the target command's required arguments before launching it", + "same_epoch_and_parent": true + }, + { + "index": 8, + "message": "The launch contains an undeclared command argument", + "same_epoch_and_parent": true + }, + { + "index": 9, + "message": "The command launch data exceeds the Android size limit", + "same_epoch_and_parent": true + } + ], + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/runner-record.json new file mode 100644 index 00000000..caac203e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#invalidRequestsKeepTheParentAndClipboard", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/state.json new file mode 100644 index 00000000..863a3fa7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "invalidRequestsKeepTheParentAndClipboard", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/tests.log new file mode 100644 index 00000000..0c5dea1e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-invalid-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=invalidRequestsKeepTheParentAndClipboard +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.289 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json new file mode 100644 index 00000000..d2256176 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "ordinary-child-without-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 4, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml new file mode 100644 index 00000000..d4894bc3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json new file mode 100644 index 00000000..95b53a85 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json @@ -0,0 +1,63 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-e716143267824754b644e7f6873dc42f", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 53, + 1200, + 826, + 1326 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "run-extension-setup", + "bounds": [ + 85, + 1163, + 995, + 1289 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "ordinary_launch_configuration_explicitly_run": true, + "ordinary_launch_has_no_old_context_arguments_or_fallback": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/runner-record.json new file mode 100644 index 00000000..4db18e0b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#ordinaryRelaunchClearsContextAndFallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/state.json new file mode 100644 index 00000000..bca6e73d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "ordinaryRelaunchClearsContextAndFallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/tests.log new file mode 100644 index 00000000..070011ee --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=ordinaryRelaunchClearsContextAndFallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=ordinaryRelaunchClearsContextAndFallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.978 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure-frame.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure-frame.json new file mode 100644 index 00000000..11e683c6 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "failure", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 3, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.xml b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.xml new file mode 100644 index 00000000..c0fdfd47 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/captures/handoff-ordinaryrelaunchclearscontextandfallback-failure.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json new file mode 100644 index 00000000..28fb3d8b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json @@ -0,0 +1,37 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-3c0f7b061aa744d7af09c460cee2a272", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/runner-record.json new file mode 100644 index 00000000..44e95e15 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": false, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#ordinaryRelaunchClearsContextAndFallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 0, + "tests_completed": false, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/state.json new file mode 100644 index 00000000..3635564c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": false, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "ordinaryRelaunchClearsContextAndFallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 1, + "passes": 0, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/tests.log new file mode 100644 index 00000000..f8016dbd --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v2/tests.log @@ -0,0 +1,44 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=ordinaryRelaunchClearsContextAndFallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stack=androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 25000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.launch(ExtensionCommandHandoffDeviceTest.kt:184) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.ordinaryRelaunchClearsContextAndFallback(ExtensionCommandHandoffDeviceTest.kt:368) + +INSTRUMENTATION_STATUS: stream= +Error in ordinaryRelaunchClearsContextAndFallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest): +androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 25000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.launch(ExtensionCommandHandoffDeviceTest.kt:184) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.ordinaryRelaunchClearsContextAndFallback(ExtensionCommandHandoffDeviceTest.kt:368) + +INSTRUMENTATION_STATUS: test=ordinaryRelaunchClearsContextAndFallback +INSTRUMENTATION_STATUS_CODE: -2 +INSTRUMENTATION_RESULT: stream= + +Time: 30.689 +There was 1 failure: +1) ordinaryRelaunchClearsContextAndFallback(dev.tinycast.android.ExtensionCommandHandoffDeviceTest) +androidx.compose.ui.test.ComposeTimeoutException: Condition still not satisfied after 25000 ms + at androidx.compose.ui.test.AndroidComposeUiTestEnvironment$AndroidComposeUiTestImpl.waitUntil(ComposeUiTest.android.kt:441) + at androidx.compose.ui.test.junit4.AndroidComposeTestRule.waitUntil(AndroidComposeTestRule.android.kt:306) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.launch(ExtensionCommandHandoffDeviceTest.kt:184) + at dev.tinycast.android.ExtensionCommandHandoffDeviceTest.ordinaryRelaunchClearsContextAndFallback(ExtensionCommandHandoffDeviceTest.kt:368) + +FAILURES!!! +Tests run: 1, Failures: 1 + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json new file mode 100644 index 00000000..d2256176 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "ordinary-child-without-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 4, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml new file mode 100644 index 00000000..c800f492 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/captures/handoff-ordinaryrelaunchclearscontextandfallback-ordinary-child-without-context.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json new file mode 100644 index 00000000..b645be04 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/cases/handoff-ordinaryrelaunchclearscontextandfallback-record.json @@ -0,0 +1,63 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-c0fc23756a2c499fbef668a66c8acd4a", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "run-extension-setup", + "bounds": [ + 428, + 848, + 1493, + 920 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "ordinary_launch_configuration_explicitly_run": true, + "ordinary_launch_has_no_old_context_arguments_or_fallback": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/runner-record.json new file mode 100644 index 00000000..15210d14 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#ordinaryRelaunchClearsContextAndFallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/state.json new file mode 100644 index 00000000..60aaf72a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "ordinaryRelaunchClearsContextAndFallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/tests.log new file mode 100644 index 00000000..0ba73521 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-ordinary-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=ordinaryRelaunchClearsContextAndFallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=ordinaryRelaunchClearsContextAndFallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 9.888 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json new file mode 100644 index 00000000..011bd105 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "restored-parent-rejects-old-preferences", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml new file mode 100644 index 00000000..fd1904ce --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json new file mode 100644 index 00000000..6d0e4cd4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-a87879cf51604daeb6abc0efb3bb011b", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "disposed_preferences_rejected_after_route_return": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/runner-record.json new file mode 100644 index 00000000..188449a8 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#returnedCommandRejectsDisposedPreferencesCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/state.json new file mode 100644 index 00000000..149d5aaf --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "returnedCommandRejectsDisposedPreferencesCallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/tests.log new file mode 100644 index 00000000..34ebc994 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.587 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json new file mode 100644 index 00000000..78558af2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-816b473242884cefb2457bd90f50debf", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "disposed_preferences_rejected_after_route_return": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/runner-record.json new file mode 100644 index 00000000..8e4224f4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#returnedCommandRejectsDisposedPreferencesCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/state.json new file mode 100644 index 00000000..cd5f82fc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "returnedCommandRejectsDisposedPreferencesCallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/tests.log new file mode 100644 index 00000000..f8957cf1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.968 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json new file mode 100644 index 00000000..011bd105 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "restored-parent-rejects-old-preferences", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 1, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml new file mode 100644 index 00000000..a7a41b2b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/captures/handoff-returnedcommandrejectsdisposedpreferencescallback-restored-parent-rejects-old-preferences.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json new file mode 100644 index 00000000..8040b8cd --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/cases/handoff-returnedcommandrejectsdisposedpreferencescallback-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-030d1765166046c28123ebadd992883c", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "disposed_preferences_rejected_after_route_return": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/runner-record.json new file mode 100644 index 00000000..5b1efc03 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#returnedCommandRejectsDisposedPreferencesCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/state.json new file mode 100644 index 00000000..69b12fe1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "returnedCommandRejectsDisposedPreferencesCallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/tests.log new file mode 100644 index 00000000..0a95d041 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-preferences-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=returnedCommandRejectsDisposedPreferencesCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.148 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json new file mode 100644 index 00000000..14944fbc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "recreated-child-retains-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml new file mode 100644 index 00000000..fb674dc4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json new file mode 100644 index 00000000..80eae19f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json @@ -0,0 +1,41 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-1e308db1c1954ee7af82e7d61cd81af0", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 53, + 1200, + 826, + 1326 + ], + "minimum_px": 126, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "current_invocation_context_survived_recreation": true, + "disposed_back_rejected_after_recreation": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/runner-record.json new file mode 100644 index 00000000..b3532444 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#recreatedChildRejectsDisposedBackCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/state.json new file mode 100644 index 00000000..e0b566c9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "recreatedChildRejectsDisposedBackCallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/tests.log new file mode 100644 index 00000000..03be272b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.711 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json new file mode 100644 index 00000000..e5daaa00 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json @@ -0,0 +1,41 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-35e1d0775e274b809ff9c3a4bab460d5", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "current_invocation_context_survived_recreation": true, + "disposed_back_rejected_after_recreation": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/runner-record.json new file mode 100644 index 00000000..7a7ba3db --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#recreatedChildRejectsDisposedBackCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/state.json new file mode 100644 index 00000000..fd143687 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "layout": "tablet", + "font": 1, + "method": "recreatedChildRejectsDisposedBackCallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/tests.log new file mode 100644 index 00000000..4c18e665 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v2/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.11 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json new file mode 100644 index 00000000..14944fbc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "recreated-child-retains-context", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml new file mode 100644 index 00000000..186a20dc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/captures/handoff-recreatedchildrejectsdisposedbackcallback-recreated-child-retains-context.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json new file mode 100644 index 00000000..5a35c7a3 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/cases/handoff-recreatedchildrejectsdisposedbackcallback-record.json @@ -0,0 +1,41 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-813d5d17ed2d429e9685edb2a186a237", + "fixture_parent_sha256": "5f5ff4ecbcff73d4e63f2a8f059502752fb1018d0283f2f56c1b1705b12da324", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "pointer_taps": [ + { + "tag": "extension-primary", + "bounds": [ + 1049, + 872, + 1322, + 944 + ], + "minimum_px": 72, + "reveal_gestures": 0 + }, + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "current_invocation_context_survived_recreation": true, + "disposed_back_rejected_after_recreation": true, + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/runner-record.json new file mode 100644 index 00000000..f8ad595b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#recreatedChildRejectsDisposedBackCallback", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/state.json new file mode 100644 index 00000000..48f73925 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "recreatedChildRejectsDisposedBackCallback", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/tests.log new file mode 100644 index 00000000..6f683182 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/owned-recreation-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=recreatedChildRejectsDisposedBackCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.572 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json new file mode 100644 index 00000000..633fa27f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-after-queued-callbacks", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml new file mode 100644 index 00000000..543a3f74 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json new file mode 100644 index 00000000..9036178b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-643287a3b3df4b0ea4a3aa17af43536e", + "fixture_parent_sha256": "89173122097eb113c83d73b1a94ac3208fe6c5bea790029b6d5ef5aa9a61da2d", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "paused_parent_probe": { + "attempted": 1, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/runner-record.json b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/runner-record.json new file mode 100644 index 00000000..a2100f64 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#acknowledgementRevokesParentBeforeChildComposition", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/state.json b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/state.json new file mode 100644 index 00000000..5c3ba1df --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "73e719c602bc378c71df83eba34440771bc8d999", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "layout": "phone", + "font": 1, + "method": "acknowledgementRevokesParentBeforeChildComposition", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/tests.log b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/tests.log new file mode 100644 index 00000000..d04ccdb0 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-phone100-v4/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.825 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json new file mode 100644 index 00000000..633fa27f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-after-queued-callbacks", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml new file mode 100644 index 00000000..504933dd --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/captures/handoff-acknowledgementrevokesparentbeforechildcomposition-child-after-queued-callbacks.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json new file mode 100644 index 00000000..f1459691 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/cases/handoff-acknowledgementrevokesparentbeforechildcomposition-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-9c6a6590230f4260b66d5ede075d9ee7", + "fixture_parent_sha256": "89173122097eb113c83d73b1a94ac3208fe6c5bea790029b6d5ef5aa9a61da2d", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "paused_parent_probe": { + "attempted": 1, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/runner-record.json b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/runner-record.json new file mode 100644 index 00000000..cad399cc --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#acknowledgementRevokesParentBeforeChildComposition", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/state.json b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/state.json new file mode 100644 index 00000000..02c71fb0 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "73e719c602bc378c71df83eba34440771bc8d999", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "layout": "tablet", + "font": 1, + "method": "acknowledgementRevokesParentBeforeChildComposition", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/tests.log b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/tests.log new file mode 100644 index 00000000..36e8b651 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-ack-tablet100-v4/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=acknowledgementRevokesParentBeforeChildComposition +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 8.04 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json new file mode 100644 index 00000000..633fa27f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-after-queued-callbacks", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml new file mode 100644 index 00000000..893f1771 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json new file mode 100644 index 00000000..6e6a88b1 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-10373dbce90740c2a7fb023c428ec6fd", + "fixture_parent_sha256": "89173122097eb113c83d73b1a94ac3208fe6c5bea790029b6d5ef5aa9a61da2d", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "paused_parent_probe": { + "attempted": 2, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 32, + 106, + 158, + 232 + ], + "minimum_px": 126, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/runner-record.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/runner-record.json new file mode 100644 index 00000000..c38796a2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#duplicateLaunchRequestsTransferOnlyOnce", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/state.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/state.json new file mode 100644 index 00000000..4c2ea72b --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "73e719c602bc378c71df83eba34440771bc8d999", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "layout": "phone", + "font": 1, + "method": "duplicateLaunchRequestsTransferOnlyOnce", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/tests.log b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/tests.log new file mode 100644 index 00000000..28d456b5 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-phone100-v4/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.244 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json new file mode 100644 index 00000000..633fa27f --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks-frame.json @@ -0,0 +1,7 @@ +{ + "phase": "child-after-queued-callbacks", + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "font_scale": 1, + "launch_epoch": 2, + "synchronization": "Compose idle; hierarchy before PNG" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml new file mode 100644 index 00000000..b5e7f3cb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/captures/handoff-duplicatelaunchrequeststransferonlyonce-child-after-queued-callbacks.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json new file mode 100644 index 00000000..6ea766f8 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/cases/handoff-duplicatelaunchrequeststransferonlyonce-record.json @@ -0,0 +1,40 @@ +{ + "scope": "Owned JavaScript\/native handoff probes; no Store, service, physical-typing or broad parity credit", + "owned_extension_id": "reviewed-text-5ca52829e421471e8209ba40dbea6abd", + "fixture_parent_sha256": "89173122097eb113c83d73b1a94ac3208fe6c5bea790029b6d5ef5aa9a61da2d", + "fixture_child_sha256": "e618f4c555f58360598d3b7488ae470025b8669b852964ed9533d3879c9dc0e4", + "fixture_manifest_sha256": "0c7b899f9ffed2d79361adb85f077ffb86074b6b957bd122dcca4a6995bd5806", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "paused_parent_probe": { + "attempted": 2, + "acks": 1, + "copiesAttempted": 1, + "copiesResolved": 0, + "statusesAttempted": 1, + "publicationsAttempted": 1, + "rejections": [] + }, + "one_transfer_before_native_composition": true, + "obsolete_host_and_chrome_callbacks_rejected": true, + "protocol_setup": "Compose frame clock paused for the logical handoff\/acknowledgement and queued-callback probes; child native rendering follows after resuming", + "pointer_taps": [ + { + "tag": "extension-back", + "bounds": [ + 398, + 243, + 470, + 315 + ], + "minimum_px": 72, + "reveal_gestures": 0 + } + ], + "launcher_query_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "clipboard_restoration_scope": "Independent host\/test-UID durable recovery; this class does not retain or publish the original clipboard" +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/runner-record.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/runner-record.json new file mode 100644 index 00000000..deb42435 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionCommandHandoffDeviceTest#duplicateLaunchRequestsTransferOnlyOnce", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 1, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/state.json b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/state.json new file mode 100644 index 00000000..253a9f3d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "73e719c602bc378c71df83eba34440771bc8d999", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "layout": "tablet", + "font": 1, + "method": "duplicateLaunchRequestsTransferOnlyOnce", + "expected_failure": false, + "collector_sha256": "7ae4796f5ce78a6adead709ab872b66c54f45cb726c817483d625a77d12beb0c", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 1 +} diff --git a/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/tests.log b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/tests.log new file mode 100644 index 00000000..f0bcf2a4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/protocol-duplicate-tablet100-v4/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionCommandHandoffDeviceTest: +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionCommandHandoffDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=duplicateLaunchRequestsTransferOnlyOnce +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 7.805 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json new file mode 100644 index 00000000..fc977ebd --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json @@ -0,0 +1,97 @@ +{ + "scope": "Owned React Markdown\/metadata through the real runtime and native UI; not Store or service certification", + "clipboard-before-owned-sentinel": { + "observations": [ + "22ms query_ms=17 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "142ms query_ms=64 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "209ms query_ms=6 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "308ms query_ms=42 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "369ms query_ms=10 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "423ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "496ms query_ms=22 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "551ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "607ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "663ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "721ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "777ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]" + ], + "actions": [] + }, + "clipboard-owned-sentinel": { + "observations": [ + "183ms query_ms=181 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "242ms query_ms=7 mode=0 flags=65618 windows=[(7540, 3), (7536, 3)] systemui_roots=[7540] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=false actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "319ms query_ms=12 mode=0 flags=65618 windows=[(7540, 3), (7536, 3)] systemui_roots=[7536] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=false actions=1 nodes=[]", + "374ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "430ms query_ms=6 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "485ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "540ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "597ms query_ms=6 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "651ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "712ms query_ms=8 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "767ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]" + ], + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ] + }, + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "list", + "fixture_command_sha256": "7682a7e605e5da169bc4809047f490da7f87b3ebb30b4378b74ded04302dc790", + "fixture_manifest_sha256": "f8f5c5f83969cb94f57edd76779ac5ad976d465f06acdb607befefac885d10e6", + "owned_extension_id": "reviewed-text-d595a125f04a435f8a99a900a7fa334c", + "owned_png_sha256": "9d6eb0bb52ca2b690f4d60646c909d3f54e18e7ce4ea7181a774c898e56ef5f0", + "owned_svg_sha256": "3995c224db43ff143e50bf2b81db937d947678d54a7650a5e02b7c86c4301489", + "publication_witnesses": [ + { + "phase": "initial", + "counter": 0, + "root_id": "31", + "root_type": "List", + "composed_marker_text": "Detail publication 0", + "semantics_id": 131 + } + ], + "axis_aware_scrolls": [], + "list_search_actual_ime_open": true, + "primary_ime_geometry": { + "bottom": 1326, + "visible_frame_bottom": 1374 + }, + "ime_toggle_contract_started": true, + "last_native_text_wait": "Owned value beta A", + "clipboard-exact-copy": { + "observations": [ + "108ms query_ms=93 mode=0 flags=65618 windows=[(7541, 3), (7536, 3)] systemui_roots=[7541] queries=10 roots=1 children=9 walked=8 prefetch=36 complete=false require_action=false actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "217ms query_ms=13 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "272ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "326ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "382ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "437ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "494ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "548ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "604ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "661ms query_ms=6 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "716ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "773ms query_ms=3 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]" + ], + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ] + }, + "exact_copy": "Owned exact copy beta café é 日本 🌱", + "query_selection_and_caller_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "image_history_process_property_restored": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json new file mode 100644 index 00000000..97e6b751 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json @@ -0,0 +1,103 @@ +{ + "scope": "Owned React Markdown\/metadata through the real runtime and native UI; not Store or service certification", + "clipboard-before-owned-sentinel": { + "observations": [ + "10ms query_ms=9 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "65ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "123ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "196ms query_ms=16 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "255ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "310ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "367ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "422ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "478ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "536ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "594ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "652ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "709ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "774ms query_ms=6 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]" + ], + "actions": [] + }, + "clipboard-owned-sentinel": { + "observations": [ + "193ms query_ms=193 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "263ms query_ms=14 mode=0 flags=65618 windows=[(7545, 3), (7536, 3)] systemui_roots=[7545] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=false actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "327ms query_ms=9 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "383ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "438ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "495ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "554ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "611ms query_ms=7 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "666ms query_ms=4 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "721ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "783ms query_ms=5 mode=0 flags=65618 windows=[(7536, 3)] systemui_roots=[7536] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]" + ], + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ] + }, + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "detail", + "fixture_command_sha256": "ff7e24a4c563b94aa4a73404d9bc89c80cb81afe37e89c76e19df55507f84082", + "fixture_manifest_sha256": "f8f5c5f83969cb94f57edd76779ac5ad976d465f06acdb607befefac885d10e6", + "owned_extension_id": "reviewed-text-5d948b794f404586a9d603e452809351", + "owned_png_sha256": "9d6eb0bb52ca2b690f4d60646c909d3f54e18e7ce4ea7181a774c898e56ef5f0", + "owned_svg_sha256": "3995c224db43ff143e50bf2b81db937d947678d54a7650a5e02b7c86c4301489", + "publication_witnesses": [ + { + "phase": "initial", + "counter": 0, + "root_id": "13", + "root_type": "Detail", + "composed_marker_text": "Detail publication 0", + "semantics_id": 325 + }, + { + "phase": "recreated", + "counter": 0, + "root_id": "13", + "root_type": "Detail", + "composed_marker_text": "Detail publication 0", + "semantics_id": 410 + }, + { + "phase": "fresh-owner-activation", + "counter": 1, + "root_id": "13", + "root_type": "Detail", + "composed_marker_text": "Detail publication 1", + "semantics_id": 410 + } + ], + "last_native_text_wait": "Owned tag standalone", + "axis_aware_scrolls": [], + "queued_callbacks": [ + { + "phase": "activity-recreation", + "before": { + "revision": 0, + "tagCalls": 0, + "selected": null, + "unexpectedLink": false + }, + "after": { + "revision": 0, + "tagCalls": 0, + "selected": null, + "unexpectedLink": false + }, + "dispatch_rejected": true + } + ], + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "image_history_process_property_restored": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/runner-record.json new file mode 100644 index 00000000..afb82059 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionDetailDeviceTest#listTouchDetailPreservesQuerySelectionExactCopyAndCaller,dev.tinycast.android.ExtensionDetailDeviceTest#recreationStartsAnewOwnerAndRejectsThePriorNativeCallback", + "expected": 2, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 2, + "tests_completed": true, + "owned_extension_count": 2, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/state.json b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/state.json new file mode 100644 index 00000000..5f4f50b4 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "detail", + "expected_failure": false, + "collector_sha256": "2d89e0751c303383fdf31125799778f4f8c39865f23ebf814faca51bc19d4c9e", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 2, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 2 +} diff --git a/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/tests.log b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/tests.log new file mode 100644 index 00000000..9c442c84 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-phone100-v2/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionDetailDeviceTest: +INSTRUMENTATION_STATUS: test=listTouchDetailPreservesQuerySelectionExactCopyAndCaller +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=listTouchDetailPreservesQuerySelectionExactCopyAndCaller +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=recreationStartsAnewOwnerAndRejectsThePriorNativeCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=recreationStartsAnewOwnerAndRejectsThePriorNativeCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 14.773 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json new file mode 100644 index 00000000..1530407c --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-listtouchdetailpreservesqueryselectionexactcopyandcaller-record.json @@ -0,0 +1,93 @@ +{ + "scope": "Owned React Markdown\/metadata through the real runtime and native UI; not Store or service certification", + "clipboard-before-owned-sentinel": { + "observations": [ + "32ms query_ms=28 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "102ms query_ms=18 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "177ms query_ms=25 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "250ms query_ms=23 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "306ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "369ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "433ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "494ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "550ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "606ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "665ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "730ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "790ms query_ms=8 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]" + ], + "actions": [] + }, + "clipboard-owned-sentinel": { + "observations": [ + "258ms query_ms=257 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "315ms query_ms=6 mode=0 flags=65618 windows=[(7458, 3), (7453, 3)] systemui_roots=[7458] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=false actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "414ms query_ms=20 mode=0 flags=65618 windows=[(7458, 3), (7453, 3)] systemui_roots=[7453] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=false actions=1 nodes=[]", + "471ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "527ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "586ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "642ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "701ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "767ms query_ms=16 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]" + ], + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ] + }, + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "list", + "fixture_command_sha256": "7682a7e605e5da169bc4809047f490da7f87b3ebb30b4378b74ded04302dc790", + "fixture_manifest_sha256": "f8f5c5f83969cb94f57edd76779ac5ad976d465f06acdb607befefac885d10e6", + "owned_extension_id": "reviewed-text-59c5bb74c0c34dc1940d0f4e9eecb74c", + "owned_png_sha256": "9d6eb0bb52ca2b690f4d60646c909d3f54e18e7ce4ea7181a774c898e56ef5f0", + "owned_svg_sha256": "3995c224db43ff143e50bf2b81db937d947678d54a7650a5e02b7c86c4301489", + "publication_witnesses": [ + { + "phase": "initial", + "counter": 0, + "root_id": "31", + "root_type": "List", + "composed_marker_text": "Detail publication 0", + "semantics_id": 143 + } + ], + "axis_aware_scrolls": [], + "list_search_actual_ime_open": true, + "primary_ime_geometry": { + "bottom": 624, + "visible_frame_bottom": 648 + }, + "ime_toggle_contract_started": true, + "last_native_text_wait": "Owned value beta A", + "clipboard-exact-copy": { + "observations": [ + "319ms query_ms=317 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "497ms query_ms=127 mode=0 flags=65618 windows=[(7459, 3), (7453, 3)] systemui_roots=[7459] queries=10 roots=1 children=9 walked=8 prefetch=36 complete=false require_action=false actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "668ms query_ms=65 mode=0 flags=65618 windows=[(7459, 3), (7453, 3)] systemui_roots=[7453] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=false actions=1 nodes=[]", + "728ms query_ms=8 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "785ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "840ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "896ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "952ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "1008ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]" + ], + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ] + }, + "exact_copy": "Owned exact copy beta café é 日本 🌱", + "query_selection_and_caller_preserved": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "image_history_process_property_restored": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json new file mode 100644 index 00000000..989f3ed7 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/cases/detail-recreationstartsanewownerandrejectsthepriornativecallback-record.json @@ -0,0 +1,101 @@ +{ + "scope": "Owned React Markdown\/metadata through the real runtime and native UI; not Store or service certification", + "clipboard-before-owned-sentinel": { + "observations": [ + "35ms query_ms=16 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "118ms query_ms=15 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "182ms query_ms=13 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "256ms query_ms=22 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "332ms query_ms=19 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "403ms query_ms=14 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "460ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "515ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "578ms query_ms=7 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "634ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "690ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "745ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "802ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]" + ], + "actions": [] + }, + "clipboard-owned-sentinel": { + "observations": [ + "246ms query_ms=241 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "355ms query_ms=44 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=0 nodes=[]", + "451ms query_ms=20 mode=0 flags=65618 windows=[(7463, 3), (7453, 3)] systemui_roots=[7463] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=false actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "576ms query_ms=42 mode=0 flags=65618 windows=[(7463, 3), (7453, 3)] systemui_roots=[7453] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=false actions=1 nodes=[]", + "631ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "687ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "742ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "797ms query_ms=4 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "855ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]", + "913ms query_ms=5 mode=0 flags=65618 windows=[(7453, 3)] systemui_roots=[7453] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=false actions=1 nodes=[]" + ], + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ] + }, + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "detail", + "fixture_command_sha256": "ff7e24a4c563b94aa4a73404d9bc89c80cb81afe37e89c76e19df55507f84082", + "fixture_manifest_sha256": "f8f5c5f83969cb94f57edd76779ac5ad976d465f06acdb607befefac885d10e6", + "owned_extension_id": "reviewed-text-35569edc7a284697af9be8be604bd4c2", + "owned_png_sha256": "9d6eb0bb52ca2b690f4d60646c909d3f54e18e7ce4ea7181a774c898e56ef5f0", + "owned_svg_sha256": "3995c224db43ff143e50bf2b81db937d947678d54a7650a5e02b7c86c4301489", + "publication_witnesses": [ + { + "phase": "initial", + "counter": 0, + "root_id": "13", + "root_type": "Detail", + "composed_marker_text": "Detail publication 0", + "semantics_id": 358 + }, + { + "phase": "recreated", + "counter": 0, + "root_id": "13", + "root_type": "Detail", + "composed_marker_text": "Detail publication 0", + "semantics_id": 447 + }, + { + "phase": "fresh-owner-activation", + "counter": 1, + "root_id": "13", + "root_type": "Detail", + "composed_marker_text": "Detail publication 1", + "semantics_id": 447 + } + ], + "last_native_text_wait": "Owned tag standalone", + "axis_aware_scrolls": [], + "queued_callbacks": [ + { + "phase": "activity-recreation", + "before": { + "revision": 0, + "tagCalls": 0, + "selected": null, + "unexpectedLink": false + }, + "after": { + "revision": 0, + "tagCalls": 0, + "selected": null, + "unexpectedLink": false + }, + "dispatch_rejected": true + } + ], + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true, + "image_history_process_property_restored": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/runner-record.json new file mode 100644 index 00000000..906e26b2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionDetailDeviceTest#listTouchDetailPreservesQuerySelectionExactCopyAndCaller,dev.tinycast.android.ExtensionDetailDeviceTest#recreationStartsAnewOwnerAndRejectsThePriorNativeCallback", + "expected": 2, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 2, + "tests_completed": true, + "owned_extension_count": 2, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/state.json new file mode 100644 index 00000000..9a988137 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "detail", + "expected_failure": false, + "collector_sha256": "2d89e0751c303383fdf31125799778f4f8c39865f23ebf814faca51bc19d4c9e", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 2, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 2 +} diff --git a/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/tests.log new file mode 100644 index 00000000..91b65ecb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-detail-tablet100-v2/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionDetailDeviceTest: +INSTRUMENTATION_STATUS: test=listTouchDetailPreservesQuerySelectionExactCopyAndCaller +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=listTouchDetailPreservesQuerySelectionExactCopyAndCaller +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=recreationStartsAnewOwnerAndRejectsThePriorNativeCallback +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionDetailDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=recreationStartsAnewOwnerAndRejectsThePriorNativeCallback +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 16.685 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json new file mode 100644 index 00000000..aa58f974 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json @@ -0,0 +1,691 @@ +{ + "scope": "Owned React Form through the real runtime and Android controls; not Store\/service certification", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "window_soft_input_mode": 16, + "window_soft_input_state": 0, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "configuration", + "fixture_command_sha256": "e08bae2f6447a8b88fbf631a2e5e6dabb9b546fff529839fd5ed450f419667d0", + "fixture_manifest_sha256": "ff2d7e3a9e7cd92c0afc8bd1b3bc30081085347d57852267be44529ae5e89c6d", + "owned_extension_id": "reviewed-text-9f73615386124d68ba12113192b26f5b", + "settled_ime_geometry": [ + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 2277 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 1, + 966, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 1374 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": false, + "window_scope": "activity", + "native_frames": 8, + "geometry": [ + 0, + 0, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 2277 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 8, + "geometry": [ + 0, + 0, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 2277 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 1, + 966, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 1374 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 8, + "geometry": [ + 1, + 966, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 1374 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 1, + 966, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 1374 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 2277 + ], + "stable_for_at_least_ms": 100, + "settled": true + } + ], + "viewport_reveal_gestures": [], + "pointer_taps": [ + { + "tag": "preference-secret", + "viewport": "extension-configuration", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 85, + 963, + 995, + 1110 + ], + "control_size": [ + 910, + 147 + ], + "point": [ + 540, + 1036.5 + ] + }, + { + "tag": "run-extension-setup", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 85, + 1163, + 995, + 1289 + ], + "control_size": [ + 910, + 126 + ], + "point": [ + 540, + 1226 + ] + }, + { + "tag": "extension-back", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 32, + 106, + 158, + 232 + ], + "control_size": [ + 126, + 126 + ], + "point": [ + 95, + 169 + ] + }, + { + "tag": "preference-choice-layout", + "viewport": "extension-configuration", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 85, + 984, + 995, + 1110 + ], + "control_size": [ + 910, + 126 + ], + "point": [ + 540, + 1047 + ] + }, + { + "tag": "run-extension-setup", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 85, + 1163, + 995, + 1289 + ], + "control_size": [ + 910, + 126 + ], + "point": [ + 540, + 1226 + ] + }, + { + "tag": "extension-back", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 32, + 106, + 158, + 232 + ], + "control_size": [ + 126, + 126 + ], + "point": [ + 95, + 169 + ] + } + ], + "hidden_ime_window_absence_confirmed": true, + "password_editor_metadata": [ + { + "tag": "preference-secret", + "input_type": 129, + "ime_options": 33554438, + "scope": "Actual focused editor InputConnection metadata before any password is entered" + } + ], + "pointer_scrolls": [ + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 32, + 246, + 1048, + 1110 + ], + "start": [ + 21, + 432 + ], + "end": [ + 21, + 648 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 32, + 246, + 1048, + 1110 + ], + "start": [ + 21, + 432 + ], + "end": [ + 21, + 648 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 32, + 246, + 1048, + 1110 + ], + "start": [ + 21, + 432 + ], + "end": [ + 21, + 648 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 32, + 246, + 1048, + 1110 + ], + "start": [ + 21, + 432 + ], + "end": [ + 21, + 216 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 32, + 246, + 1048, + 1110 + ], + "start": [ + 21, + 432 + ], + "end": [ + 21, + 216 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 32, + 246, + 1048, + 1110 + ], + "start": [ + 21, + 432 + ], + "end": [ + 21, + 216 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 32, + 246, + 1048, + 1110 + ], + "start": [ + 21, + 432 + ], + "end": [ + 21, + 216 + ] + } + ], + "configuration-required_line_probe": { + "ime_visible": false, + "line_counts": [ + 1, + 1, + 1, + 1, + 2, + 1 + ], + "all_lines_reached": true, + "pointer_steps": [ + { + "viewport": [ + 32, + 246, + 1048, + 1110 + ], + "text_0": [ + 85, + 299, + 995, + 352 + ], + "text_0_lines_seen": 1, + "text_1": [ + 85, + 626, + 995, + 679 + ], + "text_1_lines_seen": 1, + "text_2": [ + 85, + 531, + 995, + 584 + ], + "text_2_lines_seen": 1, + "text_3": [ + 85, + 858, + 995, + 911 + ], + "text_3_lines_seen": 1, + "text_4": [ + 85, + 927, + 995, + 1033 + ], + "text_4_lines_seen": 2, + "text_5": [ + 85, + 1809, + 917, + 1862 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 32, + 246, + 1048, + 1110 + ], + "text_0": [ + 85, + 104, + 995, + 157 + ], + "text_0_lines_seen": 1, + "text_1": [ + 85, + 431, + 995, + 484 + ], + "text_1_lines_seen": 1, + "text_2": [ + 85, + 336, + 995, + 389 + ], + "text_2_lines_seen": 1, + "text_3": [ + 85, + 663, + 995, + 716 + ], + "text_3_lines_seen": 1, + "text_4": [ + 85, + 732, + 995, + 838 + ], + "text_4_lines_seen": 2, + "text_5": [ + 85, + 1614, + 917, + 1667 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 32, + 246, + 1048, + 1110 + ], + "text_0": [ + 85, + -91, + 995, + -38 + ], + "text_0_lines_seen": 1, + "text_1": [ + 85, + 236, + 995, + 289 + ], + "text_1_lines_seen": 1, + "text_2": [ + 85, + 141, + 995, + 194 + ], + "text_2_lines_seen": 1, + "text_3": [ + 85, + 468, + 995, + 521 + ], + "text_3_lines_seen": 1, + "text_4": [ + 85, + 537, + 995, + 643 + ], + "text_4_lines_seen": 2, + "text_5": [ + 85, + 1419, + 917, + 1472 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 32, + 246, + 1048, + 1110 + ], + "text_0": [ + 85, + -286, + 995, + -233 + ], + "text_0_lines_seen": 1, + "text_1": [ + 85, + 41, + 995, + 94 + ], + "text_1_lines_seen": 1, + "text_2": [ + 85, + -54, + 995, + -1 + ], + "text_2_lines_seen": 1, + "text_3": [ + 85, + 273, + 995, + 326 + ], + "text_3_lines_seen": 1, + "text_4": [ + 85, + 342, + 995, + 448 + ], + "text_4_lines_seen": 2, + "text_5": [ + 85, + 1224, + 917, + 1277 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 32, + 246, + 1048, + 1110 + ], + "text_0": [ + 85, + -481, + 995, + -428 + ], + "text_0_lines_seen": 1, + "text_1": [ + 85, + -154, + 995, + -101 + ], + "text_1_lines_seen": 1, + "text_2": [ + 85, + -249, + 995, + -196 + ], + "text_2_lines_seen": 1, + "text_3": [ + 85, + 78, + 995, + 131 + ], + "text_3_lines_seen": 1, + "text_4": [ + 85, + 147, + 995, + 253 + ], + "text_4_lines_seen": 2, + "text_5": [ + 85, + 1029, + 917, + 1082 + ], + "text_5_lines_seen": 1 + } + ] + }, + "configuration_method": "Native required errors, actual argument\/preference edits, label tap and menu choice; Cancel discards, explicit Run persists and starts the exact owned values", + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json new file mode 100644 index 00000000..4b813932 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json @@ -0,0 +1,88 @@ +{ + "scope": "Owned no-view completion\/cancellation and native callback lifetime; no Store certification", + "clipboard-owned-sentinel": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 183, + "observations": [ + "100ms query_ms=99 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "168ms query_ms=17 mode=0 flags=65618 windows=[(7524, 3), (7499, 3)] systemui_roots=[7524] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "245ms query_ms=11 mode=0 flags=65618 windows=[(7524, 3), (7499, 3)] systemui_roots=[7499] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "300ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "355ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "410ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "466ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "522ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "577ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "632ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "691ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "747ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "803ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 805 + }, + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "window_soft_input_mode": 16, + "window_soft_input_state": 0, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "owned_extension_id": "reviewed-text-2edaae1c1bf94413a27f488bc599d5e2", + "fixture_pending": false, + "fixture_command_sha256": "caa437a0c2690326903b1c2a010484d12ff5b16b186a488937a0243d94f56ecc", + "fixture_manifest_sha256": "5f0791158ea7dac3bf8aebb5b286df6d3465c1dfbcfa3a0caf50367d79221f7b", + "clipboard-owned-completion": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 303, + "observations": [ + "145ms query_ms=138 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "258ms query_ms=60 mode=0 flags=65618 windows=[(7526, 3), (7499, 3)] systemui_roots=[7526] queries=10 roots=1 children=9 walked=8 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "356ms query_ms=10 mode=0 flags=65618 windows=[(7526, 3), (7499, 3)] systemui_roots=[7499] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "410ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "469ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "524ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "583ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "638ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "693ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "749ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "805ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 814 + }, + "completion_return_line_bounds": [ + [ + 485, + 1081, + 593.2857, + 1134 + ] + ], + "completion_return_visible_target": [ + 393, + 1044, + 687, + 1170 + ], + "focus_setup_touch_mode_before_tab": true, + "focus_setup_touch_mode_after_tab": false, + "focus_setup": "Instrumentation Tab enters keyboard mode, then native RequestFocus semantics; no pointer-focus claim", + "input_execution": "Instrumentation key down\/up: Enter on focused Return; Escape on fresh invocation", + "enter_and_escape_preserved_copy_query": true, + "owned_runs": 2, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json new file mode 100644 index 00000000..755574d8 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json @@ -0,0 +1,174 @@ +{ + "scope": "Owned no-view completion\/cancellation and native callback lifetime; no Store certification", + "clipboard-owned-sentinel": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 159, + "observations": [ + "98ms query_ms=98 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "152ms query_ms=3 mode=0 flags=65618 windows=[(7517, 3), (7499, 3)] systemui_roots=[7517] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "212ms query_ms=5 mode=0 flags=65618 windows=[(7517, 3), (7499, 3)] systemui_roots=[7499] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "281ms query_ms=17 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "338ms query_ms=6 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "394ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "449ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "504ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "561ms query_ms=6 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "616ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "679ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "742ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "799ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 803 + }, + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "window_soft_input_mode": 16, + "window_soft_input_state": 0, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "owned_extension_id": "reviewed-text-b868e908230540c4b508c2fa3f590d1d", + "fixture_pending": false, + "fixture_command_sha256": "caa437a0c2690326903b1c2a010484d12ff5b16b186a488937a0243d94f56ecc", + "fixture_manifest_sha256": "5f0791158ea7dac3bf8aebb5b286df6d3465c1dfbcfa3a0caf50367d79221f7b", + "clipboard-owned-completion": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 383, + "observations": [ + "176ms query_ms=174 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "343ms query_ms=116 mode=0 flags=65618 windows=[(7520, 3), (7499, 3)] systemui_roots=[7520] queries=10 roots=1 children=9 walked=8 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "446ms query_ms=11 mode=0 flags=65618 windows=[(7520, 3), (7499, 3)] systemui_roots=[7499] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "501ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "557ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "611ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "667ms query_ms=4 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "733ms query_ms=10 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "789ms query_ms=5 mode=0 flags=65618 windows=[(7499, 3)] systemui_roots=[7499] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 790 + }, + "settled_ime_geometry": [ + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 8, + "geometry": [ + 0, + 0, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 2277 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1080, + 2340, + 0, + 0, + 0, + 63, + 1080, + 2277 + ], + "stable_for_at_least_ms": 100, + "settled": true + } + ], + "pointer_taps": [ + { + "tag": "extension-back", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 475, + "visible_bounds": [ + 32, + 106, + 158, + 232 + ], + "control_size": [ + 126, + 126 + ], + "point": [ + 95, + 169 + ] + }, + { + "tag": "extension-completion-return", + "viewport": "extension-completion", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 475, + "visible_bounds": [ + 393, + 1044, + 687, + 1170 + ], + "control_size": [ + 294, + 126 + ], + "point": [ + 540, + 1107 + ] + } + ], + "viewport_reveal_gestures": [], + "completion_return_line_bounds": [ + [ + 485, + 1081, + 593.2857, + 1134 + ] + ], + "completion_return_visible_target": [ + 393, + 1044, + 687, + 1170 + ], + "queued_callback_guards": [ + "Preferences hidden", + "Preferences reopened", + "native root ABA", + "same-command replacement before disposal", + "replacement composed", + "closed before disposal", + "closed invocation replaced", + "duplicate after pointer return" + ], + "guard_observation": "Route, epoch, live owner, exact clipboard and owned invocation counter; callback Boolean is not an execution receipt", + "owned_runs": 3, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json new file mode 100644 index 00000000..d8c8363d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json @@ -0,0 +1,18 @@ +{ + "scope": "Owned React Form through the real runtime and Android controls; not Store\/service certification", + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "window_soft_input_mode": 16, + "window_soft_input_state": 0, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "configuration", + "fixture_command_sha256": "e08bae2f6447a8b88fbf631a2e5e6dabb9b546fff529839fd5ed450f419667d0", + "fixture_manifest_sha256": "ff2d7e3a9e7cd92c0afc8bd1b3bc30081085347d57852267be44529ae5e89c6d", + "owned_extension_id": "reviewed-text-743dc0faf548448d85821440ce98080e", + "controlled_native_transition": "Changed launch epoch before queued native edit, Run and Back; restored before a Compose frame", + "queued_edits_run_back_rejected": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/runner-record.json new file mode 100644 index 00000000..92537702 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionFormDeviceTest#nativeConfigurationEditsValidateCancelAndRun,dev.tinycast.android.ExtensionFormDeviceTest#replacedConfigurationRejectsQueuedEditsRunAndBack,dev.tinycast.android.ExtensionFormDeviceTest#ownedNoViewReturnRejectsDisposedAndReplacedCallbacks,dev.tinycast.android.ExtensionFormDeviceTest#ownedNoViewReturnAcceptsFocusedEnterAndPreservesEscape", + "expected": 4, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 4, + "tests_completed": true, + "owned_extension_count": 4, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/state.json b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/state.json new file mode 100644 index 00000000..5c35890e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "forms", + "expected_failure": false, + "collector_sha256": "2d89e0751c303383fdf31125799778f4f8c39865f23ebf814faca51bc19d4c9e", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 4, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 4 +} diff --git a/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/tests.log b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/tests.log new file mode 100644 index 00000000..4bf0cc5e --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-phone100-v2/tests.log @@ -0,0 +1,65 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionFormDeviceTest: +INSTRUMENTATION_STATUS: test=nativeConfigurationEditsValidateCancelAndRun +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=nativeConfigurationEditsValidateCancelAndRun +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=replacedConfigurationRejectsQueuedEditsRunAndBack +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=replacedConfigurationRejectsQueuedEditsRunAndBack +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=ownedNoViewReturnRejectsDisposedAndReplacedCallbacks +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=ownedNoViewReturnRejectsDisposedAndReplacedCallbacks +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=ownedNoViewReturnAcceptsFocusedEnterAndPreservesEscape +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=ownedNoViewReturnAcceptsFocusedEnterAndPreservesEscape +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 29.537 + +OK (4 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json new file mode 100644 index 00000000..84ea2e03 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-nativeconfigurationeditsvalidatecancelandrun-record.json @@ -0,0 +1,691 @@ +{ + "scope": "Owned React Form through the real runtime and Android controls; not Store\/service certification", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "window_soft_input_mode": 19, + "window_soft_input_state": 3, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "configuration", + "fixture_command_sha256": "e08bae2f6447a8b88fbf631a2e5e6dabb9b546fff529839fd5ed450f419667d0", + "fixture_manifest_sha256": "ff2d7e3a9e7cd92c0afc8bd1b3bc30081085347d57852267be44529ae5e89c6d", + "owned_extension_id": "reviewed-text-b2ab32375607408f883528ad47bcc9ca", + "settled_ime_geometry": [ + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 1152 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 8, + "geometry": [ + 1, + 552, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 648 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": false, + "window_scope": "activity", + "native_frames": 4, + "geometry": [ + 0, + 0, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 1152 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 1152 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 8, + "geometry": [ + 1, + 552, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 648 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 6, + "geometry": [ + 1, + 552, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 648 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 1, + 552, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 648 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 1152 + ], + "stable_for_at_least_ms": 100, + "settled": true + } + ], + "viewport_reveal_gestures": [], + "pointer_taps": [ + { + "tag": "preference-secret", + "viewport": "extension-configuration", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 428, + 725, + 1493, + 809 + ], + "control_size": [ + 1065, + 84 + ], + "point": [ + 960.5, + 767 + ] + }, + { + "tag": "run-extension-setup", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 428, + 848, + 1493, + 920 + ], + "control_size": [ + 1065, + 72 + ], + "point": [ + 960.5, + 884 + ] + }, + { + "tag": "extension-back", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 398, + 243, + 470, + 315 + ], + "control_size": [ + 72, + 72 + ], + "point": [ + 434, + 279 + ] + }, + { + "tag": "preference-choice-layout", + "viewport": "extension-configuration", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 428, + 426, + 1493, + 498 + ], + "control_size": [ + 1065, + 72 + ], + "point": [ + 960.5, + 462 + ] + }, + { + "tag": "run-extension-setup", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 428, + 528, + 1493, + 600 + ], + "control_size": [ + 1065, + 72 + ], + "point": [ + 960.5, + 564 + ] + }, + { + "tag": "extension-back", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 1, + "visible_bounds": [ + 398, + 243, + 470, + 315 + ], + "control_size": [ + 72, + 72 + ], + "point": [ + 434, + 279 + ] + } + ], + "hidden_ime_window_absence_confirmed": true, + "password_editor_metadata": [ + { + "tag": "preference-secret", + "input_type": 129, + "ime_options": 33554438, + "scope": "Actual focused editor InputConnection metadata before any password is entered" + } + ], + "pointer_scrolls": [ + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 398, + 323, + 1523, + 818 + ], + "start": [ + 12, + 247.5 + ], + "end": [ + 12, + 371.25 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 398, + 323, + 1523, + 818 + ], + "start": [ + 12, + 247.5 + ], + "end": [ + 12, + 371.25 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 398, + 323, + 1523, + 818 + ], + "start": [ + 12, + 247.5 + ], + "end": [ + 12, + 371.25 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 398, + 323, + 1523, + 818 + ], + "start": [ + 12, + 247.5 + ], + "end": [ + 12, + 123.75 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 398, + 323, + 1523, + 818 + ], + "start": [ + 12, + 247.5 + ], + "end": [ + 12, + 123.75 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 398, + 323, + 1523, + 818 + ], + "start": [ + 12, + 247.5 + ], + "end": [ + 12, + 123.75 + ] + }, + { + "viewport": "extension-configuration", + "gutter": true, + "visible_bounds": [ + 398, + 323, + 1523, + 818 + ], + "start": [ + 12, + 247.5 + ], + "end": [ + 12, + 123.75 + ] + } + ], + "configuration-required_line_probe": { + "ime_visible": false, + "line_counts": [ + 1, + 1, + 1, + 1, + 1, + 1 + ], + "all_lines_reached": true, + "pointer_steps": [ + { + "viewport": [ + 398, + 323, + 1523, + 818 + ], + "text_0": [ + 428, + 353, + 1493, + 383 + ], + "text_0_lines_seen": 1, + "text_1": [ + 428, + 539, + 1493, + 569 + ], + "text_1_lines_seen": 1, + "text_2": [ + 428, + 485, + 1493, + 515 + ], + "text_2_lines_seen": 1, + "text_3": [ + 428, + 671, + 1493, + 701 + ], + "text_3_lines_seen": 1, + "text_4": [ + 428, + 710, + 1493, + 740 + ], + "text_4_lines_seen": 1, + "text_5": [ + 428, + 1181, + 894, + 1211 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 398, + 323, + 1523, + 818 + ], + "text_0": [ + 428, + 241, + 1493, + 271 + ], + "text_0_lines_seen": 1, + "text_1": [ + 428, + 427, + 1493, + 457 + ], + "text_1_lines_seen": 1, + "text_2": [ + 428, + 373, + 1493, + 403 + ], + "text_2_lines_seen": 1, + "text_3": [ + 428, + 559, + 1493, + 589 + ], + "text_3_lines_seen": 1, + "text_4": [ + 428, + 598, + 1493, + 628 + ], + "text_4_lines_seen": 1, + "text_5": [ + 428, + 1069, + 894, + 1099 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 398, + 323, + 1523, + 818 + ], + "text_0": [ + 428, + 129, + 1493, + 159 + ], + "text_0_lines_seen": 1, + "text_1": [ + 428, + 315, + 1493, + 345 + ], + "text_1_lines_seen": 1, + "text_2": [ + 428, + 261, + 1493, + 291 + ], + "text_2_lines_seen": 1, + "text_3": [ + 428, + 447, + 1493, + 477 + ], + "text_3_lines_seen": 1, + "text_4": [ + 428, + 486, + 1493, + 516 + ], + "text_4_lines_seen": 1, + "text_5": [ + 428, + 957, + 894, + 987 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 398, + 323, + 1523, + 818 + ], + "text_0": [ + 428, + 18, + 1493, + 48 + ], + "text_0_lines_seen": 1, + "text_1": [ + 428, + 204, + 1493, + 234 + ], + "text_1_lines_seen": 1, + "text_2": [ + 428, + 150, + 1493, + 180 + ], + "text_2_lines_seen": 1, + "text_3": [ + 428, + 336, + 1493, + 366 + ], + "text_3_lines_seen": 1, + "text_4": [ + 428, + 375, + 1493, + 405 + ], + "text_4_lines_seen": 1, + "text_5": [ + 428, + 846, + 894, + 876 + ], + "text_5_lines_seen": 0 + }, + { + "viewport": [ + 398, + 323, + 1523, + 818 + ], + "text_0": [ + 428, + -70, + 1493, + -40 + ], + "text_0_lines_seen": 1, + "text_1": [ + 428, + 116, + 1493, + 146 + ], + "text_1_lines_seen": 1, + "text_2": [ + 428, + 62, + 1493, + 92 + ], + "text_2_lines_seen": 1, + "text_3": [ + 428, + 248, + 1493, + 278 + ], + "text_3_lines_seen": 1, + "text_4": [ + 428, + 287, + 1493, + 317 + ], + "text_4_lines_seen": 1, + "text_5": [ + 428, + 758, + 894, + 788 + ], + "text_5_lines_seen": 1 + } + ] + }, + "configuration_method": "Native required errors, actual argument\/preference edits, label tap and menu choice; Cancel discards, explicit Run persists and starts the exact owned values", + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json new file mode 100644 index 00000000..0d12fe08 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnacceptsfocusedenterandpreservesescape-record.json @@ -0,0 +1,82 @@ +{ + "scope": "Owned no-view completion\/cancellation and native callback lifetime; no Store certification", + "clipboard-owned-sentinel": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 460, + "observations": [ + "363ms query_ms=362 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "448ms query_ms=29 mode=0 flags=65618 windows=[(7442, 3), (7417, 3)] systemui_roots=[7442] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "532ms query_ms=21 mode=0 flags=65618 windows=[(7442, 3), (7417, 3)] systemui_roots=[7417] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "625ms query_ms=27 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "681ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "737ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "793ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "848ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "902ms query_ms=3 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 903 + }, + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "window_soft_input_mode": 19, + "window_soft_input_state": 3, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "owned_extension_id": "reviewed-text-ac946069b0424486b5cd58d0b15fcb3b", + "fixture_pending": false, + "fixture_command_sha256": "caa437a0c2690326903b1c2a010484d12ff5b16b186a488937a0243d94f56ecc", + "fixture_manifest_sha256": "5f0791158ea7dac3bf8aebb5b286df6d3465c1dfbcfa3a0caf50367d79221f7b", + "clipboard-owned-completion": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 498, + "observations": [ + "123ms query_ms=122 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "402ms query_ms=212 mode=0 flags=65618 windows=[(7444, 3), (7417, 3)] systemui_roots=[7444] queries=10 roots=1 children=9 walked=8 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "621ms query_ms=54 mode=0 flags=65618 windows=[(7444, 3), (7417, 3)] systemui_roots=[7417] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "677ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "734ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "789ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "845ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "900ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "957ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 959 + }, + "completion_return_line_bounds": [ + [ + 929, + 801, + 991.75, + 831 + ] + ], + "completion_return_visible_target": [ + 877, + 780, + 1045, + 852 + ], + "focus_setup_touch_mode_before_tab": true, + "focus_setup_touch_mode_after_tab": false, + "focus_setup": "Instrumentation Tab enters keyboard mode, then native RequestFocus semantics; no pointer-focus claim", + "input_execution": "Instrumentation key down\/up: Enter on focused Return; Escape on fresh invocation", + "enter_and_escape_preserved_copy_query": true, + "owned_runs": 2, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json new file mode 100644 index 00000000..e3d45dc2 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-ownednoviewreturnrejectsdisposedandreplacedcallbacks-record.json @@ -0,0 +1,170 @@ +{ + "scope": "Owned no-view completion\/cancellation and native callback lifetime; no Store certification", + "clipboard-owned-sentinel": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 320, + "observations": [ + "241ms query_ms=241 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "316ms query_ms=15 mode=0 flags=65618 windows=[(7435, 3), (7417, 3)] systemui_roots=[7435] queries=9 roots=1 children=8 walked=7 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/minimized_preview visible=true enabled=true clickable=true, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "415ms query_ms=45 mode=0 flags=65618 windows=[(7435, 3), (7417, 3)] systemui_roots=[7417] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "483ms query_ms=16 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "538ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "594ms query_ms=5 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "649ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "704ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "761ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 763 + }, + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "window_soft_input_mode": 19, + "window_soft_input_state": 3, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "owned_extension_id": "reviewed-text-4cf226bf07a4453fad0f26205a68be15", + "fixture_pending": false, + "fixture_command_sha256": "caa437a0c2690326903b1c2a010484d12ff5b16b186a488937a0243d94f56ecc", + "fixture_manifest_sha256": "5f0791158ea7dac3bf8aebb5b286df6d3465c1dfbcfa3a0caf50367d79221f7b", + "clipboard-owned-completion": { + "fixture_ready": true, + "actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "readiness_protocol": "Same bounded discovery\/action\/absence path; no preceding UiDevice idle query", + "fixture_wait_ms": 550, + "observations": [ + "276ms query_ms=254 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=0 nodes=[]", + "494ms query_ms=154 mode=0 flags=65618 windows=[(7438, 3), (7417, 3)] systemui_roots=[7438] queries=10 roots=1 children=9 walked=8 prefetch=36 complete=false require_action=true actions=0 nodes=[com.android.systemui:id\/clipboard_ui visible=true enabled=true clickable=false, com.android.systemui:id\/dismiss_button visible=true enabled=true clickable=true]", + "633ms query_ms=33 mode=0 flags=65618 windows=[(7438, 3), (7417, 3)] systemui_roots=[7417] queries=30 roots=2 children=28 walked=29 prefetch=36 complete=false require_action=true actions=1 nodes=[]", + "695ms query_ms=12 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "750ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "804ms query_ms=3 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "860ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "916ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]", + "971ms query_ms=4 mode=0 flags=65618 windows=[(7417, 3)] systemui_roots=[7417] queries=29 roots=1 children=28 walked=29 prefetch=36 complete=true require_action=true actions=1 nodes=[]" + ], + "cleanup_elapsed_ms": 973 + }, + "settled_ime_geometry": [ + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 1152 + ], + "stable_for_at_least_ms": 100, + "settled": true + }, + { + "requested_visibility": null, + "window_scope": "activity", + "native_frames": 7, + "geometry": [ + 0, + 0, + 1920, + 1200, + 0, + 0, + 0, + 36, + 1920, + 1152 + ], + "stable_for_at_least_ms": 100, + "settled": true + } + ], + "pointer_taps": [ + { + "tag": "extension-back", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 507, + "visible_bounds": [ + 398, + 243, + 470, + 315 + ], + "control_size": [ + 72, + 72 + ], + "point": [ + 434, + 279 + ] + }, + { + "tag": "extension-completion-return", + "viewport": "extension-completion", + "injection_owner": "Compose root containing the exact target tag", + "owner_root_semantics_id": 507, + "visible_bounds": [ + 877, + 780, + 1045, + 852 + ], + "control_size": [ + 168, + 72 + ], + "point": [ + 961, + 816 + ] + } + ], + "viewport_reveal_gestures": [], + "completion_return_line_bounds": [ + [ + 929, + 801, + 991.75, + 831 + ] + ], + "completion_return_visible_target": [ + 877, + 780, + 1045, + 852 + ], + "queued_callback_guards": [ + "Preferences hidden", + "Preferences reopened", + "native root ABA", + "same-command replacement before disposal", + "replacement composed", + "closed before disposal", + "closed invocation replaced", + "duplicate after pointer return" + ], + "guard_observation": "Route, epoch, live owner, exact clipboard and owned invocation counter; callback Boolean is not an execution receipt", + "owned_runs": 3, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json new file mode 100644 index 00000000..31752c5d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/cases/form-replacedconfigurationrejectsqueuededitsrunandback-record.json @@ -0,0 +1,18 @@ +{ + "scope": "Owned React Form through the real runtime and Android controls; not Store\/service certification", + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "window_soft_input_mode": 19, + "window_soft_input_state": 3, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "fixture_mode": "configuration", + "fixture_command_sha256": "e08bae2f6447a8b88fbf631a2e5e6dabb9b546fff529839fd5ed450f419667d0", + "fixture_manifest_sha256": "ff2d7e3a9e7cd92c0afc8bd1b3bc30081085347d57852267be44529ae5e89c6d", + "owned_extension_id": "reviewed-text-f0803b94a93147b683774a3523c29670", + "controlled_native_transition": "Changed launch epoch before queued native edit, Run and Back; restored before a Compose frame", + "queued_edits_run_back_rejected": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/runner-record.json new file mode 100644 index 00000000..174d3832 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ExtensionFormDeviceTest#nativeConfigurationEditsValidateCancelAndRun,dev.tinycast.android.ExtensionFormDeviceTest#replacedConfigurationRejectsQueuedEditsRunAndBack,dev.tinycast.android.ExtensionFormDeviceTest#ownedNoViewReturnRejectsDisposedAndReplacedCallbacks,dev.tinycast.android.ExtensionFormDeviceTest#ownedNoViewReturnAcceptsFocusedEnterAndPreservesEscape", + "expected": 4, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 4, + "tests_completed": true, + "owned_extension_count": 4, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/state.json new file mode 100644 index 00000000..f5a356bf --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "forms", + "expected_failure": false, + "collector_sha256": "2d89e0751c303383fdf31125799778f4f8c39865f23ebf814faca51bc19d4c9e", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 4, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 4 +} diff --git a/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/tests.log new file mode 100644 index 00000000..bd064b3d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-forms-tablet100-v2/tests.log @@ -0,0 +1,65 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ExtensionFormDeviceTest: +INSTRUMENTATION_STATUS: test=nativeConfigurationEditsValidateCancelAndRun +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=nativeConfigurationEditsValidateCancelAndRun +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=replacedConfigurationRejectsQueuedEditsRunAndBack +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=replacedConfigurationRejectsQueuedEditsRunAndBack +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=ownedNoViewReturnRejectsDisposedAndReplacedCallbacks +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=3 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=ownedNoViewReturnRejectsDisposedAndReplacedCallbacks +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=ownedNoViewReturnAcceptsFocusedEnterAndPreservesEscape +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ExtensionFormDeviceTest +INSTRUMENTATION_STATUS: current=4 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=4 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=ownedNoViewReturnAcceptsFocusedEnterAndPreservesEscape +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 35.677 + +OK (4 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/runner-record.json new file mode 100644 index 00000000..0e450545 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/runner-record.json @@ -0,0 +1,94 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReadinessRegressionDeviceTest#rapidExtensionListDownThenEnterRunsTheCurrentAction", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 0, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "legacy-fixtures-completed": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/state.json b/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/state.json new file mode 100644 index 00000000..4d0f8c22 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/state.json @@ -0,0 +1,23 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "menus", + "collector_sha256": "2e35e2349b8868c1b559087e7d96850bafbd6b36914592346ef87c8d0aeba3b7", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 21, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_completed": true, + "preservation_owner_released": true, + "original_evidence_restored": true +} diff --git a/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/tests.log b/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/tests.log new file mode 100644 index 00000000..abc9ae9d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-menus-phone100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReadinessRegressionDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReadinessRegressionDeviceTest: +INSTRUMENTATION_STATUS: test=rapidExtensionListDownThenEnterRunsTheCurrentAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReadinessRegressionDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=rapidExtensionListDownThenEnterRunsTheCurrentAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 4.411 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/runner-record.json b/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/runner-record.json new file mode 100644 index 00000000..5cf6bf6a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/runner-record.json @@ -0,0 +1,88 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReadinessRegressionDeviceTest#rapidExtensionListDownThenEnterRunsTheCurrentAction", + "expected": 1, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 1, + "tests_completed": true, + "owned_extension_count": 0, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "legacy-fixtures-completed": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/state.json b/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/state.json new file mode 100644 index 00000000..406a1854 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/state.json @@ -0,0 +1,23 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "menus", + "collector_sha256": "2e35e2349b8868c1b559087e7d96850bafbd6b36914592346ef87c8d0aeba3b7", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 1, + "cleanup_checks": 19, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_completed": true, + "preservation_owner_released": true, + "original_evidence_restored": true +} diff --git a/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/tests.log b/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/tests.log new file mode 100644 index 00000000..4d81d7bb --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-menus-tablet100-v3/tests.log @@ -0,0 +1,23 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReadinessRegressionDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReadinessRegressionDeviceTest: +INSTRUMENTATION_STATUS: test=rapidExtensionListDownThenEnterRunsTheCurrentAction +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReadinessRegressionDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=1 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=rapidExtensionListDownThenEnterRunsTheCurrentAction +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 6.156 + +OK (1 test) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json new file mode 100644 index 00000000..920254d9 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json @@ -0,0 +1,26 @@ +{ + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-0fe051c48b894ea09d0167d63839c3d1", + "reviewed-text-d2a73a79ebe2414cba0a077606a9732d" + ], + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "cancelled_before_run": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json new file mode 100644 index 00000000..632b0dee --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json @@ -0,0 +1,35 @@ +{ + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-29011f0e75424286a8f9d7cbb01f59f4", + "reviewed-text-8b2ed2b7887049af8249b981c7ae1bcd" + ], + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 411, + "height_dp": 891, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "executed_command": "formatSelectionAndShow", + "native_format_contract_started": true, + "native_code_exact_output_sha256": "97aebb62251401c70af03542248f7a0e4a320e7801c5d35ede8a2b3461b87ab3", + "native_code_monospace": true, + "exact_input_sha256": "875cb6f6b27c42e85b02505c4938305fdd0603b7a76d3ff5bf2e8d2b2316209b", + "exact_output_sha256": "328d7f3c82072c2fbe0565257f692e9a25d828b02ea4287544237f3b4bd79a51", + "clipboard_unchanged_until_copy": true, + "exact_unicode_output_copied": true, + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/runner-record.json new file mode 100644 index 00000000..3175da9a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/runner-record.json @@ -0,0 +1,91 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "phone", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns,dev.tinycast.android.ReviewedTextDeviceTest#cancelBeforeRunReturnsWithoutExecutingOrSaving", + "expected": 2, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 2, + "tests_completed": true, + "owned_extension_count": 4, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "size": { + "passed": true + }, + "density": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/state.json b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/state.json new file mode 100644 index 00000000..2f90a868 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "phone", + "font": 1, + "method": "review", + "expected_failure": false, + "collector_sha256": "2d89e0751c303383fdf31125799778f4f8c39865f23ebf814faca51bc19d4c9e", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 2, + "cleanup_checks": 20, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 2 +} diff --git a/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/tests.log b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/tests.log new file mode 100644 index 00000000..739100f6 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-phone100-v2/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 17.766 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json new file mode 100644 index 00000000..51192f7a --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-cancelbeforerunreturnswithoutexecutingorsaving-record.json @@ -0,0 +1,26 @@ +{ + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-66a709c2742446a492de47deee4a82f4", + "reviewed-text-e584a83f64ab4112920d6d564da11f1f" + ], + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "cancelled_before_run": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json new file mode 100644 index 00000000..6ee2853d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/cases/text-selectedjsonrunsonlyafterreviewthencopiesandreturns-record.json @@ -0,0 +1,35 @@ +{ + "scope": "Owned external Android caller and frozen JSON formatter; probe commands are separately identified", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "command_sha256": "bb859bf5193664df28734d7982ff540ba7da4fc92be0f3958afd7e717c84ac92", + "probe_command_sha256": "8bc7c98a835bf72824ae0f061d6cc0272052c58a8c4a665c8a4157192246ff93", + "owned_extension_ids": [ + "reviewed-text-37e0eafc63014ec8bf43ae2a6a2198a8", + "reviewed-text-067b908852c14f27b27e97846322020d" + ], + "external_caller_uses_separate_package_and_uid": true, + "owned_sentinel_dismiss_actions": [ + { + "id": "com.android.systemui:id\/dismiss_button", + "accepted": true + } + ], + "font_scale": 1, + "width_dp": 1280, + "height_dp": 800, + "installed_build_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "preview_no_execution_and_clipboard_unchanged": true, + "executed_command": "formatSelectionAndShow", + "native_format_contract_started": true, + "native_code_exact_output_sha256": "97aebb62251401c70af03542248f7a0e4a320e7801c5d35ede8a2b3461b87ab3", + "native_code_monospace": true, + "exact_input_sha256": "875cb6f6b27c42e85b02505c4938305fdd0603b7a76d3ff5bf2e8d2b2316209b", + "exact_output_sha256": "328d7f3c82072c2fbe0565257f692e9a25d828b02ea4287544237f3b4bd79a51", + "clipboard_unchanged_until_copy": true, + "exact_unicode_output_copied": true, + "source_text_and_selection_unchanged": true, + "returned_to_external_caller": true, + "passed": true, + "owned_data_removed": true, + "preexisting_installations_and_data_preserved": true +} \ No newline at end of file diff --git a/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/runner-record.json b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/runner-record.json new file mode 100644 index 00000000..f61af28d --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/runner-record.json @@ -0,0 +1,85 @@ +{ + "completed": true, + "serial": "emulator-5580", + "avd": "Tinycast_Tablet_API_36", + "layout": "tablet", + "font_scale": 1.0, + "classes": "dev.tinycast.android.ReviewedTextDeviceTest#selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns,dev.tinycast.android.ReviewedTextDeviceTest#cancelBeforeRunReturnsWithoutExecutingOrSaving", + "expected": 2, + "runner_sha256": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "archive_sha256": "fc420406a59251daee0c9af32e216026724631480b3a4e2f5d65d0c507b09a58", + "typed_workflow_archive_sha256": {}, + "cleanup_helper_sha256": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "clipboard_helper_sha256": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "document_helper_sha256": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "instrumentation_excluded_tests": [ + "dev.tinycast.android.ReviewedTextDeviceTest#selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure", + "dev.tinycast.android.ReviewedTextDeviceTest#desktopMenuBarIsUnavailableInReviewedChooserAndReturnsToSource" + ], + "reviewed_json_command": "formatSelectionAndShow", + "reviewed_translation_command": "instant-translate-copy", + "expect_completion_return": false, + "apk_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "installed_apks_match": true, + "instrumentation_exit_code": 0, + "passes": 2, + "tests_completed": true, + "owned_extension_count": 4, + "cleanup": { + "stop-app": { + "passed": true + }, + "stop-owned-caller": { + "passed": true + }, + "clipboard-restored-and-verified-independently": { + "passed": true + }, + "stop-clipboard-recovery-activity": { + "passed": true + }, + "owned-fixture-data": { + "passed": true + }, + "copied-evidence": { + "passed": true + }, + "palette-backup": { + "passed": true + }, + "palette-preferences": { + "passed": true + }, + "palette-verified": { + "passed": true + }, + "emoji-backup": { + "passed": true + }, + "emoji-preferences": { + "passed": true + }, + "emoji-verified": { + "passed": true + }, + "font-scale": { + "passed": true + }, + "secure-enabled_accessibility_services": { + "passed": true + }, + "secure-accessibility_enabled": { + "passed": true + }, + "secure-show_ime_with_hard_keyboard": { + "passed": true + }, + "verify-state-and-unprivileged-identity": { + "passed": true + }, + "release-lease": { + "passed": true + } + } +} diff --git a/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/state.json b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/state.json new file mode 100644 index 00000000..173a32ad --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/state.json @@ -0,0 +1,22 @@ +{ + "completed": true, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "layout": "tablet", + "font": 1, + "method": "review", + "expected_failure": false, + "collector_sha256": "2d89e0751c303383fdf31125799778f4f8c39865f23ebf814faca51bc19d4c9e", + "durable_file_count": 12, + "evidence_file_count": 528, + "runner_exit_code": 0, + "passes": 2, + "cleanup_checks": 18, + "cleanup_passed": true, + "same_boot": true, + "durable_data_unchanged": true, + "pre_existing_evidence_unchanged": true, + "native_case_records": 2 +} diff --git a/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/tests.log b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/tests.log new file mode 100644 index 00000000..387c3a53 --- /dev/null +++ b/docs/validation/command-handoff/cohorts/regression-review-tablet100-v2/tests.log @@ -0,0 +1,37 @@ +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +dev.tinycast.android.ReviewedTextDeviceTest: +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=1 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=cancelBeforeRunReturnsWithoutExecutingOrSaving +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream= +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 1 +INSTRUMENTATION_STATUS: class=dev.tinycast.android.ReviewedTextDeviceTest +INSTRUMENTATION_STATUS: current=2 +INSTRUMENTATION_STATUS: id=AndroidJUnitRunner +INSTRUMENTATION_STATUS: numtests=2 +INSTRUMENTATION_STATUS: stream=. +INSTRUMENTATION_STATUS: test=selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns +INSTRUMENTATION_STATUS_CODE: 0 +INSTRUMENTATION_RESULT: stream= + +Time: 17.876 + +OK (2 tests) + + +INSTRUMENTATION_CODE: -1 diff --git a/docs/validation/command-handoff/collectors/build-candidate-v1.py b/docs/validation/command-handoff/collectors/build-candidate-v1.py new file mode 100644 index 00000000..17098a93 --- /dev/null +++ b/docs/validation/command-handoff/collectors/build-candidate-v1.py @@ -0,0 +1,79 @@ +from pathlib import Path +import hashlib, json, os, shutil, subprocess, xml.etree.ElementTree as E + +base = Path('artifacts/command-handoff') +out = base / 'build-candidate-v1' + +def require(value, message): + if not value: + raise RuntimeError(message) + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + +def git(*args): + return subprocess.check_output(['git', *args], text=True).strip() + +head = git('rev-parse', 'HEAD') +require(head == '10d8798e92dc0334f17f0eded4ab6fc5493326c6' and not git('status', '--porcelain=v1', '--untracked-files=all'), 'Source is not frozen') +parent = json.loads(Path('docs/validation/context-workflows/checkpoint.json').read_text()) +paths = sorted(set(parent['source_hashes']) | { + 'app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt', + 'app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt', +}) +sources = {path: sha(path) for path in paths} +require(not git('diff', '--name-only', '517a650ddb4d1eb8509ce887b6979a06b774b625', head, '--', 'app/src/main/assets'), 'Packaged runtime assets changed') +out.mkdir(exist_ok=False) +state = dict(completed=False, pid=os.getpid(), source_commit=head, runtime_source_commit=head, test_source_commit=head, + source_hashes=sources, commands=[], runs=[]) + +def save(): + (out / 'state.json').write_text(json.dumps(state, indent=2) + '\n') + +save() +env = dict(os.environ, JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-21.0.12.1+1/Contents/Home', + ANDROID_HOME='/Library/Android/sdk') +for variant in ['debug', 'benchmark']: + tasks = [':app:assemble' + variant.capitalize(), ':app:assemble' + variant.capitalize() + 'AndroidTest', ':app:lint' + variant.capitalize()] + if variant == 'debug': + tasks.insert(0, ':app:testDebugUnitTest') + command = ['./gradlew', *tasks, '-PdroidcastTestBuildType=' + variant, '-PdroidcastBuildCommit=' + head, '--console=plain'] + state['commands'].append(command) + save() + with (out / (variant + '-build.log')).open('wb') as log: + process = subprocess.run(command, stdout=log, stderr=subprocess.STDOUT, env=env) + state['runs'].append(dict(variant=variant, exit_code=process.returncode)) + save() + require(process.returncode == 0, variant + ' build failed') + target = out / ('candidate' if variant == 'debug' else 'benchmark') + target.mkdir() + for source in [Path('app/build/outputs/apk') / variant / ('app-' + variant + '.apk'), + Path('app/build/outputs/apk/androidTest') / variant / ('app-' + variant + '-androidTest.apk')]: + shutil.copyfile(source, target / source.name) + state['apk_hashes' if variant == 'debug' else 'benchmark_apk_hashes'] = {path.name: sha(path) for path in target.iterdir()} + save() +reports = out / 'reports' +reports.mkdir() +state['lint'] = {} +for variant in ['debug', 'benchmark']: + source = Path('app/build/reports/lint-results-' + variant + '.xml') + root = E.parse(source).getroot() + counts = {severity: sum(issue.get('severity') == severity for issue in root.findall('issue')) for severity in ['Error', 'Fatal', 'Warning']} + require(not counts['Error'] and not counts['Fatal'], 'Lint errors') + state['lint'][variant] = counts + shutil.copyfile(source, reports / source.name) +jvm = reports / 'jvm' +jvm.mkdir() +cases = [] +for source in sorted(Path('app/build/test-results/testDebugUnitTest').glob('TEST-*.xml')): + root = E.parse(source).getroot() + require(not root.findall('.//failure') and not root.findall('.//error') and not root.findall('.//skipped'), 'JVM cases failed or skipped') + cases.extend(case.get('classname') + '#' + case.get('name') for case in root.findall('testcase')) + shutil.copyfile(source, jvm / source.name) +require(len(cases) == 289 and len(cases) == len(set(cases)), 'Unexpected JVM case accounting') +state['jvm_cases'] = cases +require(all(sha(path) == digest for path, digest in sources.items()) and head == git('rev-parse', 'HEAD') and not git('status', '--porcelain=v1', '--untracked-files=all'), 'Sources changed during build') +state['completed'] = True +save() +print(json.dumps({key: state[key] for key in ['completed', 'source_commit', 'apk_hashes', 'lint']}, indent=2)) +print('JVM cases:', len(cases)) diff --git a/docs/validation/command-handoff/collectors/build-candidate-v2.py b/docs/validation/command-handoff/collectors/build-candidate-v2.py new file mode 100644 index 00000000..e0c66754 --- /dev/null +++ b/docs/validation/command-handoff/collectors/build-candidate-v2.py @@ -0,0 +1,80 @@ +from pathlib import Path +import hashlib, json, os, shutil, subprocess, xml.etree.ElementTree as E + +base = Path('artifacts/command-handoff') +out = base / 'build-candidate-v2' + +def require(value, message): + if not value: + raise RuntimeError(message) + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + +def git(*args): + return subprocess.check_output(['git', *args], text=True).strip() + +head = git('rev-parse', 'HEAD') +require(head == '56134f31f74211d7ec4d8faaf18ef5f84658242e' and not git('status', '--porcelain=v1', '--untracked-files=all'), 'Source is not frozen') +parent = json.loads(Path('docs/validation/context-workflows/checkpoint.json').read_text()) +paths = sorted(set(parent['source_hashes']) | { + 'app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt', + 'app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt', + 'app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt', +}) +sources = {path: sha(path) for path in paths} +require(not git('diff', '--name-only', '517a650ddb4d1eb8509ce887b6979a06b774b625', head, '--', 'app/src/main/assets'), 'Packaged runtime assets changed') +out.mkdir(exist_ok=False) +state = dict(completed=False, pid=os.getpid(), source_commit=head, runtime_source_commit=head, test_source_commit=head, + source_hashes=sources, commands=[], runs=[]) + +def save(): + (out / 'state.json').write_text(json.dumps(state, indent=2) + '\n') + +save() +env = dict(os.environ, JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-21.0.12.1+1/Contents/Home', + ANDROID_HOME='/Library/Android/sdk') +for variant in ['debug', 'benchmark']: + tasks = [':app:assemble' + variant.capitalize(), ':app:assemble' + variant.capitalize() + 'AndroidTest', ':app:lint' + variant.capitalize()] + if variant == 'debug': + tasks.insert(0, ':app:testDebugUnitTest') + command = ['./gradlew', *tasks, '-PdroidcastTestBuildType=' + variant, '-PdroidcastBuildCommit=' + head, '--console=plain'] + state['commands'].append(command) + save() + with (out / (variant + '-build.log')).open('wb') as log: + process = subprocess.run(command, stdout=log, stderr=subprocess.STDOUT, env=env) + state['runs'].append(dict(variant=variant, exit_code=process.returncode)) + save() + require(process.returncode == 0, variant + ' build failed') + target = out / ('candidate' if variant == 'debug' else 'benchmark') + target.mkdir() + for source in [Path('app/build/outputs/apk') / variant / ('app-' + variant + '.apk'), + Path('app/build/outputs/apk/androidTest') / variant / ('app-' + variant + '-androidTest.apk')]: + shutil.copyfile(source, target / source.name) + state['apk_hashes' if variant == 'debug' else 'benchmark_apk_hashes'] = {path.name: sha(path) for path in target.iterdir()} + save() +reports = out / 'reports' +reports.mkdir() +state['lint'] = {} +for variant in ['debug', 'benchmark']: + source = Path('app/build/reports/lint-results-' + variant + '.xml') + root = E.parse(source).getroot() + counts = {severity: sum(issue.get('severity') == severity for issue in root.findall('issue')) for severity in ['Error', 'Fatal', 'Warning']} + require(not counts['Error'] and not counts['Fatal'], 'Lint errors') + state['lint'][variant] = counts + shutil.copyfile(source, reports / source.name) +jvm = reports / 'jvm' +jvm.mkdir() +cases = [] +for source in sorted(Path('app/build/test-results/testDebugUnitTest').glob('TEST-*.xml')): + root = E.parse(source).getroot() + require(not root.findall('.//failure') and not root.findall('.//error') and not root.findall('.//skipped'), 'JVM cases failed or skipped') + cases.extend(case.get('classname') + '#' + case.get('name') for case in root.findall('testcase')) + shutil.copyfile(source, jvm / source.name) +require(len(cases) == 289 and len(cases) == len(set(cases)), 'Unexpected JVM case accounting') +state['jvm_cases'] = cases +require(all(sha(path) == digest for path, digest in sources.items()) and head == git('rev-parse', 'HEAD') and not git('status', '--porcelain=v1', '--untracked-files=all'), 'Sources changed during build') +state['completed'] = True +save() +print(json.dumps({key: state[key] for key in ['completed', 'source_commit', 'apk_hashes', 'lint']}, indent=2)) +print('JVM cases:', len(cases)) diff --git a/docs/validation/command-handoff/collectors/preservation.py b/docs/validation/command-handoff/collectors/preservation.py new file mode 100644 index 00000000..cd7f02a3 --- /dev/null +++ b/docs/validation/command-handoff/collectors/preservation.py @@ -0,0 +1,71 @@ +from pathlib import Path, PurePosixPath +import hashlib, io, json, subprocess, tarfile + +BASE = Path('artifacts/command-handoff') +ADB = ['/Library/Android/sdk/platform-tools/adb', '-s', 'emulator-5580'] +APP = 'dev.tinycast.android' + +def require(value, message): + if not value: + raise RuntimeError(message) + +def raw(*values): + return subprocess.check_output(ADB + list(values), timeout=60, stderr=subprocess.STDOUT) + +def text(*values): + return raw(*values).decode().strip() + +def absent(path): + result = subprocess.run(ADB + ['shell', 'run-as', APP, 'test', '-e', path], capture_output=True, timeout=20) + require(result.returncode in [0, 1] and not result.stdout and not result.stderr, 'Path absence is unknown') + return result.returncode == 1 + +def idle(): + require(text('shell', 'getprop', 'ro.boot.qemu.avd_name') == 'Tinycast_Tablet_API_36', 'Wrong emulator') + require(text('shell', 'id').startswith('uid=2000('), 'Privileged adbd') + require('ActiveInstrumentation{' not in text('shell', 'dumpsys', 'activity', 'processes'), 'Instrumentation active') + for path in ['files/reviewed-text-fixture-lease', 'files/reviewed-text-evidence', 'files/empty-view-fixture-lease', 'files/compatibility-batch-fixtures']: + require(absent(path), 'Prior fixture ownership or evidence remains') + +def hashes(roots): + data = raw('exec-out', 'run-as', APP, 'tar', '-cf', '-', *roots) + result = {} + with tarfile.open(fileobj=io.BytesIO(data)) as archive: + for member in archive: + path = PurePosixPath(member.name) + require(not path.is_absolute() and '..' not in path.parts, 'Unsafe snapshot member') + if member.isdir(): + continue + require(member.isfile() and member.name not in result and any(member.name.startswith(root + '/') for root in roots), 'Unexpected snapshot member') + result[member.name] = hashlib.sha256(archive.extractfile(member).read()).hexdigest() + return result + +def verify(): + idle() + counts = {} + for name in ['durable', 'evidence']: + expected = json.loads((BASE / ('private-' + name + '-before-v1.json')).read_text()) + require(text('shell', 'cat', '/proc/sys/kernel/random/boot_id') == expected['boot_id'], 'Emulator boot changed') + require(hashes(expected['roots']) == expected['hashes'], 'Pre-existing data/evidence changed') + counts[name + '_file_count'] = len(expected['hashes']) + return counts + +if __name__ == '__main__': + idle() + parent = Path('/.t3/scratch/droidcast-context-workflows-27caf3/artifacts/context-workflows') + boot = json.loads((parent / 'private-durable-before-v1.json').read_text())['boot_id'] + require(text('shell', 'cat', '/proc/sys/kernel/random/boot_id') == boot, 'Parent boot changed') + for name in ['durable', 'evidence']: + destination = BASE / ('private-' + name + '-before-v1.json') + expected = json.loads((parent / destination.name).read_text()) + current = hashes(expected['roots']) + require(current == expected['hashes'], 'Parent preservation baseline does not match') + snapshot = dict(boot_id=boot, roots=expected['roots'], hashes=current) + if destination.exists(): + require(json.loads(destination.read_text()) == snapshot, 'Existing private baseline differs') + else: + with destination.open('x') as output: + destination.chmod(0o600) + json.dump(snapshot, output, indent=2) + output.write('\n') + print(json.dumps(dict(verified=True, **verify()))) diff --git a/docs/validation/command-handoff/collectors/publish-handoff-v1.py b/docs/validation/command-handoff/collectors/publish-handoff-v1.py new file mode 100644 index 00000000..f2ff359d --- /dev/null +++ b/docs/validation/command-handoff/collectors/publish-handoff-v1.py @@ -0,0 +1,92 @@ +from pathlib import Path +import hashlib,json,subprocess,xml.etree.ElementTree as E +base=Path('artifacts/command-handoff');public=Path('docs/validation/command-handoff');pictures=Path('docs/screenshots/command-handoff') +read=lambda p:json.loads(Path(p).read_text());sha=lambda b:hashlib.sha256(b).hexdigest() +def require(value,message): + if not value:raise RuntimeError(message) +require(not (public/'checkpoint.json').exists(),'Published checkpoint exists; verify instead') +matrix=read(base/'owned-matrix-v3/record.json');final=read(base/'final-verification-v3/record.json') +continuation=read(base/'continuation-v4/record.json') +require(matrix['completed'] and not final['completed'] and continuation['completed'],'Verified continuation incomplete') +final_runs=[r for r in final['runs'] if r['exit_code']==0]+continuation['runs'] +public.mkdir(parents=True,exist_ok=True);pictures.mkdir(parents=True,exist_ok=True) +bindings=[];projections=[];cohorts=[];frames=[];capture_hashes={} +def write(source,target,raw=False): + source=Path(source);data=source.read_bytes();original=data + if not raw:data=data.decode().replace('','<user>' if target.suffix=='.xml' else '').encode() + target.parent.mkdir(parents=True,exist_ok=True);require(not target.exists() or target.read_bytes()==data,'Destination differs') + target.write_bytes(data);bindings.append(dict(artifact=str(source.relative_to(base)),public=str(target),original_sha256=sha(original),public_sha256=sha(data),transformation='identity' if data==original else 'UTF-8 host-home replacement only; XML-safe <user> in XML, elsewhere')) +def project(source,target,keys): + value=read(source);out={k:value[k] for k in keys if k in value} + if 'cleanup' in value:out['cleanup']={k:{'passed':r.get('passed') is True} for k,r in value['cleanup'].items()} + data=(json.dumps(out,indent=2)+'\n').encode();target.parent.mkdir(parents=True,exist_ok=True);require(not target.exists() or target.read_bytes()==data,'Projection differs');target.write_bytes(data) + projections.append(dict(artifact=str(Path(source).relative_to(base)),public=str(target),allowed_keys=keys,cleanup_projection='passed boolean only' if 'cleanup' in value else None));return out +state_keys=['completed','runtime_source_commit','test_source_commit','app_sha256','test_apk_sha256','layout','font','method','expected_failure','collector_sha256','preservation_helper_sha256','durable_file_count','evidence_file_count','runner_exit_code','passes','cleanup_checks','cleanup_passed','same_boot','durable_data_unchanged','pre_existing_evidence_unchanged','native_case_records','native_completed','preservation_owner_released','original_evidence_restored','app','phase_outcome','expected_phase','compatible_listed_workflow','negative_capability_observed'] +runner_keys=['completed','serial','avd','layout','font_scale','classes','expected','runner_sha256','archive_sha256','typed_workflow_archive_sha256','cleanup_helper_sha256','clipboard_helper_sha256','document_helper_sha256','instrumentation_excluded_tests','reviewed_json_command','reviewed_translation_command','expect_completion_return','apk_sha256','test_apk_sha256','installed_apks_match','instrumentation_exit_code','passes','tests_completed','owned_extension_count'] +superseded={r['name'] for r in matrix['runs'] if r['name'].startswith(('owned-ack-','owned-duplicate-'))} +final_names=[r['name'] for r in matrix['runs']+final_runs if not r['name'].startswith('matched-lifetime-') and r['name'] not in superseded] +negative_names=[r['name'] for r in final_runs if r['name'].startswith('matched-lifetime-')] +require(len(final_names)==34 and len(set(final_names))==34 and len(negative_names)==2,'Unexpected final cohort accounting') +for state_path in sorted(base.glob('*/state.json')): + root=state_path.parent + if not (root/'cohort/record.json').exists():continue + name=root.name;dest=public/'cohorts'/name + state=project(state_path,dest/'state.json',state_keys);runner=project(root/'cohort/record.json',dest/'runner-record.json',runner_keys) + require(state['cleanup_passed'] and state['same_boot'] and state['durable_data_unchanged'] and state['pre_existing_evidence_unchanged'],'Preservation failed') + write(root/'cohort/tests.log',dest/'tests.log') + for directory in ['captures','readiness-evidence','extension-grid-evidence']: + capture_root=root/'cohort'/directory + if not capture_root.exists():continue + for p in sorted(capture_root.iterdir()): + require(p.suffix in ['.png','.json','.xml'],'Unexpected capture path');capture_hashes[str(p.relative_to(base))]=sha(p.read_bytes()) + if p.name.endswith('-record.json'):write(p,dest/'cases'/p.name,raw=True) + category='final-positive' if name in final_names else 'final-matched-negative' if name in negative_names else 'historical-failure' if not state['completed'] or state.get('expected_failure') else 'historical-observation' + if category=='final-positive':require(state['completed'] and runner['passes']==runner['expected'],'Incomplete positive') + if category=='final-matched-negative':require(state['completed'] and runner['passes']==0,'Old control unexpectedly passed') + cohorts.append(dict(name=name,category=category,passes=runner['passes'],expected=runner['expected'],cleanup_checks=len(runner['cleanup']),app_sha256=state['app_sha256'],test_apk_sha256=state['test_apk_sha256'])) +def frame(name,phase): + root=base/name/'cohort/captures';files=list(root.glob('*-'+phase+'.png'));require(len(files)==1,'Selected phase missing: '+name+'/'+phase);stem=files[0].stem + if any(x['cohort']==name and x['stem']==stem for x in frames):return + for suffix in ['.png','.xml','-frame.json']: + p=root/(stem+suffix);require(p.exists(),'Incomplete triplet');write(p,pictures/name/p.name if suffix=='.png' else public/'cohorts'/name/'captures'/p.name,raw=True) + frames.append(dict(cohort=name,stem=stem)) +for layout in ['tablet','phone']: + for label,phase in [('ordinary','ordinary-child-without-context'),('recreation','recreated-child-retains-context'),('preferences','restored-parent-rejects-old-preferences'),('context','child-context'),('cancel','cancelled-caller'),('invalid','rejected-request-feedback')]:frame('owned-'+label+'-'+layout+'100-v3',phase) + for phase in ['parent-ready','caller-return']:frame('owned-context-'+layout+'100-v3',phase) +for name in final_names: + if name.startswith('protocol-'):frame(name,'child-after-queued-callbacks') + elif name.startswith('critical-context-'):frame(name,'child-context') + elif name.startswith('critical-invalid-'):frame(name,'rejected-request-feedback') + elif name.startswith('final-quick-'): + for phase in ['translation-chosen','translation-native-result','translation-exact-copy','translation-context-return']:frame(name,phase) +for phase in ['exact-context-copy','caller-return']:frame('critical-context-landscape200-v3',phase) +for name in negative_names:frame(name,'failure') +for layout in ['tablet','phone']:frame('matched-quick-old-'+layout+'100-v1','translation-runtime-boundary') +frame('owned-ordinary-tablet100-v2','failure') +for folder in ['build-candidate-v1','build-candidate-v2']: + value=read(base/folder/'state.json');project(base/folder/'state.json',public/'identities'/(folder+'.json'),[k for k in value if k!='pid']) + for p in sorted((base/folder).glob('*.log')):write(p,public/'checks'/folder/p.name) + if folder=='build-candidate-v2': + for p in sorted((base/folder/'reports').rglob('*')): + if p.is_file():write(p,public/'checks'/folder/'reports'/p.relative_to(base/folder/'reports')) +for version in [2,3]: + for p in sorted((base/('final-harness-reports-v'+str(version))).glob('*.xml')):write(p,public/'checks'/('final-lint-v'+str(version))/p.name) +for folder in ['common-v5','owned-harness-v1','owned-harness-v2','owned-harness-v3','repaired-harness-v2']: + write(base/folder/'identity.json',public/'identities'/(folder+'.json')) +for name in ['asset-comparison-v1.json','harness-transition-v2.json','python-owned-v1.log','python-owned-optimized-v1.log','owned-harness-v1-build.log','owned-harness-v2-build.log','owned-harness-v2-benchmark-build.log','owned-harness-v2-debug-lint.log','final-harness-checks-v2.json','owned-harness-v3-build.log','owned-harness-v3-benchmark-build.log','owned-harness-v3-debug-lint.log','final-harness-checks-v3.json']: + write(base/name,public/'checks'/name) +for folder in ['owned-matrix-v2','owned-matrix-v3','final-verification-v3','continuation-v4']: + value=read(base/folder/'record.json');project(base/folder/'record.json',public/'pipelines'/(folder+'.json'),[k for k in value if k!='pid']) +write(base/'regression-menus-tablet100-v2/host.log',public/'checks/menu-preflight.log') +write(base/'menu-preflight-v1.json',public/'checks/menu-preflight-v1.json') +for p in sorted(base.glob('*.py')):write(p,public/'collectors'/p.name) +for p in public.rglob('*.xml'):E.parse(p) +for root in [public,pictures]: + for p in root.rglob('*'): + if p.is_file() and p.suffix!='.png':require((b'/' + b'Users' + b'/') not in p.read_bytes(),'Host path published') +files={str(p):sha(p.read_bytes()) for root in [public,pictures] for p in sorted(root.rglob('*')) if p.is_file()} +require(set(files)=={r['public'] for r in bindings+projections},'Unlisted public evidence') +positive=[r for r in cohorts if r['category']=='final-positive'];negative=[r for r in cohorts if r['category']=='final-matched-negative'] +record=dict(schema_version=1,scope='Bounded same-extension foreground handoff; owned lifecycle protocols plus the configured frozen Quick Translate path, not broad parity',source_head=subprocess.check_output(['git','rev-parse','HEAD'],text=True).strip(),source_hashes=read(base/'owned-harness-v3/identity.json')['source_hashes'],cohorts=cohorts,original_public_bindings=bindings,allowlisted_projections=projections,retained_capture_hashes=capture_hashes,selected_frame_sets=frames,public_files=files,final_native_executions=sum(r['passes'] for r in positive),final_cleanup_checks=sum(r['cleanup_checks'] for r in positive),final_cohorts=len(positive),matched_negative_executions=sum(r['expected'] for r in negative),matched_negative_cleanup_checks=sum(r['cleanup_checks'] for r in negative),total_executions=sum(r['expected'] for r in cohorts),total_passes=sum(r['passes'] for r in cohorts),total_cleanup_checks=sum(r['cleanup_checks'] for r in cohorts)) +(public/'checkpoint.json').write_text(json.dumps(record,indent=2)+'\n') +print(json.dumps({k:record[k] for k in ['final_native_executions','final_cleanup_checks','final_cohorts','total_executions','total_passes','total_cleanup_checks']},indent=2));print('Public files:',len(files),'frames:',len(frames)) diff --git a/docs/validation/command-handoff/collectors/run-continuation-v4.py b/docs/validation/command-handoff/collectors/run-continuation-v4.py new file mode 100644 index 00000000..b5666088 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-continuation-v4.py @@ -0,0 +1,18 @@ +from pathlib import Path +import json,os,subprocess,sys +from preservation import require,verify +base=Path('artifacts/command-handoff');out=base/'continuation-v4';out.mkdir(exist_ok=False) +prior=json.loads((base/'final-verification-v3/record.json').read_text());require(not prior['completed'] and prior['runs'][-1]=={'name':'regression-menus-tablet100-v2','exit_code':1},'Unexpected preceding pipeline state') +require(json.loads((base/'regression-menus-tablet100-v3/state.json').read_text())['completed'],'Tablet menu continuation incomplete') +verify() +state=dict(completed=False,pid=os.getpid(),runs=[dict(name='regression-menus-tablet100-v3',exit_code=0,already_completed=True)]) +def save():(out/'record.json').write_text(json.dumps(state,indent=2)+'\n') +save() +for layout,groups in [('tablet',['review']),('phone',['forms','detail','menus','review'])]: + for group in groups: + name='regression-'+group+'-'+layout+('100-v3' if group=='menus' else '100-v2') + command=[str(base/'run-menu-regression-v1.py'),'--layout',layout] if group=='menus' else [str(base/'run-regression-v1.py'),'--name',name,'--method',group,'--layout',layout] + with (out/(name+'.log')).open('wb') as log:r=subprocess.run([sys.executable,*command],stdout=log,stderr=subprocess.STDOUT) + state['runs'].append(dict(name=name,exit_code=r.returncode));save();print(name,r.returncode,flush=True) + require(r.returncode==0,'Continuation failed; retain original state') +state['completed']=True;save() diff --git a/docs/validation/command-handoff/collectors/run-final-verification-v2.py b/docs/validation/command-handoff/collectors/run-final-verification-v2.py new file mode 100644 index 00000000..1f797902 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-final-verification-v2.py @@ -0,0 +1,26 @@ +from pathlib import Path +import json,os,subprocess,sys +from preservation import require +base=Path('artifacts/command-handoff');out=base/'final-verification-v2';out.mkdir(exist_ok=False) +require(json.loads((base/'owned-matrix-v2/record.json').read_text())['completed'],'Owned matrix incomplete') +state=dict(completed=False,pid=os.getpid(),runs=[]) +def save():(out/'record.json').write_text(json.dumps(state,indent=2)+'\n') +def run(name,command): + with (out/(name+'.log')).open('wb') as log:r=subprocess.run([sys.executable,*command],stdout=log,stderr=subprocess.STDOUT) + state['runs'].append(dict(name=name,exit_code=r.returncode));save();print(name,r.returncode,flush=True) + require(r.returncode==0,'Verification stops at failure; inspect retained cohort') +save() +for layout,font in [('tablet',2),('phone',2),('landscape',1),('landscape',2)]: + name='critical-context-'+layout+str(font*100)+'-v2' + run(name,[str(base/'run-owned-v1.py'),'--name',name,'--method','contextArgumentsAndFallbackReachChildAndCopy','--layout',layout,'--font',str(font),'--build','build-candidate-v2','--harness','owned-harness-v1']) +for layout in ['phone','landscape']: + name='critical-invalid-'+layout+'200-v2' + run(name,[str(base/'run-owned-v1.py'),'--name',name,'--method','invalidRequestsKeepTheParentAndClipboard','--layout',layout,'--font','2','--build','build-candidate-v2','--harness','owned-harness-v1']) +for layout,font in [('tablet',1),('phone',1),('phone',2),('landscape',2)]: + name='final-quick-'+layout+str(font*100)+'-v2' + run(name,[str(base/'run-quick-control-v2.py'),'--name',name,'--app','new','--layout',layout,'--font',str(font)]) +for layout in ['tablet','phone']: + for group in ['forms','detail','menus','review']: + name='regression-'+group+'-'+layout+'100-v2' + run(name,[str(base/'run-regression-v1.py'),'--name',name,'--method',group,'--layout',layout]) +state['completed']=True;save() diff --git a/docs/validation/command-handoff/collectors/run-final-verification-v3.py b/docs/validation/command-handoff/collectors/run-final-verification-v3.py new file mode 100644 index 00000000..e54c8318 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-final-verification-v3.py @@ -0,0 +1,33 @@ +from pathlib import Path +import json,os,subprocess,sys +from preservation import require +base=Path('artifacts/command-handoff');out=base/'final-verification-v3';out.mkdir(exist_ok=False) +require(json.loads((base/'owned-matrix-v3/record.json').read_text())['completed'],'Owned matrix incomplete') +state=dict(completed=False,pid=os.getpid(),runs=[]) +def save():(out/'record.json').write_text(json.dumps(state,indent=2)+'\n') +def run(name,command): + with (out/(name+'.log')).open('wb') as log:r=subprocess.run([sys.executable,*command],stdout=log,stderr=subprocess.STDOUT) + state['runs'].append(dict(name=name,exit_code=r.returncode));save();print(name,r.returncode,flush=True) + require(r.returncode==0,'Verification stops at failure; inspect retained cohort') +save() +for method,label in [('recreatedChildRejectsDisposedBackCallback','recreation'),('returnedCommandRejectsDisposedPreferencesCallback','preferences')]: + name='matched-lifetime-'+label+'-old-tablet100-v3' + run(name,[str(base/'run-owned-v1.py'),'--name',name,'--method',method,'--build','build-candidate-v1','--harness','owned-harness-v2','--expect-failure']) +for layout in ['tablet','phone']: + for method,label in [('acknowledgementRevokesParentBeforeChildComposition','ack'),('duplicateLaunchRequestsTransferOnlyOnce','duplicate')]: + name='protocol-'+label+'-'+layout+'100-v4' + run(name,[str(base/'run-owned-v1.py'),'--name',name,'--method',method,'--layout',layout,'--build','build-candidate-v2','--harness','owned-harness-v3']) +for layout,font in [('tablet',2),('phone',2),('landscape',1),('landscape',2)]: + name='critical-context-'+layout+str(font*100)+'-v3' + run(name,[str(base/'run-owned-v1.py'),'--name',name,'--method','contextArgumentsAndFallbackReachChildAndCopy','--layout',layout,'--font',str(font),'--build','build-candidate-v2','--harness','owned-harness-v2']) +for layout in ['phone','landscape']: + name='critical-invalid-'+layout+'200-v2' + run(name,[str(base/'run-owned-v1.py'),'--name',name,'--method','invalidRequestsKeepTheParentAndClipboard','--layout',layout,'--font','2','--build','build-candidate-v2','--harness','owned-harness-v2']) +for layout,font in [('tablet',1),('phone',1),('phone',2),('landscape',2)]: + name='final-quick-'+layout+str(font*100)+'-v3' + run(name,[str(base/'run-quick-control-v2.py'),'--name',name,'--app','new','--layout',layout,'--font',str(font)]) +for layout in ['tablet','phone']: + for group in ['forms','detail','menus','review']: + name='regression-'+group+'-'+layout+'100-v2' + run(name,[str(base/'run-regression-v1.py'),'--name',name,'--method',group,'--layout',layout]) +state['completed']=True;save() diff --git a/docs/validation/command-handoff/collectors/run-matched-quick-v1.py b/docs/validation/command-handoff/collectors/run-matched-quick-v1.py new file mode 100644 index 00000000..eaccbee2 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-matched-quick-v1.py @@ -0,0 +1,26 @@ +from pathlib import Path +import json, os, subprocess, sys +from preservation import require + +base = Path('artifacts/command-handoff') +out = base / 'matched-quick-v1' +out.mkdir(exist_ok=False) +record = dict(completed=False, pid=os.getpid(), runs=[], scope='Same frozen v5 instrumentation on old/current apps; old collector passes witness a blocked capability, not working compatibility or JUnit failures') + +def save(): + (out / 'record.json').write_text(json.dumps(record, indent=2) + '\n') + +save() +for layout in ['tablet', 'phone']: + for app in ['old', 'new']: + name = 'matched-quick-' + app + '-' + layout + '100-v1' + command = [sys.executable, str(base / 'run-quick-control-v1.py'), '--app', app, '--layout', layout, '--name', name] + with (out / (name + '.log')).open('wb') as log: + result = subprocess.run(command, stdout=log, stderr=subprocess.STDOUT) + record['runs'].append(dict(name=name, exit_code=result.returncode)) + save() + print(name, result.returncode, flush=True) + require(result.returncode == 0, 'Matched sequence failed; inspect before continuing') +record['completed'] = True +save() +print(json.dumps(record, indent=2)) diff --git a/docs/validation/command-handoff/collectors/run-menu-regression-v1.py b/docs/validation/command-handoff/collectors/run-menu-regression-v1.py new file mode 100644 index 00000000..5f508831 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-menu-regression-v1.py @@ -0,0 +1,97 @@ +from pathlib import Path,PurePosixPath +import argparse,hashlib,io,json,os,subprocess,sys,tarfile,uuid + +p=argparse.ArgumentParser();p.add_argument('--layout',choices=['tablet','phone','landscape'],required=True);p.add_argument('--restore-only',action='store_true');args=p.parse_args() +base=Path('artifacts/command-handoff');out=base/('regression-menus-'+args.layout+'100-v3');state_path=out/'state.json' +adb=['/Library/Android/sdk/platform-tools/adb','-s','emulator-5580'];app='dev.tinycast.android' +owner_root='files/command-handoff-regression-preservation-v1';folders=['extension-grid-evidence','readiness-evidence'] +def require(value,message): + if not value:raise RuntimeError(message) +def sha(data):return hashlib.sha256(data).hexdigest() +def raw(*values,data=None):return subprocess.check_output(adb+list(values),input=data,stderr=subprocess.STDOUT,timeout=60) +def text(*values):return raw(*values).decode().strip() +def absent(path): + result=subprocess.run(adb+['shell','run-as',app,'test','-e',path],capture_output=True,timeout=20) + require(result.returncode in [0,1] and not result.stdout and not result.stderr,'Cannot establish path absence') + return result.returncode==1 +def idle(): + require(text('shell','getprop','ro.boot.qemu.avd_name')=='Tinycast_Tablet_API_36','Wrong dedicated emulator') + require(text('shell','id').startswith('uid=2000('),'adbd is privileged') + require('ActiveInstrumentation{' not in text('shell','dumpsys','activity','processes'),'Instrumentation remains active') +def snapshot(roots): + data=raw('exec-out','run-as',app,'tar','-cf','-',*roots.values());hashes={} + with tarfile.open(fileobj=io.BytesIO(data)) as archive: + for member in archive: + path=PurePosixPath(member.name);require(not path.is_absolute() and '..' not in path.parts,'Unsafe archive member') + if member.isdir():continue + require(member.isfile(),'Nonregular archive member') + matching=[(name,root) for name,root in roots.items() if member.name.startswith(root+'/')] + require(len(matching)==1,'Unexpected archive namespace') + name,root=matching[0];key=name+'/'+member.name.removeprefix(root+'/');require(key not in hashes,'Duplicate member') + hashes[key]=sha(archive.extractfile(member).read()) + return data,hashes +def save():state_path.write_text(json.dumps(state,indent=2)+'\n') +def original_owner():return dict(schema_version=1,nonce=state['nonce'],folders=folders,origin='command-handoff-menu-regression-v1') +def verify_originals(): + for name in ['private-evidence-before-v1.json','private-durable-before-v1.json']: + value=json.loads((base/name).read_text());roots={root:root for root in value['roots']};_,hashes=snapshot(roots) + require(hashes==value['hashes'],'Pre-existing data/evidence differs') + require(text('shell','cat','/proc/sys/kernel/random/boot_id')==json.loads((base/'private-durable-before-v1.json').read_text())['boot_id'],'Boot identity changed') +def restore(): + idle() + for path in ['files/reviewed-text-fixture-lease','files/empty-view-fixture-lease','files/compatibility-batch-fixtures','files/reviewed-text-evidence']: + require(absent(path),'A failed native cohort retains ownership; inspect and recover it first') + require(json.loads(raw('exec-out','run-as',app,'cat',owner_root+'/owner.json'))==original_owner(),'Preservation owner changed') + for folder in folders: + saved=owner_root+'/'+folder;target='files/'+folder + if not absent(saved): + require(absent(target),'New evidence remains; retain it before restoring') + _,hashes=snapshot({folder:saved});require(hashes=={k:v for k,v in json.loads((out/'private-original-hashes.json').read_text()).items() if k.startswith(folder+'/')},'Saved evidence differs') + raw('shell','run-as',app,'mv',saved,target) + else:require(not absent(target),'Original directory absent at both locations') + state['restored_folders']=list(dict.fromkeys(state.get('restored_folders',[])+[folder]));save() + _,hashes=snapshot({folder:'files/'+folder for folder in folders});require(hashes==json.loads((out/'private-original-hashes.json').read_text()),'Restored evidence differs') + state['original_evidence_restored']=True;save();verify_originals() + state['pre_existing_evidence_unchanged']=True;state['durable_data_unchanged']=True;state['same_boot']=True;save() + require(text('shell','run-as',app,'ls',owner_root).splitlines()==['owner.json'],'Unexpected preservation contents remain') + require(json.loads(raw('exec-out','run-as',app,'cat',owner_root+'/owner.json'))==original_owner(),'Ownership changed before release') + raw('shell','run-as',app,'rm','-rf',owner_root) # Final device operation, only after all verification. + state['preservation_owner_released']=True;save() + +if args.restore_only: + state=json.loads(state_path.read_text());require(not state.get('preservation_owner_released'),'Already restored') + restore();print(json.dumps({'restored':True,'original_outcome_unchanged':True}));raise SystemExit(0) +require(not out.exists(),'Prior execution exists; do not repeat mutations') +build=json.loads((base/'build-candidate-v2/state.json').read_text());require(build['completed'],'Frozen build incomplete') +harness=json.loads((base/'owned-harness-v2/identity.json').read_text()) +apk=base/'build-candidate-v2/candidate/app-debug.apk';test=base/'owned-harness-v2/app-debug-androidTest.apk' +require(sha(apk.read_bytes())==build['apk_hashes'][apk.name] and sha(test.read_bytes())==harness['test_apk_sha256'],'Frozen APK changed') +require(all(sha(Path(p).read_bytes())==v for p,v in harness['source_hashes'].items() if p.endswith('.py')),'Executed Python sources changed') +idle();verify_originals() +for path in [owner_root,'files/reviewed-text-fixture-lease','files/empty-view-fixture-lease','files/compatibility-batch-fixtures','files/reviewed-text-evidence','files/compact-menu-evidence-preservation-v1']: + require(absent(path),'Prior evidence/recovery ownership remains') +backup,hashes=snapshot({f:'files/'+f for f in folders});require(hashes,'Expected pre-existing regression evidence') +out.mkdir(mode=0o700);private=out/'private-original-evidence.tar';private.write_bytes(backup);private.chmod(0o600) +classes=['dev.tinycast.android.ReadinessRegressionDeviceTest#rapidExtensionListDownThenEnterRunsTheCurrentAction'] +private_hashes=out/'private-original-hashes.json';private_hashes.write_text(json.dumps(hashes,indent=2)+'\n');private_hashes.chmod(0o600) +state=dict(completed=False,pid=os.getpid(),nonce=uuid.uuid4().hex,layout=args.layout,methods=classes,font=1,method='menus',durable_file_count=12,evidence_file_count=528, + collector_sha256=sha(Path(__file__).read_bytes()),app_sha256=build['apk_hashes'][apk.name],test_apk_sha256=harness['test_apk_sha256'],test_source_commit=harness['test_source_commit'],runtime_source_commit=build['runtime_source_commit']) +save();raw('shell','run-as',app,'mkdir',owner_root) +raw('shell','run-as',app,'tee',owner_root+'/owner.json',data=(json.dumps(original_owner())+'\n').encode()) +try: + for folder in folders:raw('shell','run-as',app,'mv','files/'+folder,owner_root+'/'+folder) + _,saved=snapshot({folder:owner_root+'/'+folder for folder in folders});require(saved==hashes,'Moved evidence differs') + archive='/.t3/scratch/droidcast-command-catalog-27caf3/artifacts/extension-catalog/representative-001-bundles-v1/archives/223987eaca2c894e37ada9e087669f260cda79d6a3b88ff11463f429cc952e6a.zip' + command=[sys.executable,'scripts/test-reviewed-text-input.py','--serial','emulator-5580','--avd','Tinycast_Tablet_API_36','--layout',args.layout,'--font-scale','1','--output',str(out/'cohort'), + '--apk',str(apk),'--test-apk',str(test),'--json-archive',archive,'--classes',','.join(classes),'--expected',str(len(classes))] + with (out/'host.log').open('wb') as log:result=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT,env=dict(os.environ,ANDROID_HOME='/Library/Android/sdk')) + state['runner_exit_code']=result.returncode + receipt=json.loads((out/'cohort/record.json').read_text());state['passes']=receipt.get('passes');state['cleanup_checks']=len(receipt.get('cleanup',{})) + state['cleanup_passed']=bool(receipt.get('cleanup')) and all(row.get('passed') for row in receipt.get('cleanup',{}).values());state['native_completed']=receipt.get('completed');save() + require(sha(Path(__file__).read_bytes())==state['collector_sha256'],'Collector changed during execution') +finally: + try:restore() + except BaseException as error:state['restoration_pending']=True;state['restoration_error_type']=type(error).__name__;save();raise +state['completed']=state['runner_exit_code']==0 and state['native_completed'] and state['preservation_owner_released'];save() +print(json.dumps({k:state.get(k) for k in ['completed','layout','passes','cleanup_checks','cleanup_passed','pre_existing_evidence_unchanged','durable_data_unchanged']},indent=2)) +require(state['completed'],'Regression assertions failed; retain the failure') diff --git a/docs/validation/command-handoff/collectors/run-owned-matrix-v2.py b/docs/validation/command-handoff/collectors/run-owned-matrix-v2.py new file mode 100644 index 00000000..7a402759 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-owned-matrix-v2.py @@ -0,0 +1,16 @@ +from pathlib import Path +import json,os,subprocess,sys +from preservation import require +base=Path('artifacts/command-handoff');out=base/'owned-matrix-v2';out.mkdir(exist_ok=False) +methods=[('recreatedChildRejectsDisposedBackCallback','recreation'),('returnedCommandRejectsDisposedPreferencesCallback','preferences'),('contextArgumentsAndFallbackReachChildAndCopy','context'),('acknowledgementRevokesParentBeforeChildComposition','ack'),('duplicateLaunchRequestsTransferOnlyOnce','duplicate'),('queuedRequestCannotLaunchAfterParentCancellation','cancel'),('invalidRequestsKeepTheParentAndClipboard','invalid'),('ordinaryRelaunchClearsContextAndFallback','ordinary')] +state=dict(completed=False,pid=os.getpid(),runs=[]) +def save():(out/'record.json').write_text(json.dumps(state,indent=2)+'\n') +save() +for layout in ['tablet','phone']: + for method,label in methods: + name='owned-'+label+'-'+layout+'100-v2' + command=[sys.executable,str(base/'run-owned-v1.py'),'--name',name,'--method',method,'--layout',layout,'--build','build-candidate-v2','--harness','owned-harness-v1'] + with (out/(name+'.log')).open('wb') as log:r=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT) + state['runs'].append(dict(name=name,exit_code=r.returncode));save();print(name,r.returncode,flush=True) + require(r.returncode==0,'Case failed; pipeline stops, preserve evidence and inspect') +state['completed']=True;save() diff --git a/docs/validation/command-handoff/collectors/run-owned-matrix-v3.py b/docs/validation/command-handoff/collectors/run-owned-matrix-v3.py new file mode 100644 index 00000000..f8849df2 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-owned-matrix-v3.py @@ -0,0 +1,16 @@ +from pathlib import Path +import json,os,subprocess,sys +from preservation import require +base=Path('artifacts/command-handoff');out=base/'owned-matrix-v3';out.mkdir(exist_ok=False) +methods=[('ordinaryRelaunchClearsContextAndFallback','ordinary'),('recreatedChildRejectsDisposedBackCallback','recreation'),('returnedCommandRejectsDisposedPreferencesCallback','preferences'),('contextArgumentsAndFallbackReachChildAndCopy','context'),('acknowledgementRevokesParentBeforeChildComposition','ack'),('duplicateLaunchRequestsTransferOnlyOnce','duplicate'),('queuedRequestCannotLaunchAfterParentCancellation','cancel'),('invalidRequestsKeepTheParentAndClipboard','invalid')] +state=dict(completed=False,pid=os.getpid(),runs=[]) +def save():(out/'record.json').write_text(json.dumps(state,indent=2)+'\n') +save() +for layout in ['tablet','phone']: + for method,label in methods: + name='owned-'+label+'-'+layout+'100-v3' + command=[sys.executable,str(base/'run-owned-v1.py'),'--name',name,'--method',method,'--layout',layout,'--build','build-candidate-v2','--harness','owned-harness-v2'] + with (out/(name+'.log')).open('wb') as log:r=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT) + state['runs'].append(dict(name=name,exit_code=r.returncode));save();print(name,r.returncode,flush=True) + require(r.returncode==0,'Case failed; pipeline stops, preserve evidence and inspect') +state['completed']=True;save() diff --git a/docs/validation/command-handoff/collectors/run-owned-v1.py b/docs/validation/command-handoff/collectors/run-owned-v1.py new file mode 100644 index 00000000..a069eb7a --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-owned-v1.py @@ -0,0 +1,37 @@ +from pathlib import Path +import argparse, hashlib, json, os, re, subprocess, sys +from preservation import verify, require, absent +base=Path('artifacts/command-handoff') +p=argparse.ArgumentParser() +p.add_argument('--name',required=True);p.add_argument('--method',required=True) +p.add_argument('--layout',choices=['tablet','phone','landscape'],default='tablet');p.add_argument('--font',type=float,default=1) +p.add_argument('--harness',default='owned-harness-v1');p.add_argument('--build',default='build-candidate-v1') +p.add_argument('--expect-failure',action='store_true') +a=p.parse_args() +require(all(re.fullmatch(r'[a-zA-Z0-9][a-zA-Z0-9-]{0,100}',x) for x in [a.name,a.harness,a.build,a.method]),'Invalid paths or method') +require(1<=a.font<=2,'Invalid font') +out=base/a.name;require(not out.exists(),'Attempt exists; inspect before repeating') +read=lambda x:json.loads(Path(x).read_text());sha=lambda x:hashlib.sha256(Path(x).read_bytes()).hexdigest() +build=read(base/a.build/'state.json');harness=read(base/a.harness/'identity.json') +require(build['completed'],'Incomplete build') +for path,digest in harness['source_hashes'].items(): + if path.endswith('.py'):require(sha(path)==digest,'Executed Python source changed') +app=base/a.build/'candidate/app-debug.apk';test=base/a.harness/'app-debug-androidTest.apk' +require(sha(app)==build['apk_hashes'][app.name] and sha(test)==harness['test_apk_sha256'],'APK mismatch') +before=verify();out.mkdir(mode=0o700) +cache=Path('/.t3/scratch/droidcast-command-catalog-27caf3/artifacts/extension-catalog/representative-001-bundles-v1/archives') +command=[sys.executable,'scripts/test-reviewed-text-input.py','--serial','emulator-5580','--avd','Tinycast_Tablet_API_36','--layout',a.layout,'--font-scale',str(a.font),'--output',str(out/'cohort'),'--apk',str(app),'--test-apk',str(test),'--classes','dev.tinycast.android.ExtensionCommandHandoffDeviceTest#'+a.method,'--expected','1','--json-archive',str(cache/'223987eaca2c894e37ada9e087669f260cda79d6a3b88ff11463f429cc952e6a.zip')] +state=dict(completed=False,pid=os.getpid(),runtime_source_commit=build['runtime_source_commit'],test_source_commit=harness['test_source_commit'],app_sha256=sha(app),test_apk_sha256=sha(test),layout=a.layout,font=a.font,method=a.method,expected_failure=a.expect_failure,collector_sha256=sha(__file__),**before) +def save():(out/'state.json').write_text(json.dumps(state,indent=2)+'\n') +save() +with (out/'host.log').open('wb') as log:r=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT,env=dict(os.environ,ANDROID_HOME='/Library/Android/sdk')) +receipt=read(out/'cohort/record.json');cleanup=receipt.get('cleanup',{}) +state.update(runner_exit_code=r.returncode,passes=receipt.get('passes',0),cleanup_checks=len(cleanup),cleanup_passed=bool(cleanup) and all(x.get('passed') for x in cleanup.values())) +save();require(state['cleanup_passed'] and absent('files/reviewed-text-fixture-lease'),'Cleanup failed; inspect retained ownership') +require(verify()==before,'Preservation changed') +state.update(same_boot=True,durable_data_unchanged=True,pre_existing_evidence_unchanged=True) +records=list((out/'cohort/captures').glob('handoff-*-record.json')) +state['native_case_records']=len(records) +state['completed']=r.returncode!=0 and state['passes']==0 if a.expect_failure else r.returncode==0 and receipt.get('completed') is True and state['passes']==1 and len(records)==1 and read(records[0]).get('passed') is True +save();require(sha(__file__)==state['collector_sha256'],'Collector changed') +print(json.dumps(state,indent=2));require(state['completed'],'Owned case did not establish intended outcome; inspect retained attempt') diff --git a/docs/validation/command-handoff/collectors/run-quick-control-v1.py b/docs/validation/command-handoff/collectors/run-quick-control-v1.py new file mode 100644 index 00000000..5ec11350 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-quick-control-v1.py @@ -0,0 +1,75 @@ +from pathlib import Path +import argparse, hashlib, json, os, re, subprocess, sys +from preservation import verify, require, absent + +base = Path('artifacts/command-handoff') +p = argparse.ArgumentParser() +p.add_argument('--app', choices=['old', 'new'], required=True) +p.add_argument('--layout', choices=['tablet', 'phone', 'landscape'], required=True) +p.add_argument('--font', type=float, default=1) +p.add_argument('--name', required=True) +args = p.parse_args() +require(re.fullmatch(r'[a-z0-9][a-z0-9-]{0,100}', args.name) and 1 <= args.font <= 2, 'Invalid cohort arguments') +out = base / args.name +require(not out.exists(), 'Attempt exists; inspect before repeating') +read = lambda path: json.loads(Path(path).read_text()) +sha = lambda path: hashlib.sha256(Path(path).read_bytes()).hexdigest() +candidate = read(base / 'build-candidate-v1/state.json') +common = read(base / 'common-v5/identity.json') +require(candidate['completed'], 'Candidate build incomplete') +for path, digest in candidate['source_hashes'].items(): + if path.endswith('.py'): + require(sha(path) == digest, 'Executed Python sources differ') +apk = base / ('common-v5' if args.app == 'old' else 'build-candidate-v1/candidate') / 'app-debug.apk' +test = base / 'common-v5/app-debug-androidTest.apk' +app_identity = common if args.app == 'old' else candidate +require(sha(apk) == app_identity['apk_hashes'][apk.name] and sha(test) == common['apk_hashes'][test.name], 'APK identity mismatch') +before = verify() +out.mkdir(mode=0o700) +cache = Path('/.t3/scratch/droidcast-command-catalog-27caf3/artifacts/extension-catalog/representative-001-bundles-v1/archives') +method = 'selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure' +command = [sys.executable, 'scripts/test-reviewed-text-input.py', '--serial', 'emulator-5580', '--avd', 'Tinycast_Tablet_API_36', + '--layout', args.layout, '--font-scale', str(args.font), '--output', str(out / 'cohort'), '--apk', str(apk), '--test-apk', str(test), + '--classes', 'dev.tinycast.android.ReviewedTextDeviceTest#' + method, '--expected', '1', + '--reviewed-translation-command', 'quick-translate', + '--json-archive', str(cache / '223987eaca2c894e37ada9e087669f260cda79d6a3b88ff11463f429cc952e6a.zip'), + '--translate-archive', str(cache / '909c8a3916ca91612bb610da257f5718af2ef25f303ea95371e907eaa1cf7d69.zip')] +state = dict(completed=False, pid=os.getpid(), app=args.app, layout=args.layout, font=args.font, + runtime_source_commit=app_identity['runtime_source_commit'], test_source_commit=common['test_source_commit'], + app_sha256=sha(apk), test_apk_sha256=sha(test), collector_sha256=sha(__file__), + preservation_helper_sha256=sha(Path(__file__).with_name('preservation.py')), **before) + +def save(): + (out / 'state.json').write_text(json.dumps(state, indent=2) + '\n') + +save() +with (out / 'host.log').open('wb') as log: + result = subprocess.run(command, stdout=log, stderr=subprocess.STDOUT, env=dict(os.environ, ANDROID_HOME='/Library/Android/sdk')) +receipt = read(out / 'cohort/record.json') +cleanup = receipt.get('cleanup', {}) +state.update(runner_exit_code=result.returncode, passes=receipt.get('passes', 0), cleanup_checks=len(cleanup), + cleanup_passed=bool(cleanup) and all(row.get('passed') for row in cleanup.values())) +save() +require(state['cleanup_passed'] and absent('files/reviewed-text-fixture-lease'), 'Cleanup failed; retain ownership and inspect') +require(verify() == before, 'Preservation differs') +state.update(same_boot=True, durable_data_unchanged=True, pre_existing_evidence_unchanged=True) +save() +records = list((out / 'cohort/captures').glob('text-' + method.lower() + '-record.json')) +require(len(records) == 1, 'Missing native case receipt') +case = read(records[0]) +state['phase_outcome'] = case.get('workflow_outcome', 'unclassified') +expected = 'blocked-command-handoff' if args.app == 'old' else 'working-observed-path' +state['expected_phase'] = expected +state['compatible_listed_workflow'] = args.app == 'new' and state['phase_outcome'] == expected +state['completed'] = result.returncode == 0 and receipt.get('completed') is True and state['passes'] == 1 and case.get('passed') is True and state['phase_outcome'] == expected +if state['completed']: + require(case['returned_to_external_caller'] and case['source_text_and_selection_unchanged'], 'Source return missing') + if args.app == 'old': + require('launchCommand is not supported on Android' in case['observed_runtime_error'], 'Wrong old boundary') + state['negative_capability_observed'] = True + else: + require(case['handoff_target'] == 'quick-translate-view' and case['child_raw_input_grant_absent'] is True and case['copy_exact'] is True, 'Missing handoff/input/Copy witness') +save() +require(sha(__file__) == state['collector_sha256'], 'Collector changed') +print(json.dumps({key: state[key] for key in ['completed', 'app', 'layout', 'font', 'passes', 'phase_outcome', 'compatible_listed_workflow', 'cleanup_checks', 'cleanup_passed']}, indent=2)) +require(state['completed'], 'Control did not establish the required phase; inspect retained attempt') diff --git a/docs/validation/command-handoff/collectors/run-quick-control-v2.py b/docs/validation/command-handoff/collectors/run-quick-control-v2.py new file mode 100644 index 00000000..335b7218 --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-quick-control-v2.py @@ -0,0 +1,75 @@ +from pathlib import Path +import argparse, hashlib, json, os, re, subprocess, sys +from preservation import verify, require, absent + +base = Path('artifacts/command-handoff') +p = argparse.ArgumentParser() +p.add_argument('--app', choices=['old', 'new'], required=True) +p.add_argument('--layout', choices=['tablet', 'phone', 'landscape'], required=True) +p.add_argument('--font', type=float, default=1) +p.add_argument('--name', required=True) +args = p.parse_args() +require(re.fullmatch(r'[a-z0-9][a-z0-9-]{0,100}', args.name) and 1 <= args.font <= 2, 'Invalid cohort arguments') +out = base / args.name +require(not out.exists(), 'Attempt exists; inspect before repeating') +read = lambda path: json.loads(Path(path).read_text()) +sha = lambda path: hashlib.sha256(Path(path).read_bytes()).hexdigest() +candidate = read(base / 'build-candidate-v2/state.json') +common = read(base / 'common-v5/identity.json') +require(candidate['completed'], 'Candidate build incomplete') +for path, digest in candidate['source_hashes'].items(): + if path.endswith('.py'): + require(sha(path) == digest, 'Executed Python sources differ') +apk = base / ('common-v5' if args.app == 'old' else 'build-candidate-v2/candidate') / 'app-debug.apk' +test = base / 'common-v5/app-debug-androidTest.apk' +app_identity = common if args.app == 'old' else candidate +require(sha(apk) == app_identity['apk_hashes'][apk.name] and sha(test) == common['apk_hashes'][test.name], 'APK identity mismatch') +before = verify() +out.mkdir(mode=0o700) +cache = Path('/.t3/scratch/droidcast-command-catalog-27caf3/artifacts/extension-catalog/representative-001-bundles-v1/archives') +method = 'selectedTranslationRunsOnlyAfterReviewAndReportsExactCopyOrServiceFailure' +command = [sys.executable, 'scripts/test-reviewed-text-input.py', '--serial', 'emulator-5580', '--avd', 'Tinycast_Tablet_API_36', + '--layout', args.layout, '--font-scale', str(args.font), '--output', str(out / 'cohort'), '--apk', str(apk), '--test-apk', str(test), + '--classes', 'dev.tinycast.android.ReviewedTextDeviceTest#' + method, '--expected', '1', + '--reviewed-translation-command', 'quick-translate', + '--json-archive', str(cache / '223987eaca2c894e37ada9e087669f260cda79d6a3b88ff11463f429cc952e6a.zip'), + '--translate-archive', str(cache / '909c8a3916ca91612bb610da257f5718af2ef25f303ea95371e907eaa1cf7d69.zip')] +state = dict(completed=False, pid=os.getpid(), app=args.app, layout=args.layout, font=args.font, + runtime_source_commit=app_identity['runtime_source_commit'], test_source_commit=common['test_source_commit'], + app_sha256=sha(apk), test_apk_sha256=sha(test), collector_sha256=sha(__file__), + preservation_helper_sha256=sha(Path(__file__).with_name('preservation.py')), **before) + +def save(): + (out / 'state.json').write_text(json.dumps(state, indent=2) + '\n') + +save() +with (out / 'host.log').open('wb') as log: + result = subprocess.run(command, stdout=log, stderr=subprocess.STDOUT, env=dict(os.environ, ANDROID_HOME='/Library/Android/sdk')) +receipt = read(out / 'cohort/record.json') +cleanup = receipt.get('cleanup', {}) +state.update(runner_exit_code=result.returncode, passes=receipt.get('passes', 0), cleanup_checks=len(cleanup), + cleanup_passed=bool(cleanup) and all(row.get('passed') for row in cleanup.values())) +save() +require(state['cleanup_passed'] and absent('files/reviewed-text-fixture-lease'), 'Cleanup failed; retain ownership and inspect') +require(verify() == before, 'Preservation differs') +state.update(same_boot=True, durable_data_unchanged=True, pre_existing_evidence_unchanged=True) +save() +records = list((out / 'cohort/captures').glob('text-' + method.lower() + '-record.json')) +require(len(records) == 1, 'Missing native case receipt') +case = read(records[0]) +state['phase_outcome'] = case.get('workflow_outcome', 'unclassified') +expected = 'blocked-command-handoff' if args.app == 'old' else 'working-observed-path' +state['expected_phase'] = expected +state['compatible_listed_workflow'] = args.app == 'new' and state['phase_outcome'] == expected +state['completed'] = result.returncode == 0 and receipt.get('completed') is True and state['passes'] == 1 and case.get('passed') is True and state['phase_outcome'] == expected +if state['completed']: + require(case['returned_to_external_caller'] and case['source_text_and_selection_unchanged'], 'Source return missing') + if args.app == 'old': + require('launchCommand is not supported on Android' in case['observed_runtime_error'], 'Wrong old boundary') + state['negative_capability_observed'] = True + else: + require(case['handoff_target'] == 'quick-translate-view' and case['child_raw_input_grant_absent'] is True and case['copy_exact'] is True, 'Missing handoff/input/Copy witness') +save() +require(sha(__file__) == state['collector_sha256'], 'Collector changed') +print(json.dumps({key: state[key] for key in ['completed', 'app', 'layout', 'font', 'passes', 'phase_outcome', 'compatible_listed_workflow', 'cleanup_checks', 'cleanup_passed']}, indent=2)) +require(state['completed'], 'Control did not establish the required phase; inspect retained attempt') diff --git a/docs/validation/command-handoff/collectors/run-regression-v1.py b/docs/validation/command-handoff/collectors/run-regression-v1.py new file mode 100644 index 00000000..53cd999e --- /dev/null +++ b/docs/validation/command-handoff/collectors/run-regression-v1.py @@ -0,0 +1,39 @@ +from pathlib import Path +import argparse, hashlib, json, os, re, subprocess, sys +from preservation import verify, require, absent +base=Path('artifacts/command-handoff') +p=argparse.ArgumentParser() +p.add_argument('--name',required=True);p.add_argument('--method',choices=['forms','detail','menus','review'],required=True) +p.add_argument('--layout',choices=['tablet','phone','landscape'],default='tablet');p.add_argument('--font',type=float,default=1) +p.add_argument('--harness',default='owned-harness-v2');p.add_argument('--build',default='build-candidate-v2') +p.add_argument('--expect-failure',action='store_true') +a=p.parse_args() +require(all(re.fullmatch(r'[a-zA-Z0-9][a-zA-Z0-9-]{0,100}',x) for x in [a.name,a.harness,a.build,a.method]),'Invalid paths or method') +require(1<=a.font<=2,'Invalid font') +out=base/a.name;require(not out.exists(),'Attempt exists; inspect before repeating') +read=lambda x:json.loads(Path(x).read_text());sha=lambda x:hashlib.sha256(Path(x).read_bytes()).hexdigest() +build=read(base/a.build/'state.json');harness=read(base/a.harness/'identity.json') +require(build['completed'],'Incomplete build') +for path,digest in harness['source_hashes'].items(): + if path.endswith('.py'):require(sha(path)==digest,'Executed Python source changed') +app=base/a.build/'candidate/app-debug.apk';test=base/a.harness/'app-debug-androidTest.apk' +require(sha(app)==build['apk_hashes'][app.name] and sha(test)==harness['test_apk_sha256'],'APK mismatch') +before=verify();out.mkdir(mode=0o700) +cache=Path('/.t3/scratch/droidcast-command-catalog-27caf3/artifacts/extension-catalog/representative-001-bundles-v1/archives') +groups={'forms':('ExtensionFormDeviceTest',['nativeConfigurationEditsValidateCancelAndRun','replacedConfigurationRejectsQueuedEditsRunAndBack','ownedNoViewReturnRejectsDisposedAndReplacedCallbacks','ownedNoViewReturnAcceptsFocusedEnterAndPreservesEscape']),'detail':('ExtensionDetailDeviceTest',['listTouchDetailPreservesQuerySelectionExactCopyAndCaller','recreationStartsAnewOwnerAndRejectsThePriorNativeCallback']),'menus':('ReadinessRegressionDeviceTest',['rapidExtensionListDownThenEnterRunsTheCurrentAction']),'review':('ReviewedTextDeviceTest',['selectedJsonRunsOnlyAfterReviewThenCopiesAndReturns','cancelBeforeRunReturnsWithoutExecutingOrSaving'])} +klass,methods=groups[a.method];classes=','.join('dev.tinycast.android.'+klass+'#'+m for m in methods) +command=[sys.executable,'scripts/test-reviewed-text-input.py','--serial','emulator-5580','--avd','Tinycast_Tablet_API_36','--layout',a.layout,'--font-scale',str(a.font),'--output',str(out/'cohort'),'--apk',str(app),'--test-apk',str(test),'--classes',classes,'--expected',str(len(methods)),'--json-archive',str(cache/'223987eaca2c894e37ada9e087669f260cda79d6a3b88ff11463f429cc952e6a.zip')] +state=dict(completed=False,pid=os.getpid(),runtime_source_commit=build['runtime_source_commit'],test_source_commit=harness['test_source_commit'],app_sha256=sha(app),test_apk_sha256=sha(test),layout=a.layout,font=a.font,method=a.method,expected_failure=a.expect_failure,collector_sha256=sha(__file__),**before) +def save():(out/'state.json').write_text(json.dumps(state,indent=2)+'\n') +save() +with (out/'host.log').open('wb') as log:r=subprocess.run(command,stdout=log,stderr=subprocess.STDOUT,env=dict(os.environ,ANDROID_HOME='/Library/Android/sdk')) +receipt=read(out/'cohort/record.json');cleanup=receipt.get('cleanup',{}) +state.update(runner_exit_code=r.returncode,passes=receipt.get('passes',0),cleanup_checks=len(cleanup),cleanup_passed=bool(cleanup) and all(x.get('passed') for x in cleanup.values())) +save();require(state['cleanup_passed'] and absent('files/reviewed-text-fixture-lease'),'Cleanup failed; inspect retained ownership') +require(verify()==before,'Preservation changed') +state.update(same_boot=True,durable_data_unchanged=True,pre_existing_evidence_unchanged=True) +records=list((out/'cohort/captures').glob('*-record.json')) +state['native_case_records']=len(records) +state['completed']=r.returncode!=0 and state['passes']==0 if a.expect_failure else r.returncode==0 and receipt.get('completed') is True and state['passes']==len(methods) +save();require(sha(__file__)==state['collector_sha256'],'Collector changed') +print(json.dumps(state,indent=2));require(state['completed'],'Owned case did not establish intended outcome; inspect retained attempt') diff --git a/docs/validation/command-handoff/collectors/verify-handoff-v1.py b/docs/validation/command-handoff/collectors/verify-handoff-v1.py new file mode 100644 index 00000000..74bd3864 --- /dev/null +++ b/docs/validation/command-handoff/collectors/verify-handoff-v1.py @@ -0,0 +1,65 @@ +from pathlib import Path +import hashlib,json,re,subprocess,xml.etree.ElementTree as E,zipfile +base=Path('artifacts/command-handoff');public=Path('docs/validation/command-handoff') +read=lambda p:json.loads(Path(p).read_text());sha=lambda b:hashlib.sha256(b).hexdigest() +def require(value,message): + if not value:raise RuntimeError(message) +c=read(public/'checkpoint.json') +for path,digest in c['public_files'].items():require(sha(Path(path).read_bytes())==digest,'Public hash differs: '+path) +for path,digest in c['source_hashes'].items(): + require(sha(Path(path).read_bytes())==digest,'Current source differs: '+path) + require(sha(subprocess.check_output(['git','show','73e719c602bc378c71df83eba34440771bc8d999:'+path]))==digest,'Frozen final source differs') +for row in c['original_public_bindings']: + path=base/row['artifact'];require(not any(p.startswith('private-') for p in path.parts),'Private original is forbidden') + data=path.read_bytes();require(sha(data)==row['original_sha256'],'Original hash differs') + if row['transformation']!='identity':data=data.decode().replace(str(Path.home()),'<user>' if Path(row['public']).suffix=='.xml' else '').encode() + require(data==Path(row['public']).read_bytes() and sha(data)==row['public_sha256'],'Publication transform differs') +for row in c['allowlisted_projections']: + value=read(base/row['artifact']);expected={k:value[k] for k in row['allowed_keys'] if k in value} + if row['cleanup_projection']:expected['cleanup']={k:{'passed':r.get('passed') is True} for k,r in value['cleanup'].items()} + require(expected==read(row['public']),'Projection differs') +for path,digest in c['retained_capture_hashes'].items():require(sha((base/path).read_bytes())==digest,'Capture original differs') +expected_total=pass_total=cleanup_total=final_pass=final_cleanup=0 +for row in c['cohorts']: + dest=public/'cohorts'/row['name'];state=read(dest/'state.json');runner=read(dest/'runner-record.json');log=(dest/'tests.log').read_text() + passes=len(re.findall(r'^INSTRUMENTATION_STATUS_CODE: 0$',log,re.M));require(passes==row['passes']==runner['passes'],'JUnit count differs') + require(runner['installed_apks_match'] and runner['apk_sha256']==row['app_sha256'] and runner['test_apk_sha256']==row['test_apk_sha256'],'Installed APK identity differs') + require(all(v['passed'] for v in runner['cleanup'].values()),'Restoration failed') + for key,name in [('apk_sha256','app-debug.apk'),('test_apk_sha256','app-debug-androidTest.apk')]:require(sha((base/row['name']/'cohort'/name).read_bytes())==runner[key],'Cohort archive differs') + if row['category']=='final-positive': + require(state['completed'] and passes==runner['expected'],'Incomplete positive') + require(row['app_sha256']=='2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d','Wrong final runtime') + final_pass+=passes;final_cleanup+=len(runner['cleanup']) + for p in (dest/'cases').glob('*-record.json'):require(read(p).get('passed') is True,'Failed native case in positive cohort') + if row['name'].startswith('final-quick-'): + cases=list((dest/'cases').glob('*-record.json'));require(len(cases)==1,'Missing real workflow receipt');case=read(cases[0]) + require(case['workflow_outcome']=='working-observed-path' and case['handoff_target']=='quick-translate-view' and case['child_raw_input_grant_absent'] and case['copy_exact'] and case['returned_to_external_caller'] and case['source_text_and_selection_unchanged'],'Missing actual handoff/Copy/source witness') + if row['name'].startswith('protocol-'): + case=read(next((dest/'cases').glob('*-record.json')));probe=case['paused_parent_probe'] + require(probe['acks']==1 and probe['copiesAttempted']==1 and probe['copiesResolved']==0 and probe['statusesAttempted']==1 and probe['publicationsAttempted']==1,'Missing obsolete-parent witness') + if row['category']=='final-matched-negative': + needle='Disposed Back must not close the recreated child' if 'recreation' in row['name'] else 'Disposed Preferences must not replace the restored command' + require(passes==0 and needle in log,'Wrong intended negative') + expected_total+=runner['expected'];pass_total+=passes;cleanup_total+=len(runner['cleanup']) +require((expected_total,pass_total,cleanup_total)==(c['total_executions'],c['total_passes'],c['total_cleanup_checks']),'Totals differ') +require((final_pass,final_cleanup)==(c['final_native_executions'],c['final_cleanup_checks']),'Final totals differ') +for folder in ['build-candidate-v1','build-candidate-v2']: + value=read(public/'identities'/(folder+'.json')) + for path,digest in value['source_hashes'].items():require(sha(subprocess.check_output(['git','show',value['source_commit']+':'+path]))==digest,'Historical build source differs') + for name,digest in value['apk_hashes'].items():require(sha((base/folder/'candidate'/name).read_bytes())==digest,'Build APK differs') +for folder in ['owned-harness-v1','owned-harness-v2','owned-harness-v3']: + value=read(public/'identities'/(folder+'.json')) + for path,digest in value['source_hashes'].items():require(sha(subprocess.check_output(['git','show',value['test_source_commit']+':'+path]))==digest,'Harness source differs') + require(sha((base/folder/'app-debug-androidTest.apk').read_bytes())==value['test_apk_sha256'],'Harness APK differs') +assets={} +for label,path in [('old',base/'common-v5/app-debug.apk'),('current',base/'build-candidate-v2/candidate/app-debug.apk')]: + with zipfile.ZipFile(path) as z:assets[label]={n:sha(z.read(n)) for n in z.namelist() if n.startswith('assets/') and not n.endswith('/')} +require(len(assets['old'])==10 and assets['old']==assets['current'],'Packaged asset changed') +for path in public.rglob('*.xml'):E.parse(path) +for frame in c['selected_frame_sets']: + path=public/'cohorts'/frame['cohort']/'captures'/(frame['stem']+'.xml');require(b'\r\n' in path.read_bytes(),'Raw capture CRLF changed') +reports=list((public/'checks/build-candidate-v2/reports/jvm').glob('TEST-*.xml'));cases=[] +for p in reports: + root=E.parse(p).getroot();require(not root.findall('.//failure') and not root.findall('.//error') and not root.findall('.//skipped'),'JVM outcome failed');cases.extend(root.findall('testcase')) +require(len(cases)==289,'JVM case count differs') +print(json.dumps(dict(verified=True,public_files=len(c['public_files']),sources=len(c['source_hashes']),bindings=len(c['original_public_bindings']),projections=len(c['allowlisted_projections']),capture_hashes=len(c['retained_capture_hashes']),frames=len(c['selected_frame_sets']),parseable_xml=len(list(public.rglob('*.xml'))),final_executions=final_pass,final_cleanup=final_cleanup,total_executions=expected_total,total_passes=pass_total,total_cleanup=cleanup_total),indent=2)) diff --git a/docs/validation/command-handoff/identities/build-candidate-v1.json b/docs/validation/command-handoff/identities/build-candidate-v1.json new file mode 100644 index 00000000..3c2ebaf3 --- /dev/null +++ b/docs/validation/command-handoff/identities/build-candidate-v1.json @@ -0,0 +1,569 @@ +{ + "completed": true, + "source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "test_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "4ffe86bc2ff77c53afa708b421c76817ff96e18acf7d62c3592f00ad041ca6a7", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "0d19429376081de7f4f7b5ebe0d954a2b3aa82bc15d9c03af10184412f33e9a1", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "2fbdaff64c1e8660025bf12bf3361713caa8175b4c9313139d6bc141fa93f726", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "commands": [ + [ + "./gradlew", + ":app:testDebugUnitTest", + ":app:assembleDebug", + ":app:assembleDebugAndroidTest", + ":app:lintDebug", + "-PdroidcastTestBuildType=debug", + "-PdroidcastBuildCommit=10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "--console=plain" + ], + [ + "./gradlew", + ":app:assembleBenchmark", + ":app:assembleBenchmarkAndroidTest", + ":app:lintBenchmark", + "-PdroidcastTestBuildType=benchmark", + "-PdroidcastBuildCommit=10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "--console=plain" + ] + ], + "runs": [ + { + "variant": "debug", + "exit_code": 0 + }, + { + "variant": "benchmark", + "exit_code": 0 + } + ], + "apk_hashes": { + "app-debug-androidTest.apk": "c770a1b8612ac4de2aec989083684f792f6ce45fba76dcd10652e65fee0f5be8", + "app-debug.apk": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254" + }, + "benchmark_apk_hashes": { + "app-benchmark-androidTest.apk": "f675ea2ee6e623774ec9102ad64da03d7712eec51461cd747012ed2273e1542c", + "app-benchmark.apk": "dd9b7465cab9e84df6734258d267e0e536765ebd38e84ef27b7b03d4b1ad147e" + }, + "lint": { + "debug": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + }, + "benchmark": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + } + }, + "jvm_cases": [ + "dev.tinycast.android.BackupPlannerTest#conflictingEffectiveAliasesRejectTheWholePlan", + "dev.tinycast.android.BackupPlannerTest#clipMergeCannotSilentlyTrimExistingData", + "dev.tinycast.android.BackupPlannerTest#preferencesMergeKeepsExistingOverridesAndRank", + "dev.tinycast.android.BackupPlannerTest#noOrUnavailableCategoryCannotBeApplied", + "dev.tinycast.android.BackupPlannerTest#deduplicatedContentRemapsItsKeyboardBinding", + "dev.tinycast.android.BackupPlannerTest#remappedAliasesCannotSilentlyDiscardConflictingValues", + "dev.tinycast.android.BackupPlannerTest#remappedRankingUsesMaximumRatherThanInputOrder", + "dev.tinycast.android.BackupPlannerTest#contentDuplicatesRemapPinsAliasesAndLearning", + "dev.tinycast.android.BackupPlannerTest#oldBackupOrUnselectedShortcutCategoryKeepsCurrentBindings", + "dev.tinycast.android.BackupPlannerTest#remappingCannotDiscardDistinctKeyboardBindings", + "dev.tinycast.android.BackupPlannerTest#preservedDocumentBindingsBlockCollisionsForMergeAndReplace", + "dev.tinycast.android.BackupPlannerTest#replacementTouchesOnlySelectedCategories", + "dev.tinycast.android.BackupPlannerTest#identityWinsWhenAnEarlierItemAlsoMatchesIncomingContent", + "dev.tinycast.android.BackupPlannerTest#mergeIsIdempotentAndKeepsConflictingIdentity", + "dev.tinycast.android.BackupPlannerTest#preservedDocumentModifierSidesBlockOverlapsButAllowDistinctSides", + "dev.tinycast.android.CalculatorActionsTest#answersBeyondTheParserLimitRemainCopyableWithoutAnUnusableChain", + "dev.tinycast.android.CalculatorActionsTest#modifiedEnterDefaultsDoNotReserveAnExistingConfigurableBinding", + "dev.tinycast.android.CalculatorActionsTest#explicitQuantityLiteralsAcceptOnlyKnownUnitsAndFiniteValues", + "dev.tinycast.android.CalculatorActionsTest#acceleratorsConsumeHeldRepeatsAndReleaseAfterTheResultChanges", + "dev.tinycast.android.CalculatorActionsTest#scalarChainingKeepsExplicitIntentAndAllowsTheNextOperation", + "dev.tinycast.android.CalculatorActionsTest#ordinaryCommandsAndWebResultsDoNotOfferCalculatorActions", + "dev.tinycast.android.CalculatorActionsTest#sharedResultIdsCannotAuthorizeChangedQueryValueSelectionCategoryOrRoute", + "dev.tinycast.android.CalculatorActionsTest#copyingUsesTheSelectedPayloadWithoutRoundingOrReevaluatingIt", + "dev.tinycast.android.CalculatorActionsTest#functionsAndUnitsRetainTheirExpressionAndAnswer", + "dev.tinycast.android.CalculatorActionsTest#quantitiesChainWithoutDiscardingTheirUnit", + "dev.tinycast.android.CalculatorActionsTest#fullCalculationUsesTheDisplayedMultiplicationAndStripsOnlyTheModePrefix", + "dev.tinycast.android.CommandEngineTest#constantsCanImmediatelyPrecedeAsciiMultiplication", + "dev.tinycast.android.CommandEngineTest#knownConstantOperandsDoNotNeedADecimalDigitAndWordsStillFail", + "dev.tinycast.android.CommandEngineTest#xInWordsAndIncompleteExpressionsRemainSearches", + "dev.tinycast.android.CommandEngineTest#rightAssociativePower", + "dev.tinycast.android.CommandEngineTest#pinsLeadEmptyQuery", + "dev.tinycast.android.CommandEngineTest#exactAndPrefixRankAboveSubsequence", + "dev.tinycast.android.CommandEngineTest#arithmeticPrecedence", + "dev.tinycast.android.CommandEngineTest#exactAliasWins", + "dev.tinycast.android.CommandEngineTest#functions", + "dev.tinycast.android.CommandEngineTest#xMultiplicationRetainsPrecedenceAndFunctionNames", + "dev.tinycast.android.CommandEngineTest#refusesOversizedExpression", + "dev.tinycast.android.CommandEngineTest#arithmeticOperatorsTriggerRootCalculation", + "dev.tinycast.android.CommandEngineTest#invalidMathDoesNotCrashOrProduceNan", + "dev.tinycast.android.CommandEngineTest#localeIndependentOutput", + "dev.tinycast.android.CommandEngineTest#stableOrderingAndUsage", + "dev.tinycast.android.CommandEngineTest#explicitCalculatorModeAcceptsNumbers", + "dev.tinycast.android.CommandEngineTest#unaryMinusPrecedence", + "dev.tinycast.android.CommandEngineTest#convertsTimeAndData", + "dev.tinycast.android.CommandEngineTest#functionsConstantsAndConversionsKeepTheirIntentionalSearchBehavior", + "dev.tinycast.android.CommandEngineTest#percentages", + "dev.tinycast.android.CommandEngineTest#multiplicationDisplayUsesTheRealSymbolAndKeepsResultsNumeric", + "dev.tinycast.android.CommandEngineTest#convertsTemperature", + "dev.tinycast.android.CommandEngineTest#calculatorPrefixAndUnicodeOperators", + "dev.tinycast.android.CommandEngineTest#ordinaryNumbersRemainRootSearches", + "dev.tinycast.android.CommandEngineTest#rejectsIncompatibleUnits", + "dev.tinycast.android.CommandEngineTest#convertsLength", + "dev.tinycast.android.CommandEngineTest#fuzzySubsequenceMatches", + "dev.tinycast.android.EmojiCatalogTest#filtersFavoritesAndRecentsHaveDeterministicOrder", + "dev.tinycast.android.EmojiCatalogTest#namesAliasesKeywordsAndMultipleWordsAreSearchable", + "dev.tinycast.android.EmojiCatalogTest#malformedCatalogsAreRejected", + "dev.tinycast.android.EmojiCatalogTest#bundledCatalogPreservesSequencesAndStableIdentities", + "dev.tinycast.android.EmojiCatalogTest#exactMatchesOutrankHistoryAndRecentIsBoundedWithoutDuplicates", + "dev.tinycast.android.ExtensionCommandLaunchTest#argumentConsumersCannotChangeThePreparedValues", + "dev.tinycast.android.ExtensionCommandLaunchTest#undeclaredNonstringAndMissingRequiredArgumentsAreRejected", + "dev.tinycast.android.ExtensionCommandLaunchTest#ordinaryEmptyRequestDoesNotInventContextOrFallback", + "dev.tinycast.android.ExtensionCommandLaunchTest#crossExtensionRoutingAndBackgroundLaunchesAreRejected", + "dev.tinycast.android.ExtensionCommandLaunchTest#foregroundContextAndArgumentsArriveAsSeparateCopiedLaunchProperties", + "dev.tinycast.android.ExtensionCommandLaunchTest#requestIsBoundedBeforeParsingByUnitsAndUtf8Bytes", + "dev.tinycast.android.ExtensionCommandLaunchTest#requiredPreferencesAndDropdownSelectionsMustBeConfigured", + "dev.tinycast.android.ExtensionCommandLaunchTest#unsafeNamesAndUnknownOptionsNeverBecomeLaunches", + "dev.tinycast.android.ExtensionCommandLaunchTest#argumentCountsAndAmbiguousDefinitionsAreBounded", + "dev.tinycast.android.ExtensionCommandLaunchTest#contextMustBeAnObjectAndNestedCollectionsAreBounded", + "dev.tinycast.android.ExtensionCommandLaunchTest#parserDepthIsCheckedBeforeJsonAllocationAndQuotedBracketsRemainData", + "dev.tinycast.android.ExtensionDetailImageTimeoutTest#deadlineCancelsThePendingWorkBeforeReportingAnImageFailure", + "dev.tinycast.android.ExtensionDetailImageTimeoutTest#successfulWorkRetainsItsResult", + "dev.tinycast.android.ExtensionDetailImageTimeoutTest#cancellationByTheViewOwnerRemainsCancellation", + "dev.tinycast.android.ExtensionFormContractTest#reusedNativeIdsCannotChangeTheirLogicalFieldOrControlType", + "dev.tinycast.android.ExtensionFormContractTest#rerendersDoNotDuplicateFocusAndBlur", + "dev.tinycast.android.ExtensionFormContractTest#anExplicitEmptyValuedOptionKeepsItsOwnTitle", + "dev.tinycast.android.ExtensionFormContractTest#clearingAnOutgoingFormDropsItsPendingFocusWithoutDispatching", + "dev.tinycast.android.ExtensionFormContractTest#changedOptionMeaningInvalidatesItsCapturedChoice", + "dev.tinycast.android.ExtensionFormContractTest#aNewOptionAtTheSamePositionCannotInheritAnOldMenuChoice", + "dev.tinycast.android.ExtensionFormContractTest#reorderingTheSameOptionsDoesNotChangeTheirIdentity", + "dev.tinycast.android.ExtensionFormContractTest#ordinaryRerendersKeepTheSameFieldAuthority", + "dev.tinycast.android.ExtensionFormContractTest#aRemovedFieldCannotReceiveFocusOrAStaleBlur", + "dev.tinycast.android.ExtensionFormContractTest#selectedTitlesNeverReplaceTheUnderlyingSubmittedValue", + "dev.tinycast.android.ExtensionFormContractTest#aMissingSelectionHasAnExplicitLabelWithoutInventingANewValue", + "dev.tinycast.android.ExtensionFormContractTest#reentrantFocusFromBlurSupersedesTheOutgoingTransition", + "dev.tinycast.android.ExtensionFormContractTest#duplicateReadableTitlesStillIdentifyDistinctValues", + "dev.tinycast.android.ExtensionFormContractTest#anOutgoingBlurCannotClearTheNewerFocusedField", + "dev.tinycast.android.ExtensionFormContractTest#aReplacementFieldWithTheSameLogicalIdRejectsTheOldNativeCallback", + "dev.tinycast.android.ExtensionFormContractTest#blurValidationCanRemoveTheNextFieldBeforeItReceivesFocus", + "dev.tinycast.android.ExtensionFormContractTest#identicalLogicalIdsInAnotherRootCannotInheritAQueuedFieldEvent", + "dev.tinycast.android.ExtensionFormFileImportTest#aggregateLimitsRollBackTheWholeSelection", + "dev.tinycast.android.ExtensionFormFileImportTest#cleanupDoesNotFollowLinksToOtherData", + "dev.tinycast.android.ExtensionFormFileImportTest#directoriesRespectChoicePolicyAndRejectProviderCycles", + "dev.tinycast.android.ExtensionFormFileImportTest#actualStreamBytesAreBoundedEvenWhenSizeMetadataIsMissing", + "dev.tinycast.android.ExtensionFormFileImportTest#cancellationAfterAReadDiscardsTheUndeliveredCopy", + "dev.tinycast.android.ExtensionFormFileImportTest#aSelectedDirectoryRetainsItsHierarchyAndExactLeafBytes", + "dev.tinycast.android.ExtensionFormFileImportTest#losingTheCleanupOwnerRetainsDataUntilOwnershipIsRecovered", + "dev.tinycast.android.ExtensionFormFileImportTest#aProviderThatMakesNoReadProgressDoesNotSpinOrLeaveACopy", + "dev.tinycast.android.ExtensionFormFileImportTest#recoveryRemovesOnlyNonceOwnedOrphansFromAnEarlierProcess", + "dev.tinycast.android.ExtensionFormFileImportTest#recoveryLeavesLiveRequestsAndDeliveredImportsAlone", + "dev.tinycast.android.ExtensionFormFileImportTest#traversalNamesNeverBecomeDestinationPaths", + "dev.tinycast.android.ExtensionFormFileImportTest#anUndeliveredCommitCanBeDiscardedWithoutChangingUnrelatedData", + "dev.tinycast.android.ExtensionFormFileImportTest#aLinkedReplacementParentCannotReceiveCommitOrCleanup", + "dev.tinycast.android.ExtensionFormFileImportTest#selectedBytesAndUnicodeNamesAreExactAndRetainedCopiesStayReadable", + "dev.tinycast.android.ExtensionFormFileImportTest#storageRootRejectsTraversalAndLinkedImportDirectories", + "dev.tinycast.android.ExtensionFormSubmissionTest#submitBlurUsesTheLatestEditExactlyOnceAndAllowsRefocus", + "dev.tinycast.android.ExtensionFormSubmissionTest#aMissingOrDisposedFormCannotPrepareSubmission", + "dev.tinycast.android.ExtensionFormSubmissionTest#disposalDuringBlurInvalidatesTheOutgoingSubmit", + "dev.tinycast.android.ExtensionFormSubmissionTest#aReentrantSuccessorCannotInheritTheOutgoingRequest", + "dev.tinycast.android.ExtensionFormSubmissionTest#changingTheCallbackForTheSameOwnerAlsoInvalidatesPreparation", + "dev.tinycast.android.ExtensionFormSubmissionTest#oldDisposalCannotRemoveTheCurrentFormCallback", + "dev.tinycast.android.ExtensionFormSubmissionTest#aRemovedFieldCannotReceiveSubmitBlur", + "dev.tinycast.android.ExtensionFormTypedValuesTest#exactInstantAndFractionalSecondsSurviveParsing", + "dev.tinycast.android.ExtensionFormTypedValuesTest#tagChangesPreserveExactOrderedValuesAndDoNotInventSelections", + "dev.tinycast.android.ExtensionFormTypedValuesTest#calendarPickerLabelsDoNotShiftInNonUtcZonesOrBefore1970", + "dev.tinycast.android.ExtensionFormTypedValuesTest#datetimeBoundsAreInclusiveAtTheExactInstant", + "dev.tinycast.android.ExtensionFormTypedValuesTest#anAmbiguousUneditedWallTimeKeepsItsExistingOffsetAndPrecision", + "dev.tinycast.android.ExtensionFormTypedValuesTest#absentDatesAreDistinctFromMalformedValuesAndKinds", + "dev.tinycast.android.ExtensionFormTypedValuesTest#aNonexistentDstWallTimeIsRejectedInsteadOfShifted", + "dev.tinycast.android.ExtensionFormTypedValuesTest#dateBoundsIncludeTheWholeLocalDayRatherThanOnlyTheirInstants", + "dev.tinycast.android.ExtensionFormTypedValuesTest#dateOnlyUsesTheFullDayMarkerAtLocalStartAndRejectsASkippedDay", + "dev.tinycast.android.ExtensionFormValuesTest#disposalDropsAllEditorValues", + "dev.tinycast.android.ExtensionFormValuesTest#removedAndUnregisteredOwnersCannotAdoptAnotherFieldValue", + "dev.tinycast.android.ExtensionFormValuesTest#aNewPublicationCanTransformOrRejectTheNativeEdit", + "dev.tinycast.android.ExtensionFormValuesTest#booleanFalseIsAnEventValueRatherThanMissingData", + "dev.tinycast.android.ExtensionFormValuesTest#fieldsCannotBorrowEachOthersPendingValues", + "dev.tinycast.android.ExtensionFormValuesTest#samePublicationDoesNotOverwriteAnEditBeforeBlur", + "dev.tinycast.android.ExtensionGridContractTest#initialRemoteRequestWinsOverTheAutomaticFallback", + "dev.tinycast.android.ExtensionGridContractTest#emptySectionsDoNotAddSlotsAndTitledSectionsKeepOneHeading", + "dev.tinycast.android.ExtensionGridContractTest#aNewOrRemovedRequestReplacesThePendingOne", + "dev.tinycast.android.ExtensionGridContractTest#missingRequestRemainsPendingUntilItsItemArrives", + "dev.tinycast.android.ExtensionGridContractTest#aRemovedLocalItemFallsBackWithoutResurrectingAnAppliedRequest", + "dev.tinycast.android.ExtensionGridContractTest#changedRemoteRequestWinsOverAnExistingSelection", + "dev.tinycast.android.ExtensionGridContractTest#anAppliedRequestDoesNotUndoLocalNavigation", + "dev.tinycast.android.ExtensionGridContractTest#untitledSectionsHaveAFullSpanBoundaryAfterTheFirstSection", + "dev.tinycast.android.ExtensionGridNavigationTest#sectionHeadersAndRaggedRowsDoNotStealSelection", + "dev.tinycast.android.ExtensionGridNavigationTest#homeEndEmptyAndStaleIndicesAreSafe", + "dev.tinycast.android.ExtensionGridNavigationTest#assetsResolveInsidePackageAndEscapesAreRejected", + "dev.tinycast.android.ExtensionGridNavigationTest#aspectRatiosUseOnlySupportedFiniteValues", + "dev.tinycast.android.ExtensionGridNavigationTest#adaptiveColumnsRespectUsableTouchWidth", + "dev.tinycast.android.ExtensionGridNavigationTest#fourWayNavigationUsesVisualRowsAndClampsEdges", + "dev.tinycast.android.ExtensionHttpTest#plaintextIsRejectedBeforeCreatingATransport", + "dev.tinycast.android.ExtensionHttpTest#boundedBodyAlwaysClosesTheConnection", + "dev.tinycast.android.ExtensionHttpTest#cancellationDisconnectsAReadThatIgnoresThreadInterruption", + "dev.tinycast.android.ExtensionHttpTest#credentialRedirectCannotChangePorts", + "dev.tinycast.android.ExtensionHttpTest#absoluteDeadlineStopsAStreamThatKeepsDeliveringBytes", + "dev.tinycast.android.ExtensionHttpTest#repeatedCommandScopeCancellationReleasesEveryTransport", + "dev.tinycast.android.ExtensionHttpTest#completedResponseContainsNoLiveConnection", + "dev.tinycast.android.ExtensionMarkdownModelTest#cancellationAfterParserLimitIsNotConvertedToAnUnavailableDocument", + "dev.tinycast.android.ExtensionMarkdownModelTest#referenceLinksResolveWithoutChangingTargetsOrTitles", + "dev.tinycast.android.ExtensionMarkdownModelTest#oversizedSourcesAndNodeCountsDoNotProducePartialDocuments", + "dev.tinycast.android.ExtensionMarkdownModelTest#tableCellBudgetAllowsItsBoundaryAndRejectsTheNextPaddedRow", + "dev.tinycast.android.ExtensionMarkdownModelTest#numericLineFeedsStayTextWhileExplicitBreaksAndCodeKeepTheirLines", + "dev.tinycast.android.ExtensionMarkdownModelTest#quotesAndDividersRemainSeparateBlocks", + "dev.tinycast.android.ExtensionMarkdownModelTest#fencedAndIndentedCodeKeepSpacesTabsAndBlankLines", + "dev.tinycast.android.ExtensionMarkdownModelTest#nestedListsPreserveStartingNumberAndParagraphs", + "dev.tinycast.android.ExtensionMarkdownModelTest#cancellationIsObservedBeforeParsing", + "dev.tinycast.android.ExtensionMarkdownModelTest#compactPaddedTableLimitBecomesAnUnavailableDocument", + "dev.tinycast.android.ExtensionMarkdownModelTest#escapesEntitiesAndLineBreaksFollowCommonMark", + "dev.tinycast.android.ExtensionMarkdownModelTest#tablesKeepHeaderAlignmentCodeAndCellValues", + "dev.tinycast.android.ExtensionMarkdownModelTest#headingAndNestedMarksKeepUnicodeAndCombiningText", + "dev.tinycast.android.ExtensionMarkdownModelTest#inlineCodeKeepsItsOwnWhitespaceAndMarks", + "dev.tinycast.android.ExtensionMarkdownModelTest#linkedImagesPreserveAlternativeAndRenderParameters", + "dev.tinycast.android.ExtensionMarkdownModelTest#strikeAndRawHtmlNeverBecomeExecutableMarkup", + "dev.tinycast.android.ExtensionMetadataVisualsTest#freshlySerializedAdaptiveIconsRetainTheSameVisualValue", + "dev.tinycast.android.ExtensionMetadataVisualsTest#changedSourceMaskAndTintDoNotAdoptThePreviousVisualIdentity", + "dev.tinycast.android.ExtensionMetadataVisualsTest#adaptiveColorIdentityUsesTheSameShadeAsItsCurrentRenderer", + "dev.tinycast.android.ExtensionSelectionDeliveryTest#eventAndRenderDeliverEachSelectionOnlyOnceBeforeAction", + "dev.tinycast.android.ExtensionSelectionDeliveryTest#initialEmptySelectionAndDifferentRootsStillNotify", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationDuringThePostCommitReadKeepsTheSavedFoldersGrant", + "dev.tinycast.android.FolderGrantTransactionTest#failedConfigurationWriteRollsBackTheNewGrant", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationCannotReleaseAPreexistingReadGrant", + "dev.tinycast.android.FolderGrantTransactionTest#failedRemovalWriteRetainsTheGrantForTheExistingConfiguration", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationWhenCommitReturnsKeepsTheSavedFoldersGrant", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationWhenRemovalReturnsCannotSkipItsGrantRelease", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationWhenAcquisitionReturnsRollsBackTheNewGrant", + "dev.tinycast.android.FolderGrantTransactionTest#successfulCommitTransfersOwnershipToTheConfiguration", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationBeforeTakingDoesNotAcquireOrReleaseAGrant", + "dev.tinycast.android.FolderGrantTransactionTest#cancelledRemovalBeforeTheWriteRetainsTheExistingGrant", + "dev.tinycast.android.FolderGrantTransactionTest#replacementReaderCannotSeeTheGrantBeforeValidationRollback", + "dev.tinycast.android.FolderGrantTransactionTest#failedValidationRollsBackOnlyTheNewGrant", + "dev.tinycast.android.FolderGrantTransactionTest#unknownPostRenameResultRetainsTheGrantBeforeReplacementReads", + "dev.tinycast.android.FolderIndexTest#resultsAreBoundedAndQueriesCanBeCancelled", + "dev.tinycast.android.FolderIndexTest#identityUsesProviderAndPersistentDocumentId", + "dev.tinycast.android.FolderIndexTest#typesRespectDirectoriesAndNativeMime", + "dev.tinycast.android.FolderIndexTest#hiddenNamesRankAfterVisibleNamesAtEqualScore", + "dev.tinycast.android.FolderIndexTest#filenameMatchesOutrankPathOnlyMatches", + "dev.tinycast.android.FolderIndexTest#overlappingScopesDoNotDuplicateAnIdentity", + "dev.tinycast.android.FolderIndexTest#emptySearchUsesModifiedDateWithStableOrdering", + "dev.tinycast.android.ModifierTapTest#imeWindowChangeDoesNotCancelButAppAndUnknownWindowsDo", + "dev.tinycast.android.ModifierTapTest#malformedModifierIdentitiesFailClosed", + "dev.tinycast.android.ModifierTapTest#repeatsCancelFirstAndSecondTap", + "dev.tinycast.android.ModifierTapTest#bindingAndConnectionEpochChangesDiscardEarlierTap", + "dev.tinycast.android.ModifierTapTest#twoCompletePairsDispatchExactlyOnceOnSecondRelease", + "dev.tinycast.android.ModifierTapTest#sideConflictsAreRejectedAcrossTargetsWithoutRejectingDistinctSides", + "dev.tinycast.android.ModifierTapTest#ordinaryTypingAndChordsCancelBothBeforeAndDuringSecondPress", + "dev.tinycast.android.ModifierTapTest#delayedWindowNotificationBeforeFirstKeyAlsoPreservesAnInProgressFirstPress", + "dev.tinycast.android.ModifierTapTest#simultaneousModifiersAndAdditionalMetaStateCancel", + "dev.tinycast.android.ModifierTapTest#ordinaryCtrlChordDownAndUpStillPassThroughTheChordEngine", + "dev.tinycast.android.ModifierTapTest#exactlyOneOfServiceAndForegroundObserversCanDispatchTheSameEvents", + "dev.tinycast.android.ModifierTapTest#missingMismatchedAndDuplicateReleasesCannotActivate", + "dev.tinycast.android.ModifierTapTest#inclusiveTimingBoundariesAreDeterministic", + "dev.tinycast.android.ModifierTapTest#allFourModifierFamiliesAndBothSidesHaveStableIdentities", + "dev.tinycast.android.ModifierTapTest#enteringAndLeavingRecorderWithoutKeyEventsStillDiscardsEarlierTap", + "dev.tinycast.android.ModifierTapTest#differentDeviceOrDifferentPhysicalModifierCannotCompleteAPair", + "dev.tinycast.android.ModifierTapTest#delayedOldWindowNotificationCannotCancelNewerKeysFromCapturedTrace", + "dev.tinycast.android.ModifierTapTest#cancellationStaleDeliveryAndNonmonotonicTimesClearPendingGesture", + "dev.tinycast.android.ModifierTapTest#windowChangesDuringEitherTapStillCancelIncludingUnknownAndEqualTime", + "dev.tinycast.android.ModifierTapTest#eitherSideAndSpecificSideDispatchUseTheActualPersistedIdentity", + "dev.tinycast.android.ModifierTapTest#explicitResetDiscardsPartialGestureAcrossFocusConfigurationOrConnectionChanges", + "dev.tinycast.android.ModifierTapTest#pauseAndOwnershipTransferNeverCompleteAPartialTap", + "dev.tinycast.android.ModifierTapTest#holdsAndTooSlowSecondPressNeverDispatch", + "dev.tinycast.android.PaletteMenuOwnershipTest#focusedMenuTransitionInvalidatesAnInProgressPairOnlyOnce", + "dev.tinycast.android.PaletteMenuOwnershipTest#inactiveCleanupDoesNotCancelKeysInTheNewWindow", + "dev.tinycast.android.PaletteMenuOwnershipTest#outgoingOwnerCannotCloseOrDetachReplacementMenu", + "dev.tinycast.android.PaletteScrollHistoryTest#detachedLayoutDoesNotScrollOrForgetTheLastMeasuredViewport", + "dev.tinycast.android.ReviewedTextInputTest#authority_is_bound_to_both_the_original_owner_and_target", + "dev.tinycast.android.ReviewedTextInputTest#a_char_sequence_cannot_bypass_the_limit_by_lying_about_its_length", + "dev.tinycast.android.ReviewedTextInputTest#invalid_replacements_revoke_an_already_approved_input", + "dev.tinycast.android.ReviewedTextInputTest#diagnostics_and_errors_do_not_echo_input_content", + "dev.tinycast.android.ReviewedTextInputTest#receiving_copies_mutable_text_without_normalizing_unicode_or_whitespace", + "dev.tinycast.android.ReviewedTextInputTest#cancellation_clears_only_the_current_review", + "dev.tinycast.android.ReviewedTextInputTest#a_changed_command_rejects_a_retained_run_callback_without_consuming_the_review", + "dev.tinycast.android.ReviewedTextInputTest#releasing_an_outgoing_input_does_not_clear_a_new_review_or_invocation", + "dev.tinycast.android.ReviewedTextInputTest#a_queued_cancel_from_the_review_cannot_revoke_the_approved_invocation", + "dev.tinycast.android.ReviewedTextInputTest#whitespace_is_valid_selection_text_and_share_has_no_writable_source", + "dev.tinycast.android.ReviewedTextInputTest#wrong_types_are_rejected_without_calling_their_to_string", + "dev.tinycast.android.ReviewedTextInputTest#an_outgoing_review_cannot_approve_or_change_its_replacement", + "dev.tinycast.android.ReviewedTextInputTest#approval_requires_a_chosen_command_and_consumes_the_current_review_once", + "dev.tinycast.android.ReviewedTextInputTest#size_limit_counts_utf16_units_and_accepts_the_exact_boundary", + "dev.tinycast.android.ShortcutReadinessTest#reconnectEpochRejectsAProbeEvenWithoutAnIntermediateFrame", + "dev.tinycast.android.ShortcutReadinessTest#armedRoutingRejectsStaleConnectionsAndExpiredOrDifferentChords", + "dev.tinycast.android.ShortcutReadinessTest#absentChordUnknownApprovalAndDisconnectStayExplicit", + "dev.tinycast.android.ShortcutReadinessTest#deadlinesRejectLateEventsAndOldTimeoutsDoNotExpireNewChecks", + "dev.tinycast.android.ShortcutReadinessTest#onlyTheFilteredCurrentPaletteChordCanCompleteACheckOnce", + "dev.tinycast.android.ShortcutReadinessTest#aSavedChordAndApprovalAloneDoNotClaimReadiness", + "dev.tinycast.android.ShortcutReadinessTest#cancelRemovesTheExpectedChordAndRejectsLateResults", + "dev.tinycast.android.ShortcutReadinessTest#lateDisconnectCannotClearANewerServiceConnection", + "dev.tinycast.android.ShortcutReadinessTest#changedAndClearedBindingsInvalidateTheCheck", + "dev.tinycast.android.ShortcutTest#duplicateBindingsAndEphemeralTargetsAreRejected", + "dev.tinycast.android.ShortcutTest#devicesAreTrackedSeparatelyAndDisconnectedDevicesAreCleared", + "dev.tinycast.android.ShortcutTest#matchingDownAndUpAreConsumedEvenAfterModifiersAreReleased", + "dev.tinycast.android.ShortcutTest#invocationTokensAreOneUseAndExpireBeforeAndAfterConsumption", + "dev.tinycast.android.ShortcutTest#outstandingInvocationTokensAreBounded", + "dev.tinycast.android.ShortcutTest#plainTypingAndSystemOrEditorConflictsAreRejected", + "dev.tinycast.android.ShortcutTest#recordingPauseAndRebindingPreserveAlreadyConsumedReleases", + "dev.tinycast.android.ShortcutTest#defaultAndDisabledConfigurationsAreValid", + "dev.tinycast.android.ShortcutTest#unrelatedTypingAndUnboundChordsPassBothEnds", + "dev.tinycast.android.ShortcutTest#freshPressRecoversFromLostReleaseWithoutSwallowingTyping", + "dev.tinycast.android.ShortcutTest#repeatsNeverDispatchAnotherCommandOrCaptureAnUnmatchedHold", + "dev.tinycast.android.SystemSettingsTest#searchFindsSpecificDestinations", + "dev.tinycast.android.SystemSettingsTest#catalogHasNoDuplicateOrReservedIdsOrNewAliases", + "dev.tinycast.android.SystemSettingsTest#onlyAppSpecificTargetsRequirePackageArguments", + "dev.tinycast.android.TinycastGridParityTest#verticalNavigationMatchesTinycastAcrossSectionsAndRaggedRows", + "dev.tinycast.android.UpdatePolicyTest#onlyExplicitApprovedHttpsRedirectHostsAreAccepted", + "dev.tinycast.android.UpdatePolicyTest#candidateRequiresOneBoundedMatchingAsset", + "dev.tinycast.android.UpdatePolicyTest#checksumMustMatchExactlyOneFilename", + "dev.tinycast.android.UpdatePolicyTest#releaseCannotRedirectDiscoveryToAnotherRepoOrPrivateHost", + "dev.tinycast.android.UpdatePolicyTest#exactSignerAndStrictlyNewerArchiveAreRequired", + "dev.tinycast.android.UpdatePolicyTest#manifestRejectsWrongPackageSchemaOrInvalidIdentity", + "dev.tinycast.android.WeakValueTokensTest#changedValuesRemainDistinctAndAnExistingInstanceKeepsItsToken", + "dev.tinycast.android.WeakValueTokensTest#boundedHistoryReportsEvictionWithoutChangingTheCurrentToken", + "dev.tinycast.android.WeakValueTokensTest#equalReplacementSurvivesClearingTheOlderWrapper", + "dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest#nativeModelMatchesPrimaryTextStylesLinksAndBlocksOutsideLiteralHtmlAndGfm", + "dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest#coreGrammarMatchesAll652PrimaryExamples", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgBoundsStructuralAndNumericWork", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#bothDocumentedTintSpellingsAndDataSourcesWork", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#packagePathsDecodeBeforeCanonicalContainment", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgInspectionHonorsCancellation", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgRejectsDeclarationsActiveContentAndExternalResources", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#packageSymlinksCannotReadOutsideTheirOwner", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#invalidOrAmbiguousHintsAreRejected", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#boundedStaticSvgSupportsPathsAndLocalGradients", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgRejectsDanglingNonGradientDuplicateAndInheritedReferences", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#renderHintsPreserveUnrelatedServiceQueryBytes", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#untrustedSchemesAuthoritiesCredentialsAndPortsAreRejected", + "dev.tinycast.android.extensions.NodeCpuInfoTest#readsOnlyModelFieldsAndNeverReturnsSerialOrHardwareIdentifiers", + "dev.tinycast.android.extensions.NodeCpuInfoTest#convertsEachCoreAndKeepsSparseIdsWithoutInventingCores", + "dev.tinycast.android.extensions.NodeCpuInfoTest#convertsNonHundredTickClocksAndTruncatesFractionalMilliseconds", + "dev.tinycast.android.extensions.NodeCpuInfoTest#refusesOverflowAndUnsafeJavascriptIntegers", + "dev.tinycast.android.extensions.NodeCpuInfoTest#aSourceThatStopsMakingProgressDoesNotSpin", + "dev.tinycast.android.extensions.NodeCpuInfoTest#rejectsOversizedAndExcessiveCoreData", + "dev.tinycast.android.extensions.NodeCpuInfoTest#boundedStreamsAcceptTheExactLimitAndRejectOneMoreByte", + "dev.tinycast.android.extensions.NodeCpuInfoTest#absentOptionalMetadataUsesNodeUnknownAndZeroConventions", + "dev.tinycast.android.extensions.NodeCpuInfoTest#securityDenialAndInvalidClocksReturnUnavailable", + "dev.tinycast.android.extensions.NodeCpuInfoTest#invalidCoreRowsRejectTheSnapshotInsteadOfChangingItsDenominator", + "dev.tinycast.android.extensions.NodeCpuInfoTest#readersReceiveOnlyFixedPathsAndValidatedCoreIndices", + "dev.tinycast.android.extensions.NodeCpuInfoTest#modelsAreBoundedAndControlCharactersAreExcluded", + "dev.tinycast.android.extensions.NodeCpuInfoTest#missingOrDeniedStatisticsReturnAnEmptyArrayWithoutOtherReads", + "dev.tinycast.android.extensions.NodeCpuInfoTest#optionalFrequencyErrorsDoNotFabricateAReportedFrequency" + ] +} diff --git a/docs/validation/command-handoff/identities/build-candidate-v2.json b/docs/validation/command-handoff/identities/build-candidate-v2.json new file mode 100644 index 00000000..d34b67a9 --- /dev/null +++ b/docs/validation/command-handoff/identities/build-candidate-v2.json @@ -0,0 +1,570 @@ +{ + "completed": true, + "source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "test_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "87ce127e7dc41f78af21d4515e633abf69205c1d723f00a1f211649e5f9a20d4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "b66e3faeaab07b8a86bd6eb5b9d8ab27df6ff70b4341d577e98cab64ae4fa584", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "commands": [ + [ + "./gradlew", + ":app:testDebugUnitTest", + ":app:assembleDebug", + ":app:assembleDebugAndroidTest", + ":app:lintDebug", + "-PdroidcastTestBuildType=debug", + "-PdroidcastBuildCommit=56134f31f74211d7ec4d8faaf18ef5f84658242e", + "--console=plain" + ], + [ + "./gradlew", + ":app:assembleBenchmark", + ":app:assembleBenchmarkAndroidTest", + ":app:lintBenchmark", + "-PdroidcastTestBuildType=benchmark", + "-PdroidcastBuildCommit=56134f31f74211d7ec4d8faaf18ef5f84658242e", + "--console=plain" + ] + ], + "runs": [ + { + "variant": "debug", + "exit_code": 0 + }, + { + "variant": "benchmark", + "exit_code": 0 + } + ], + "apk_hashes": { + "app-debug-androidTest.apk": "c4e3cbda39121756df96c5c1d91b38ec78f6276af062450aed1ad73e88be356d", + "app-debug.apk": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d" + }, + "benchmark_apk_hashes": { + "app-benchmark-androidTest.apk": "b18892cb62c3d1d67ef9f5dc059b3f2496c0911a326dc92726d1caa990ea9aaf", + "app-benchmark.apk": "4d8ace22c31af8e39157255d0624100d8ea78196dd79f76663bad38b5b23c24e" + }, + "lint": { + "debug": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + }, + "benchmark": { + "Error": 0, + "Fatal": 0, + "Warning": 55 + } + }, + "jvm_cases": [ + "dev.tinycast.android.BackupPlannerTest#conflictingEffectiveAliasesRejectTheWholePlan", + "dev.tinycast.android.BackupPlannerTest#clipMergeCannotSilentlyTrimExistingData", + "dev.tinycast.android.BackupPlannerTest#preferencesMergeKeepsExistingOverridesAndRank", + "dev.tinycast.android.BackupPlannerTest#noOrUnavailableCategoryCannotBeApplied", + "dev.tinycast.android.BackupPlannerTest#deduplicatedContentRemapsItsKeyboardBinding", + "dev.tinycast.android.BackupPlannerTest#remappedAliasesCannotSilentlyDiscardConflictingValues", + "dev.tinycast.android.BackupPlannerTest#remappedRankingUsesMaximumRatherThanInputOrder", + "dev.tinycast.android.BackupPlannerTest#contentDuplicatesRemapPinsAliasesAndLearning", + "dev.tinycast.android.BackupPlannerTest#oldBackupOrUnselectedShortcutCategoryKeepsCurrentBindings", + "dev.tinycast.android.BackupPlannerTest#remappingCannotDiscardDistinctKeyboardBindings", + "dev.tinycast.android.BackupPlannerTest#preservedDocumentBindingsBlockCollisionsForMergeAndReplace", + "dev.tinycast.android.BackupPlannerTest#replacementTouchesOnlySelectedCategories", + "dev.tinycast.android.BackupPlannerTest#identityWinsWhenAnEarlierItemAlsoMatchesIncomingContent", + "dev.tinycast.android.BackupPlannerTest#mergeIsIdempotentAndKeepsConflictingIdentity", + "dev.tinycast.android.BackupPlannerTest#preservedDocumentModifierSidesBlockOverlapsButAllowDistinctSides", + "dev.tinycast.android.CalculatorActionsTest#answersBeyondTheParserLimitRemainCopyableWithoutAnUnusableChain", + "dev.tinycast.android.CalculatorActionsTest#modifiedEnterDefaultsDoNotReserveAnExistingConfigurableBinding", + "dev.tinycast.android.CalculatorActionsTest#explicitQuantityLiteralsAcceptOnlyKnownUnitsAndFiniteValues", + "dev.tinycast.android.CalculatorActionsTest#acceleratorsConsumeHeldRepeatsAndReleaseAfterTheResultChanges", + "dev.tinycast.android.CalculatorActionsTest#scalarChainingKeepsExplicitIntentAndAllowsTheNextOperation", + "dev.tinycast.android.CalculatorActionsTest#ordinaryCommandsAndWebResultsDoNotOfferCalculatorActions", + "dev.tinycast.android.CalculatorActionsTest#sharedResultIdsCannotAuthorizeChangedQueryValueSelectionCategoryOrRoute", + "dev.tinycast.android.CalculatorActionsTest#copyingUsesTheSelectedPayloadWithoutRoundingOrReevaluatingIt", + "dev.tinycast.android.CalculatorActionsTest#functionsAndUnitsRetainTheirExpressionAndAnswer", + "dev.tinycast.android.CalculatorActionsTest#quantitiesChainWithoutDiscardingTheirUnit", + "dev.tinycast.android.CalculatorActionsTest#fullCalculationUsesTheDisplayedMultiplicationAndStripsOnlyTheModePrefix", + "dev.tinycast.android.CommandEngineTest#constantsCanImmediatelyPrecedeAsciiMultiplication", + "dev.tinycast.android.CommandEngineTest#knownConstantOperandsDoNotNeedADecimalDigitAndWordsStillFail", + "dev.tinycast.android.CommandEngineTest#xInWordsAndIncompleteExpressionsRemainSearches", + "dev.tinycast.android.CommandEngineTest#rightAssociativePower", + "dev.tinycast.android.CommandEngineTest#pinsLeadEmptyQuery", + "dev.tinycast.android.CommandEngineTest#exactAndPrefixRankAboveSubsequence", + "dev.tinycast.android.CommandEngineTest#arithmeticPrecedence", + "dev.tinycast.android.CommandEngineTest#exactAliasWins", + "dev.tinycast.android.CommandEngineTest#functions", + "dev.tinycast.android.CommandEngineTest#xMultiplicationRetainsPrecedenceAndFunctionNames", + "dev.tinycast.android.CommandEngineTest#refusesOversizedExpression", + "dev.tinycast.android.CommandEngineTest#arithmeticOperatorsTriggerRootCalculation", + "dev.tinycast.android.CommandEngineTest#invalidMathDoesNotCrashOrProduceNan", + "dev.tinycast.android.CommandEngineTest#localeIndependentOutput", + "dev.tinycast.android.CommandEngineTest#stableOrderingAndUsage", + "dev.tinycast.android.CommandEngineTest#explicitCalculatorModeAcceptsNumbers", + "dev.tinycast.android.CommandEngineTest#unaryMinusPrecedence", + "dev.tinycast.android.CommandEngineTest#convertsTimeAndData", + "dev.tinycast.android.CommandEngineTest#functionsConstantsAndConversionsKeepTheirIntentionalSearchBehavior", + "dev.tinycast.android.CommandEngineTest#percentages", + "dev.tinycast.android.CommandEngineTest#multiplicationDisplayUsesTheRealSymbolAndKeepsResultsNumeric", + "dev.tinycast.android.CommandEngineTest#convertsTemperature", + "dev.tinycast.android.CommandEngineTest#calculatorPrefixAndUnicodeOperators", + "dev.tinycast.android.CommandEngineTest#ordinaryNumbersRemainRootSearches", + "dev.tinycast.android.CommandEngineTest#rejectsIncompatibleUnits", + "dev.tinycast.android.CommandEngineTest#convertsLength", + "dev.tinycast.android.CommandEngineTest#fuzzySubsequenceMatches", + "dev.tinycast.android.EmojiCatalogTest#filtersFavoritesAndRecentsHaveDeterministicOrder", + "dev.tinycast.android.EmojiCatalogTest#namesAliasesKeywordsAndMultipleWordsAreSearchable", + "dev.tinycast.android.EmojiCatalogTest#malformedCatalogsAreRejected", + "dev.tinycast.android.EmojiCatalogTest#bundledCatalogPreservesSequencesAndStableIdentities", + "dev.tinycast.android.EmojiCatalogTest#exactMatchesOutrankHistoryAndRecentIsBoundedWithoutDuplicates", + "dev.tinycast.android.ExtensionCommandLaunchTest#argumentConsumersCannotChangeThePreparedValues", + "dev.tinycast.android.ExtensionCommandLaunchTest#undeclaredNonstringAndMissingRequiredArgumentsAreRejected", + "dev.tinycast.android.ExtensionCommandLaunchTest#ordinaryEmptyRequestDoesNotInventContextOrFallback", + "dev.tinycast.android.ExtensionCommandLaunchTest#crossExtensionRoutingAndBackgroundLaunchesAreRejected", + "dev.tinycast.android.ExtensionCommandLaunchTest#foregroundContextAndArgumentsArriveAsSeparateCopiedLaunchProperties", + "dev.tinycast.android.ExtensionCommandLaunchTest#requestIsBoundedBeforeParsingByUnitsAndUtf8Bytes", + "dev.tinycast.android.ExtensionCommandLaunchTest#requiredPreferencesAndDropdownSelectionsMustBeConfigured", + "dev.tinycast.android.ExtensionCommandLaunchTest#unsafeNamesAndUnknownOptionsNeverBecomeLaunches", + "dev.tinycast.android.ExtensionCommandLaunchTest#argumentCountsAndAmbiguousDefinitionsAreBounded", + "dev.tinycast.android.ExtensionCommandLaunchTest#contextMustBeAnObjectAndNestedCollectionsAreBounded", + "dev.tinycast.android.ExtensionCommandLaunchTest#parserDepthIsCheckedBeforeJsonAllocationAndQuotedBracketsRemainData", + "dev.tinycast.android.ExtensionDetailImageTimeoutTest#deadlineCancelsThePendingWorkBeforeReportingAnImageFailure", + "dev.tinycast.android.ExtensionDetailImageTimeoutTest#successfulWorkRetainsItsResult", + "dev.tinycast.android.ExtensionDetailImageTimeoutTest#cancellationByTheViewOwnerRemainsCancellation", + "dev.tinycast.android.ExtensionFormContractTest#reusedNativeIdsCannotChangeTheirLogicalFieldOrControlType", + "dev.tinycast.android.ExtensionFormContractTest#rerendersDoNotDuplicateFocusAndBlur", + "dev.tinycast.android.ExtensionFormContractTest#anExplicitEmptyValuedOptionKeepsItsOwnTitle", + "dev.tinycast.android.ExtensionFormContractTest#clearingAnOutgoingFormDropsItsPendingFocusWithoutDispatching", + "dev.tinycast.android.ExtensionFormContractTest#changedOptionMeaningInvalidatesItsCapturedChoice", + "dev.tinycast.android.ExtensionFormContractTest#aNewOptionAtTheSamePositionCannotInheritAnOldMenuChoice", + "dev.tinycast.android.ExtensionFormContractTest#reorderingTheSameOptionsDoesNotChangeTheirIdentity", + "dev.tinycast.android.ExtensionFormContractTest#ordinaryRerendersKeepTheSameFieldAuthority", + "dev.tinycast.android.ExtensionFormContractTest#aRemovedFieldCannotReceiveFocusOrAStaleBlur", + "dev.tinycast.android.ExtensionFormContractTest#selectedTitlesNeverReplaceTheUnderlyingSubmittedValue", + "dev.tinycast.android.ExtensionFormContractTest#aMissingSelectionHasAnExplicitLabelWithoutInventingANewValue", + "dev.tinycast.android.ExtensionFormContractTest#reentrantFocusFromBlurSupersedesTheOutgoingTransition", + "dev.tinycast.android.ExtensionFormContractTest#duplicateReadableTitlesStillIdentifyDistinctValues", + "dev.tinycast.android.ExtensionFormContractTest#anOutgoingBlurCannotClearTheNewerFocusedField", + "dev.tinycast.android.ExtensionFormContractTest#aReplacementFieldWithTheSameLogicalIdRejectsTheOldNativeCallback", + "dev.tinycast.android.ExtensionFormContractTest#blurValidationCanRemoveTheNextFieldBeforeItReceivesFocus", + "dev.tinycast.android.ExtensionFormContractTest#identicalLogicalIdsInAnotherRootCannotInheritAQueuedFieldEvent", + "dev.tinycast.android.ExtensionFormFileImportTest#aggregateLimitsRollBackTheWholeSelection", + "dev.tinycast.android.ExtensionFormFileImportTest#cleanupDoesNotFollowLinksToOtherData", + "dev.tinycast.android.ExtensionFormFileImportTest#directoriesRespectChoicePolicyAndRejectProviderCycles", + "dev.tinycast.android.ExtensionFormFileImportTest#actualStreamBytesAreBoundedEvenWhenSizeMetadataIsMissing", + "dev.tinycast.android.ExtensionFormFileImportTest#cancellationAfterAReadDiscardsTheUndeliveredCopy", + "dev.tinycast.android.ExtensionFormFileImportTest#aSelectedDirectoryRetainsItsHierarchyAndExactLeafBytes", + "dev.tinycast.android.ExtensionFormFileImportTest#losingTheCleanupOwnerRetainsDataUntilOwnershipIsRecovered", + "dev.tinycast.android.ExtensionFormFileImportTest#aProviderThatMakesNoReadProgressDoesNotSpinOrLeaveACopy", + "dev.tinycast.android.ExtensionFormFileImportTest#recoveryRemovesOnlyNonceOwnedOrphansFromAnEarlierProcess", + "dev.tinycast.android.ExtensionFormFileImportTest#recoveryLeavesLiveRequestsAndDeliveredImportsAlone", + "dev.tinycast.android.ExtensionFormFileImportTest#traversalNamesNeverBecomeDestinationPaths", + "dev.tinycast.android.ExtensionFormFileImportTest#anUndeliveredCommitCanBeDiscardedWithoutChangingUnrelatedData", + "dev.tinycast.android.ExtensionFormFileImportTest#aLinkedReplacementParentCannotReceiveCommitOrCleanup", + "dev.tinycast.android.ExtensionFormFileImportTest#selectedBytesAndUnicodeNamesAreExactAndRetainedCopiesStayReadable", + "dev.tinycast.android.ExtensionFormFileImportTest#storageRootRejectsTraversalAndLinkedImportDirectories", + "dev.tinycast.android.ExtensionFormSubmissionTest#submitBlurUsesTheLatestEditExactlyOnceAndAllowsRefocus", + "dev.tinycast.android.ExtensionFormSubmissionTest#aMissingOrDisposedFormCannotPrepareSubmission", + "dev.tinycast.android.ExtensionFormSubmissionTest#disposalDuringBlurInvalidatesTheOutgoingSubmit", + "dev.tinycast.android.ExtensionFormSubmissionTest#aReentrantSuccessorCannotInheritTheOutgoingRequest", + "dev.tinycast.android.ExtensionFormSubmissionTest#changingTheCallbackForTheSameOwnerAlsoInvalidatesPreparation", + "dev.tinycast.android.ExtensionFormSubmissionTest#oldDisposalCannotRemoveTheCurrentFormCallback", + "dev.tinycast.android.ExtensionFormSubmissionTest#aRemovedFieldCannotReceiveSubmitBlur", + "dev.tinycast.android.ExtensionFormTypedValuesTest#exactInstantAndFractionalSecondsSurviveParsing", + "dev.tinycast.android.ExtensionFormTypedValuesTest#tagChangesPreserveExactOrderedValuesAndDoNotInventSelections", + "dev.tinycast.android.ExtensionFormTypedValuesTest#calendarPickerLabelsDoNotShiftInNonUtcZonesOrBefore1970", + "dev.tinycast.android.ExtensionFormTypedValuesTest#datetimeBoundsAreInclusiveAtTheExactInstant", + "dev.tinycast.android.ExtensionFormTypedValuesTest#anAmbiguousUneditedWallTimeKeepsItsExistingOffsetAndPrecision", + "dev.tinycast.android.ExtensionFormTypedValuesTest#absentDatesAreDistinctFromMalformedValuesAndKinds", + "dev.tinycast.android.ExtensionFormTypedValuesTest#aNonexistentDstWallTimeIsRejectedInsteadOfShifted", + "dev.tinycast.android.ExtensionFormTypedValuesTest#dateBoundsIncludeTheWholeLocalDayRatherThanOnlyTheirInstants", + "dev.tinycast.android.ExtensionFormTypedValuesTest#dateOnlyUsesTheFullDayMarkerAtLocalStartAndRejectsASkippedDay", + "dev.tinycast.android.ExtensionFormValuesTest#disposalDropsAllEditorValues", + "dev.tinycast.android.ExtensionFormValuesTest#removedAndUnregisteredOwnersCannotAdoptAnotherFieldValue", + "dev.tinycast.android.ExtensionFormValuesTest#aNewPublicationCanTransformOrRejectTheNativeEdit", + "dev.tinycast.android.ExtensionFormValuesTest#booleanFalseIsAnEventValueRatherThanMissingData", + "dev.tinycast.android.ExtensionFormValuesTest#fieldsCannotBorrowEachOthersPendingValues", + "dev.tinycast.android.ExtensionFormValuesTest#samePublicationDoesNotOverwriteAnEditBeforeBlur", + "dev.tinycast.android.ExtensionGridContractTest#initialRemoteRequestWinsOverTheAutomaticFallback", + "dev.tinycast.android.ExtensionGridContractTest#emptySectionsDoNotAddSlotsAndTitledSectionsKeepOneHeading", + "dev.tinycast.android.ExtensionGridContractTest#aNewOrRemovedRequestReplacesThePendingOne", + "dev.tinycast.android.ExtensionGridContractTest#missingRequestRemainsPendingUntilItsItemArrives", + "dev.tinycast.android.ExtensionGridContractTest#aRemovedLocalItemFallsBackWithoutResurrectingAnAppliedRequest", + "dev.tinycast.android.ExtensionGridContractTest#changedRemoteRequestWinsOverAnExistingSelection", + "dev.tinycast.android.ExtensionGridContractTest#anAppliedRequestDoesNotUndoLocalNavigation", + "dev.tinycast.android.ExtensionGridContractTest#untitledSectionsHaveAFullSpanBoundaryAfterTheFirstSection", + "dev.tinycast.android.ExtensionGridNavigationTest#sectionHeadersAndRaggedRowsDoNotStealSelection", + "dev.tinycast.android.ExtensionGridNavigationTest#homeEndEmptyAndStaleIndicesAreSafe", + "dev.tinycast.android.ExtensionGridNavigationTest#assetsResolveInsidePackageAndEscapesAreRejected", + "dev.tinycast.android.ExtensionGridNavigationTest#aspectRatiosUseOnlySupportedFiniteValues", + "dev.tinycast.android.ExtensionGridNavigationTest#adaptiveColumnsRespectUsableTouchWidth", + "dev.tinycast.android.ExtensionGridNavigationTest#fourWayNavigationUsesVisualRowsAndClampsEdges", + "dev.tinycast.android.ExtensionHttpTest#plaintextIsRejectedBeforeCreatingATransport", + "dev.tinycast.android.ExtensionHttpTest#boundedBodyAlwaysClosesTheConnection", + "dev.tinycast.android.ExtensionHttpTest#cancellationDisconnectsAReadThatIgnoresThreadInterruption", + "dev.tinycast.android.ExtensionHttpTest#credentialRedirectCannotChangePorts", + "dev.tinycast.android.ExtensionHttpTest#absoluteDeadlineStopsAStreamThatKeepsDeliveringBytes", + "dev.tinycast.android.ExtensionHttpTest#repeatedCommandScopeCancellationReleasesEveryTransport", + "dev.tinycast.android.ExtensionHttpTest#completedResponseContainsNoLiveConnection", + "dev.tinycast.android.ExtensionMarkdownModelTest#cancellationAfterParserLimitIsNotConvertedToAnUnavailableDocument", + "dev.tinycast.android.ExtensionMarkdownModelTest#referenceLinksResolveWithoutChangingTargetsOrTitles", + "dev.tinycast.android.ExtensionMarkdownModelTest#oversizedSourcesAndNodeCountsDoNotProducePartialDocuments", + "dev.tinycast.android.ExtensionMarkdownModelTest#tableCellBudgetAllowsItsBoundaryAndRejectsTheNextPaddedRow", + "dev.tinycast.android.ExtensionMarkdownModelTest#numericLineFeedsStayTextWhileExplicitBreaksAndCodeKeepTheirLines", + "dev.tinycast.android.ExtensionMarkdownModelTest#quotesAndDividersRemainSeparateBlocks", + "dev.tinycast.android.ExtensionMarkdownModelTest#fencedAndIndentedCodeKeepSpacesTabsAndBlankLines", + "dev.tinycast.android.ExtensionMarkdownModelTest#nestedListsPreserveStartingNumberAndParagraphs", + "dev.tinycast.android.ExtensionMarkdownModelTest#cancellationIsObservedBeforeParsing", + "dev.tinycast.android.ExtensionMarkdownModelTest#compactPaddedTableLimitBecomesAnUnavailableDocument", + "dev.tinycast.android.ExtensionMarkdownModelTest#escapesEntitiesAndLineBreaksFollowCommonMark", + "dev.tinycast.android.ExtensionMarkdownModelTest#tablesKeepHeaderAlignmentCodeAndCellValues", + "dev.tinycast.android.ExtensionMarkdownModelTest#headingAndNestedMarksKeepUnicodeAndCombiningText", + "dev.tinycast.android.ExtensionMarkdownModelTest#inlineCodeKeepsItsOwnWhitespaceAndMarks", + "dev.tinycast.android.ExtensionMarkdownModelTest#linkedImagesPreserveAlternativeAndRenderParameters", + "dev.tinycast.android.ExtensionMarkdownModelTest#strikeAndRawHtmlNeverBecomeExecutableMarkup", + "dev.tinycast.android.ExtensionMetadataVisualsTest#freshlySerializedAdaptiveIconsRetainTheSameVisualValue", + "dev.tinycast.android.ExtensionMetadataVisualsTest#changedSourceMaskAndTintDoNotAdoptThePreviousVisualIdentity", + "dev.tinycast.android.ExtensionMetadataVisualsTest#adaptiveColorIdentityUsesTheSameShadeAsItsCurrentRenderer", + "dev.tinycast.android.ExtensionSelectionDeliveryTest#eventAndRenderDeliverEachSelectionOnlyOnceBeforeAction", + "dev.tinycast.android.ExtensionSelectionDeliveryTest#initialEmptySelectionAndDifferentRootsStillNotify", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationDuringThePostCommitReadKeepsTheSavedFoldersGrant", + "dev.tinycast.android.FolderGrantTransactionTest#failedConfigurationWriteRollsBackTheNewGrant", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationCannotReleaseAPreexistingReadGrant", + "dev.tinycast.android.FolderGrantTransactionTest#failedRemovalWriteRetainsTheGrantForTheExistingConfiguration", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationWhenCommitReturnsKeepsTheSavedFoldersGrant", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationWhenRemovalReturnsCannotSkipItsGrantRelease", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationWhenAcquisitionReturnsRollsBackTheNewGrant", + "dev.tinycast.android.FolderGrantTransactionTest#successfulCommitTransfersOwnershipToTheConfiguration", + "dev.tinycast.android.FolderGrantTransactionTest#cancellationBeforeTakingDoesNotAcquireOrReleaseAGrant", + "dev.tinycast.android.FolderGrantTransactionTest#cancelledRemovalBeforeTheWriteRetainsTheExistingGrant", + "dev.tinycast.android.FolderGrantTransactionTest#replacementReaderCannotSeeTheGrantBeforeValidationRollback", + "dev.tinycast.android.FolderGrantTransactionTest#failedValidationRollsBackOnlyTheNewGrant", + "dev.tinycast.android.FolderGrantTransactionTest#unknownPostRenameResultRetainsTheGrantBeforeReplacementReads", + "dev.tinycast.android.FolderIndexTest#resultsAreBoundedAndQueriesCanBeCancelled", + "dev.tinycast.android.FolderIndexTest#identityUsesProviderAndPersistentDocumentId", + "dev.tinycast.android.FolderIndexTest#typesRespectDirectoriesAndNativeMime", + "dev.tinycast.android.FolderIndexTest#hiddenNamesRankAfterVisibleNamesAtEqualScore", + "dev.tinycast.android.FolderIndexTest#filenameMatchesOutrankPathOnlyMatches", + "dev.tinycast.android.FolderIndexTest#overlappingScopesDoNotDuplicateAnIdentity", + "dev.tinycast.android.FolderIndexTest#emptySearchUsesModifiedDateWithStableOrdering", + "dev.tinycast.android.ModifierTapTest#imeWindowChangeDoesNotCancelButAppAndUnknownWindowsDo", + "dev.tinycast.android.ModifierTapTest#malformedModifierIdentitiesFailClosed", + "dev.tinycast.android.ModifierTapTest#repeatsCancelFirstAndSecondTap", + "dev.tinycast.android.ModifierTapTest#bindingAndConnectionEpochChangesDiscardEarlierTap", + "dev.tinycast.android.ModifierTapTest#twoCompletePairsDispatchExactlyOnceOnSecondRelease", + "dev.tinycast.android.ModifierTapTest#sideConflictsAreRejectedAcrossTargetsWithoutRejectingDistinctSides", + "dev.tinycast.android.ModifierTapTest#ordinaryTypingAndChordsCancelBothBeforeAndDuringSecondPress", + "dev.tinycast.android.ModifierTapTest#delayedWindowNotificationBeforeFirstKeyAlsoPreservesAnInProgressFirstPress", + "dev.tinycast.android.ModifierTapTest#simultaneousModifiersAndAdditionalMetaStateCancel", + "dev.tinycast.android.ModifierTapTest#ordinaryCtrlChordDownAndUpStillPassThroughTheChordEngine", + "dev.tinycast.android.ModifierTapTest#exactlyOneOfServiceAndForegroundObserversCanDispatchTheSameEvents", + "dev.tinycast.android.ModifierTapTest#missingMismatchedAndDuplicateReleasesCannotActivate", + "dev.tinycast.android.ModifierTapTest#inclusiveTimingBoundariesAreDeterministic", + "dev.tinycast.android.ModifierTapTest#allFourModifierFamiliesAndBothSidesHaveStableIdentities", + "dev.tinycast.android.ModifierTapTest#enteringAndLeavingRecorderWithoutKeyEventsStillDiscardsEarlierTap", + "dev.tinycast.android.ModifierTapTest#differentDeviceOrDifferentPhysicalModifierCannotCompleteAPair", + "dev.tinycast.android.ModifierTapTest#delayedOldWindowNotificationCannotCancelNewerKeysFromCapturedTrace", + "dev.tinycast.android.ModifierTapTest#cancellationStaleDeliveryAndNonmonotonicTimesClearPendingGesture", + "dev.tinycast.android.ModifierTapTest#windowChangesDuringEitherTapStillCancelIncludingUnknownAndEqualTime", + "dev.tinycast.android.ModifierTapTest#eitherSideAndSpecificSideDispatchUseTheActualPersistedIdentity", + "dev.tinycast.android.ModifierTapTest#explicitResetDiscardsPartialGestureAcrossFocusConfigurationOrConnectionChanges", + "dev.tinycast.android.ModifierTapTest#pauseAndOwnershipTransferNeverCompleteAPartialTap", + "dev.tinycast.android.ModifierTapTest#holdsAndTooSlowSecondPressNeverDispatch", + "dev.tinycast.android.PaletteMenuOwnershipTest#focusedMenuTransitionInvalidatesAnInProgressPairOnlyOnce", + "dev.tinycast.android.PaletteMenuOwnershipTest#inactiveCleanupDoesNotCancelKeysInTheNewWindow", + "dev.tinycast.android.PaletteMenuOwnershipTest#outgoingOwnerCannotCloseOrDetachReplacementMenu", + "dev.tinycast.android.PaletteScrollHistoryTest#detachedLayoutDoesNotScrollOrForgetTheLastMeasuredViewport", + "dev.tinycast.android.ReviewedTextInputTest#authority_is_bound_to_both_the_original_owner_and_target", + "dev.tinycast.android.ReviewedTextInputTest#a_char_sequence_cannot_bypass_the_limit_by_lying_about_its_length", + "dev.tinycast.android.ReviewedTextInputTest#invalid_replacements_revoke_an_already_approved_input", + "dev.tinycast.android.ReviewedTextInputTest#diagnostics_and_errors_do_not_echo_input_content", + "dev.tinycast.android.ReviewedTextInputTest#receiving_copies_mutable_text_without_normalizing_unicode_or_whitespace", + "dev.tinycast.android.ReviewedTextInputTest#cancellation_clears_only_the_current_review", + "dev.tinycast.android.ReviewedTextInputTest#a_changed_command_rejects_a_retained_run_callback_without_consuming_the_review", + "dev.tinycast.android.ReviewedTextInputTest#releasing_an_outgoing_input_does_not_clear_a_new_review_or_invocation", + "dev.tinycast.android.ReviewedTextInputTest#a_queued_cancel_from_the_review_cannot_revoke_the_approved_invocation", + "dev.tinycast.android.ReviewedTextInputTest#whitespace_is_valid_selection_text_and_share_has_no_writable_source", + "dev.tinycast.android.ReviewedTextInputTest#wrong_types_are_rejected_without_calling_their_to_string", + "dev.tinycast.android.ReviewedTextInputTest#an_outgoing_review_cannot_approve_or_change_its_replacement", + "dev.tinycast.android.ReviewedTextInputTest#approval_requires_a_chosen_command_and_consumes_the_current_review_once", + "dev.tinycast.android.ReviewedTextInputTest#size_limit_counts_utf16_units_and_accepts_the_exact_boundary", + "dev.tinycast.android.ShortcutReadinessTest#reconnectEpochRejectsAProbeEvenWithoutAnIntermediateFrame", + "dev.tinycast.android.ShortcutReadinessTest#armedRoutingRejectsStaleConnectionsAndExpiredOrDifferentChords", + "dev.tinycast.android.ShortcutReadinessTest#absentChordUnknownApprovalAndDisconnectStayExplicit", + "dev.tinycast.android.ShortcutReadinessTest#deadlinesRejectLateEventsAndOldTimeoutsDoNotExpireNewChecks", + "dev.tinycast.android.ShortcutReadinessTest#onlyTheFilteredCurrentPaletteChordCanCompleteACheckOnce", + "dev.tinycast.android.ShortcutReadinessTest#aSavedChordAndApprovalAloneDoNotClaimReadiness", + "dev.tinycast.android.ShortcutReadinessTest#cancelRemovesTheExpectedChordAndRejectsLateResults", + "dev.tinycast.android.ShortcutReadinessTest#lateDisconnectCannotClearANewerServiceConnection", + "dev.tinycast.android.ShortcutReadinessTest#changedAndClearedBindingsInvalidateTheCheck", + "dev.tinycast.android.ShortcutTest#duplicateBindingsAndEphemeralTargetsAreRejected", + "dev.tinycast.android.ShortcutTest#devicesAreTrackedSeparatelyAndDisconnectedDevicesAreCleared", + "dev.tinycast.android.ShortcutTest#matchingDownAndUpAreConsumedEvenAfterModifiersAreReleased", + "dev.tinycast.android.ShortcutTest#invocationTokensAreOneUseAndExpireBeforeAndAfterConsumption", + "dev.tinycast.android.ShortcutTest#outstandingInvocationTokensAreBounded", + "dev.tinycast.android.ShortcutTest#plainTypingAndSystemOrEditorConflictsAreRejected", + "dev.tinycast.android.ShortcutTest#recordingPauseAndRebindingPreserveAlreadyConsumedReleases", + "dev.tinycast.android.ShortcutTest#defaultAndDisabledConfigurationsAreValid", + "dev.tinycast.android.ShortcutTest#unrelatedTypingAndUnboundChordsPassBothEnds", + "dev.tinycast.android.ShortcutTest#freshPressRecoversFromLostReleaseWithoutSwallowingTyping", + "dev.tinycast.android.ShortcutTest#repeatsNeverDispatchAnotherCommandOrCaptureAnUnmatchedHold", + "dev.tinycast.android.SystemSettingsTest#searchFindsSpecificDestinations", + "dev.tinycast.android.SystemSettingsTest#catalogHasNoDuplicateOrReservedIdsOrNewAliases", + "dev.tinycast.android.SystemSettingsTest#onlyAppSpecificTargetsRequirePackageArguments", + "dev.tinycast.android.TinycastGridParityTest#verticalNavigationMatchesTinycastAcrossSectionsAndRaggedRows", + "dev.tinycast.android.UpdatePolicyTest#onlyExplicitApprovedHttpsRedirectHostsAreAccepted", + "dev.tinycast.android.UpdatePolicyTest#candidateRequiresOneBoundedMatchingAsset", + "dev.tinycast.android.UpdatePolicyTest#checksumMustMatchExactlyOneFilename", + "dev.tinycast.android.UpdatePolicyTest#releaseCannotRedirectDiscoveryToAnotherRepoOrPrivateHost", + "dev.tinycast.android.UpdatePolicyTest#exactSignerAndStrictlyNewerArchiveAreRequired", + "dev.tinycast.android.UpdatePolicyTest#manifestRejectsWrongPackageSchemaOrInvalidIdentity", + "dev.tinycast.android.WeakValueTokensTest#changedValuesRemainDistinctAndAnExistingInstanceKeepsItsToken", + "dev.tinycast.android.WeakValueTokensTest#boundedHistoryReportsEvictionWithoutChangingTheCurrentToken", + "dev.tinycast.android.WeakValueTokensTest#equalReplacementSurvivesClearingTheOlderWrapper", + "dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest#nativeModelMatchesPrimaryTextStylesLinksAndBlocksOutsideLiteralHtmlAndGfm", + "dev.tinycast.android.extensions.CommonMarkPrimaryConformanceTest#coreGrammarMatchesAll652PrimaryExamples", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgBoundsStructuralAndNumericWork", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#bothDocumentedTintSpellingsAndDataSourcesWork", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#packagePathsDecodeBeforeCanonicalContainment", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgInspectionHonorsCancellation", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgRejectsDeclarationsActiveContentAndExternalResources", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#packageSymlinksCannotReadOutsideTheirOwner", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#invalidOrAmbiguousHintsAreRejected", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#boundedStaticSvgSupportsPathsAndLocalGradients", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#svgRejectsDanglingNonGradientDuplicateAndInheritedReferences", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#renderHintsPreserveUnrelatedServiceQueryBytes", + "dev.tinycast.android.extensions.ExtensionDetailImagePolicyTest#untrustedSchemesAuthoritiesCredentialsAndPortsAreRejected", + "dev.tinycast.android.extensions.NodeCpuInfoTest#readsOnlyModelFieldsAndNeverReturnsSerialOrHardwareIdentifiers", + "dev.tinycast.android.extensions.NodeCpuInfoTest#convertsEachCoreAndKeepsSparseIdsWithoutInventingCores", + "dev.tinycast.android.extensions.NodeCpuInfoTest#convertsNonHundredTickClocksAndTruncatesFractionalMilliseconds", + "dev.tinycast.android.extensions.NodeCpuInfoTest#refusesOverflowAndUnsafeJavascriptIntegers", + "dev.tinycast.android.extensions.NodeCpuInfoTest#aSourceThatStopsMakingProgressDoesNotSpin", + "dev.tinycast.android.extensions.NodeCpuInfoTest#rejectsOversizedAndExcessiveCoreData", + "dev.tinycast.android.extensions.NodeCpuInfoTest#boundedStreamsAcceptTheExactLimitAndRejectOneMoreByte", + "dev.tinycast.android.extensions.NodeCpuInfoTest#absentOptionalMetadataUsesNodeUnknownAndZeroConventions", + "dev.tinycast.android.extensions.NodeCpuInfoTest#securityDenialAndInvalidClocksReturnUnavailable", + "dev.tinycast.android.extensions.NodeCpuInfoTest#invalidCoreRowsRejectTheSnapshotInsteadOfChangingItsDenominator", + "dev.tinycast.android.extensions.NodeCpuInfoTest#readersReceiveOnlyFixedPathsAndValidatedCoreIndices", + "dev.tinycast.android.extensions.NodeCpuInfoTest#modelsAreBoundedAndControlCharactersAreExcluded", + "dev.tinycast.android.extensions.NodeCpuInfoTest#missingOrDeniedStatisticsReturnAnEmptyArrayWithoutOtherReads", + "dev.tinycast.android.extensions.NodeCpuInfoTest#optionalFrequencyErrorsDoNotFabricateAReportedFrequency" + ] +} diff --git a/docs/validation/command-handoff/identities/common-v5.json b/docs/validation/command-handoff/identities/common-v5.json new file mode 100644 index 00000000..554c56a0 --- /dev/null +++ b/docs/validation/command-handoff/identities/common-v5.json @@ -0,0 +1,9 @@ +{ + "runtime_source_commit": "ed3831303a8319a194f0ae137830acba1f3580d5", + "test_source_commit": "77bec8fcfcc501c58707db2d939236943a14f479", + "apk_hashes": { + "app-debug.apk": "de99960d7658740d8377877fe19287e9a34c3fce46394367f5ac5426c1d5e18d", + "app-debug-androidTest.apk": "7379458fa7785309cf8184c5865801d77345b491fb7c333041677fc4638a127f" + }, + "scope": "Exact final PR102 app and common v5 instrumentation; actual old/new phase observations, not blanket test equivalence" +} diff --git a/docs/validation/command-handoff/identities/owned-harness-v1.json b/docs/validation/command-handoff/identities/owned-harness-v1.json new file mode 100644 index 00000000..ea01da8f --- /dev/null +++ b/docs/validation/command-handoff/identities/owned-harness-v1.json @@ -0,0 +1,229 @@ +{ + "test_source_commit": "f08fc5437f5a5ce0c23500c420debe0d8fe231a4", + "source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "87ce127e7dc41f78af21d4515e633abf69205c1d723f00a1f211649e5f9a20d4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "4ffe86bc2ff77c53afa708b421c76817ff96e18acf7d62c3592f00ad041ca6a7", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "test_apk_sha256": "ed33517dbe006117620fe63519a2822fd0c39821b00821ce88fcddbda33421cf", + "build_log_sha256": "ae704c1a636636ca051a995888a2b04a2eb7759b7e34ebf2d7476d5dd25a6f29", + "runtime_source_commit": "10d8798e92dc0334f17f0eded4ab6fc5493326c6", + "app_sha256": "ac8144e49a9652320f00dc59cba17655a750b3e3d8252c3abbe8576cbe62d254" +} diff --git a/docs/validation/command-handoff/identities/owned-harness-v2.json b/docs/validation/command-handoff/identities/owned-harness-v2.json new file mode 100644 index 00000000..16ffbe06 --- /dev/null +++ b/docs/validation/command-handoff/identities/owned-harness-v2.json @@ -0,0 +1,229 @@ +{ + "test_source_commit": "fa7f39430a5259a5549dfeaa58b8a9954b228a3f", + "source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "40db20d8a320bad2f5de185ed4f6df73398989ecf1d9bacfa47d91aa72e94769", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "b66e3faeaab07b8a86bd6eb5b9d8ab27df6ff70b4341d577e98cab64ae4fa584", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "05435e170651863fd4e1e734eda2ffb16c1c2d69629d4f7bd57dc674e6529e2a", + "build_log_sha256": "dc059ee2d91e96a8d84ae6feb4bae55f8bfa7d494ded12062dc5abbb7e3a60b7" +} diff --git a/docs/validation/command-handoff/identities/owned-harness-v3.json b/docs/validation/command-handoff/identities/owned-harness-v3.json new file mode 100644 index 00000000..dbeabb88 --- /dev/null +++ b/docs/validation/command-handoff/identities/owned-harness-v3.json @@ -0,0 +1,229 @@ +{ + "test_source_commit": "73e719c602bc378c71df83eba34440771bc8d999", + "source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "8c47f08b1d49a94dfd520840a0b0349199459da4ece8ff1adcacc46516b37f7b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "b66e3faeaab07b8a86bd6eb5b9d8ab27df6ff70b4341d577e98cab64ae4fa584", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "runtime_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "app_sha256": "2a41ea1407cccf23b70afada6fde64de55bc0bd3d8f035645a44532b12d14e3d", + "test_apk_sha256": "84508996f4c3be9f70719fcbb23b9a825a1e62f29eb42900d29e4e68061747f6", + "build_log_sha256": "910d8c79f6ed71e89b2f2b1b7b3dbc6f7a088d21224c409ceb1eb8c370ad23bf" +} diff --git a/docs/validation/command-handoff/identities/repaired-harness-v2.json b/docs/validation/command-handoff/identities/repaired-harness-v2.json new file mode 100644 index 00000000..e4df807e --- /dev/null +++ b/docs/validation/command-handoff/identities/repaired-harness-v2.json @@ -0,0 +1,226 @@ +{ + "test_source_commit": "56134f31f74211d7ec4d8faaf18ef5f84658242e", + "source_hashes": { + "app/build.gradle.kts": "28f41ac518c91f15c98221d0511870a5409b9f35ae008acfdd5f667db06bcadf", + "app/src/androidTest/AndroidManifest.xml": "5d5a39153ed75d64af76674ab767709ee57017bdf39e6fe55ce7fd58ab8b3598", + "app/src/androidTest/java/dev/tinycast/android/ActivationDeviceTest.kt": "2f2fe66a5c3628433feeb6db33e02be43ca3f267b39ec541f2e3330fc1142974", + "app/src/androidTest/java/dev/tinycast/android/AssistantDeviceTest.kt": "1ecebcf20fe9aa7aa63701c81500195eddd1ae88618d89f31105fecc58189b6b", + "app/src/androidTest/java/dev/tinycast/android/AssistantTouchDeviceTest.kt": "1f33a283e5b1f05a5a74dbb76bc3ff8920193cd761edd1cce1e61cb733cb9874", + "app/src/androidTest/java/dev/tinycast/android/BackupDeviceTest.kt": "56c56d6a652524f7fc7952b1478552314b1e465ace5c7216385d7f2ea3cf4b6c", + "app/src/androidTest/java/dev/tinycast/android/CalculatorActionsDeviceTest.kt": "e738e5b09aa6128343abe628ed7f93571b9a87c1eb95e78f00c617aadcf348b4", + "app/src/androidTest/java/dev/tinycast/android/CalculatorIntentDeviceTest.kt": "628ddcef4b50880170fba97cd925fefc5f463f632799d9e2686e7512b2bbc15f", + "app/src/androidTest/java/dev/tinycast/android/ClipboardApiDeviceTest.kt": "e53bbc080d17b59aae6280b7b817a3c81b4df684dcfd5ca787a993d89caf5de4", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidence.kt": "c882a7435cdca3bbdf68da66a6e8ef23bce932fb5746ba09c61bded5b9c98e9d", + "app/src/androidTest/java/dev/tinycast/android/ClipboardEvidenceDeviceTest.kt": "dfdb64344886b7e5d4b54f04fa4560f169e8cb8d7b7b238ba08358dcde73f854", + "app/src/androidTest/java/dev/tinycast/android/ClipboardRecoveryActivity.java": "48627f465b10c316cca7fdfa735928095328241b4fb98bf90e5c247add17345d", + "app/src/androidTest/java/dev/tinycast/android/DocumentProviderDeviceTest.kt": "13895d23b8758affd8889461ef660c442d3bfd1bb111fce08a064aa4b582aea2", + "app/src/androidTest/java/dev/tinycast/android/EmojiDeviceTest.kt": "ab9907d4e4acd7e52ed26f12ac14648271e5740784cdba678671ca8ad42fb415", + "app/src/androidTest/java/dev/tinycast/android/EnduranceDeviceTest.kt": "4802d3755ce6bc1cdf8e60c7cf9998a09ced8e0be6d9888f0b9d9a32ee332dc4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionCommandHandoffDeviceTest.kt": "87ce127e7dc41f78af21d4515e633abf69205c1d723f00a1f211649e5f9a20d4", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDetailDeviceTest.kt": "d5bd83f6d174ca5d5c3c9d68551cc3a78bc90763060410bd5f3b67d9d9642025", + "app/src/androidTest/java/dev/tinycast/android/ExtensionDeviceTest.kt": "3087ff055f70cdf43d2565e22703b9c57445b5c3e1594126d60b0279c32b2640", + "app/src/androidTest/java/dev/tinycast/android/ExtensionEmptyViewDeviceTest.kt": "64e6b1e68c61cf67b24ba02d1e14a72d297b1bdeebbdf1008905d5619ce2558f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionFormDeviceTest.kt": "6418f6ab517ead50a102b4834bff9c40988849fb3a2a1ef20f575d162b32e11b", + "app/src/androidTest/java/dev/tinycast/android/ExtensionGridDeviceTest.kt": "952b4f2988379c1545575d1332f8358acc9053e257a382b7549a27f6b4b40de3", + "app/src/androidTest/java/dev/tinycast/android/ExtensionMarkdownDeviceTest.kt": "e4b7daa9fd914335f572ef41665595104cdae5434682977a2d806ff63ef36c4f", + "app/src/androidTest/java/dev/tinycast/android/ExtensionSandboxDiagnosticDeviceTest.kt": "3e192cb65d011e021d5b47b6bde765e1136c2ddf7e039b5c9dce6dedbf39da15", + "app/src/androidTest/java/dev/tinycast/android/FeedbackReadabilityDeviceTest.kt": "86096d428b6554bcb6b8c9d7bc39b981baf1fd53f9367a33c97ce03c89020a82", + "app/src/androidTest/java/dev/tinycast/android/FolderDeviceTest.kt": "f3d54b0d788459d34470d2d87c8882cdfe30e8956a8886cd324dd63160f5628d", + "app/src/androidTest/java/dev/tinycast/android/FormDocumentsFixtureActivity.java": "434e72d8a0c977a83cbe6524cc51638eaff9cca5581c570ea58d4068ad2156a9", + "app/src/androidTest/java/dev/tinycast/android/FrozenBundleWorkflowDeviceTest.kt": "9d31d56f739caa2509610cf4c07abf70dfd5ea0aead7ec5c5673bde1ca04bc45", + "app/src/androidTest/java/dev/tinycast/android/InlinePaletteDeviceTest.kt": "ed2cfb9dc3c5218adfe0ae7b3cc1c60a69e6cf8c83ad434c2fc6b87d23bb2727", + "app/src/androidTest/java/dev/tinycast/android/LegacyInputDiagnosticDeviceTest.kt": "4966fac20af96b8597fb38a278d8f3ef89b7e335f3d3b6e5df00fb349ebabc55", + "app/src/androidTest/java/dev/tinycast/android/ModifierHardwareClipboardTest.kt": "141499cea10d4c80b8ef690fd43e985c066d1b420afa23895c32e75de737ec8d", + "app/src/androidTest/java/dev/tinycast/android/ModifierTapDeviceTest.kt": "d33bafba795569c15bab709a9830ca06ecffda9feb754492ec437d55c1d1cae1", + "app/src/androidTest/java/dev/tinycast/android/OwnedFormDocumentsProvider.java": "67c22d543cb2136d81dc3544d8f63df94ce67f9524c7f19dc9c6b1b586713e89", + "app/src/androidTest/java/dev/tinycast/android/PaletteDeviceTest.kt": "7f5861ffec2e762c1e629519802c10d4b31e3bebd49a3c5867013c6aad77f3f4", + "app/src/androidTest/java/dev/tinycast/android/PaletteOverlayTest.kt": "0755f9aa38bdb5785d2cb8902157ce990b5b9825db0ae71847e11c8b1bd4b7aa", + "app/src/androidTest/java/dev/tinycast/android/PaletteStabilityDeviceTest.kt": "87896693541425799e7815d2fc1e3988e29afd9bba346da48183a91fa91be9c9", + "app/src/androidTest/java/dev/tinycast/android/ReadinessDeviceTest.kt": "c6f3ea767e9adc8384a3b662223ab57bef067fca8501509e0415111b711589f3", + "app/src/androidTest/java/dev/tinycast/android/ReadinessRegressionDeviceTest.kt": "17545e645708b0f9c38ec1b9c4ca27c9ab7d3ee54a11e92c2932553493561770", + "app/src/androidTest/java/dev/tinycast/android/RecentDocumentDeviceTest.kt": "85af5ed0fd05c0716b8ac14b24e98397829ff8d241695999a0cfc68727923e40", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextCallerActivity.java": "640609575a0711566bf23f3028a5144e8aeae912604f9b7180912fd2c9b96200", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextClipboardCrashDeviceTest.kt": "6a1ebc4d90c8b5fa9a07f4b288c20b361297efbeaf7d4423eb211da47b4cf0c0", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextDeviceTest.kt": "03cc93b5e0fd05d7baa9c9164004f3cc79e4bd48e8e190a33a20748dfdb6a0d8", + "app/src/androidTest/java/dev/tinycast/android/ReviewedTextLifecycleDeviceTest.kt": "ef799e02e8d95738d5642cece8898a9a65d2b416b616f37c1687451732228d4e", + "app/src/androidTest/java/dev/tinycast/android/SettingsDeviceTest.kt": "dd9b9a2492c497a2a3ac3218d0833d2e8b536eb904975aa536b08361acc323a9", + "app/src/androidTest/java/dev/tinycast/android/SettingsRouteDeviceTest.kt": "8f6991670e740a07d3a6b30aea270b60e19f6d237c4b7b6afaf25200962ad736", + "app/src/androidTest/java/dev/tinycast/android/ShortcutDeviceTest.kt": "5376ede8474d5eaa4ec7ecb628d1056a5bfc963bd2a292d17d9b86eead8a5415", + "app/src/androidTest/java/dev/tinycast/android/ShortcutReadinessDeviceTest.kt": "41bdf7ab67a6899dc8a0b1b0f697135bc587dc401c9234eb56d25385eadf3dcf", + "app/src/androidTest/java/dev/tinycast/android/SystemSettingsDeviceTest.kt": "80e0c919fbf04916d2441aa3fbc4cccfac534f56c29dfd908e5ae2d917cfe13b", + "app/src/androidTest/java/dev/tinycast/android/TestAutomation.kt": "faad509cd41b06c4cc1087e5de8e0218abca78773603b2050bb2825c880588fb", + "app/src/androidTest/java/dev/tinycast/android/TouchReadabilityDeviceTest.kt": "6801d25bb0d9bc45899b04aeedba474e2ac8e5cc8cb168b6268e0305fb49345e", + "app/src/androidTest/java/dev/tinycast/android/UpdateDeviceTest.kt": "380e4d7702d2f8c68fd575581309113bc67abf3e5713bdb177cc3b920c4e2787", + "app/src/androidTest/java/dev/tinycast/android/UpdateSelfInstallDeviceTest.kt": "fc94ef400b54ee2cf8378d2b1632fff1521299f188a132f0330e930b40f80ed3", + "app/src/androidTest/java/dev/tinycast/android/UpdateSourceDeviceTest.kt": "76d91931dc044fdeb001a8325a321306011f2b0c54aa631bea25751c59f3ea50", + "app/src/androidTest/java/dev/tinycast/android/UpdateVerificationDeviceTest.kt": "cebe3033132db567affccc5419ec59a9639c87ceb88b20c38ffbba16c13b4592", + "app/src/androidTest/java/dev/tinycast/android/WebViewCompatibilityDeviceTest.kt": "ce5842cad291b9cb77aed19ecb9436dc80de24beb27e018797a7f84fb4a84895", + "app/src/main/AndroidManifest.xml": "65fefcf86296b7103c2237f1e29bca7890bf33f6b5056f860c2e39ede371a55b", + "app/src/main/assets/ANDROIDSVG-LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30", + "app/src/main/assets/ANDROIDSVG-NOTICE": "2e61b715e3553494f46f43e5a88e8d26c56201e0558c8d5ab02946edb4f7dedf", + "app/src/main/assets/COMMONMARK-LICENSE": "11cfcf6da0142fb1971c1f40f5924ddded14454e2793d7f1dd87c9f4abe42dfd", + "app/src/main/assets/COPYING": "14609801e0e520dac851e75d993ca4c75c3842a3be468f6f7f04a16c03c824db", + "app/src/main/assets/GEMOJI-LICENSE": "7ea1d1fd0602e6623b9a65e791499a0ea5a2f5f60f91bfad78cbaeee19da26e6", + "app/src/main/assets/NOTICE.md": "c263e44ea9a845c4e4ec564eeca46ae0fc343f63ffd10685afbf74586647e0f6", + "app/src/main/assets/REACT-LICENSE": "da6d3703ed11cbe42bd212c725957c98da23cbff1998c05fa4b3d976d1a58e93", + "app/src/main/assets/RaycastRuntime.generated.js": "b306b45453cc8507037ff2822066475aae17def757a8ef72d4a4fc64c6494bb7", + "app/src/main/assets/android-runtime.js": "1b5dfa3f5b512f55322f27703bbebf15d1a8c4569c4c1712a6dd64541dd552aa", + "app/src/main/assets/emoji-catalog.tsv": "e49f1cc09c6f487a6e7b55590ecc171dcff390f720a9ce3820fe2038810d5d66", + "app/src/main/java/dev/tinycast/android/AndroidShortcuts.kt": "1738bc2fe26a117f3d00edddf2639cd49d118f9d91bd5f6eff86d6ee6804b68c", + "app/src/main/java/dev/tinycast/android/AssistantActivation.kt": "b5855f87a029362bd06a63136dea7a1572fff716d0c302056f2a3647d9d95560", + "app/src/main/java/dev/tinycast/android/Backup.kt": "97f09aa4c2cf7ef42473be8728be28cadd3f3ab14930a6804590c0544a7c104b", + "app/src/main/java/dev/tinycast/android/BackupUi.kt": "d13aabc798d7fb19746b09d28a38593792792b67e916824776413d2fbe82870f", + "app/src/main/java/dev/tinycast/android/CalculatorActions.kt": "e03e5645069dafb156556efac7bd465f632938f8a5a24a78be72dff0ee5d3947", + "app/src/main/java/dev/tinycast/android/CommandEngine.kt": "b6be72c82b19fb09e1bf44cd4dd4148b3dbb0c39098eb42f89e80f9ffa034f78", + "app/src/main/java/dev/tinycast/android/EmojiCatalog.kt": "4dd39955ec38adea02d0c1974ace2b33d86ae738efea0e59d3e62b9072c10b81", + "app/src/main/java/dev/tinycast/android/EmojiStore.kt": "f7f5dd63af030b9d179c70336f4b52789d23a318020b6f19ac0c24d20ba8cd8e", + "app/src/main/java/dev/tinycast/android/EmojiUi.kt": "8c1be27aad2e952108cdc28c8d6c28c5039513baeaa23ec6d6069d967b8c9414", + "app/src/main/java/dev/tinycast/android/FolderGrantTransaction.kt": "11361d342e1e1598c85b5ea630f174c3a4590cbfaf9b430a30fbea2b9686a5c7", + "app/src/main/java/dev/tinycast/android/FolderIndex.kt": "6f1b1617a39c0c6e954a1b9b4da0d0d6af3ab7eeac25f2619e299621eec83a99", + "app/src/main/java/dev/tinycast/android/FolderSearch.kt": "4fcf90368ed70b49c192ab1b92b6e367d0a61643f928245f8447f542e745b60d", + "app/src/main/java/dev/tinycast/android/FolderSearchUi.kt": "dad0f473544f8e459aa301ad8eb91ec7380cebbe572e3e2be3f94443585a75c6", + "app/src/main/java/dev/tinycast/android/FolderStorageCoordinator.kt": "ff5491baf9d81ff19b04b35e33a503fc1656bfee9d8eb066453fdbe7e0f83bfb", + "app/src/main/java/dev/tinycast/android/MainActivity.kt": "2bc08e693d69ba4668a675c42dbcabb507755f8e3daf9ee01eaf62fd5744efe0", + "app/src/main/java/dev/tinycast/android/PaletteActionCapsule.kt": "f7228cdd6b6988fb049f0aaf1048d69cc8489e802b4cc42a2b4d6f9e7ceea3e0", + "app/src/main/java/dev/tinycast/android/PaletteColumn.kt": "cd6cdc348752bcc20bd631e2216abdd4ee0c91d9606aaab62ce0c01a145dd6aa", + "app/src/main/java/dev/tinycast/android/PaletteDialogs.kt": "99055192ab85f645a9d9c77d96064b06bba2f1435de503bc45be8f56b4de2dc5", + "app/src/main/java/dev/tinycast/android/PaletteFooter.kt": "5b62c907b46e5075975fc22d01771f5ab7c7f53e433692de55d92865231e967f", + "app/src/main/java/dev/tinycast/android/PaletteFrame.kt": "bfbc139e01a4276770644d5f4c1242016839fd98f5e2f21fa8afb31c886bc763", + "app/src/main/java/dev/tinycast/android/PaletteMenuOwnership.kt": "0be25f335246b8e47bf07ea057adf2045a20f9db5bee90a396109adfa7426174", + "app/src/main/java/dev/tinycast/android/PaletteMenus.kt": "43bc24a46a1ea0bac20f096a7d5d5256250c1c1069e0990bc958881830533dd3", + "app/src/main/java/dev/tinycast/android/PaletteScrollHistory.kt": "84e26b8544adc069c9f86e3273acd2254e2189f1680dec592570a261cdf87602", + "app/src/main/java/dev/tinycast/android/PaletteStore.kt": "7434fd21d100108a267e5790ecb705f4ca76c5dd0c86cc5b14bd9644ed58f57d", + "app/src/main/java/dev/tinycast/android/PaletteTheme.kt": "7afa29642b2bda9c9f669eaf6cdefcb977d14417d313547aff1ff807f4e37471", + "app/src/main/java/dev/tinycast/android/PaletteTileService.kt": "6f29825b3560944aae77935bc3abfb6a53e9577735dc622bf80e5ea1a1fbad00", + "app/src/main/java/dev/tinycast/android/PaletteUi.kt": "7d539b8b669fa8f9ad175fc1a3be15079fdefc456ba19bb76b3b56b3f038a6d5", + "app/src/main/java/dev/tinycast/android/PaletteViewport.kt": "7008b8535ec3e754450ce446f34b6d8e50e9b2f5a9de64f436583144f8dd83dc", + "app/src/main/java/dev/tinycast/android/RecentDocumentQueries.kt": "b60f5f6ac3458eb3659dd41aef01bcd20be9d59f3841ff0fa77c3eb6ee82c92b", + "app/src/main/java/dev/tinycast/android/ReviewedTextFlow.kt": "7daf246a7b8a608fe61e06f078bf3167c17df8f784f8779977ba6e87914526ea", + "app/src/main/java/dev/tinycast/android/ReviewedTextInput.kt": "ca681bb2c4eb91188a1550650bf5fb5f83569bf8ac954ab22abc0ce05ed17e73", + "app/src/main/java/dev/tinycast/android/ReviewedTextUi.kt": "5ded41175e114968aa1994c93ade551b21121db15c4a4a7ea5ff87deaff00d86", + "app/src/main/java/dev/tinycast/android/SettingsActivity.kt": "6c8a09cf51abdfc1f61c305b17e613f7b40f9960168aad2fafebdc31155a3601", + "app/src/main/java/dev/tinycast/android/SettingsUi.kt": "55886d17261a019fcddac77f25e655896217dadd081db6da23a2e519a6bad35b", + "app/src/main/java/dev/tinycast/android/ShortcutReadiness.kt": "83a422a837edc657f1f3faf94c155019eae73f1abcc8761379dcb2051ceed505", + "app/src/main/java/dev/tinycast/android/ShortcutUi.kt": "394fadd7890bbb2dd5f851bd5a290ebf19ad4e05fae64c321e529eeccd35c632", + "app/src/main/java/dev/tinycast/android/Shortcuts.kt": "14e08d112e3cc5689a5717f68dce1334d3c2bf92f4a7cfbc2057fdc96418a9b2", + "app/src/main/java/dev/tinycast/android/SystemSettings.kt": "c5c1535d12627b975f8f582437e53d02b4110f4bfb185d5c8d1e9307debc319a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCatalog.kt": "8e22c11ac92be56a5db31da0b5d32eb546530a6be24d788e275d756c80fa06aa", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionCommandLaunch.kt": "2b253982bfcaa9c2b04178fcd38a04492e450352a459bdf375abc7948e6950c6", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageInformation.kt": "8a5d61b8f7d594933c6797d12c60f1888b4f4f4ad7de35a306c206406733b5e0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImagePolicy.kt": "f393349926cd371a67e3e59af0d0eb4db66d124e035259622c5558efb0035529", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageTimeout.kt": "16e0fb6b411c4cf30fcbcafc7df536f72da84c1a208f0ea47ba1a0b612d762a8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImageUi.kt": "6da7920fd357a8106015a8a6da6d085fd2b8ae2bf26269c4aee670c84f7b0af0", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailImages.kt": "a87f8cf7d311baefd09c62f8a09e282764561bc2fe27b61abe0aec14d8c273f4", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionDetailUi.kt": "15be7bc728b4fa72841db59a6e72e9acece275a5a6315d4ba6b19af22fc06f21", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionEmptyView.kt": "4ab1b0093364ad790235b666fc70ec2642bb40692f3ce7fdb830e6bc514c61dd", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormContract.kt": "6eba4aa3f33b19d4c452212b3bbb33c8ac0cbb8ae8e61963867e83094d6778ed", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDateUi.kt": "e052fc6c27a78ac0df119c954f7ef43f720ce8ab72462bb712832b6dfdeae18f", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormDocuments.kt": "1071c99bd42ec6265991731022662729fd1ccc0269fee924b229f9ab8c2980fc", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileImport.kt": "c91ee69d460190918ee649a61a340429ac0478a59ab5e7ca824db8c17d1f5d00", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormFileUi.kt": "4241a498c65c255db94f833038a1f86a8cb06f27b4cecb3838cc20e953262b01", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormPickerBackdrop.kt": "dff8e4e37d38c1387bfd221f6c43c29272abfa144fff34ada0a0734a9c0f946d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormSubmission.kt": "7f89b0ef7216cafb22c72a636b3b2998e5d71c9933bcd87d7c65a25b9a2bd9d8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTagUi.kt": "509187d014c00ca027720e16d22934686d1c0491f10e5e151a27b574cde86a96", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormTypedValues.kt": "bd6b1c9b3e45101715916ee145ad41cfb1b74e206ae733f97d375c119f86af97", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionFormUi.kt": "bdb8f813a82e1e1860ebb08047b4a449a440ffe6d2a005d97c06debcbf4438c2", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridImages.kt": "777de62995b645310418d2f0da8adf87c450d8b7459d1c9abab0e9a02ce84258", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridModel.kt": "5b104c726a950f09a7cf890a14c0e4e654dfe8f5ea8b1b41468a0822f42a2f48", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionGridUi.kt": "c66cd6ee6d29cd2cc43d45ddbdc15f175ac5a5a39b332736b4cbddecdbf9e6bf", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionHttp.kt": "88ed57ca318c3e0c45e50f85e3157692d479bdae9636127869556cfb553abfe8", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionLinks.kt": "cebfba7010fd2a20423527f8025413c21257ecd8e97ddc0dcb321b1c74db71f1", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionListUi.kt": "b02b632904d5d6be8f7b967cd10ccbc72d7e3d8fff3caf66c4fb444bce7de136", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownModel.kt": "723a518700e335179c296e8b9b05ae9a899c8aaf93b8ca02b76476a46879d6ea", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMarkdownUi.kt": "54d1b8dc6b09e55a7b0adf7d23903c9fb97551673a5695196e2e6f89259e304d", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionMetadataVisuals.kt": "882b7080d8f46cc9c9e2fd96fd1cc5cb0565cbb282bf3b04cad1c31b77a32290", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionRuntime.kt": "96fecfe385972e520c4e1e06b510f357219b70ca02a9e4c3ba6c87fa7a428b30", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSelectionDelivery.kt": "f13388787b615343c214a861a619bdba88b6327dc939365a130e9e799169c397", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionSvgPolicy.kt": "1bed94b2ea8e6d2475526a0ed83d85724e32893fafc8b27bd8f2b58a95cd868a", + "app/src/main/java/dev/tinycast/android/extensions/ExtensionUi.kt": "b66e3faeaab07b8a86bd6eb5b9d8ab27df6ff70b4341d577e98cab64ae4fa584", + "app/src/main/java/dev/tinycast/android/extensions/NodeCpuInfo.kt": "eea176a7259e8f3736878886350610a84a23a6d2799f5337f5c8b07a8fefa398", + "app/src/main/java/dev/tinycast/android/extensions/WeakValueTokens.kt": "5c4d6f5c5b0d7170b554091e1b9cd9d551119ea60d7fe7f03946eb70f498c34d", + "app/src/main/java/dev/tinycast/android/updates/AppUpdates.kt": "63ace29d7dc29e005ffbbdde31cbac4e1d923732604b1e43e6a4db8a3285b508", + "app/src/main/java/dev/tinycast/android/updates/UpdatePolicy.kt": "350a9142ebfc663cd4a0c982ab220fb5f1e3399bfb3207c980ea20fd4c5c4e6e", + "app/src/main/java/dev/tinycast/android/updates/UpdateSource.kt": "aa860f14bd3a9f39e19899f1927fb7a790c54bb4f2704651253d8f867bb3c100", + "app/src/main/java/dev/tinycast/android/updates/UpdateUi.kt": "0bceb6a4221787a58dfb14ee1bcdcd266388720ca8862bd705cfeb10cfe52457", + "app/src/main/res/drawable/ic_launcher.xml": "104e38ffdf3214de23909b7896392f4a974e4fcbcc778c447d5d7a9ce56380af", + "app/src/main/res/drawable/ic_palette_tile.xml": "e063a6c4a1a25d6717a31bc355543d76c7d1babf8e9556e68b1b5e6a2b860748", + "app/src/main/res/values/styles.xml": "de4ad14f9ef41aaa4ffc824af155831579fa1194af5055edd112efee5042f5e1", + "app/src/main/res/xml/assistant_service.xml": "1e9e560563a7d0260fc83126d3a9bf027bf6357adfc811b43bc3224290c77ddf", + "app/src/main/res/xml/data_extraction_rules.xml": "cb4d1da1c1bd38761a9a08cc4d8d1b55839fcc14a6e19badb653f75b23c20eca", + "app/src/main/res/xml/keyboard_service.xml": "b1839c96988c03fea26ce4ed5932b1315013f3d2c16165993afc17368ab7bdd4", + "app/src/test/java/dev/tinycast/android/BackupPlannerTest.kt": "12a55d3644b5094b84cad2e88a5432738021fc8d7c59c232d4e5fc4c2c9a1454", + "app/src/test/java/dev/tinycast/android/CalculatorActionsTest.kt": "e803682a82b89c9703fcfbcbb82424eafef6bae6a13092953a3dc2c877816509", + "app/src/test/java/dev/tinycast/android/CommandEngineTest.kt": "65d9d198e8e1a188e4dcfd5551ced8f558f87a106f42b1d02a1432e8d6b7c234", + "app/src/test/java/dev/tinycast/android/CommonMarkPrimaryConformanceTest.kt": "ceb2ca14cc003385533bdd73b8beefffe92740887537b74c2146160621a23fcd", + "app/src/test/java/dev/tinycast/android/EmojiCatalogTest.kt": "9d70ef96696215e14e561d73f5a41f0b1a8272c3b58e5ad5a8438c31bc53aaa5", + "app/src/test/java/dev/tinycast/android/ExtensionCommandLaunchTest.kt": "f45df47e1740873ed7e771de72a650d9df88cd31bbcf2fd3abf67e3999700291", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImagePolicyTest.kt": "7ec37a8870b70e3df0e3110f8b60ccc94185fedeaf1c39c76a00485dd4ca37d5", + "app/src/test/java/dev/tinycast/android/ExtensionDetailImageTimeoutTest.kt": "839216fc2d395cbd171676f32bfe77b894730a29a12127ec916c1d88b18dfb3d", + "app/src/test/java/dev/tinycast/android/ExtensionFormContractTest.kt": "432d658e2a177312105e2ec86db2c59d0625086e86464a7ff946acb61c07e283", + "app/src/test/java/dev/tinycast/android/ExtensionFormFileImportTest.kt": "784f5b78f1dfd0d23ca653b36fc59bd13cba42e68c708c499678ac1ce474b673", + "app/src/test/java/dev/tinycast/android/ExtensionFormSubmissionTest.kt": "4bbdd8068cd95c314f7cf7aa156c7928cd815c5da11ef5f2cab1b4c5d23dd7d5", + "app/src/test/java/dev/tinycast/android/ExtensionFormTypedValuesTest.kt": "3a485a387e1527163d4318c3f0863b743bff02fe4e485adfff490d95cd554395", + "app/src/test/java/dev/tinycast/android/ExtensionFormValuesTest.kt": "6bc5bc8caaa5763e12dc3136bbba1d99249db10387c163cb1efeb0ae03f09d2a", + "app/src/test/java/dev/tinycast/android/ExtensionGridContractTest.kt": "50681a34c624a01867f287c66523d653e1931cf759f5e2926dda60feb85fa2b3", + "app/src/test/java/dev/tinycast/android/ExtensionGridNavigationTest.kt": "94ffe218ed5f9411210c2599db2a10dcd20c1a94655ef53e8cac1c574318b68f", + "app/src/test/java/dev/tinycast/android/ExtensionHttpTest.kt": "76917bbbdcc33dcc90d9b152d5a3e478fd981139e1df1d9edc0916e4f81b8e76", + "app/src/test/java/dev/tinycast/android/ExtensionMarkdownModelTest.kt": "fbeee6a80280ec27b660cc53222ef42f0e9ff5f5ce7ec5e02dede9d6b1c9222b", + "app/src/test/java/dev/tinycast/android/ExtensionMetadataVisualsTest.kt": "6f8653f4ed71138ac4fb0353e427d5b6775f54ec3600177ec6eae49dbc81598e", + "app/src/test/java/dev/tinycast/android/ExtensionSelectionDeliveryTest.kt": "1ea1e17cf0ea43fa3418a61f71587dbee9ec341b288d17fdaba3c5d3d8da4cb7", + "app/src/test/java/dev/tinycast/android/FolderGrantTransactionTest.kt": "ef710edc4ed1eb45782f90c385bc73305217f26882b630cd3e79ee93c59ef118", + "app/src/test/java/dev/tinycast/android/FolderIndexTest.kt": "bd371b19d1678ea876889cfb25505d690a4296c37d042e4cabd38bc7c7e4eff4", + "app/src/test/java/dev/tinycast/android/ModifierTapTest.kt": "bc0f6191ef2837018ca33a71010c1582cd39d0b3713c55acec4f91406a74d4fd", + "app/src/test/java/dev/tinycast/android/PaletteMenuOwnershipTest.kt": "c3134a62d61b5cd7ed810b867a6b40219713f21b798fabf6e659129cfab55506", + "app/src/test/java/dev/tinycast/android/PaletteScrollHistoryTest.kt": "b1610e3c3818e5823f99ded35bc36325042da250cfd48d98c0d6381066cfad5f", + "app/src/test/java/dev/tinycast/android/ReviewedTextInputTest.kt": "4bff225dd9fc1963736ad1f992e3eda3ffff21554c3ebef63d25acfdb41a29f3", + "app/src/test/java/dev/tinycast/android/ShortcutReadinessTest.kt": "45d32b02d4f89f857867d2585f3f5968251e9580edd34d9312bbfc158adc12e1", + "app/src/test/java/dev/tinycast/android/ShortcutTest.kt": "ae8034901d8ca73d704d40992b85ed43a64a021a078ff4eb5b2b853c4f398610", + "app/src/test/java/dev/tinycast/android/SystemSettingsTest.kt": "cdfc38bed12779bb92b0ddaeb79d197733243b24da43ab89d8580ecfd1f1fb51", + "app/src/test/java/dev/tinycast/android/TinycastGridParityTest.kt": "df6ca13f0f0a1e4bfa1f0085e274ed87457a6aa1a69492afa1041128af99c5e3", + "app/src/test/java/dev/tinycast/android/UpdatePolicyTest.kt": "d87ee4f7d6aa7b39b998267bd4d042d0b494ec6a1280d18860f262355c25cbe3", + "app/src/test/java/dev/tinycast/android/WeakValueTokensTest.kt": "ced7bf72628d5dc18fc5fdd30a81e58bb4b4b7f40e4e8c7eb0e77500f7c73566", + "app/src/test/java/dev/tinycast/android/extensions/NodeCpuInfoTest.kt": "5f3a7aae9b24435a4dbca77f9132a4b203ea736b1c76fc9108a51251983c2797", + "app/src/test/js/android-fetch.test.cjs": "2842effb321a11a33816f176f3300cd27a61c1e2ac70c4ed32681d46a129e56e", + "app/src/test/js/android-form-focus.test.cjs": "dd065271386dfdb2552caef1ae6e0c6f30e32783571abd85be328b9864bff8b6", + "app/src/test/js/android-form-submit.test.cjs": "7cbbb553dc2e657951b9195593b11add03597adad2710b4daa3e2cb807f87334", + "build.gradle.kts": "780d597cbe0f80d0103221a566db7574d1e07b17adca5bdbe7d6c728d77df12a", + "gradle.properties": "e43a00491832254a35cf5a979ef6de17f78c4e159d446be39319d2e3d3e46325", + "scripts/android_clipboard_recovery.py": "4aa2d03a100791544d282de37a2f62b6f7bfd94c47cc5611b6b6448ed8a946c1", + "scripts/android_form_documents_fixture.py": "ef44f5a9af1397fc8e8ea1924e36c2dec18d5c56c02e22f4925752daf1034841", + "scripts/android_test_cleanup.py": "1f4a1d70d251ec0a8294932388ce881da144c9c7d1c05df54df2c5b246d46373", + "scripts/extension_bundle_snapshot.py": "08ae0408a22e4f4c3c8a8b22af31b6a6a16d304dc0d14d5e489596dd9731a950", + "scripts/extension_manifest_catalog.py": "18c6048a0690e68dba3da1e8d11c5abccac16c3c26aa8803ff80abfd1dabe7e4", + "scripts/generate-emoji.py": "98f43c9a5941b4e65533e31ff7d7eaa4e697d8fecd4c7424297e6957e07abd53", + "scripts/generate-tinycast-grid-oracle.py": "bd53975673883b624d2553cd47687c5a3a760b17181a8c0621715ed1599b3118", + "scripts/package-nightly-update.py": "2a650baee0c7c76eadd360171e19686aad7b960fe34ebc780638c6b231032420", + "scripts/summarize-readiness.py": "e63d9d2ec435d2c369ae0be126bafb0b0507e903b03674f11a77ee10b428fe64", + "scripts/test-api-compatibility.py": "1ba4bf24535130bfd59a5f1d9d4830ca075e7158fc2cbe316696fcadb6108065", + "scripts/test-assistant-touch.py": "fd5a4acfdd19ddc60eb467fea3c7d2e8ab7ac717bea35c76d007577c23235a54", + "scripts/test-calculator-intent.py": "93ef5653c4d0c153d8f216c9fd74557089a964eaab80c84c85ab5460ec58f1a1", + "scripts/test-configurable-shortcuts.py": "56f4581f78265ec2c28faa1da115ae10a8349cf47e10db60bfba3e88f0cc3e73", + "scripts/test-extension-grid.py": "26f15b12f40277cbd3b6b874c58e41ab7e26735ef8e70634e5b5eb53b5652560", + "scripts/test-extension-workflows.py": "c6cce4d533b45655a7763305379107840a93a1a953be0322a869c7505ffc0997", + "scripts/test-global-shortcut.py": "4a0f57d16dfccbd0c7b33d6b78a841ccad030c4bad6fb108ac80f15dc89f6d6a", + "scripts/test-modifier-taps-hardware.py": "b0d2da7fd2410095d65ef20e25cd9b8e90f9b480849dfd5e497f75d4d713139c", + "scripts/test-modifier-taps.py": "8cb08d228371c90f995ae2246ef0a92daf6c81724c11a1ac67374ed0dd347dab", + "scripts/test-readiness-benchmark.py": "1f92dc1989f1ff36c82433d6eaab1e2c896abf7541a24a9b215c109e49d1a7d9", + "scripts/test-restart-files.py": "65f1c311df77634f746cb155d831acf1fa4d8cf05d0e1dabc9d372bf1e842065", + "scripts/test-reviewed-text-input.py": "2c13b94e4dfe29ba2f8726bbb79bf2d8f147fab13847c66a50d1603a0f54b510", + "scripts/test-reviewed-text-process-recreation.py": "eecd547c48ad2bbce2d8bae62bbed26a2484e0b5d97ebb7cb989ba98d4de2a23", + "scripts/test-search-header.py": "772cb70442bbf28086beb8087ebce94d02ba6cc10e6acf8c2cf91a0d8d5b39d0", + "scripts/test-self-updates.py": "4ff148ea90c3a148a1eacf74116db288e5e9c282f69e0c331caa6f22b1a40889", + "scripts/test-startup-performance.py": "9ac605bf3347fde625d279767bb8fc4de76ae82f099e7d8351416fa5bc9250ae", + "scripts/test-touch-readability.py": "d9ae59ab3db56d63cb5c959c200263b71acd0e04c305dce4e9ceb8a395933fb6", + "scripts/tests/test_android_clipboard_recovery.py": "b260d3adcfa33e2641affebee9bebb1676097b4a24bbdbeb89cef7f3fc889176", + "scripts/tests/test_android_form_documents_fixture.py": "c2b573793d6c5d48fe9dc8e75ffc554e11818e319507080a4b96aa4e24e1fc03", + "scripts/tests/test_android_test_cleanup.py": "49c8831c517f0777f46952376f5d3b783322eeb25f063d69a9b1bc2f8cde01cf", + "scripts/tests/test_extension_bundle_snapshot.py": "382561907129ac58b7e20b963c1afcbc9bc1a03b7e18da64e7d61927a8b15783", + "scripts/tests/test_extension_manifest_catalog.py": "57af21edf39e3e4084453830eed62d3c052ba8d8a4f942d3d69807e2cd4b69a6", + "scripts/tests/test_extension_workflow_guards.py": "1cea982b85cf759e691471cad72b8e2cbdccdf3c2ccc6c483b1ef01b49002a3f", + "scripts/tests/test_private_path_observation.py": "3c0fff3062ac9b43aab67ed4ab2d53b92fa39f9af9e0ada9d197856a1df94e95", + "scripts/tests/test_reviewed_text_archives.py": "0308a50c148c97ed50381e894eabd43ec6e374878f99b810244c24e25f1a626e", + "scripts/tests/test_reviewed_text_runner_guards.py": "a9d0a581a46398d8643b58803537bb593ba2c4e2ee89374b94ea135f8d825c80", + "settings.gradle.kts": "6a8db88135b364d8bd2facb607fc4e9e9476c171d2b7f7f3a0892c57a9ee6487" + }, + "test_apk_sha256": "c4e3cbda39121756df96c5c1d91b38ec78f6276af062450aed1ad73e88be356d" +} diff --git a/docs/validation/command-handoff/pipelines/continuation-v4.json b/docs/validation/command-handoff/pipelines/continuation-v4.json new file mode 100644 index 00000000..c0e25b55 --- /dev/null +++ b/docs/validation/command-handoff/pipelines/continuation-v4.json @@ -0,0 +1,30 @@ +{ + "completed": true, + "runs": [ + { + "name": "regression-menus-tablet100-v3", + "exit_code": 0, + "already_completed": true + }, + { + "name": "regression-review-tablet100-v2", + "exit_code": 0 + }, + { + "name": "regression-forms-phone100-v2", + "exit_code": 0 + }, + { + "name": "regression-detail-phone100-v2", + "exit_code": 0 + }, + { + "name": "regression-menus-phone100-v3", + "exit_code": 0 + }, + { + "name": "regression-review-phone100-v2", + "exit_code": 0 + } + ] +} diff --git a/docs/validation/command-handoff/pipelines/final-verification-v3.json b/docs/validation/command-handoff/pipelines/final-verification-v3.json new file mode 100644 index 00000000..16ef687b --- /dev/null +++ b/docs/validation/command-handoff/pipelines/final-verification-v3.json @@ -0,0 +1,81 @@ +{ + "completed": false, + "runs": [ + { + "name": "matched-lifetime-recreation-old-tablet100-v3", + "exit_code": 0 + }, + { + "name": "matched-lifetime-preferences-old-tablet100-v3", + "exit_code": 0 + }, + { + "name": "protocol-ack-tablet100-v4", + "exit_code": 0 + }, + { + "name": "protocol-duplicate-tablet100-v4", + "exit_code": 0 + }, + { + "name": "protocol-ack-phone100-v4", + "exit_code": 0 + }, + { + "name": "protocol-duplicate-phone100-v4", + "exit_code": 0 + }, + { + "name": "critical-context-tablet200-v3", + "exit_code": 0 + }, + { + "name": "critical-context-phone200-v3", + "exit_code": 0 + }, + { + "name": "critical-context-landscape100-v3", + "exit_code": 0 + }, + { + "name": "critical-context-landscape200-v3", + "exit_code": 0 + }, + { + "name": "critical-invalid-phone200-v2", + "exit_code": 0 + }, + { + "name": "critical-invalid-landscape200-v2", + "exit_code": 0 + }, + { + "name": "final-quick-tablet100-v3", + "exit_code": 0 + }, + { + "name": "final-quick-phone100-v3", + "exit_code": 0 + }, + { + "name": "final-quick-phone200-v3", + "exit_code": 0 + }, + { + "name": "final-quick-landscape200-v3", + "exit_code": 0 + }, + { + "name": "regression-forms-tablet100-v2", + "exit_code": 0 + }, + { + "name": "regression-detail-tablet100-v2", + "exit_code": 0 + }, + { + "name": "regression-menus-tablet100-v2", + "exit_code": 1 + } + ] +} diff --git a/docs/validation/command-handoff/pipelines/owned-matrix-v2.json b/docs/validation/command-handoff/pipelines/owned-matrix-v2.json new file mode 100644 index 00000000..efaea9f9 --- /dev/null +++ b/docs/validation/command-handoff/pipelines/owned-matrix-v2.json @@ -0,0 +1,37 @@ +{ + "completed": false, + "runs": [ + { + "name": "owned-recreation-tablet100-v2", + "exit_code": 0 + }, + { + "name": "owned-preferences-tablet100-v2", + "exit_code": 0 + }, + { + "name": "owned-context-tablet100-v2", + "exit_code": 0 + }, + { + "name": "owned-ack-tablet100-v2", + "exit_code": 0 + }, + { + "name": "owned-duplicate-tablet100-v2", + "exit_code": 0 + }, + { + "name": "owned-cancel-tablet100-v2", + "exit_code": 0 + }, + { + "name": "owned-invalid-tablet100-v2", + "exit_code": 0 + }, + { + "name": "owned-ordinary-tablet100-v2", + "exit_code": 1 + } + ] +} diff --git a/docs/validation/command-handoff/pipelines/owned-matrix-v3.json b/docs/validation/command-handoff/pipelines/owned-matrix-v3.json new file mode 100644 index 00000000..963d0dbd --- /dev/null +++ b/docs/validation/command-handoff/pipelines/owned-matrix-v3.json @@ -0,0 +1,69 @@ +{ + "completed": true, + "runs": [ + { + "name": "owned-ordinary-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-recreation-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-preferences-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-context-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-ack-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-duplicate-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-cancel-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-invalid-tablet100-v3", + "exit_code": 0 + }, + { + "name": "owned-ordinary-phone100-v3", + "exit_code": 0 + }, + { + "name": "owned-recreation-phone100-v3", + "exit_code": 0 + }, + { + "name": "owned-preferences-phone100-v3", + "exit_code": 0 + }, + { + "name": "owned-context-phone100-v3", + "exit_code": 0 + }, + { + "name": "owned-ack-phone100-v3", + "exit_code": 0 + }, + { + "name": "owned-duplicate-phone100-v3", + "exit_code": 0 + }, + { + "name": "owned-cancel-phone100-v3", + "exit_code": 0 + }, + { + "name": "owned-invalid-phone100-v3", + "exit_code": 0 + } + ] +} diff --git a/scripts/test-reviewed-text-input.py b/scripts/test-reviewed-text-input.py index 7b670333..17c372ba 100644 --- a/scripts/test-reviewed-text-input.py +++ b/scripts/test-reviewed-text-input.py @@ -99,6 +99,7 @@ def main(): 'dev.tinycast.android.ExtensionFormDeviceTest', 'dev.tinycast.android.ExtensionMarkdownDeviceTest', 'dev.tinycast.android.ExtensionDetailDeviceTest', + 'dev.tinycast.android.ExtensionCommandHandoffDeviceTest', 'dev.tinycast.android.CalculatorActionsDeviceTest', 'dev.tinycast.android.ClipboardEvidenceDeviceTest', 'dev.tinycast.android.ActivationDeviceTest', 'dev.tinycast.android.InlinePaletteDeviceTest', 'dev.tinycast.android.ReadinessRegressionDeviceTest'] @@ -109,6 +110,9 @@ def main(): regression_classes = {'dev.tinycast.android.InlinePaletteDeviceTest', 'dev.tinycast.android.ReadinessRegressionDeviceTest', 'dev.tinycast.android.ClipboardEvidenceDeviceTest', 'dev.tinycast.android.ActivationDeviceTest'} regression = any(item.split('#')[0] in regression_classes for item in args.classes.split(',')) + handoff = any(item.split('#')[0] == 'dev.tinycast.android.ExtensionCommandHandoffDeviceTest' for item in args.classes.split(',')) + require(not handoff or all(item.split('#')[0] == 'dev.tinycast.android.ExtensionCommandHandoffDeviceTest' for item in args.classes.split(',')), + 'Keep the owned command handoff cohort separate from other fixtures') calculator = any(item.split('#')[0] == 'dev.tinycast.android.CalculatorActionsDeviceTest' for item in args.classes.split(',')) require(not calculator or all(item.split('#')[0] == 'dev.tinycast.android.CalculatorActionsDeviceTest' for item in args.classes.split(',')), 'Keep the owned calculator cohort separate from extension and legacy fixtures') diff --git a/scripts/tests/test_reviewed_text_runner_guards.py b/scripts/tests/test_reviewed_text_runner_guards.py index e2760c2d..a99cf7e9 100644 --- a/scripts/tests/test_reviewed_text_runner_guards.py +++ b/scripts/tests/test_reviewed_text_runner_guards.py @@ -14,9 +14,24 @@ CALCULATOR = 'dev.tinycast.android.CalculatorActionsDeviceTest' CLIPBOARD = 'dev.tinycast.android.ClipboardEvidenceDeviceTest' ACTIVATION = 'dev.tinycast.android.ActivationDeviceTest' +HANDOFF = 'dev.tinycast.android.ExtensionCommandHandoffDeviceTest' class ReviewedRunnerGuardTests(unittest.TestCase): + def test_handoff_cannot_mix_with_other_fixtures(self): + for selected in [DETAIL, CALCULATOR, 'dev.tinycast.android.ReviewedTextDeviceTest', CLIPBOARD]: + self.refused_without_device_access(HANDOFF + ',' + selected, [], + 'Keep the owned command handoff cohort separate from other fixtures') + + def test_handoff_cannot_claim_unrelated_archives_or_recovery_controls(self): + for flag, error in [('--translate-archive', 'Network bundle is not authorized'), + ('--weather-archive', 'Network bundle is not authorized'), + ('--html-colors-archive', 'HTML Colors belongs only'), + ('--uuid-archive', 'Offline bundles belong only')]: + self.refused_without_device_access(HANDOFF, [flag, 'not-read.zip'], error) + self.refused_without_device_access(HANDOFF, ['--document-fixtures'], 'Document fixtures belong only') + self.refused_without_device_access(HANDOFF, ['--inject-clipboard-restore-failure'], 'Restoration failure is limited') + def refused_without_device_access(self, classes, options, error, without_archive=False): for optimized in [False, True]: with self.subTest(optimized=optimized), tempfile.TemporaryDirectory() as directory: