Repository navigation
fix(native-chat): order pending user prompts chronologically and tolerate cross-host clock skew (#23851) - #24207
Conversation
|
Comments Outside DiffThese findings could not be posted inline.
|
|
Important Review skippedWe couldn't safely recover the incremental review. No full review was started, and the last reviewed checkpoint was preserved. Retry later, or explicitly request a full review by commenting You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 Walkthrough
Priority: ➖ Normal Severity of issue fixed: Medium Merge Risk: 🔵 Low · up to
|
| Check name | Status | Explanation | Resolution |
|---|---|---|---|
| Docstring Coverage | Docstring coverage is 41.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 12 functions across 9 files. (1 skipped: … | Write docstrings for the functions missing them to satisfy the coverage threshold. |
✅ Passed checks (4 passed)
-
Check name Status Explanation Title check ✅ Passed The title clearly summarizes the main changes: chronological ordering of pending prompts and tolerance for cross-host clock skew. Description check ✅ Passed The description explains the user-visible problem, changes, rationale, linked issue, and added tests. It also reports test results and cross-platform considerations. The visual-proof section names a c… Linked Issues check ✅ Passed Issue #23851requires prompts to appear before the responses they trigger.compareMessagesassigns ordinary pending prompts rank 0, streaming previews rank 1, and explicitly queued prompts rank 2. `…Out of Scope Changes check ✅ Passed The queue-state tracking, timestamp matching tolerance, pruning tests, and specification support prompt ordering and prevent clock skew from misclassifying or stranding prompts for #23851. The reviewe…
Full details: Docstring Coverage
-
Explanation
Docstring coverage is 41.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 12 functions across 9 files. (1 skipped: 1 unsupported.)
- Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Autopilot is currently an internal CodeRabbit preview.
Comment @coderabbitai help to get the list of available commands.
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Advanced
Run ID: 8d631c0a-8c67-4e22-afaf-45d6f41a2d09
📥 Commits
Reviewing files that changed from the base of the PR and between 373d951 and 3e70f377b9404ce854e24682e1109379e11f9073.
📒 Files selected for processing (7)
docs/review-evidence/23851-chat-ui-out-of-sequence-messages.mdsrc/renderer/src/components/native-chat/NativeChatResolvedView.tsxsrc/renderer/src/components/native-chat/native-chat-message-grouping.test.tssrc/renderer/src/components/native-chat/native-chat-pending.test.tssrc/renderer/src/components/native-chat/native-chat-pending.tssrc/renderer/src/components/native-chat/native-chat-session-assembler.test.tssrc/renderer/src/components/native-chat/native-chat-session-assembler.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
There was a problem hiding this comment.
Important
The rank collapse fixes the prompt that triggered the current reply but inverts the mirrored case: a prompt queued while the agent is still streaming now sorts above the streaming preview and renders before the answer to the previous turn. See inline.
Reviewed changes
- Pending prompts sort chronologically —
compareMessagesdropsmessageSortRank's rank-2 tier; pending/launch echoes now share rank 0 and order bytimestamp, with onlyNATIVE_CHAT_STREAMING_IDat rank 1. - View echo order —
NativeChatResolvedViewconcatenatespendingMessagesbefore the streaming bubble (cosmetic, since the list re-sorts viacompareMessages). - Clock-skew slack —
native-chat-pending.tsappliesLIFECYCLE_CLOCK_SKEW_SLACK_MSto client-sent boundaries (pending matching, launch-prompt pruning), each gated by the existing epoch-ms> 1e11check; server transcript boundaries stay strict. - Tests — new/updated cases across the three native-chat test files.
- Evidence doc — new
docs/review-evidence/23851-chat-ui-out-of-sequence-messages.md.
ℹ️ Nitpicks
isPendingMessageId(native-chat-pending.ts:277) andisLaunchPromptMessageId(native-chat-pending.ts:341) lost their only production caller when thesession-assemblerimport was removed; they are now referenced only by their own tests. Remove both helpers and their test blocks unless a near-term consumer is planned.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
3e70f37 to
cc56e17
Compare
PR Update & Review Response Summary
|
There was a problem hiding this comment.
ℹ️ No critical issues — the previously flagged queued-send inversion is fixed. One bounded ordering gap and a few minor notes inline.
Reviewed changes (delta since the prior pullfrog review at 3e70f377)
- Queued sends rank again — re-introduced
messageSortRankwithmessage.queued→ rank 2 andNATIVE_CHAT_STREAMING_ID→ rank 1, addressing the inverted queued case raised last review. queuedthreaded end to end —onOptimisticSendcomputesqueuedfromisWorking || liveWorking || streamingText,recordstores it on the pending entry, andpendingSendsAsMessagesemits it on the echo.- Strict
sentAtboundary restored —messageIsAfterPendingTimestampdrops the clock-skew slack it carried at3e70f377; new tests pin the strict>=/>split. - View tail ordering — the pending echoes and streaming bubble are sorted with
compareMessagesbefore being appended. - Tests — new/updated cases across the three native-chat suites plus
use-native-chat-pending-delivery.test.tsx.
ℹ️ Nitpicks
record's third parameter is typedNativeChatRecordPendingOptions | boolean(use-native-chat-pending-delivery.ts:51), but no caller passes a boolean — only{ queued }is ever used. Drop the union arm.- This commit deleted the two-line comment in
messageIsAfterPendingTimestampexplaining why a local send time is inclusive (>=) while a transcript boundary is exclusive (>). It is load-bearing rationale for a change this PR is specifically about; restore it. - The PR description still says skew slack was added to client
sentAtboundaries, but that slack was removed here and the new tests assert the strict behavior. Update the description so it matches the code.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
Important
The new dynamic queued check subtracts the renderer clock from the execution host's clock, so on a host whose clock lags, the prompt that triggered the current turn is flagged queued and renders below its own streaming reply — the #23851 inversion, now confined to remote/paired hosts.
Reviewed changes (delta since the prior pullfrog review at cc56e17d)
- Dynamic
queuedevaluation —pendingSendsAsMessagesaccepts{ liveWorking, hookWorkingEpoch }and decidesqueuedlive fromentry.sentAt >= hookWorkingEpoch, replacing the send-time latch and resolving the prior "queued latch never clears" finding. - First-send skew slack —
messageIsAfterPendingTimestampappliesLIFECYCLE_CLOCK_SKEW_SLACK_MSwhenafterMessageId === null, and launch-prompt matching/pruning gain the same slack, so a first/launch prompt whose transcript row trails the renderer clock still prunes; paged-out transcript boundaries stay strict. - Tests — new cases in
native-chat-pending.test.ts,native-chat-session-assembler.test.ts,native-chat-message-grouping.test.ts, anduse-native-chat-pending-delivery.test.tsx.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
Update: Resolution of Cross-Clock Dynamic Queuing & Review FeedbackCommit
|
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes (delta since the prior pullfrog review at 88d0eee)
- Queued state moved into the host clock domain —
onOptimisticSendnow recordsqueuedBehindWorkingEpoch(the livehookWorkingEpoch) andpendingSendsAsMessagesmarks a sendqueuedonly whileliveWorkingand the live epoch still equals that stored epoch, replacing the renderer-sentAtvs host-epoch subtraction that inverted remote/paired prompts. recordoption shape tightened — the| booleanarm was dropped fromNativeChatRecordPendingOptions; the pending entry now always carriesqueuedBehindWorkingEpoch.- Restored rationale comment — the inclusive-vs-strict boundary comment in
messageIsAfterPendingTimestampis back. - Tests — the dynamic-
queuedcase was reworked for the epoch-equality rule, plus a regression case asserting a triggering prompt stays rank 0 when the host clock lags; the delivery test coversqueuedBehindWorkingEpochpersistence.
The prior inline concern (cross-clock subtraction) is correctly resolved: both sides of the equality are host-clock values, so the triggering prompt stays rank 0 and a queued follow-up still ranks below its active turn's streaming preview.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
Important
The new isSubsequentQueuedSend heuristic infers "this follow-up is now the active turn" from its position among visible echoes, but the active send's echo is exactly the one that vanishes when its transcript user row lands. I confirmed both mis-sorts with a failing unit test — the multi-follow-up ordering can invert in either direction.
Reviewed changes (delta since the prior pullfrog review at 876eb55)
- Later queued follow-ups stay queued —
pendingSendsAsMessagesnow also marks an entry with a storedqueuedBehindWorkingEpochas queued when it is not the first surviving echo, so a second follow-up keeps rank 2 once the first becomes the active turn. - Test coverage — the dynamic-
queuedtest asserts the first follow-up unqueues and the second stays queued when the epoch advances. - Spec artifact — adds
specs/23851-chat-ui-out-of-sequence-messages.mddescribing the change.
ℹ️ Nitpicks
specs/23851-chat-ui-out-of-sequence-messages.mdreads as agent planning scratch (Step-by-Step,Expert Maintainer Audit,Notes for Next Agent) and introduces a new top-levelspecs/directory with no other entries. A prior review flagged the same material underdocs/review-evidence/as worth dropping or folding into the PR description.
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏
Update: Resolution of Queued Follow-Up Ordering Position (Commit
|
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes (delta since the prior pullfrog review at c0f604ff)
- Active queued send selected before filtering —
pendingSendsAsMessagesnow picks the active send by its position in the incomingpendingarray (the first entry with a stalequeuedBehindWorkingEpoch) rather than its index among surviving echoes, so the active echo's classification no longer flips when its own transcript row hides it. - Queued follow-ups survive pruning and a null epoch — a stale-epoch send stays queued while the last transcript row is an unanswered user turn whose timestamp is at/after its stored epoch, and a queued send stays queued when
hookWorkingEpochis null; otherwise the earliest stale-epoch send becomes the active turn. - Tests — new
native-chat-pending-queued.test.tspins the post-prune, older-echo-lingering, null-epoch, and lagging-host-clock cases; the five touched native-chat suites pass locally (108 tests).
The prior [!IMPORTANT] finding is resolved: both mis-sorts it described (a follow-up surviving after its predecessor's echo hides, and a now-active follow-up while an older echo lingers) are now decided by the send's stable pre-filter position, with the transcript-tail check covering the prune window.
deepseek-v4.1-flash (free via Pullfrog for OSS) | 𝕏
|
@CodeRabbit full review |
✅ Action performedFull review finished. |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
- Configuration used: Repository UI
- Review profile: CHILL
- Plan: Advanced
- Run ID:
27301a16-01aa-427e-9a7f-d9dab720ecf4
📒 Files selected for processing (10)
specs/23851-chat-ui-out-of-sequence-messages.mdsrc/renderer/src/components/native-chat/NativeChatResolvedView.tsxsrc/renderer/src/components/native-chat/native-chat-message-grouping.test.tssrc/renderer/src/components/native-chat/native-chat-pending-queued.test.tssrc/renderer/src/components/native-chat/native-chat-pending.test.tssrc/renderer/src/components/native-chat/native-chat-pending.tssrc/renderer/src/components/native-chat/native-chat-session-assembler.test.tssrc/renderer/src/components/native-chat/native-chat-session-assembler.tssrc/renderer/src/components/native-chat/use-native-chat-pending-delivery.test.tsxsrc/renderer/src/components/native-chat/use-native-chat-pending-delivery.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
| In `src/renderer/src/components/native-chat/native-chat-session-assembler.ts`, `messageSortRank` previously classified messages into artificial tiers where pending user prompts were ranked 2 and streaming previews were ranked 1. This caused pending user prompts to sort after streaming previews and assistant responses. Additionally, clock skew between host and client could cause launch prompt pruning to fail. | ||
|
|
||
| The fix unifies user message sorting precedence: | ||
| 1. Pending user prompts and authoritative messages sort by timestamp chronologically. | ||
| 2. The active streaming preview sits directly after the user prompt that triggered it. | ||
| 3. Pending send and launch prompt pruning are tolerant of cross-host clock skew. | ||
| 4. Adversarial review identified and resolved two edge cases in `pendingSendsAsMessages`: | ||
| - Handled post-pruning React state cycle: when a prior follow-up is pruned from `pending` after landing in the transcript, subsequent follow-up sends remain queued behind the in-progress transcript turn. | ||
| - Handled null `hookWorkingEpoch`: when an agent is live-working (e.g. scrape/terminal turn), explicitly queued sends remain queued even if `hookWorkingEpoch` is not yet available. | ||
|
|
||
| All 108 targeted Vitest tests pass, web typecheck is clean, oxlint has 0 issues, and `check:code-quality:changed` passes with 0 findings. | ||
| ## Summary | ||
|
|
||
| Restore strict chronological ordering in `compareMessages` and message assembly: | ||
| 1. Pending user prompts must not sort after subsequent assistant responses or streaming previews. User prompts appear before the agent response that answers them. | ||
| 2. In `compareMessages`, chronological timestamps take precedence for user prompts so pending user prompts sort by submission order. | ||
| 3. The streaming preview (`NATIVE_CHAT_STREAMING_ID`) with `null` timestamp sorts directly after the user prompt that triggered it, never before the user prompt. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
sed -n '1,70p' specs/23851-chat-ui-out-of-sequence-messages.md
sed -n '90,118p' src/renderer/src/components/native-chat/native-chat-session-assembler.tsRepository: stablyai/orca
Length of output: 5962
🏁 Script executed:
git diff --unified=50 ed462b2caa5e280d6a56b2f9c6fed1b2bc2f86db 279cadef0267182ac0bb2eb1b632f047c167fe86 -- specs/23851-chat-ui-out-of-sequence-messages.md src/renderer/src/components/native-chat/native-chat-session-assembler.ts src/renderer/src/components/native-chat/native-chat-pending.ts src/renderer/src/components/native-chat/use-native-chat-pending-delivery.ts src/renderer/src/components/native-chat/native-chat-session-assembler.test.ts src/renderer/src/components/native-chat/native-chat-pending-queued.test.ts
printf '\\n--- spec complete ---\\n'
nl -ba specs/23851-chat-ui-out-of-sequence-messages.md | sed -n '1,120p'
printf '\\n--- relevant implementation declarations ---\\n'
rg -n -C 8 'messageSortRank|pendingSendsAsMessages|hookWorkingEpoch|queued:' src/renderer/src/components/native-chat/native-chat-session-assembler.ts src/renderer/src/components/native-chat/native-chat-pending.ts src/renderer/src/components/native-chat/use-native-chat-pending-delivery.tsRepository: stablyai/orca
Length of output: 42023
🤖 get_repo_knowledge executed:
get_repo_knowledge stablyai/orca /tmp/coderabbit-repo-knowledge/stablyai-orca-89dc44e4/learnings /tmp/coderabbit-repo-knowledge/stablyai-orca-89dc44e4/conventions
Length of output: 47809
🏁 Script executed:
printf '%s\\n' '--- base comparator ---'
git show ed462b2caa5e280d6a56b2f9c6fed1b2bc2f86db:src/renderer/src/components/native-chat/native-chat-session-assembler.ts | nl -ba | sed -n '88,120p'
printf '%s\\n' '--- head comparator ---'
git show 279cadef0267182ac0bb2eb1b632f047c167fe86:src/renderer/src/components/native-chat/native-chat-session-assembler.ts | nl -ba | sed -n '88,120p'
printf '%s\\n' '--- head pending queue logic ---'
git show 279cadef0267182ac0bb2eb1b632f047c167fe86:src/renderer/src/components/native-chat/native-chat-pending.ts | nl -ba | sed -n '258,330p'
printf '%s\\n' '--- spec lines ---'
git show 279cadef0267182ac0bb2eb1b632f047c167fe86:specs/23851-chat-ui-out-of-sequence-messages.md | nl -ba | sed -n '1,70p'
printf '%s\\n' '--- applicable guidance candidates ---'
rg --files -g 'AGENTS.md' -g 'CONTRIBUTING*' -g '*spec*' specs . 2>/dev/null | sed -n '1,80p'Repository: stablyai/orca
Length of output: 16459
🏁 Script executed:
nl -ba AGENTS.md | sed -n '1,220p'Repository: stablyai/orca
Length of output: 15296
Correct the ordering summary to distinguish active and queued prompts.
The description of the previous ranks is accurate. The current summary is too broad: compareMessages still compares ranks before transcript order, so queued prompts sort after the streaming preview. Update the spec to describe the retained rank tiers. The queue-state notes are supported by the implementation.
Suggested spec wording
-The fix unifies user message sorting precedence:
-1. Pending user prompts and authoritative messages sort by timestamp chronologically.
-2. The active streaming preview sits directly after the user prompt that triggered it.
+`compareMessages` keeps three rank tiers. Messages other than queued prompts and the streaming preview rank 0; the streaming preview ranks 1; queued prompts rank 2. The comparator applies transcript order only within each rank.
+1. The triggering prompt sorts before the streaming preview.
+2. Prompts queued while the agent is working sort after the preview.
@@
-Restore strict chronological ordering in `compareMessages` and message assembly:
-1. Pending user prompts must not sort after subsequent assistant responses or streaming previews. User prompts appear before the agent response that answers them.
-2. In `compareMessages`, chronological timestamps take precedence for user prompts so pending user prompts sort by submission order.
-3. The streaming preview (`NATIVE_CHAT_STREAMING_ID`) with `null` timestamp sorts directly after the user prompt that triggered it, never before the user prompt.
+Preserve rank-first ordering in `compareMessages` and message assembly:
+1. The triggering prompt sorts before the streaming preview; queued prompts sort after it.
+2. `compareMessages` compares rank before transcript order.
+3. The streaming preview (`NATIVE_CHAT_STREAMING_ID`) ranks after the triggering prompt and before queued prompts.
@@
- - Adjust `messageSortRank` and `compareMessages` in `native-chat-session-assembler.ts` so pending user messages sort by their chronological timestamp.
+ - Adjust `messageSortRank` and `compareMessages` in `native-chat-session-assembler.ts` to preserve the active-prompt, preview, and queued-prompt ranks.ae7e9fa to
bec5cd3
Compare
176b48b to
f23f737
Compare
…clock skew (stablyai#23851) Active pending/launch echoes sort with ordinary transcript order so the prompt that started a turn stays above its streaming reply. Mid-turn follow-ups set queued:true and wait behind the live preview. Wall-clock first-send and launch matching accept LIFECYCLE_CLOCK_SKEW_SLACK_MS when comparing local sentAt/createdAt to host timestamps; same-host transcript boundaries stay strict. Rebased onto current main and keep empty-transcript session claims when recording pending sends.
Mid-turn follow-ups kept queued:true until prune, so after the prior stream ended they could still sort behind the next streaming reply. Clear queued once working and stream preview are both idle so remaining pendings rank as ordinary prompts above any later stream.
f23f737 to
f740321
Compare

ELI5
When you submit a message in the chat UI, the user prompt is shown immediately as a pending prompt while the assistant starts thinking and streaming its reply. Previously, the pending prompt was artificially assigned a lower sorting rank ("Rank 2") than assistant responses ("Rank 0") and streaming previews ("Rank 1"). This caused newly submitted prompts to jump below subsequent assistant messages or streaming text instead of staying above the reply they triggered. In addition, follow-up prompts queued while the agent was busy needed to cleanly sort below active turns without cross-clock comparisons between host and client clocks. This fix aligns pending prompts chronologically, tracks queued follow-ups against the host working epoch in a single clock domain, and handles clock skew cleanly.
What Changed
What broke, as a user sees it:
Occasionally, when sending a prompt or pasting instructions into the chat UI, the user's prompt rendered after the assistant's reply (or streaming preview bubble) rather than before it (#23851). In multi-turn chats or rapid exchanges, the prompt-response causality appeared inverted on screen. Furthermore, launch prompts could become stranded indefinitely at the bottom of the transcript if client and server clocks differed.
Why:
After this PR:
Why
User prompts naturally precede the model's response in conversation flow. Assigning pending prompts to an artificial Rank 2 was intended to ensure pending items didn't displace finalized history, but it had the unintended consequence of pushing user prompts below active streaming previews and subsequent transcript arrivals. Unifying pending user prompts into Rank 0 sorted by chronological timestamp preserves conversational causality without special-case heuristics. Tracking queued follow-ups within the host's clock domain ensures robust sorting across local and remote/SSH setups.
Linked Issue
Fixes #23851
Visual Proof
Visual sequence flow comparison:
Testing
Automated tests in:
Specific unit test verifying that when host clock lags (), a prompt triggering the turn is NOT flagged queued and sorts before the streaming preview.
Typecheck (Scope: all 2 workspace projects
✓ Lockfile passes supply-chain policies (verified 7h ago)
Lockfile is up to date, resolution step is skipped
Already up to date
native/windows-registry install$ node-gyp rebuild
native/windows-registry install: gyp info it worked if it ends with ok
native/windows-registry install: gyp info using node-gyp@12.3.0
native/windows-registry install: gyp info using node@24.19.0 | linux | x64
native/windows-registry install: gyp info find Python using Python version 3.12.3 found at "/usr/bin/python3"
native/windows-registry install:
native/windows-registry install: gyp info spawn /usr/bin/python3
native/windows-registry install: gyp info spawn args [
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/gyp/gyp_main.py',
native/windows-registry install: gyp info spawn args 'binding.gyp',
native/windows-registry install: gyp info spawn args '-f',
native/windows-registry install: gyp info spawn args 'make',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build/config.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/addon.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node-gyp/24.19.0/include/node/common.gypi',
native/windows-registry install: gyp info spawn args '-Dlibrary=shared_library',
native/windows-registry install: gyp info spawn args '-Dvisibility=default',
native/windows-registry install: gyp info spawn args '-Dnode_root_dir=/home/lesley/.cache/node-gyp/24.19.0',
native/windows-registry install: gyp info spawn args '-Dnode_gyp_dir=/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp',
native/windows-registry install: gyp info spawn args '-Dnode_lib_file=/home/lesley/.cache/node-gyp/24.19.0/<(target_arch)/node.lib',
native/windows-registry install: gyp info spawn args '-Dmodule_root_dir=/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry',
native/windows-registry install: gyp info spawn args '-Dnode_engine=v8',
native/windows-registry install: gyp info spawn args '--depth=.',
native/windows-registry install: gyp info spawn args '--no-parallel',
native/windows-registry install: gyp info spawn args '--generator-output',
native/windows-registry install: gyp info spawn args 'build',
native/windows-registry install: gyp info spawn args '-Goutput_dir=.'
native/windows-registry install: gyp info spawn args ]
native/windows-registry install: gyp info spawn make
native/windows-registry install: gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
native/windows-registry install: make: Entering directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: TOUCH Release/obj.target/orca_windows_registry.stamp
native/windows-registry install: make: Leaving directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: gyp info ok
native/windows-registry install: Done
. postinstall$ node config/scripts/rebuild-native-deps.mjs
. postinstall: [rebuild] Skipping optional Electron rebuild modules: cpu-features
. postinstall: [rebuild] Native modules already load in Electron; skipping rebuild.
. postinstall: Done
. prepare$ husky
. prepare: node:fs:3177
. prepare: binding.copyFile(
. prepare: ^
. prepare:
. prepare: Error: EACCES: permission denied, copyfile '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky' -> '.husky//h'
. prepare: at Object.copyFileSync (node:fs:3177:11)
. prepare: at default (file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/index.js:21:4)
. prepare: at file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/bin.js:26:16
. prepare: at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
. prepare: at async node:internal/modules/esm/loader:643:26
. prepare: at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
. prepare: errno: -13,
. prepare: code: 'EACCES',
. prepare: syscall: 'copyfile',
. prepare: path: '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky',
. prepare: dest: '.husky//h'
. prepare: }
. prepare:
. prepare: Node.js v24.19.0
. prepare: Failed) and full vitest suite in all passing (220/220 test files, 2284/2284 tests).
I manually tested these changes locally
Automated tests added/updated, or explained why not below
AI Disclosure
Prepared with Claude Code. Reviewed and verified by Lesley Murfin.
Review
Agent skill upstream boundary
Notes
Checklist
✓ Lockfile passes supply-chain policies (verified 7h ago)
Lockfile is up to date, resolution step is skipped
Already up to date
native/windows-registry install$ node-gyp rebuild
native/windows-registry install: gyp info it worked if it ends with ok
native/windows-registry install: gyp info using node-gyp@12.3.0
native/windows-registry install: gyp info using node@24.19.0 | linux | x64
native/windows-registry install: gyp info find Python using Python version 3.12.3 found at "/usr/bin/python3"
native/windows-registry install:
native/windows-registry install: gyp info spawn /usr/bin/python3
native/windows-registry install: gyp info spawn args [
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/gyp/gyp_main.py',
native/windows-registry install: gyp info spawn args 'binding.gyp',
native/windows-registry install: gyp info spawn args '-f',
native/windows-registry install: gyp info spawn args 'make',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build/config.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/addon.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node-gyp/24.19.0/include/node/common.gypi',
native/windows-registry install: gyp info spawn args '-Dlibrary=shared_library',
native/windows-registry install: gyp info spawn args '-Dvisibility=default',
native/windows-registry install: gyp info spawn args '-Dnode_root_dir=/home/lesley/.cache/node-gyp/24.19.0',
native/windows-registry install: gyp info spawn args '-Dnode_gyp_dir=/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp',
native/windows-registry install: gyp info spawn args '-Dnode_lib_file=/home/lesley/.cache/node-gyp/24.19.0/<(target_arch)/node.lib',
native/windows-registry install: gyp info spawn args '-Dmodule_root_dir=/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry',
native/windows-registry install: gyp info spawn args '-Dnode_engine=v8',
native/windows-registry install: gyp info spawn args '--depth=.',
native/windows-registry install: gyp info spawn args '--no-parallel',
native/windows-registry install: gyp info spawn args '--generator-output',
native/windows-registry install: gyp info spawn args 'build',
native/windows-registry install: gyp info spawn args '-Goutput_dir=.'
native/windows-registry install: gyp info spawn args ]
native/windows-registry install: gyp info spawn make
native/windows-registry install: gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
native/windows-registry install: make: Entering directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: TOUCH Release/obj.target/orca_windows_registry.stamp
native/windows-registry install: make: Leaving directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: gyp info ok
native/windows-registry install: Done
. postinstall$ node config/scripts/rebuild-native-deps.mjs
. postinstall: [rebuild] Skipping optional Electron rebuild modules: cpu-features
. postinstall: [rebuild] Native modules already load in Electron; skipping rebuild.
. postinstall: Done
. prepare$ husky
. prepare: node:fs:3177
. prepare: binding.copyFile(
. prepare: ^
. prepare:
. prepare: Error: EACCES: permission denied, copyfile '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky' -> '.husky//h'
. prepare: at Object.copyFileSync (node:fs:3177:11)
. prepare: at default (file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/index.js:21:4)
. prepare: at file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/bin.js:26:16
. prepare: at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
. prepare: at async node:internal/modules/esm/loader:643:26
. prepare: at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
. prepare: errno: -13,
. prepare: code: 'EACCES',
. prepare: syscall: 'copyfile',
. prepare: path: '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky',
. prepare: dest: '.husky//h'
. prepare: }
. prepare:
. prepare: Node.js v24.19.0
. prepare: Failed, Scope: all 2 workspace projects
✓ Lockfile passes supply-chain policies (verified 7h ago)
Lockfile is up to date, resolution step is skipped
Already up to date
native/windows-registry install$ node-gyp rebuild
native/windows-registry install: gyp info it worked if it ends with ok
native/windows-registry install: gyp info using node-gyp@12.3.0
native/windows-registry install: gyp info using node@24.19.0 | linux | x64
native/windows-registry install: gyp info find Python using Python version 3.12.3 found at "/usr/bin/python3"
native/windows-registry install:
native/windows-registry install: gyp info spawn /usr/bin/python3
native/windows-registry install: gyp info spawn args [
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/gyp/gyp_main.py',
native/windows-registry install: gyp info spawn args 'binding.gyp',
native/windows-registry install: gyp info spawn args '-f',
native/windows-registry install: gyp info spawn args 'make',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build/config.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/addon.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node-gyp/24.19.0/include/node/common.gypi',
native/windows-registry install: gyp info spawn args '-Dlibrary=shared_library',
native/windows-registry install: gyp info spawn args '-Dvisibility=default',
native/windows-registry install: gyp info spawn args '-Dnode_root_dir=/home/lesley/.cache/node-gyp/24.19.0',
native/windows-registry install: gyp info spawn args '-Dnode_gyp_dir=/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp',
native/windows-registry install: gyp info spawn args '-Dnode_lib_file=/home/lesley/.cache/node-gyp/24.19.0/<(target_arch)/node.lib',
native/windows-registry install: gyp info spawn args '-Dmodule_root_dir=/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry',
native/windows-registry install: gyp info spawn args '-Dnode_engine=v8',
native/windows-registry install: gyp info spawn args '--depth=.',
native/windows-registry install: gyp info spawn args '--no-parallel',
native/windows-registry install: gyp info spawn args '--generator-output',
native/windows-registry install: gyp info spawn args 'build',
native/windows-registry install: gyp info spawn args '-Goutput_dir=.'
native/windows-registry install: gyp info spawn args ]
native/windows-registry install: gyp info spawn make
native/windows-registry install: gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
native/windows-registry install: make: Entering directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: TOUCH Release/obj.target/orca_windows_registry.stamp
native/windows-registry install: make: Leaving directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: gyp info ok
native/windows-registry install: Done
. postinstall$ node config/scripts/rebuild-native-deps.mjs
. postinstall: [rebuild] Skipping optional Electron rebuild modules: cpu-features
. postinstall: [rebuild] Native modules already load in Electron; skipping rebuild.
. postinstall: Done
. prepare$ husky
. prepare: node:fs:3177
. prepare: binding.copyFile(
. prepare: ^
. prepare:
. prepare: Error: EACCES: permission denied, copyfile '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky' -> '.husky//h'
. prepare: at Object.copyFileSync (node:fs:3177:11)
. prepare: at default (file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/index.js:21:4)
. prepare: at file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/bin.js:26:16
. prepare: at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
. prepare: at async node:internal/modules/esm/loader:643:26
. prepare: at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
. prepare: errno: -13,
. prepare: code: 'EACCES',
. prepare: syscall: 'copyfile',
. prepare: path: '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky',
. prepare: dest: '.husky//h'
. prepare: }
. prepare:
. prepare: Node.js v24.19.0
. prepare: Failed, Scope: all 2 workspace projects
✓ Lockfile passes supply-chain policies (verified 7h ago)
Lockfile is up to date, resolution step is skipped
Already up to date
native/windows-registry install$ node-gyp rebuild
native/windows-registry install: gyp info it worked if it ends with ok
native/windows-registry install: gyp info using node-gyp@12.3.0
native/windows-registry install: gyp info using node@24.19.0 | linux | x64
native/windows-registry install: gyp info find Python using Python version 3.12.3 found at "/usr/bin/python3"
native/windows-registry install:
native/windows-registry install: gyp info spawn /usr/bin/python3
native/windows-registry install: gyp info spawn args [
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/gyp/gyp_main.py',
native/windows-registry install: gyp info spawn args 'binding.gyp',
native/windows-registry install: gyp info spawn args '-f',
native/windows-registry install: gyp info spawn args 'make',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build/config.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/addon.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node-gyp/24.19.0/include/node/common.gypi',
native/windows-registry install: gyp info spawn args '-Dlibrary=shared_library',
native/windows-registry install: gyp info spawn args '-Dvisibility=default',
native/windows-registry install: gyp info spawn args '-Dnode_root_dir=/home/lesley/.cache/node-gyp/24.19.0',
native/windows-registry install: gyp info spawn args '-Dnode_gyp_dir=/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp',
native/windows-registry install: gyp info spawn args '-Dnode_lib_file=/home/lesley/.cache/node-gyp/24.19.0/<(target_arch)/node.lib',
native/windows-registry install: gyp info spawn args '-Dmodule_root_dir=/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry',
native/windows-registry install: gyp info spawn args '-Dnode_engine=v8',
native/windows-registry install: gyp info spawn args '--depth=.',
native/windows-registry install: gyp info spawn args '--no-parallel',
native/windows-registry install: gyp info spawn args '--generator-output',
native/windows-registry install: gyp info spawn args 'build',
native/windows-registry install: gyp info spawn args '-Goutput_dir=.'
native/windows-registry install: gyp info spawn args ]
native/windows-registry install: gyp info spawn make
native/windows-registry install: gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
native/windows-registry install: make: Entering directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: TOUCH Release/obj.target/orca_windows_registry.stamp
native/windows-registry install: make: Leaving directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: gyp info ok
native/windows-registry install: Done
. postinstall$ node config/scripts/rebuild-native-deps.mjs
. postinstall: [rebuild] Skipping optional Electron rebuild modules: cpu-features
. postinstall: [rebuild] Native modules already load in Electron; skipping rebuild.
. postinstall: Done
. prepare$ husky
. prepare: node:fs:3177
. prepare: binding.copyFile(
. prepare: ^
. prepare:
. prepare: Error: EACCES: permission denied, copyfile '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky' -> '.husky//h'
. prepare: at Object.copyFileSync (node:fs:3177:11)
. prepare: at default (file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/index.js:21:4)
. prepare: at file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/bin.js:26:16
. prepare: at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
. prepare: at async node:internal/modules/esm/loader:643:26
. prepare: at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
. prepare: errno: -13,
. prepare: code: 'EACCES',
. prepare: syscall: 'copyfile',
. prepare: path: '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky',
. prepare: dest: '.husky//h'
. prepare: }
. prepare:
. prepare: Node.js v24.19.0
. prepare: Failed, and Scope: all 2 workspace projects
✓ Lockfile passes supply-chain policies (verified 7h ago)
Lockfile is up to date, resolution step is skipped
Already up to date
native/windows-registry install$ node-gyp rebuild
native/windows-registry install: gyp info it worked if it ends with ok
native/windows-registry install: gyp info using node-gyp@12.3.0
native/windows-registry install: gyp info using node@24.19.0 | linux | x64
native/windows-registry install: gyp info find Python using Python version 3.12.3 found at "/usr/bin/python3"
native/windows-registry install:
native/windows-registry install: gyp info spawn /usr/bin/python3
native/windows-registry install: gyp info spawn args [
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/gyp/gyp_main.py',
native/windows-registry install: gyp info spawn args 'binding.gyp',
native/windows-registry install: gyp info spawn args '-f',
native/windows-registry install: gyp info spawn args 'make',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build/config.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp/addon.gypi',
native/windows-registry install: gyp info spawn args '-I',
native/windows-registry install: gyp info spawn args '/home/lesley/.cache/node-gyp/24.19.0/include/node/common.gypi',
native/windows-registry install: gyp info spawn args '-Dlibrary=shared_library',
native/windows-registry install: gyp info spawn args '-Dvisibility=default',
native/windows-registry install: gyp info spawn args '-Dnode_root_dir=/home/lesley/.cache/node-gyp/24.19.0',
native/windows-registry install: gyp info spawn args '-Dnode_gyp_dir=/home/lesley/.cache/node/corepack/v1/pnpm/12.0.0/dist/node_modules/node-gyp',
native/windows-registry install: gyp info spawn args '-Dnode_lib_file=/home/lesley/.cache/node-gyp/24.19.0/<(target_arch)/node.lib',
native/windows-registry install: gyp info spawn args '-Dmodule_root_dir=/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry',
native/windows-registry install: gyp info spawn args '-Dnode_engine=v8',
native/windows-registry install: gyp info spawn args '--depth=.',
native/windows-registry install: gyp info spawn args '--no-parallel',
native/windows-registry install: gyp info spawn args '--generator-output',
native/windows-registry install: gyp info spawn args 'build',
native/windows-registry install: gyp info spawn args '-Goutput_dir=.'
native/windows-registry install: gyp info spawn args ]
native/windows-registry install: gyp info spawn make
native/windows-registry install: make: Entering directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
native/windows-registry install: TOUCH Release/obj.target/orca_windows_registry.stamp
native/windows-registry install: make: Leaving directory '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/native/windows-registry/build'
native/windows-registry install: gyp info ok
native/windows-registry install: Done
. postinstall$ node config/scripts/rebuild-native-deps.mjs
. postinstall: [rebuild] Skipping optional Electron rebuild modules: cpu-features
. postinstall: [rebuild] Native modules already load in Electron; skipping rebuild.
. postinstall: Done
. prepare$ husky
. prepare: node:fs:3177
. prepare: binding.copyFile(
. prepare: ^
. prepare:
. prepare: Error: EACCES: permission denied, copyfile '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky' -> '.husky//h'
. prepare: at Object.copyFileSync (node:fs:3177:11)
. prepare: at default (file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/index.js:21:4)
. prepare: at file:///data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/bin.js:26:16
. prepare: at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
. prepare: at async node:internal/modules/esm/loader:643:26
. prepare: at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
. prepare: errno: -13,
. prepare: code: 'EACCES',
. prepare: syscall: 'copyfile',
. prepare: path: '/data/opt/revive/orca_serve/state/factory/workspaces/fork/bug-chat-ui-showing-out-of-sequence-messages/node_modules/.pnpm/husky@9.1.7/node_modules/husky/husky',
. prepare: dest: '.husky//h'
. prepare: }
. prepare:
. prepare: Node.js v24.19.0
. prepare: Failed pass (or CI will cover; local preferred)