feat(verifier): report a relaunch on state.lastAction

This commit is contained in:
pj committed 2026-08-15 20:42:20 +05:30
1 parent 46f2969350
commit 365418f73e
3 files changed
+27 -1

No files matched your search

+11
View File
@@ -353,9 +353,20 @@ func lastActionFields(action *Action) []actionField {
if action.Applied { if action.Applied {
applied = true applied = true
} }
// A relaunch between two readings is not "no action happened", which is
// what dropping the action reported instead: the app restarted after an
// action that did run. Only the positive report is a fact the runner can
// vouch for, so the other side is null rather than false: a target whose
// foreground the runner cannot read (web, iOS) never relaunches the app and
// still cannot promise it never restarted.
var relaunched any
if action.Relaunched {
relaunched = true
}
fields := []actionField{ fields := []actionField{
{key: "kind", value: string(action.Kind)}, {key: "kind", value: string(action.Kind)},
{key: "applied", value: applied}, {key: "applied", value: applied},
{key: "relaunched", value: relaunched},
} }
if action.On != "" { if action.On != "" {
fields = append(fields, actionField{key: "on", value: action.On}) fields = append(fields, actionField{key: "on", value: action.On})
+6
View File
@@ -38,6 +38,12 @@ type Action struct {
// when the apply call failed and nothing can say whether the action // when the apply call failed and nothing can say whether the action
// reached the app. The spec is told which of the two it is. // reached the app. The spec is told which of the two it is.
Applied bool Applied bool
// Relaunched, like Applied, is meaningful only on state.lastAction: the
// runner brought the app back to the foreground after this action, so the
// two readings the spec compares straddle a restart. The action still
// happened; what a property cannot assume across it is that app state ran
// continuously from one reading to the next.
Relaunched bool
} }
// LogEntry mirrors a logcat line captured between steps. // LogEntry mirrors a logcat line captured between steps.
+10 -1
View File
@@ -109,8 +109,17 @@ export interface ExceptionRecord {
* tap landed. Null is unknown, not "it did not happen" (`state.lastAction` is * tap landed. Null is unknown, not "it did not happen" (`state.lastAction` is
* itself null for that), so a property attributing an effect to this action * itself null for that), so a property attributing an effect to this action
* has to decline unless `applied` is true. * has to decline unless `applied` is true.
*
* `relaunched` is true when the runner had to bring the app back to the
* foreground after this action, so the previous reading and the current one
* straddle a restart. The action itself still happened; what a property cannot
* assume across it is that app state ran continuously between the two readings,
* and one demanding an effect of this action has to decline. Null is "not
* reported", which is weaker than "the app never restarted": a target whose
* foreground the runner cannot read never relaunches the app and cannot promise
* that either.
*/ */
export type LastAction = Action & { applied: true | null }; export type LastAction = Action & { applied: true | null; relaunched: true | null };
export interface State { export interface State {
snapshots: Snapshots; snapshots: Snapshots;