RUN v5.0.5 /home/runner/_work/maria-blacksmith/maria-blacksmith-source ❯ root packages/source-control-github/src/server/gitHubPullRequestJson.test.ts (51 tests | 2 failed | 49 skipped) 8ms ↓ pull request list decoding (3) ↓ treats a merge timestamp as merged even when the state still says closed ↓ takes the verdict from the latest reviews when GitHub summarizes none, as for a bot's approval ↓ skips malformed entries but still counts them, so paging does not stop early ❯ pull request detail decoding (10) ↓ keeps a workflow waiting for approval out of the passing state ↓ reads an auto-merge request and strategy, its null as off and its absence as neither × reads the newest merge queue removal, and none where the queue was not asked about 6ms ↓ shows a re-running check once, as the run that is happening now ↓ keeps a check pending while another run of it on the same commit is still going ↓ merges reviews with comments in time order and keeps a bodyless approval ↓ drops the bodyless review GitHub opens to hold line comments ↓ keeps a bodyless APPROVED review, which is the event itself ↓ keeps a bodyless CHANGES_REQUESTED review, which is the event itself ↓ keeps a bodyless DISMISSED review, which is the event itself ↓ review thread decoding (9) ↓ selects stats only for non-merge activity commits ↓ decodes the newest commits off the same connection, oldest to newest ↓ lists someone who was asked and then answered only once ↓ lists a requested team by org/slug, apart from a user who shares its slug ↓ keeps the conversation when a reviewer has neither a login nor a team slug ↓ carries a resolved thread into the conversation, which was still said ↓ carries every reply, not only the remark each thread opened with ↓ keeps GitHub's own count of a thread whose comments were not all read ↓ ends a thread's walk on the last page, which still names a cursor ↓ reaction decoding (1) ↓ keeps a named group, widens a group whose reactors were cut short, drops an unknown content and an empty group ↓ repository access decoding (4) ↓ fails rather than defaulting open when a setting is missing ↓ counts the roles that can push as write, and the ones that cannot as read ↓ withholds write where gh names no permission, which is not a standing it gave ↓ grants write and triage to a GitHub App, which GitHub answers with a null permission ↓ viewer permission decoding (2) ↓ says no to a passer-by on a repository they can only read ↓ reads silence as permission, but not as authorship ↓ label candidate decoding (1) ↓ keeps a worn label the repository no longer defines, so it can be taken off ↓ review thread decoding (5) ↓ carries what the reader may do with the pull request, off the conversation read ↓ anchors a thread to its line and side, keeping the whole conversation ↓ leaves an outdated thread without a line rather than pinning it to a stale one ↓ reads edit times for issue comments and reviews without using reaction updates ↓ leaves the viewer's own login out of the pull request's own reactions, matched case-insensitively, while count still counts them ↓ ReviewThreads (1) ↓ caps the initial query after the 104-point rate-limit regression ↓ reviewer candidate decoding (2) ↓ leaves the author out of the people their own pull request can be sent to ↓ keeps a requested team apart from the people, so the request can be taken back ↓ reviewer request payload (2) ↓ sends people and teams in the two lists GitHub keeps them in ↓ sends both lists even where one of them is empty, which is what GitHub reads ↓ review submission payload (2) ↓ sends the verdict, the summary and every line comment in one body ↓ sends a range from its first line, and a one-line range as one line ↓ decodePullRequestFilesJson (5) ↓ quotes literal backslashes without interpreting them as escapes ↓ preserves spaces and literal backslashes in both rename paths ↓ points an added file at /dev/null on the left and a removed one on the right ↓ names both paths of a rename, counting its hunks against the old one ↓ still lists a file GitHub sent no hunks for, and says what was withheld ↓ decodePullRequestFilesViewedJson (1) ↓ treats a state it has never heard of as unread rather than failing the page ↓ host-native stack decoding (1) ↓ reads the first stack, bottom to top, with merged_at outranking state ↓ pull request lookups (1) ↓ refuses what GitHub cannot name, so one bad row cannot fail a whole batch ❯ pull request watch fingerprints (1) × moves status with checks and queue removals, and remarks with comments, not across 1ms stdout | src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > persists each merge queue removal wake across reactor restarts [11:18:28.702] ERROR (#3055): Error [AssertionError]: expected undefined to equal 'first' at /home/runner/_work/maria-blacksmith/maria-blacksmith-source/apps/server/src/orchestration-v2/runtimeLayer.test.ts:3335:14 { actual: undefined, expected: 'first', showDiff: true, operator: 'strictEqual', [cause]: undefined } ❯ t3 src/orchestration-v2/runtimeLayer.test.ts (90 tests | 1 failed | 89 skipped) 109ms ↓ project deletion during thread commands (3) ↓ deleting a thread removes its thread-bound automations through the effect worker ↓ deleting a project removes its thread-bound automations through the effect worker ↓ waits for an in-flight thread update before planning deletion ↓ OrchestrationV2LayerLive (7) ↓ projects a rollback that fails every attempt and clears it on the next one ↓ rejects non-ready rollback targets before persisting events or effects ↓ resolves delivery intent against the active run and starts after it completes ↓ answers an async question after its provider exits and commits the answer once ↓ reports an answer that never reaches its provider without reopening it ↓ dismisses message-capable questions directly and while settling ↓ merges an explicit provider-finished run while checkpoint capture is pending ↓ OrchestrationV2 legacy import (1) ↓ hydrates imported transcripts before commands and propagates hydration failures ❯ OrchestrationV2LayerLive lifecycle (50) ↓ applies lifecycle commands idempotently and emits archive/removal shell deltas ↓ keeps the branch pull request when linking another pull request ↓ retains multiple pull requests and dismissed stack members through rebuilds ↓ starts, records, and stops a pull request watch ↓ settling ends every pull request watch: manual ↓ settling ends every pull request watch: automatic ↓ archiving ends watches, and an archived thread cannot start one ↓ ends a watch it cannot read, and tells the agent ↓ wakes once for a state it reported, across a restart and a new watch ↓ finishes owed checks once after pending sweeps, a restart, and a re-watch ↓ a watch that ends on the comment limit keeps what its last pass saw ↓ wakes once when no checks report on the head, without saying they passed ↓ wakes for checks that complete after the no-checks notice on the same head ↓ watching a dismissed stack layer again keeps what its last watch told × persists each merge queue removal wake across reactor restarts 36ms ↓ wakes a watched thread once: single page ↓ wakes a watched thread once: paginated ↓ wakes a watched thread once: page failure ↓ wakes a watched thread once: repeated cursor ↓ wakes a watched thread once: missing comments ↓ wakes a watched thread once: thread list truncated ↓ persists rejected command receipts across retries ↓ admits restart continuations once and rejects a stale continuation behind newer work ↓ admits a restart continuation of a failed run that lost a shell: false ↓ admits a restart continuation of a completed run that lost a shell: false ↓ admits a restart continuation of a waiting run that lost a shell: false ↓ admits a restart continuation of a cancelled run that lost a shell: false ↓ admits a restart continuation of a completed run that lost a watchdog-monitor: false ↓ admits a restart continuation of a failed run that lost a awaited-monitor: false ↓ admits a restart continuation of a completed run that lost a awaited-monitor: true ↓ admits a restart continuation of a waiting run that lost a awaited-monitor: true ↓ admits a restart continuation of a cancelled run that lost a awaited-monitor: true ↓ rejects settling a thread while a run is active ↓ settles a thread its own agent settled once the turn completes ↓ settles past held automatic runs but not held user messages ↓ cancels preparing work on archive and keeps it cancelled through replay ↓ promotes only one queued run after each terminal run (notification: false) ↓ promotes only one queued run after each terminal run (notification: true) ↓ starts a wake's work clock from the run that ran before it ↓ handles a queued message after a usage_limit failure ↓ handles a queued message after a provider_error failure ↓ keeps queued user selections and pauses only the limited provider ↓ delivers a queued monitor update from server after conversation selection {"instanceId":"codex","model":"gpt-5.4"} ↓ delivers a queued monitor update from provider after conversation selection {"instanceId":"codex","model":"gpt-5.4"} ↓ delivers a queued monitor update from provider after conversation selection {"instanceId":"codex_alternate","model":"gpt-5.4"} ↓ keeps the queue after a user interrupts the active run ↓ places held queued messages after a continuation that started first ↓ preserves and holds queued messages across startup until explicitly resumed ↓ preserves and holds queued messages across shutdown until explicitly resumed ↓ edits and removes queued runs ↓ pending provider interruption (1) ↓ interrupts a pending provider start without launching provider work ↓ snooze queued runs (5) ↓ only user messages block snooze with a held notification run ↓ only user messages block snooze with a held delegated-completion run ↓ only user messages block snooze with a held user run ↓ a notification message on a snoozed thread keeps the snooze only when automatic ↓ a user message on a snoozed thread keeps the snooze only when automatic ↓ snooze projection (1) ↓ carries snooze state through the V2 shell projection ↓ visited projection (1) ↓ carries the visited watermark through the V2 shell projection ↓ thread opens (1) ↓ counts opens on the server clock, merges quick reopens, and keeps picked queries ↓ compact PR events (1) ↓ persists only the changed PR link and replays it without losing other links ↓ shared application data plane (1) ↓ orders retained project transactions and V2 thread transactions in one source ↓ usage-limit recovery (17) ↓ manually resumes an interrupted run ahead of its queued message only once ↓ manually resumes an usage_limit run ahead of its queued message only once ↓ guards a scheduled usage-limit continuation against resume ↓ guards a scheduled usage-limit continuation against queued-resume ↓ guards a scheduled usage-limit continuation against rearm ↓ guards a scheduled usage-limit continuation against snooze-race ↓ guards a scheduled usage-limit continuation against archive ↓ guards a scheduled usage-limit continuation against replacement ↓ guards a scheduled usage-limit continuation against manual-snooze ↓ guards a scheduled usage-limit continuation against invalid-snooze ↓ guards a scheduled usage-limit continuation against cancel-resume-keep-snooze ↓ guards a scheduled usage-limit continuation against independent-patches ↓ guards a scheduled usage-limit continuation against expired-snooze ↓ guards a scheduled usage-limit continuation against wake ↓ guards a scheduled usage-limit continuation against stop ↓ guards a scheduled usage-limit continuation against stop-before-arm ↓ guards a scheduled usage-limit continuation against stop-before-arm-mismatched-recovery ↓ queue.resume on a project-disabled instance (1) ↓ holds a queued run instead of starting it on an instance the project turned off stdout | src/pullRequest/PullRequestService.test.ts > preserves merge queue removal details from the provider [11:18:29.278] ERROR (#1): Error [AssertionError]: expected undefined to deeply equal { id: 'RMQE_1', …(2) } at /home/runner/_work/maria-blacksmith/maria-blacksmith-source/apps/server/src/pullRequest/PullRequestService.test.ts:2777:12 { actual: undefined, expected: { id: 'RMQE_1', removedAt: '2026-07-02T00:00:00Z', reason: 'CI failed' }, showDiff: true, operator: 'deepStrictEqual', [cause]: undefined } ❯ t3 src/pullRequest/PullRequestService.test.ts (104 tests | 1 failed | 103 skipped) 50ms ↓ does not wait for an in-flight detail read to display a preview ↓ lists GitHub Enterprise PRs for a stored unknown repository after host discovery ↓ derives a legacy repository host after refining its provider ↓ tries another checkout when provider refinement remains unknown ↓ reads nothing from a host with no implementation, but reports it ↓ says where each repository carries on, and from nothing it has run out of ↓ uses a provider's raw cursor advance when it consumed malformed rows ↓ continues a timestamp-paged host's listings through tied timestamps and terminates ↓ keeps a row already sent at the boundary instant from arriving twice ↓ keeps the earlier exclusions when a slice ends on the instant it began on ↓ calls a transient viewer failure a failed operation, not a signed-out CLI ↓ reports an unusable host over a merely failing one ↓ tells two hosts of one kind apart in the switcher and the filter ↓ reads a repository once when several worktrees share it ↓ keeps healthy repositories when one of them cannot be read ↓ offers each label once across repositories, despite one that cannot be read ↓ puts the author a query names exactly ahead of those it only begins ↓ tries another workspace on the same host for the viewer ↓ routing verifies the current account on the requested host without caching it ↓ refuses an action the host never claimed it could run ↓ asks to remove agent credits on merge only from a host that rewrites merge messages ↓ publishes a merge for immediate settlement only after host confirmation ↓ refreshes every reader before a queued merge confirmation finishes ↓ runs branch deletion only when the host and viewer support it, never for a stack ↓ checks and deletes a branch inside one verified credential ↓ refuses an action this viewer may not take, and says what access it takes ↓ gates arming a merge for later exactly as it gates merging now ↓ keeps two hosts of one provider kind as two accounts ↓ stops new reads after a rate limit while leaving manual actions available ↓ refuses a repository that does not belong to the requested project ↓ routes explicit Forgejo HTTP authorities through SSH checkouts after refinement ↓ names an SSH remote's web host from a later checkout when the first cannot ↓ rejects a different Forgejo HTTP port for an HTTP checkout ↓ resolves a project's repository identity when its shell has none cached ↓ routes a hosted reference to another repository through a project on that host ↓ routes Azure reads and writes through the requested organization's checkout ↓ routes Azure URL reads and writes through a ssh.dev.azure.com checkout ↓ routes Azure URL reads and writes through a vs-ssh.visualstudio.com checkout ↓ routes Azure URL reads and writes through a org-b.visualstudio.com checkout ↓ refuses Azure cross-organization reads and writes without its checkout ↓ prefers a matching checkout over a non-repository project's directory ↓ requires an explicit host for a non-repository project's linked PR ↓ refuses a review request this viewer may not make, and says what access it takes ↓ retries a replacement list read that joins a canceled lookup ↓ retries a replacement listStats read that joins a canceled lookup ↓ shares one cold viewer lookup across distinct concurrent lists ↓ a listing narrowed to some projects is its own cache entry ↓ keeps listing freshness tied to read start when filtered reads finish out of order ↓ does not revive old summaries when project epochs are evicted ↓ close and reopen notify subscribed readers after invalidating their cached state ↓ reads a host's repositories in one search, and files the rows back under each ↓ carries every repository of a slice on from the oldest row in it ↓ carries a slice on without sending the rows it already sent ↓ reads a workspace larger than one search in chunks, and merges them ↓ asks on its own for a repository a search could not vouch for ↓ believes a search's silence about a repository it vouches for ↓ fills in the line counts for the rows it is given ↓ reads the fresh diff when detail or summary discovers a changed revision ↓ keeps routed reads separate when the GitHub account changes ↓ isolates routed caches for two credentials belonging to the same account ↓ rejects mismatched routing credentials before use and preserves action errors ↓ opening detail preserves enriched linked summaries and updates draft and diff fields × preserves merge queue removal details from the provider 49ms ↓ notifies linked threads when detail changes draft status in either direction ↓ deduplicates routed PR reports without dropping draft changes ↓ reuses fresh detail checks without extending their refresh interval on detail cache hits ↓ preserves check observation time on cache hits and advances it on refresh ↓ reuses an observed merged state for strict settlement reads ↓ does not let a stale detail reopen overwrite a fresher linked summary ↓ keeps a row of a host that ignored the filters if any name of a label group holds ↓ authorizes stack rebases and refreshes sibling layers (cross-host: false) ↓ authorizes stack rebases and refreshes sibling layers (cross-host: true) ↓ refuses a way of updating a branch that the host or the viewer does not allow ↓ keeps reading a host's thinned-out slices until a filtered page is full ↓ hands a host's own resume position back on the next read ↓ judges the review filter only on a host that summarises its reviews ↓ partial host viewed writes invalidate marks but keep the diff cached ↓ tracks environment viewed files by revision and refuses a baseline it cannot read ↓ keeps hosted Forgejo marks with their repository instead of the serving checkout ↓ keeps viewed files itself for a host that keeps none of its own ↓ reports a file pushed to since it was cleared as changed ↓ keeps a deleted file cleared, which the head has no version of at all ↓ leaves a mark alone when the host could not say what the head has of it ↓ forgets what the head had of a marked file once a mutation moves the head ↓ finishes two presses on one file in the order they were made ↓ keeps the marks of two Azure repositories of the same name apart ↓ keeps environment marks apart from another change request's ↓ keeps one reader's marks on a host that names nobody ↓ carries a bounded number of its own marks and says it held more ↓ keeps Azure continuation cursors separate for repositories with the same name ↓ pauses uncached activity on a host after one activity read is rate limited ↓ authorizes cold source reads with paginated paths without fetching patch hunks ↓ keeps cold metadata membership in its original scope through an in-flight commit ↓ keeps cold metadata membership in its original scope through an in-flight credential ↓ keeps cold metadata membership in its original scope through an in-flight expiry ↓ keeps cold metadata membership in its original scope through an in-flight refresh ↓ reuses loaded oversized diff slices to expand only files the change request changes ↓ does not reuse loaded diff membership after changing commit ↓ does not reuse loaded diff membership after changing credential ↓ keeps a loaded diff's original membership scope through an in-flight expiry ↓ keeps a loaded diff's original membership scope through an in-flight commit expiry ↓ keeps a loaded diff's original membership scope through an in-flight cache hit ↓ keeps a loaded diff's original membership scope through an in-flight commit cache hit ↓ keeps a loaded diff's original membership scope through an in-flight refresh ❯ t3 src/orchestration-v2/pullRequestWatch.test.ts (22 tests | 2 failed | 20 skipped) 6ms ❯ evaluatePullRequestWatch (22) ↓ reports each failure at once, even while another check never finishes ↓ reports passed once the required checks pass, whatever the others do ↓ reports passed again when a required check shows up already passed ↓ wakes again when the other checks finish after the required ones passed ↓ reports an owed non-required failure once after the required notice ↓ clears old-head owed checks when a new head is pushed ↓ does not report passed again for a new passed check where none is required ↓ does not wake a watch saved before passed checks were recorded ↓ keeps remarks for a later pass when the conversation was not read whole ↓ reports a remark that shows up late with the same time as a reported one ↓ reports edits after the watermark once and counts them toward the wake limit ↓ wakes once per edit of a remark seen at the watermark, never for the agent's own ↓ does not treat a failed check read as a rerun ↓ wakes for the pull request's author when the agent is someone else ↓ reports remarks from others once and never the agent's own ↓ reports a conflict once, until the branch is clean again × reports each merge queue removal once while the head checks stay green 4ms × reports a merge queue removal stamped in the second the watch started 1ms ↓ does not spend the comment wake limit on check results ↓ stops after the wake limit unless the head moves ↓ does not tell a watch saved before the no-checks clock that its seen head has none ↓ never reports missing checks on a host where an empty list says nothing ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 6 ⎯⎯⎯⎯⎯⎯⎯ FAIL t3 src/orchestration-v2/pullRequestWatch.test.ts > evaluatePullRequestWatch > reports each merge queue removal once while the head checks stay green AssertionError: expected [] to deeply equal [ { …(2) } ] - Expected + Received - [ - { - "kind": "merge-queue-removed", - "reason": "Merge conflict", - }, - ] + [] ❯ src/orchestration-v2/pullRequestWatch.test.ts:366:12 364| const dropped = removed("first", "2026-10-02T12:10:00Z"); 365| const first = evaluatePullRequestWatch(watching, dropped, noRemark… 366| assert.deepEqual(first.changes, [{ kind: "merge-queue-removed", re… | ^ 367| const wake = pullRequestWatchMessage({ 368| number: 1, ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/6]⎯ FAIL t3 src/orchestration-v2/pullRequestWatch.test.ts > evaluatePullRequestWatch > reports a merge queue removal stamped in the second the watch started AssertionError: expected [] to deeply equal [ { …(2) } ] - Expected + Received - [ - { - "kind": "merge-queue-removed", - "reason": "CI failed", - }, - ] + [] ❯ src/orchestration-v2/pullRequestWatch.test.ts:394:12 392| const removed = (removedAt: string) => 393| detail({ mergeQueueRemoval: { id: "first", removedAt, reason: "C… 394| assert.deepEqual( | ^ 395| evaluatePullRequestWatch(watching, removed("2026-10-02T12:00:00Z… 396| [{ kind: "merge-queue-removed", reason: "CI failed" }], ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯ FAIL t3 src/orchestration-v2/runtimeLayer.test.ts > OrchestrationV2LayerLive lifecycle > persists each merge queue removal wake across reactor restarts AssertionError: expected undefined to equal 'first' - Expected: "first" + Received: undefined ❯ src/orchestration-v2/runtimeLayer.test.ts:3335:14 3333| yield* worker.drain(); 3334| const persisted = (yield* orchestrator.getThreadShell(threadId))… 3335| assert.equal(persisted?.mergeQueueRemovalId, "first"); | ^ 3336| const restarted = yield* PullRequestWatchReactor.make.pipe(Effec… 3337| yield* restarted.sweep; ❯ ~effect/Effect/successCont ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1422:28 ❯ ~effect/Effect/evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/core.ts:585:30 ❯ FiberImpl.runLoop ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:654:41 ❯ FiberImpl.evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:595:23 ❯ FiberImpl.evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:589:27 ❯ ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1159:17 ❯ Array. ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1697:11 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯ FAIL t3 src/pullRequest/PullRequestService.test.ts > preserves merge queue removal details from the provider AssertionError: expected undefined to deeply equal { id: 'RMQE_1', …(2) } - Expected: { "id": "RMQE_1", "reason": "CI failed", "removedAt": "2026-07-02T00:00:00Z", } + Received: undefined ❯ src/pullRequest/PullRequestService.test.ts:2777:12 2775| }); 2776| const detail = yield* service.detail({ projectId: "p1" as ProjectI… 2777| assert.deepStrictEqual(detail.mergeQueueRemoval, removal); | ^ 2778| }), 2779| ); ❯ ~effect/Effect/successCont ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1422:28 ❯ ~effect/Effect/evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/core.ts:585:30 ❯ FiberImpl.runLoop ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:654:41 ❯ FiberImpl.evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:595:23 ❯ FiberImpl.evaluate ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:589:27 ❯ ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:1159:17 ❯ Array. ../../node_modules/.pnpm/effect@4.0.5/node_modules/effect/src/internal/effect.ts:5160:17 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯ FAIL root packages/source-control-github/src/server/gitHubPullRequestJson.test.ts > pull request detail decoding > reads the newest merge queue removal, and none where the queue was not asked about AssertionError: expected undefined to deeply equal { id: 'RMQE_1', …(2) } - Expected: { "id": "RMQE_1", "reason": "Required status checks failed", "removedAt": "2026-07-05T00:00:00Z", } + Received: undefined ❯ packages/source-control-github/src/server/gitHubPullRequestJson.test.ts:519:90 517| reason: "Required status checks failed", 518| }; 519| expect(detailOf([], { mergeQueueRemovals: { nodes: [removal] } }).… | ^ 520| id: "RMQE_1", 521| removedAt: "2026-07-05T00:00:00Z", ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯ FAIL root packages/source-control-github/src/server/gitHubPullRequestJson.test.ts > pull request watch fingerprints > moves status with checks and queue removals, and remarks with comments, not across Test Files 4 failed (4) Tests 6 failed | 261 skipped (267) Start at 11:18:20 Duration 9.35s (transform 74%, import 19%, setup 5%, tests 2%) AssertionError: expected 'OPEN MERGEABLE abc123 IN_PROGRESS:2 ' not to be 'OPEN MERGEABLE abc123 IN_PROGRESS:2 ' // Object.is equality ❯ packages/source-control-github/src/server/gitHubPullRequestJson.test.ts:1698:32 1696| // Queued and dropped between two passes leaves the head and its c… 1697| const dropped = fingerprint({ ...base, removals: 1 }); 1698| expect(dropped.status).not.toBe(before.status); | ^ 1699| expect(dropped.remarks).toBe(before.remarks); 1700| }); ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/6]⎯