$ git worktree add --detach /tmp/openclaw-before-proof-82225 origin/main
$ cp PR regression gateway.test.ts into before worktree
$ node scripts/test-projects.mjs extensions/discord/src/internal/gateway.test.ts
[test] starting test/vitest/vitest.extension-discord.config.ts

[1m[30m[46m RUN [49m[39m[22m [36mv4.1.6 [39m[90m/tmp/openclaw-before-proof-82225[39m

 [31m❯[39m [30m[42m extension-discord [49m[39m extensions/discord/src/internal/gateway.test.ts [2m([22m[2m21 tests[22m[2m | [22m[31m2 failed[39m[2m)[22m[32m 189[2mms[22m[39m
     [32m✓[39m does not auto-handle interactions when autoInteractions is disabled[32m 110[2mms[22m[39m
     [32m✓[39m emits async dispatch failures as gateway errors[32m 53[2mms[22m[39m
[31m     [31m×[31m reconnects when the socket closes while waiting for identify concurrency[39m[32m 8[2mms[22m[39m
[31m     [31m×[31m does not identify a replacement socket from a stale HELLO[39m[32m 5[2mms[22m[39m
     [32m✓[39m preserves MESSAGE_CREATE author payloads for inbound dispatch[32m 1[2mms[22m[39m
     [32m✓[39m marks successful gateway resumes connected[32m 0[2mms[22m[39m
     [32m✓[39m queues outbound gateway events when the connection window is exhausted[32m 1[2mms[22m[39m
     [32m✓[39m sends critical gateway events immediately even when regular sends are queued[32m 1[2mms[22m[39m
     [32m✓[39m rejects gateway payloads that exceed Discord's size limit[32m 1[2mms[22m[39m
     [32m✓[39m ignores stale socket close events after reconnecting[32m 0[2mms[22m[39m
     [32m✓[39m reconnects after active remote normal closes[32m 1[2mms[22m[39m
     [32m✓[39m re-identifies after non-resumable gateway close 4007[32m 1[2mms[22m[39m
     [32m✓[39m re-identifies after non-resumable gateway close 4005[32m 0[2mms[22m[39m
     [32m✓[39m clears resume state after invalid session false[32m 1[2mms[22m[39m
     [32m✓[39m delays invalid-session reconnects by Discord's randomized cooldown floor[32m 1[2mms[22m[39m
     [32m✓[39m includes close code details when reconnect attempts are exhausted[32m 1[2mms[22m[39m
     [32m✓[39m does not reconnect after fatal gateway closes[32m 0[2mms[22m[39m
     [32m✓[39m clears heartbeat timers before delayed reconnects[32m 1[2mms[22m[39m
     [32m✓[39m clears stale heartbeat timers before early reconnect exits[32m 0[2mms[22m[39m
     [32m✓[39m spaces identify sends by gateway max concurrency bucket[32m 1[2mms[22m[39m
     [32m✓[39m validates requestGuildMembers before sending[32m 1[2mms[22m[39m

[31m⎯⎯⎯⎯⎯⎯⎯[39m[1m[41m Failed Tests 2 [49m[22m[31m⎯⎯⎯⎯⎯⎯⎯[39m

[41m[1m FAIL [22m[49m [30m[42m extension-discord [49m[39m extensions/discord/src/internal/gateway.test.ts[2m > [22mGatewayPlugin[2m > [22mreconnects when the socket closes while waiting for identify concurrency
[31m[1mAssertionError[22m: expected "vi.fn()" to not be called at all, but actually been called 1 times[90m

Received:

[1m  1st vi.fn() call:

[22m    Array [
      [Error: Discord gateway socket closed before IDENTIFY could be sent],
    ]
[31m[90m

Number of calls: [1m1[22m
[31m[39m
[36m [2m❯[22m extensions/discord/src/internal/gateway.test.ts:[2m183:26[22m[39m
    [90m181|[39m
    [90m182|[39m     [35mawait[39m vi[33m.[39m[34madvanceTimersByTimeAsync[39m([34m5_000[39m)[33m;[39m
    [90m183|[39m     [34mexpect[39m(errorSpy)[33m.[39mnot[33m.[39m[34mtoHaveBeenCalled[39m()[33m;[39m
    [90m   |[39m                          [31m^[39m
    [90m184|[39m     [35mawait[39m vi[33m.[39m[34madvanceTimersByTimeAsync[39m([34m2_000[39m)[33m;[39m
    [90m185|[39m

[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/2]⎯[22m[39m

[41m[1m FAIL [22m[49m [30m[42m extension-discord [49m[39m extensions/discord/src/internal/gateway.test.ts[2m > [22mGatewayPlugin[2m > [22mdoes not identify a replacement socket from a stale HELLO
[31m[1mAssertionError[22m: expected "vi.fn()" to not be called with arguments: [ StringContaining ""op":2" ][90m

Received:

[1m  1st vi.fn() call:

[22m[2m  [[22m
[32m-   StringContaining "\"op\":2",[90m
[31m+   "{\"op\":2,\"d\":{\"token\":\"\",\"intents\":0,\"properties\":{\"os\":\"linux\",\"browser\":\"openclaw\",\"device\":\"openclaw\"}}}",[90m
[2m  ][22m
[31m[90m

Number of calls: [1m1[22m
[31m[39m
[36m [2m❯[22m extensions/discord/src/internal/gateway.test.ts:[2m218:41[22m[39m
    [90m216|[39m
    [90m217|[39m     [35mawait[39m vi[33m.[39m[34madvanceTimersByTimeAsync[39m([34m3_000[39m)[33m;[39m
    [90m218|[39m     [34mexpect[39m(replacementSocket[33m?.[39msend)[33m.[39mnot[33m.[39m[34mtoHaveBeenCalledWith[39m(
    [90m   |[39m                                         [31m^[39m
    [90m219|[39m       expect[33m.[39m[34mstringContaining[39m([32m`"op":[39m[36m${[39m[33mGatewayOpcodes[39m[33m.[39m[33mIdentify[39m[36m}[39m[32m`[39m)[33m,[39m
    [90m220|[39m     )[33m;[39m

[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/2]⎯[22m[39m


[2m Test Files [22m [1m[31m1 failed[39m[22m[90m (1)[39m
[2m      Tests [22m [1m[31m2 failed[39m[22m[2m | [22m[1m[32m19 passed[39m[22m[90m (21)[39m
[2m   Start at [22m 09:53:22
[2m   Duration [22m 3.41s[2m (transform 2.26s, setup 614ms, import 2.43s, tests 189ms, environment 0ms)[22m

[test] failed 1 Vitest shard in 6.58s
[before exit code] 1
