Files
sanderling/.github/scripts/testdata/folio-ios-convicted.jsonl
T
pj 515e7249eb fix(ci): read the route the spec reports, not the hierarchy dump
The android health gate grepped the trace for "AddTransactionScreen",
which occurs in exactly one place: the hierarchy dump, as a resource-id.
That is a debug artifact standing in for a fact the spec already reports,
and it was wrong in both directions. Against the real 8.4MB trace with
hierarchy stripped, the old gate failed a healthy 200-step run; against a
trace carrying the marker on a transition frame without the route ever
being reported, it passed and called it healthy.

It reads extractor_changes.route now, whose values come from SCREENS in
the spec, so the gate and the app agree on what being on a screen means.
routeOf answers null on a frame showing two screens, which is exactly the
frame the marker was matching.

The drift check grows to cover both new names: extract("route") and the
SCREENS key. The fixtures are re-derived keeping the route entry and no
hierarchy at all; the full artifacts and the fixtures give byte-identical
verdicts, which is what proves the coupling is gone.

Script and fixtures move together: either alone leaves the suite red.
2026-08-16 01:51:11 +05:30

50 lines
14 KiB
JSON

{"extractor_changes":{"route":{"curr":"login","prev":null}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":1}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":2}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":3}
{"extractor_changes":{"route":{"curr":"home","prev":"login"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":4}
{"extractor_changes":{"route":{"curr":"add-account","prev":"home"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":5}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":6}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":7}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":8}
{"extractor_changes":{"route":{"curr":"home","prev":"add-account"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":9}
{"extractor_changes":{"route":{"curr":"ledger","prev":"home"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":10}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":11}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":12}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":13}
{"extractor_changes":{"route":{"curr":"ledger","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":14}
{"extractor_changes":{"route":{"curr":"home","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":15}
{"extractor_changes":{"route":{"curr":"ledger","prev":"home"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":16}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":17}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":18}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":19}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":20}
{"extractor_changes":{"route":{"curr":"ledger","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":21}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":22}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":23}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":24}
{"extractor_changes":{"route":{"curr":"ledger","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":25}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":26}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":27}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":28}
{"extractor_changes":{"route":{"curr":"ledger","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":29}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":30}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":31}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":32}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":33}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":34}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":35}
{"extractor_changes":{"route":{"curr":"ledger","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":36}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":37}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":38}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":39}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":40}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":41}
{"extractor_changes":{"route":{"curr":"ledger","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":42}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":43}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":44}
{"extractor_changes":{"route":{"curr":"ledger","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":45}
{"extractor_changes":{"route":{"curr":"add-transaction","prev":"ledger"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":46}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":47}
{"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"name":"p4","op":"predicate"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":48}
{"extractor_changes":{"route":{"curr":"home","prev":"add-transaction"}},"residuals":{"newAccountBalanceIsZero":{"name":"p2","op":"predicate"},"submitCommitsOneTransactionPerAction":{"op":"false"},"submitMovesBalanceByAtMostTypedAmount":{"name":"p3","op":"predicate"}},"step":49,"violations":["submitCommitsOneTransactionPerAction"],"witnesses":{"submitCommitsOneTransactionPerAction":{"detected_step":49,"extractors":{"accountBalance":null,"accountCards":[{"__sanderlingSelector":"testTag:HomeScreen > testTag:AccountCard","attrs":{"accessibilityText":"SA, Savings, $1,888.00, 7 transactions","bounds":"[20,130][382,202]","class":"Button","clickable":"true","editable":"false","enabled":"true","identifier":"AccountCard"},"bounds":{"bottom":202,"left":20,"right":382,"top":130},"checked":false,"class":"Button","clickable":true,"desc":"SA, Savings, $1,888.00, 7 transactions","editable":false,"enabled":true,"focused":false,"id":"AccountCard","selected":false,"text":"","x":201,"y":166}],"accountNameField":null,"accounts":[{"balance":188800,"name":"Savings"}],"addAccountButton":{"__sanderlingSelector":"testTag:HomeScreen > testTag:AddAccountButton","attrs":{"accessibilityText":"+ Add account","bounds":"[20,777][382,825]","class":"Button","clickable":"true","editable":"false","enabled":"true","identifier":"AddAccountButton"},"bounds":{"bottom":825,"left":20,"right":382,"top":777},"checked":false,"class":"Button","clickable":true,"desc":"+ Add account","editable":false,"enabled":true,"focused":false,"id":"AddAccountButton","selected":false,"text":"","x":201,"y":801},"addAccountSubmit":null,"addTxnButton":null,"extractor_0":0,"extractor_1":0,"homeTxnCounts":{"Savings":7},"lastAction":{"applied":true,"kind":"DoubleTap","on":"id:TxnSubmit","relaunched":null},"loggedIn":true,"loginEmailField":null,"loginPasswordField":null,"loginSubmit":null,"route":"home","submitsInWindow":6,"submitsSinceAccountBalance":1,"submitsSinceCounts":6,"totalBalance":188800,"txnAmountField":null,"txnSubmit":null},"reason":"predicate false","step":48}}}