fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(cu): classify and gate semantic failures - #918

Merged
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate
Jul 13, 2026
Merged

fix(cu): classify and gate semantic failures#918
Astro-Han merged 1 commit into
apache:mainfrom
hqhq1025:codex/cu-semantic-loop-gate

Conversation

@hqhq1025

Copy link
Copy Markdown
Contributor

Summary

Fixes two Runtime issues found by a real-provider, real-AppKit AX model run:

  • returned Computer Use failures such as { text, error: 'stale_frame' } were projected to text and incorrectly classified as successful tool invocations;
  • a model could repeat the same ambiguity-rejected semantic target after every fresh observation because the generic loop signature included the changing observation_id.

Changes

  • preserve typed Computer Use failure codes on action results;
  • mark top-level returned error values as failed tool results for persistence, events, telemetry, and the generic loop gate;
  • label only explicit ambiguous semantic refetch failures as ambiguous_target;
  • cache a stable semantic signature of action + element identity/value while ignoring observation_id;
  • block the next identical ambiguous semantic target before the backend runs;
  • clear the ambiguity gate when the model changes target or action;
  • keep user_intervened, target_missing, and ordinary stale/re-observe recovery uncached.

Real evidence

A live gpt-5.6-sol run through AiSdkBackend -> ToolRuntime -> maka_computer -> cua-driver -> AppKit AX attempted a duplicated stale element. Before this fix, the stale_frame result was recorded as telemetry success and the model could retry after another observation. The real run remained safe (zero model dispatch and zero target mutation), but the Runtime accounting and retry control were wrong.

Verification

  • Runtime full suite: 1499 pass, 7 skip, 0 fail.
  • Full repository build and typecheck pass.
  • Focused loop-gate and Computer Use tests cover returned-error classification and ambiguity gating across changing observation IDs.
  • No native executor files are modified.

@hqhq1025

Copy link
Copy Markdown
ContributorAuthor

@astrohan CI is green. Additional live evidence: the real gpt-5.6-sol AppKit ambiguity scenario returned target_changed before semantic refetch (zero model dispatch, zero mutation), while an earlier static duplicate-label scenario produced stale-frame behavior. Independently, real Computer Use returned failures were previously counted as telemetry success; this PR fixes that classification. The stable ambiguity gate is covered by focused tests and deliberately excludes user_intervened/target_missing recovery.

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved on 4307ad77. I found no P0 or P1. GitHub CI is green. On current main, the full rebuild and stale check passed, the focused loop-gate suite passed 15/15, and the Computer Use tool tests passed 58/58.

P2

  1. Preserve and correctly scope the ambiguity gate across re-observation. An ambiguous semantic refetch consumes the active frame and returns no fresh observation, so the real recovery path must call observe before retrying. That call has no computerSemanticSignature, which clears lastAmbiguousComputerSignature at packages/runtime/src/tool-runtime.ts:407-411; its successful result clears it again at lines 709-711. In an integrated reproduction, ambiguous click(obs-1) -> observe -> same click(obs-2) reached the implementation all three times. The added test skips the required observe call.

    The cached key at lines 924-929 also contains only the action, frame-local element_id, value, and text. It has no app, window, role, or label scope. If the gate is preserved across observe, the same index in another window can be blocked as the old target, while the same target can bypass the gate when its index changes. Carry the bound element identity and window scope in the failure metadata, preserve the gate through observation calls, and clear it only when the target or action actually changes.

@Astro-Han
Astro-Han merged commit f333c03 into apache:mainJul 13, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@hqhq1025@Astro-Han