') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Backport #3645: [world-postgres] Refuse a hook resume that races the disposal by github-actions[bot] · Pull Request #3663 · vercel/workflow · GitHub
Skip to content

Backport #3645: [world-postgres] Refuse a hook resume that races the disposal - #3663

Merged
pranaygp merged 1 commit into
stablefrom
backport/pr-3645-to-stable
Aug 19, 2026
Merged

Backport #3645: [world-postgres] Refuse a hook resume that races the disposal#3663
pranaygp merged 1 commit into
stablefrom
backport/pr-3645-to-stable

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated backport of #3645 to stable (backport job run).

AI recommendation: This is a pure correctness fix for a data-integrity bug: a hook_received racing its hook's disposal could be journaled after hook_disposed, permanently corrupting the owning run's event log (CorruptedEventLogError). The affected code exists on stable in the same racy shape (verified: packages/world-postgres/src/storage.ts on origin/stable still does the unlocked existence check and an autocommitted DELETE ... RETURNING for hook_disposed), and the change is a patch with regression tests in an existing test file that is also maintained on stable. Note the hook_received half will likely need manual conflict resolution, since stable's version of that branch differs from main's.

Merge conflicts were resolved by AI (opencode with anthropic/claude-opus-5). Please review the conflict resolution carefully before merging.

)
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3fe5a33

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@workflow/world-postgresPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewAug 19, 2026 6:51pm
example-nextjs-workflow-webpackReadyReadyPreviewAug 19, 2026 6:51pm
example-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-astro-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-express-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-fastify-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-hono-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-nestjs-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-nitro-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-nuxt-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-python-workflowErrorErrorAug 19, 2026 6:51pm
workbench-sveltekit-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-tanstack-start-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workbench-vite-workflowReadyReadyPreviewAug 19, 2026 6:51pm
workflow-docsReadyReadyPreview, v0Aug 19, 2026 6:51pm
workflow-swc-playgroundReadyReadyPreviewAug 19, 2026 6:51pm
workflow-tarballsReadyReadyPreviewAug 19, 2026 6:51pm
workflow-webReadyReadyPreviewAug 19, 2026 6:51pm

@pranaygp
pranaygp merged commit 0f7f498 into stableAug 19, 2026
23 of 24 checks passed
@pranaygp
pranaygp deleted the backport/pr-3645-to-stable branch August 19, 2026 20:13
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.

1 participant

@pranaygp