REPOSITORY SOURCE

recovery-ci-followup.json

docs/evidence/recovery-ci-followup.json

1{
2  "format": 1,
3  "recordedAt": "2026-10-24T22:52:54.230366+00:00",
4  "source": "e5de328f137febe0343c002f4083b6e5884541db",
5  "url": "https://github.com/jasona/darkwind-web/actions/runs/40138869891",
6  "result": "cancelled at the 15-minute browser job deadline",
7  "core": "success",
8  "container": "success",
9  "browser": {
10    "completedCases": 22,
11    "passed": 20,
12    "failed": 2,
13    "notReached": 4
14  },
15  "traceObservations": [
16    {
17      "case": "graphics recovery preserves the world",
18      "readyObservedMs": 643155.729,
19      "pixelAssertionStartedMs": 643194.309,
20      "screenshotStartedMs": 643211.667,
21      "assertionTimedOutMs": 658199.32,
22      "screenshotCleanupStartedMs": 696135.613,
23      "eventualPixelAssertion": "true at 696970.966 ms; the screenshot outlived the 15-second poll deadline"
24    },
25    {
26      "case": "graphics recovery keeps the shared room",
27      "deviceLossRequestedMs": 222910.605,
28      "injectedReleaseCalledMs": 230768.894,
29      "outcome": "runtime 20-second recovery deadline reached; cause is not established by the trace"
30    }
31  ],
32  "corrections": {
33    "source": "d0afaaa020207db2252964a77aa48e3ae2602c26",
34    "faultInjector": "Release now clears the hold even before requestDevice registers its waiter; a direct early-release regression is included. This fixes a demonstrated code race, without claiming it proves the CI timeout root cause.",
35    "observationBudgets": "CI composited-pixel wait 15s -> 60s; repeated-loss case overall budget 120s -> 180s. Pixel thresholds and runtime recovery deadline unchanged.",
36    "jobScheduling": "Multiplayer, player and probe files run as separate CI jobs with fail-fast disabled, independent temporary servers and distinct artifacts. Each retains the 15-minute job ceiling."
37  },
38  "localFollowup": {
39    "report": "model-render-final-controls.json",
40    "passed": 3,
41    "failed": 0
42  },
43  "followupCi": "https://github.com/jasona/darkwind-web/actions/runs/40140353358",
44  "followupCiStatus": "completed",
45  "followupCiConclusion": "success",
46  "followupCiVerifiedAt": "2026-10-24T23:05:18.542305+00:00",
47  "followupJobs": {
48    "core": "success",
49    "container": "success",
50    "browser (multiplayer)": "success",
51    "browser (player)": "success",
52    "browser (probe)": "success"
53  },
54  "evidenceCi": {
55    "url": "https://github.com/jasona/darkwind-web/actions/runs/40140436877",
56    "source": "1ecd771c7510242b2b2baf4ed9e973656e1b8334",
57    "status": "completed",
58    "conclusion": "success"
59  },
60  "earlierImporterCi": {
61    "url": "https://github.com/jasona/darkwind-web/actions/runs/40139617903",
62    "source": "4facc4770b78578f8d33a8303e9685a350da67b5",
63    "core": "success",
64    "container": "success",
65    "browser": {
66      "passed": 24,
67      "failed": 2
68    },
69    "failures": [
70      "Shared-room recovery observed failed instead of ready before the 120-second overall deadline.",
71      "Solo recovery pixel observation exceeded its 15-second wait."
72    ],
73    "scope": "Observed in failed job logs; these are prior to the fault-injector and CI observation/scheduling corrections. Logs alone do not establish the shared-recovery root cause."
74  }
75}
76