From 8b1a5962bf5ccd23e782459658836e5fc8ecd478 Mon Sep 17 00:00:00 2001 From: openclaw-bot Date: Thu, 12 Mar 2026 16:07:29 +0800 Subject: [PATCH 1/4] fix: ignore synthetic test breakage reports in intake --- .github/workflows/report-intake.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/report-intake.yml b/.github/workflows/report-intake.yml index 7975c56..dc12974 100644 --- a/.github/workflows/report-intake.yml +++ b/.github/workflows/report-intake.yml @@ -36,6 +36,15 @@ jobs: const exactMarker = ``; const aggregateMarker = ``; const isUserReport = report.type === 'user_report'; + const isSyntheticTestBreakage = !isUserReport && ( + diagnostics.reason === 'test_breakage' || + String(diagnostics.selectorVersion || '').startsWith('test-') + ); + if (isSyntheticTestBreakage) { + core.info('Skip synthetic test breakage report to avoid noisy issues.'); + return; + } + const baseLabels = [ isUserReport ? 'user-report' : 'auto-report', ]; From 0437ca7035d6ce84ab82d42ac5da75f07be335d1 Mon Sep 17 00:00:00 2001 From: openclaw-bot Date: Sun, 15 Mar 2026 00:03:18 +0800 Subject: [PATCH 2/4] fix(chatgpt): add fallback turn selectors for new chat layouts --- content.js | 23 ++++++++++++++++++++--- selectors.json | 4 +++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/content.js b/content.js index ae0a36e..b340902 100644 --- a/content.js +++ b/content.js @@ -21,6 +21,8 @@ chatgpt: { turns: [ "article[data-testid^='conversation-turn-']", + "[data-testid='conversation-turn']", + '[data-message-author-role]', '[data-message-id]', ], turnRoleAttr: 'data-turn', @@ -556,10 +558,25 @@ function makePathEntry(turn) { } function readChatGPTTurns() { - const turns = [...document.querySelectorAll('article[data-testid^="conversation-turn-"]')]; + let turns = [...document.querySelectorAll('article[data-testid^="conversation-turn-"]')]; + + if (!turns.length) { + const fallbackSelectors = [ + "[data-testid='conversation-turn']", + '[data-message-author-role]', + 'main article', + ]; + const candidates = dedupeElements(fallbackSelectors.flatMap(sel => [...document.querySelectorAll(sel)])) + .filter(el => isReadableTurnCandidate(el, { minText: 2 })); + turns = candidates + .filter(el => !candidates.some(other => other !== el && other.contains(el))) + .sort((a, b) => rectTop(a) - rectTop(b)); + } + return turns.map((turn, idx) => { - const role = turn.getAttribute('data-turn') === 'user' ? 'user' : 'assistant'; - const msgDiv = turn.querySelector('[data-message-id]'); + const roleAttr = turn.getAttribute('data-turn') || turn.getAttribute('data-message-author-role') || ''; + const role = /^user$/i.test(roleAttr) ? 'user' : 'assistant'; + const msgDiv = turn.matches('[data-message-id]') ? turn : turn.querySelector('[data-message-id]'); const msgId = msgDiv?.getAttribute('data-message-id') || turn.getAttribute('data-turn-id') || null; const nav = findChatGPTBranchNav(turn); return { diff --git a/selectors.json b/selectors.json index fd84db8..11181c2 100644 --- a/selectors.json +++ b/selectors.json @@ -1,10 +1,12 @@ { - "version": "0.3.0", + "version": "0.3.1", "lastVerified": "2026-03-11", "platforms": { "chatgpt": { "turns": [ "article[data-testid^='conversation-turn-']", + "[data-testid='conversation-turn']", + "[data-message-author-role]", "[data-message-id]" ], "turnRoleAttr": "data-turn", From 75971f6d0fb75fa4a7b0220f7e15e28232df47e1 Mon Sep 17 00:00:00 2001 From: openclaw-bot Date: Sun, 15 Mar 2026 12:11:33 +0800 Subject: [PATCH 3/4] fix: trigger codex review on labeled/synchronize with dedup --- .github/workflows/codex-trigger.yml | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codex-trigger.yml b/.github/workflows/codex-trigger.yml index e031aaa..e2ecd69 100644 --- a/.github/workflows/codex-trigger.yml +++ b/.github/workflows/codex-trigger.yml @@ -2,7 +2,7 @@ name: Trigger Codex Review on: pull_request: - types: [opened, reopened, labeled] + types: [opened, reopened, labeled, synchronize] jobs: trigger: @@ -13,9 +13,26 @@ jobs: with: github-token: ${{ secrets.FUUGAMO_PAT }} script: | + const prNumber = context.payload.pull_request.number; + const pingText = '@codex Please review this PR. If you find no critical issues, reply with "LGTM". If you find critical issues, describe them clearly.'; + + // 去重:如果已存在相同触发评论则跳过,避免重复@codex + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + per_page: 100, + }); + + const alreadyPinged = comments.some(c => (c.body || '').includes(pingText)); + if (alreadyPinged) { + core.info('Codex already pinged on this PR, skip duplicate comment.'); + return; + } + await github.rest.issues.createComment({ owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.payload.pull_request.number, - body: '@codex Please review this PR. If you find no critical issues, reply with "LGTM". If you find critical issues, describe them clearly.', + repo: context.repo.repo, + issue_number: prNumber, + body: pingText, }); From a2f657f8fd5cf7277a854a92af42025229d56e90 Mon Sep 17 00:00:00 2001 From: openclaw-bot Date: Sun, 15 Mar 2026 12:33:25 +0800 Subject: [PATCH 4/4] fix: report no_turns_detected only on /c/ conversation pages --- content.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/content.js b/content.js index b340902..f6d7bbd 100644 --- a/content.js +++ b/content.js @@ -1024,6 +1024,15 @@ function makePathEntry(turn) { return false; } + function isLikelyChatConversationPage() { + try { + const path = new URL(location.href).pathname || ''; + return path.includes('/c/'); + } catch (_) { + return (location.pathname || '').includes('/c/'); + } + } + function syncStateToPanel(force = false) { const turns = serializeTurns(readRawTurns()); if (!turns.length) { @@ -1031,10 +1040,12 @@ function makePathEntry(turn) { sendToPanel({ type: 'CONVERSATION_LOADING' }); return; } - maybeReportBreakage('no_turns_detected', { - phase: 'sync', - force, - }); + if (isLikelyChatConversationPage()) { + maybeReportBreakage('no_turns_detected', { + phase: 'sync', + force, + }); + } sendToPanel({ type: 'CONVERSATION_LOADING' }); return; }