From 810917a39a0529093bc72f6bd5be7875d70f04b8 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Wed, 9 Sep 2026 12:40:17 +0200 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=A4=96=20fix:=20show=20message=20load?= =?UTF-8?q?ing=20during=20active=20turns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keep transcript replay feedback visible alongside turn progress. --- _Generated with `xum` • Model: `gpt-6-astra` • Thinking: `not reported` • Cost: `unavailable`_ --- src/browser/components/ChatPane/ChatPane.tsx | 3 ++- src/browser/stories/App.chatLoading.stories.tsx | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/browser/components/ChatPane/ChatPane.tsx b/src/browser/components/ChatPane/ChatPane.tsx index 17e3f24c77..501a7fa260 100644 --- a/src/browser/components/ChatPane/ChatPane.tsx +++ b/src/browser/components/ChatPane/ChatPane.tsx @@ -1691,9 +1691,10 @@ const ChatPaneContent: React.FC = (props) => { )} {/* Replay feedback must not resize the in-flow dock: even a brief catch-up would otherwise shift cached transcript rows on workspace switches. + An active turn does not mean history has loaded, so retain feedback alongside it. Keep it above the dock for both editable and read-only transcripts, yielding to Jump to bottom while scrolled up so they cannot overlap on phones. */} - {isHydratingTranscript && !shouldMountStreamingBarrier && autoScroll && ( + {isHydratingTranscript && autoScroll && (
{ + await step("Running init finishes before replay feedback; active turns retain it", async () => { emitChat({ type: "init-start", hookPath: "/project/.xum/init", @@ -276,7 +276,8 @@ function createHydrationStory(workspaceId: string): AppStory { phase: "preparing", hadAnyOutput: false, }); - await waitFor(() => expect(getLoadingStatus(canvasElement), "preparing stream").toBeNull()); + await expect(await canvas.findByText(/starting\.\.\./)).toBeVisible(); + await checkLoadingLayout(canvasElement); emitChat({ type: "stream-start", workspaceId: workspace.id, @@ -286,7 +287,7 @@ function createHydrationStory(workspaceId: string): AppStory { startTime: STABLE_TIMESTAMP, }); await expect(await canvas.findByText(/streaming\.\.\./)).toBeVisible(); - await expect(getLoadingStatus(canvasElement)).toBeNull(); + await checkLoadingLayout(canvasElement); emitChat(history); emitChat({ type: "caught-up", @@ -319,12 +320,12 @@ function createHydrationStory(workspaceId: string): AppStory { }); }); - await step("A monitor barrier suppresses duplicate replay status", async () => { + await step("A monitor barrier retains replay feedback", async () => { await switchWorkspace(canvasElement, monitorWorkspace.id); await expect( await canvas.findByText(/Waiting on background bash monitor/, {}, { timeout: 5000 }) ).toBeVisible(); - await expect(getLoadingStatus(canvasElement)).toBeNull(); + await checkLoadingLayout(canvasElement); }); await step("Read-only cached transcripts retain aligned replay feedback", async () => { From 16ba6a423f4f0db4709e9b1c0b07a18e587f7748 Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Wed, 9 Sep 2026 13:02:11 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A4=96=20fix:=20normalize=20security?= =?UTF-8?q?=20review=20headings=20consistently?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Repair the pre-existing Codex gate regressions exposed by PR validation. Strip the observed heading once and keep completed informational results pending until code-review approval arrives. --- _Generated with `xum` • Model: `gpt-6-astra` • Thinking: `not reported` • Cost: `unavailable`_ --- scripts/lib/codex_comments.jq | 4 ++-- scripts/wait_pr_codex.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/lib/codex_comments.jq b/scripts/lib/codex_comments.jq index 3930d93fbb..50769c483d 100644 --- a/scripts/lib/codex_comments.jq +++ b/scripts/lib/codex_comments.jq @@ -49,8 +49,8 @@ def codex_comment_is_informational($bot): ) catch false) // false else ($body | test("Didn.t find any major issues|usage limits have been reached|create a Codex account")) - or ($body | test("^(### 🛡️ Codex Security Review · _[^_\n]+_\n+)?" - + "Security review completed\\. No security issues were found in this pull request\\." + # The heading was stripped once above; a second heading is an unknown envelope. + or ($body | test("^Security review completed\\. No security issues were found in this pull request\\." + "\n+\\*\\*Reviewed commit:\\*\\* `[0-9a-f]{7,40}`" + "\n+\\[View security finding report\\]\\(https://chatgpt\\.com/codex/cloud/tasks/[A-Za-z0-9_-]+\\)" + "\n+_Only the user who started this review can view the report in Codex\\._$")) diff --git a/scripts/wait_pr_codex.sh b/scripts/wait_pr_codex.sh index 957d1c14bd..dd98607e3c 100755 --- a/scripts/wait_pr_codex.sh +++ b/scripts/wait_pr_codex.sh @@ -466,7 +466,7 @@ CHECK_CODEX_STATUS_ONCE() { include "codex_comments"; [.[] | select(.author.login == $bot and .createdAt > $request_at) | select( - ((.body | startswith("") or startswith("Security review completed.")) + ((.body | codex_without_help | startswith("") or startswith("Security review completed.")) and codex_comment_is_informational($bot)) | not )] | length ')