iterate-kernel 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
{
|
|
2
|
+
"comment": "Cross-implementation anchor for decisionOutcomeFromEvidence and decisionSummaryFromEvidence (kernel/src/evidence-decision.ts). The rules a second implementation must reproduce, written so it can be coded from this file without reading the TypeScript: (1) circuitBreaker.level >= 3 is `blocked`, checked FIRST — the loop was stopped by harness policy and calling that a `fail` would blame the app. (2) Otherwise an assertion present (key present and not null) decides `pass` when its `passed` is true, `fail` when false. (3) Otherwise a diagnosis present decides `NO_ANOMALY` -> pass, `INCONCLUSIVE` -> inconclusive, any T-class -> fail. (4) Otherwise `inconclusive`: nothing was asserted and nothing diagnosed is not a pass. (5) A pass is then downgraded — never upgraded — to `inconclusive` when attribution.contaminated is true or attribution.level is `weak`, because the engine itself refuses to attribute that result to this operation. Absent vs explicit-null for assertion/diagnosis are two shapes the engine really emits and must be treated the same way. The summary is a rendering of the same fields in this order, joined by '; ': 'assertion <property> passed|failed: expected <JSON>, actual <JSON>' when an assertion is present; 'diagnosis <class>: <report.anomaly>' when a diagnosis is present; 'circuitBreaker level <n> (<reason>)' when level > 0 (the parenthetical only when a reason is present); 'attribution <level>' plus ', contaminated' when contaminated. JSON values are rendered as JavaScript's JSON.stringify would (no insignificant whitespace, key order as the pack carries them). Longer than 2048 characters, keep the first 2045 and append '...'. Provenance: four cases are real packs read out of ~/.glasspane/evidence on 2026-10-08 (operationId recorded per case); four are derived by editing exactly one field of a recorded pack, stated in each case's `origin`, because the archived corpus never contains a failed assertion, a weak-or-contaminated pass, or a breaker at the policy limit — those rules can only be pinned by derivation, and a fixture that silently invented them would be unsourced. The `input` bytes are the archived files exactly as the engine wrote them, including a `schemaVersion` of `glasspane.evidence/0.1-draft` and a `pixelDiff` with no `bounds`. A consumer that reads evidence off disk therefore parses them through the read-side contract (`parseEvidencePackRead`), which is what folds the legacy version and tolerates the missing signal — the same path the GlassPane Harness ledger uses. The transcription itself reads only `attribution`, `assertion`, `diagnosis` and `circuitBreaker`, which are identical under both contracts; nothing here depends on version folding.",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"name": "no-assertion-no-diagnosis-soft-breaker0",
|
|
6
|
+
"origin": "real",
|
|
7
|
+
"sourceOperationId": "op_01M2QS5A2AMWPNKCMTH0KFARC2",
|
|
8
|
+
"input": {
|
|
9
|
+
"assertion": null,
|
|
10
|
+
"attribution": {
|
|
11
|
+
"contaminated": false,
|
|
12
|
+
"level": "soft"
|
|
13
|
+
},
|
|
14
|
+
"circuitBreaker": {
|
|
15
|
+
"level": 0
|
|
16
|
+
},
|
|
17
|
+
"createdAt": "2026-09-17T13:33:39.275Z",
|
|
18
|
+
"diagnosis": null,
|
|
19
|
+
"operationId": "op_01M2QS5A2AMWPNKCMTH0KFARC2",
|
|
20
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
21
|
+
"signals": {
|
|
22
|
+
"act": {
|
|
23
|
+
"actConfirmed": true,
|
|
24
|
+
"action": "press",
|
|
25
|
+
"selector": {
|
|
26
|
+
"role": "AXButton",
|
|
27
|
+
"title": "Submit"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"axEvent": {
|
|
31
|
+
"axChanged": false,
|
|
32
|
+
"latencyMs": 0.0050067901611328125,
|
|
33
|
+
"nodeCount": 4,
|
|
34
|
+
"treeDigestAfter": "f84988c2d9a2edf3972aa9a247279fce",
|
|
35
|
+
"treeDigestBefore": "f84988c2d9a2edf3972aa9a247279fce"
|
|
36
|
+
},
|
|
37
|
+
"crash": {
|
|
38
|
+
"processAliveAfter": true,
|
|
39
|
+
"processAliveBefore": true
|
|
40
|
+
},
|
|
41
|
+
"handlerProbe": null,
|
|
42
|
+
"pixelDiff": {
|
|
43
|
+
"changedPixelRatio": 0,
|
|
44
|
+
"windowId": 12
|
|
45
|
+
},
|
|
46
|
+
"responsiveness": {
|
|
47
|
+
"pingMs": 3,
|
|
48
|
+
"responsive": true
|
|
49
|
+
},
|
|
50
|
+
"stateDiff": null
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"expectedOutcome": "inconclusive",
|
|
54
|
+
"expectedSummary": "attribution soft"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "diagnosis-T5-strong-breaker1",
|
|
58
|
+
"origin": "real",
|
|
59
|
+
"sourceOperationId": "op_01M2WNQN9TTG0MCR0ZRNZ5V5G1",
|
|
60
|
+
"input": {
|
|
61
|
+
"assertion": null,
|
|
62
|
+
"attribution": {
|
|
63
|
+
"contaminated": false,
|
|
64
|
+
"level": "strong"
|
|
65
|
+
},
|
|
66
|
+
"circuitBreaker": {
|
|
67
|
+
"level": 1,
|
|
68
|
+
"reason": "screen-recording-denied"
|
|
69
|
+
},
|
|
70
|
+
"createdAt": "2026-09-19T11:09:58.741Z",
|
|
71
|
+
"diagnosis": {
|
|
72
|
+
"class": "T5",
|
|
73
|
+
"report": {
|
|
74
|
+
"anomaly": "SwiftUI dependency loss: handler hit and state changed (source=z3-kvc, changed=true, keys=[demo.hidden]) but AX tree and pixels stayed silent",
|
|
75
|
+
"evidence": "op_01M2WNQN9TTG0MCR0ZRNZ5V5G1 strong attribution; actConfirmed=true; axChanged=false (digest 37521cc12c2829f47cca0287517a6d9c -> 37521cc12c2829f47cca0287517a6d9c, 171 nodes, 281.99493885040283ms); pixelDiff=unavailable; responsive=true pingMs=0.028967857360839844; alive true -> true; handlerProbe hitCount=1 late=0 [probe_demo/ProbeDemoApp.swift:68]; source=z3-kvc, changed=true, keys=[demo.hidden]; circuitBreaker=1",
|
|
76
|
+
"next": "check the view's observation of the changed key (Z1b-style direct @State writes and missing @Observable registration are the usual roots); re-bind or route through the observed model",
|
|
77
|
+
"path": "act.press -> probe-window -> handler/state -> ax-digest -> pixel-diff"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"operationId": "op_01M2WNQN9TTG0MCR0ZRNZ5V5G1",
|
|
81
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
82
|
+
"signals": {
|
|
83
|
+
"act": {
|
|
84
|
+
"actConfirmed": true,
|
|
85
|
+
"action": "press",
|
|
86
|
+
"selector": {
|
|
87
|
+
"identifier": "hidden-write",
|
|
88
|
+
"role": "AXButton"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"axEvent": {
|
|
92
|
+
"axChanged": false,
|
|
93
|
+
"latencyMs": 281.99493885040283,
|
|
94
|
+
"nodeCount": 171,
|
|
95
|
+
"treeDigestAfter": "37521cc12c2829f47cca0287517a6d9c",
|
|
96
|
+
"treeDigestBefore": "37521cc12c2829f47cca0287517a6d9c"
|
|
97
|
+
},
|
|
98
|
+
"crash": {
|
|
99
|
+
"processAliveAfter": true,
|
|
100
|
+
"processAliveBefore": true
|
|
101
|
+
},
|
|
102
|
+
"handlerProbe": {
|
|
103
|
+
"handlers": [
|
|
104
|
+
{
|
|
105
|
+
"file": "probe_demo/ProbeDemoApp.swift",
|
|
106
|
+
"line": 68
|
|
107
|
+
}
|
|
108
|
+
],
|
|
109
|
+
"hitCount": 1,
|
|
110
|
+
"lateCount": 0,
|
|
111
|
+
"probeVersion": "gp-probe/0.1.0"
|
|
112
|
+
},
|
|
113
|
+
"responsiveness": {
|
|
114
|
+
"pingMs": 0.028967857360839844,
|
|
115
|
+
"responsive": true
|
|
116
|
+
},
|
|
117
|
+
"stateDiff": {
|
|
118
|
+
"changed": true,
|
|
119
|
+
"entries": [
|
|
120
|
+
{
|
|
121
|
+
"after": "1",
|
|
122
|
+
"before": "0",
|
|
123
|
+
"key": "demo.hidden"
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
"source": "z3-kvc"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"expectedOutcome": "fail",
|
|
131
|
+
"expectedSummary": "diagnosis T5: SwiftUI dependency loss: handler hit and state changed (source=z3-kvc, changed=true, keys=[demo.hidden]) but AX tree and pixels stayed silent; circuitBreaker level 1 (screen-recording-denied); attribution strong"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "diagnosis-INCONCLUSIVE-strong-breaker1",
|
|
135
|
+
"origin": "real",
|
|
136
|
+
"sourceOperationId": "op_01M2WNQMK2NEEZDNMK58NP2JYQ",
|
|
137
|
+
"input": {
|
|
138
|
+
"assertion": null,
|
|
139
|
+
"attribution": {
|
|
140
|
+
"contaminated": false,
|
|
141
|
+
"level": "strong"
|
|
142
|
+
},
|
|
143
|
+
"circuitBreaker": {
|
|
144
|
+
"level": 1,
|
|
145
|
+
"reason": "screen-recording-denied"
|
|
146
|
+
},
|
|
147
|
+
"createdAt": "2026-09-19T11:09:58.103Z",
|
|
148
|
+
"diagnosis": {
|
|
149
|
+
"class": "INCONCLUSIVE",
|
|
150
|
+
"report": {
|
|
151
|
+
"anomaly": "AX tree changed but the pixel signal is unavailable (circuitBreaker level 1); T6 is undecidable without screen capture",
|
|
152
|
+
"evidence": "op_01M2WNQMK2NEEZDNMK58NP2JYQ strong attribution; actConfirmed=true; axChanged=true (digest c624dee7d3644a4b64f8f8b6739917de -> 37521cc12c2829f47cca0287517a6d9c, 171 nodes, 372.1029758453369ms); pixelDiff=unavailable; responsive=true pingMs=0.054955482482910156; alive true -> true; handlerProbe hitCount=1 late=0 [probe_demo/ProbeDemoApp.swift:60]; source=z3-kvc, changed=true, keys=[count-domain.count, demo.count]; circuitBreaker=1",
|
|
153
|
+
"next": "grant screen recording permission to the daemon and replay the act for a decidable T6/NO_ANOMALY verdict",
|
|
154
|
+
"path": "act.press -> probe-window -> handler/state -> ax-digest -> pixel-diff"
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"operationId": "op_01M2WNQMK2NEEZDNMK58NP2JYQ",
|
|
158
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
159
|
+
"signals": {
|
|
160
|
+
"act": {
|
|
161
|
+
"actConfirmed": true,
|
|
162
|
+
"action": "press",
|
|
163
|
+
"selector": {
|
|
164
|
+
"identifier": "ok-press",
|
|
165
|
+
"role": "AXButton"
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
"axEvent": {
|
|
169
|
+
"axChanged": true,
|
|
170
|
+
"latencyMs": 372.1029758453369,
|
|
171
|
+
"nodeCount": 171,
|
|
172
|
+
"treeDigestAfter": "37521cc12c2829f47cca0287517a6d9c",
|
|
173
|
+
"treeDigestBefore": "c624dee7d3644a4b64f8f8b6739917de"
|
|
174
|
+
},
|
|
175
|
+
"crash": {
|
|
176
|
+
"processAliveAfter": true,
|
|
177
|
+
"processAliveBefore": true
|
|
178
|
+
},
|
|
179
|
+
"handlerProbe": {
|
|
180
|
+
"handlers": [
|
|
181
|
+
{
|
|
182
|
+
"file": "probe_demo/ProbeDemoApp.swift",
|
|
183
|
+
"line": 60
|
|
184
|
+
}
|
|
185
|
+
],
|
|
186
|
+
"hitCount": 1,
|
|
187
|
+
"lateCount": 0,
|
|
188
|
+
"probeVersion": "gp-probe/0.1.0"
|
|
189
|
+
},
|
|
190
|
+
"responsiveness": {
|
|
191
|
+
"pingMs": 0.054955482482910156,
|
|
192
|
+
"responsive": true
|
|
193
|
+
},
|
|
194
|
+
"stateDiff": {
|
|
195
|
+
"changed": true,
|
|
196
|
+
"entries": [
|
|
197
|
+
{
|
|
198
|
+
"after": "1",
|
|
199
|
+
"before": "0",
|
|
200
|
+
"key": "count-domain.count"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"after": "1",
|
|
204
|
+
"before": "0",
|
|
205
|
+
"key": "demo.count"
|
|
206
|
+
}
|
|
207
|
+
],
|
|
208
|
+
"source": "z3-kvc"
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
"expectedOutcome": "inconclusive",
|
|
213
|
+
"expectedSummary": "diagnosis INCONCLUSIVE: AX tree changed but the pixel signal is unavailable (circuitBreaker level 1); T6 is undecidable without screen capture; circuitBreaker level 1 (screen-recording-denied); attribution strong"
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"name": "assertion-pass-with-diagnosis-T3-soft",
|
|
217
|
+
"origin": "real",
|
|
218
|
+
"sourceOperationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
219
|
+
"input": {
|
|
220
|
+
"assertion": {
|
|
221
|
+
"actual": true,
|
|
222
|
+
"expected": true,
|
|
223
|
+
"kind": "element_property",
|
|
224
|
+
"passed": true,
|
|
225
|
+
"property": "enabled",
|
|
226
|
+
"selector": {
|
|
227
|
+
"role": "AXButton"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"attribution": {
|
|
231
|
+
"contaminated": false,
|
|
232
|
+
"level": "soft"
|
|
233
|
+
},
|
|
234
|
+
"circuitBreaker": {
|
|
235
|
+
"level": 1,
|
|
236
|
+
"reason": "screen-recording-denied"
|
|
237
|
+
},
|
|
238
|
+
"createdAt": "2026-09-18T08:39:37.667Z",
|
|
239
|
+
"diagnosis": {
|
|
240
|
+
"class": "T3",
|
|
241
|
+
"report": {
|
|
242
|
+
"anomaly": "operation confirmed but neither the AX tree nor pixels changed; binding lost",
|
|
243
|
+
"evidence": "op_01M2STQMY23REZG9CPD6Z3CYGT soft attribution; actConfirmed=true; axChanged=false (digest bd76f2aba5c08ea202103eeca782292b -> bd76f2aba5c08ea202103eeca782292b, 820 nodes, 811.6888999938965ms); pixelDiff=unavailable; responsive=true pingMs=0.1289844512939453; alive true -> true; circuitBreaker=1",
|
|
244
|
+
"next": "verify the selector matches an enabled control; observe the tree; check the action binding and isEnabled state",
|
|
245
|
+
"path": "act.press -> ax-confirm -> tree-digest -> pixel-diff"
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
"operationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
249
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
250
|
+
"signals": {
|
|
251
|
+
"act": {
|
|
252
|
+
"actConfirmed": true,
|
|
253
|
+
"action": "press",
|
|
254
|
+
"selector": {
|
|
255
|
+
"role": "AXButton"
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
"axEvent": {
|
|
259
|
+
"axChanged": false,
|
|
260
|
+
"latencyMs": 811.6888999938965,
|
|
261
|
+
"nodeCount": 820,
|
|
262
|
+
"treeDigestAfter": "bd76f2aba5c08ea202103eeca782292b",
|
|
263
|
+
"treeDigestBefore": "bd76f2aba5c08ea202103eeca782292b"
|
|
264
|
+
},
|
|
265
|
+
"crash": {
|
|
266
|
+
"processAliveAfter": true,
|
|
267
|
+
"processAliveBefore": true
|
|
268
|
+
},
|
|
269
|
+
"handlerProbe": null,
|
|
270
|
+
"responsiveness": {
|
|
271
|
+
"pingMs": 0.1289844512939453,
|
|
272
|
+
"responsive": true
|
|
273
|
+
},
|
|
274
|
+
"stateDiff": null
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"expectedOutcome": "pass",
|
|
278
|
+
"expectedSummary": "assertion enabled passed: expected true, actual true; diagnosis T3: operation confirmed but neither the AX tree nor pixels changed; binding lost; circuitBreaker level 1 (screen-recording-denied); attribution soft"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"name": "assertion-pass-but-weak-attribution",
|
|
282
|
+
"origin": "derived: attribution.level strong->weak",
|
|
283
|
+
"sourceOperationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
284
|
+
"input": {
|
|
285
|
+
"assertion": {
|
|
286
|
+
"actual": true,
|
|
287
|
+
"expected": true,
|
|
288
|
+
"kind": "element_property",
|
|
289
|
+
"passed": true,
|
|
290
|
+
"property": "enabled",
|
|
291
|
+
"selector": {
|
|
292
|
+
"role": "AXButton"
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
"attribution": {
|
|
296
|
+
"contaminated": false,
|
|
297
|
+
"level": "weak"
|
|
298
|
+
},
|
|
299
|
+
"circuitBreaker": {
|
|
300
|
+
"level": 1,
|
|
301
|
+
"reason": "screen-recording-denied"
|
|
302
|
+
},
|
|
303
|
+
"createdAt": "2026-09-18T08:39:37.667Z",
|
|
304
|
+
"diagnosis": {
|
|
305
|
+
"class": "T3",
|
|
306
|
+
"report": {
|
|
307
|
+
"anomaly": "operation confirmed but neither the AX tree nor pixels changed; binding lost",
|
|
308
|
+
"evidence": "op_01M2STQMY23REZG9CPD6Z3CYGT soft attribution; actConfirmed=true; axChanged=false (digest bd76f2aba5c08ea202103eeca782292b -> bd76f2aba5c08ea202103eeca782292b, 820 nodes, 811.6888999938965ms); pixelDiff=unavailable; responsive=true pingMs=0.1289844512939453; alive true -> true; circuitBreaker=1",
|
|
309
|
+
"next": "verify the selector matches an enabled control; observe the tree; check the action binding and isEnabled state",
|
|
310
|
+
"path": "act.press -> ax-confirm -> tree-digest -> pixel-diff"
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
"operationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
314
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
315
|
+
"signals": {
|
|
316
|
+
"act": {
|
|
317
|
+
"actConfirmed": true,
|
|
318
|
+
"action": "press",
|
|
319
|
+
"selector": {
|
|
320
|
+
"role": "AXButton"
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"axEvent": {
|
|
324
|
+
"axChanged": false,
|
|
325
|
+
"latencyMs": 811.6888999938965,
|
|
326
|
+
"nodeCount": 820,
|
|
327
|
+
"treeDigestAfter": "bd76f2aba5c08ea202103eeca782292b",
|
|
328
|
+
"treeDigestBefore": "bd76f2aba5c08ea202103eeca782292b"
|
|
329
|
+
},
|
|
330
|
+
"crash": {
|
|
331
|
+
"processAliveAfter": true,
|
|
332
|
+
"processAliveBefore": true
|
|
333
|
+
},
|
|
334
|
+
"handlerProbe": null,
|
|
335
|
+
"responsiveness": {
|
|
336
|
+
"pingMs": 0.1289844512939453,
|
|
337
|
+
"responsive": true
|
|
338
|
+
},
|
|
339
|
+
"stateDiff": null
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"expectedOutcome": "inconclusive",
|
|
343
|
+
"expectedSummary": "assertion enabled passed: expected true, actual true; diagnosis T3: operation confirmed but neither the AX tree nor pixels changed; binding lost; circuitBreaker level 1 (screen-recording-denied); attribution weak"
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"name": "assertion-pass-but-contaminated",
|
|
347
|
+
"origin": "derived: attribution.contaminated -> true",
|
|
348
|
+
"sourceOperationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
349
|
+
"input": {
|
|
350
|
+
"assertion": {
|
|
351
|
+
"actual": true,
|
|
352
|
+
"expected": true,
|
|
353
|
+
"kind": "element_property",
|
|
354
|
+
"passed": true,
|
|
355
|
+
"property": "enabled",
|
|
356
|
+
"selector": {
|
|
357
|
+
"role": "AXButton"
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
"attribution": {
|
|
361
|
+
"contaminated": true,
|
|
362
|
+
"level": "soft"
|
|
363
|
+
},
|
|
364
|
+
"circuitBreaker": {
|
|
365
|
+
"level": 1,
|
|
366
|
+
"reason": "screen-recording-denied"
|
|
367
|
+
},
|
|
368
|
+
"createdAt": "2026-09-18T08:39:37.667Z",
|
|
369
|
+
"diagnosis": {
|
|
370
|
+
"class": "T3",
|
|
371
|
+
"report": {
|
|
372
|
+
"anomaly": "operation confirmed but neither the AX tree nor pixels changed; binding lost",
|
|
373
|
+
"evidence": "op_01M2STQMY23REZG9CPD6Z3CYGT soft attribution; actConfirmed=true; axChanged=false (digest bd76f2aba5c08ea202103eeca782292b -> bd76f2aba5c08ea202103eeca782292b, 820 nodes, 811.6888999938965ms); pixelDiff=unavailable; responsive=true pingMs=0.1289844512939453; alive true -> true; circuitBreaker=1",
|
|
374
|
+
"next": "verify the selector matches an enabled control; observe the tree; check the action binding and isEnabled state",
|
|
375
|
+
"path": "act.press -> ax-confirm -> tree-digest -> pixel-diff"
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
"operationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
379
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
380
|
+
"signals": {
|
|
381
|
+
"act": {
|
|
382
|
+
"actConfirmed": true,
|
|
383
|
+
"action": "press",
|
|
384
|
+
"selector": {
|
|
385
|
+
"role": "AXButton"
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
"axEvent": {
|
|
389
|
+
"axChanged": false,
|
|
390
|
+
"latencyMs": 811.6888999938965,
|
|
391
|
+
"nodeCount": 820,
|
|
392
|
+
"treeDigestAfter": "bd76f2aba5c08ea202103eeca782292b",
|
|
393
|
+
"treeDigestBefore": "bd76f2aba5c08ea202103eeca782292b"
|
|
394
|
+
},
|
|
395
|
+
"crash": {
|
|
396
|
+
"processAliveAfter": true,
|
|
397
|
+
"processAliveBefore": true
|
|
398
|
+
},
|
|
399
|
+
"handlerProbe": null,
|
|
400
|
+
"responsiveness": {
|
|
401
|
+
"pingMs": 0.1289844512939453,
|
|
402
|
+
"responsive": true
|
|
403
|
+
},
|
|
404
|
+
"stateDiff": null
|
|
405
|
+
}
|
|
406
|
+
},
|
|
407
|
+
"expectedOutcome": "inconclusive",
|
|
408
|
+
"expectedSummary": "assertion enabled passed: expected true, actual true; diagnosis T3: operation confirmed but neither the AX tree nor pixels changed; binding lost; circuitBreaker level 1 (screen-recording-denied); attribution soft, contaminated"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"name": "assertion-failed",
|
|
412
|
+
"origin": "derived: assertion.passed -> false, assertion.actual -> false",
|
|
413
|
+
"sourceOperationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
414
|
+
"input": {
|
|
415
|
+
"assertion": {
|
|
416
|
+
"actual": false,
|
|
417
|
+
"expected": true,
|
|
418
|
+
"kind": "element_property",
|
|
419
|
+
"passed": false,
|
|
420
|
+
"property": "enabled",
|
|
421
|
+
"selector": {
|
|
422
|
+
"role": "AXButton"
|
|
423
|
+
}
|
|
424
|
+
},
|
|
425
|
+
"attribution": {
|
|
426
|
+
"contaminated": false,
|
|
427
|
+
"level": "soft"
|
|
428
|
+
},
|
|
429
|
+
"circuitBreaker": {
|
|
430
|
+
"level": 1,
|
|
431
|
+
"reason": "screen-recording-denied"
|
|
432
|
+
},
|
|
433
|
+
"createdAt": "2026-09-18T08:39:37.667Z",
|
|
434
|
+
"diagnosis": {
|
|
435
|
+
"class": "T3",
|
|
436
|
+
"report": {
|
|
437
|
+
"anomaly": "operation confirmed but neither the AX tree nor pixels changed; binding lost",
|
|
438
|
+
"evidence": "op_01M2STQMY23REZG9CPD6Z3CYGT soft attribution; actConfirmed=true; axChanged=false (digest bd76f2aba5c08ea202103eeca782292b -> bd76f2aba5c08ea202103eeca782292b, 820 nodes, 811.6888999938965ms); pixelDiff=unavailable; responsive=true pingMs=0.1289844512939453; alive true -> true; circuitBreaker=1",
|
|
439
|
+
"next": "verify the selector matches an enabled control; observe the tree; check the action binding and isEnabled state",
|
|
440
|
+
"path": "act.press -> ax-confirm -> tree-digest -> pixel-diff"
|
|
441
|
+
}
|
|
442
|
+
},
|
|
443
|
+
"operationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
444
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
445
|
+
"signals": {
|
|
446
|
+
"act": {
|
|
447
|
+
"actConfirmed": true,
|
|
448
|
+
"action": "press",
|
|
449
|
+
"selector": {
|
|
450
|
+
"role": "AXButton"
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
"axEvent": {
|
|
454
|
+
"axChanged": false,
|
|
455
|
+
"latencyMs": 811.6888999938965,
|
|
456
|
+
"nodeCount": 820,
|
|
457
|
+
"treeDigestAfter": "bd76f2aba5c08ea202103eeca782292b",
|
|
458
|
+
"treeDigestBefore": "bd76f2aba5c08ea202103eeca782292b"
|
|
459
|
+
},
|
|
460
|
+
"crash": {
|
|
461
|
+
"processAliveAfter": true,
|
|
462
|
+
"processAliveBefore": true
|
|
463
|
+
},
|
|
464
|
+
"handlerProbe": null,
|
|
465
|
+
"responsiveness": {
|
|
466
|
+
"pingMs": 0.1289844512939453,
|
|
467
|
+
"responsive": true
|
|
468
|
+
},
|
|
469
|
+
"stateDiff": null
|
|
470
|
+
}
|
|
471
|
+
},
|
|
472
|
+
"expectedOutcome": "fail",
|
|
473
|
+
"expectedSummary": "assertion enabled failed: expected true, actual false; diagnosis T3: operation confirmed but neither the AX tree nor pixels changed; binding lost; circuitBreaker level 1 (screen-recording-denied); attribution soft"
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"name": "breaker-at-policy-limit",
|
|
477
|
+
"origin": "derived: circuitBreaker.level -> 3",
|
|
478
|
+
"sourceOperationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
479
|
+
"input": {
|
|
480
|
+
"assertion": {
|
|
481
|
+
"actual": true,
|
|
482
|
+
"expected": true,
|
|
483
|
+
"kind": "element_property",
|
|
484
|
+
"passed": true,
|
|
485
|
+
"property": "enabled",
|
|
486
|
+
"selector": {
|
|
487
|
+
"role": "AXButton"
|
|
488
|
+
}
|
|
489
|
+
},
|
|
490
|
+
"attribution": {
|
|
491
|
+
"contaminated": false,
|
|
492
|
+
"level": "soft"
|
|
493
|
+
},
|
|
494
|
+
"circuitBreaker": {
|
|
495
|
+
"level": 3,
|
|
496
|
+
"reason": "fixture: breaker raised to the policy limit"
|
|
497
|
+
},
|
|
498
|
+
"createdAt": "2026-09-18T08:39:37.667Z",
|
|
499
|
+
"diagnosis": {
|
|
500
|
+
"class": "T3",
|
|
501
|
+
"report": {
|
|
502
|
+
"anomaly": "operation confirmed but neither the AX tree nor pixels changed; binding lost",
|
|
503
|
+
"evidence": "op_01M2STQMY23REZG9CPD6Z3CYGT soft attribution; actConfirmed=true; axChanged=false (digest bd76f2aba5c08ea202103eeca782292b -> bd76f2aba5c08ea202103eeca782292b, 820 nodes, 811.6888999938965ms); pixelDiff=unavailable; responsive=true pingMs=0.1289844512939453; alive true -> true; circuitBreaker=1",
|
|
504
|
+
"next": "verify the selector matches an enabled control; observe the tree; check the action binding and isEnabled state",
|
|
505
|
+
"path": "act.press -> ax-confirm -> tree-digest -> pixel-diff"
|
|
506
|
+
}
|
|
507
|
+
},
|
|
508
|
+
"operationId": "op_01M2STQMY23REZG9CPD6Z3CYGT",
|
|
509
|
+
"schemaVersion": "glasspane.evidence/0.1-draft",
|
|
510
|
+
"signals": {
|
|
511
|
+
"act": {
|
|
512
|
+
"actConfirmed": true,
|
|
513
|
+
"action": "press",
|
|
514
|
+
"selector": {
|
|
515
|
+
"role": "AXButton"
|
|
516
|
+
}
|
|
517
|
+
},
|
|
518
|
+
"axEvent": {
|
|
519
|
+
"axChanged": false,
|
|
520
|
+
"latencyMs": 811.6888999938965,
|
|
521
|
+
"nodeCount": 820,
|
|
522
|
+
"treeDigestAfter": "bd76f2aba5c08ea202103eeca782292b",
|
|
523
|
+
"treeDigestBefore": "bd76f2aba5c08ea202103eeca782292b"
|
|
524
|
+
},
|
|
525
|
+
"crash": {
|
|
526
|
+
"processAliveAfter": true,
|
|
527
|
+
"processAliveBefore": true
|
|
528
|
+
},
|
|
529
|
+
"handlerProbe": null,
|
|
530
|
+
"responsiveness": {
|
|
531
|
+
"pingMs": 0.1289844512939453,
|
|
532
|
+
"responsive": true
|
|
533
|
+
},
|
|
534
|
+
"stateDiff": null
|
|
535
|
+
}
|
|
536
|
+
},
|
|
537
|
+
"expectedOutcome": "blocked",
|
|
538
|
+
"expectedSummary": "assertion enabled passed: expected true, actual true; diagnosis T3: operation confirmed but neither the AX tree nor pixels changed; binding lost; circuitBreaker level 3 (fixture: breaker raised to the policy limit); attribution soft"
|
|
539
|
+
}
|
|
540
|
+
]
|
|
541
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iterate-kernel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "iterate ecosystem shared kernel: schemas, the evidence->decision transcription, the decision-log audit chain and public validators. Verification reasoning stays in the engine; this layer transcribes.",
|
|
6
6
|
"type": "module",
|