fix(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam
, '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(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam
, '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(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam
, '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(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam
, '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(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam
, '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(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam
, '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(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam
, '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(resources): make TipTracker.get_tip use pending state - #1206

Open
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309
Open

fix(resources): make TipTracker.get_tip use pending state#1206
VivienP wants to merge 1 commit into
PyLabRobot:mainfrom
VivienP:fix/tip-state-consistency-309

Conversation

@VivienP

@VivienPVivienP commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Align TipTracker.get_tip() with has_tip so both expose the pending transactional state.
  • Fix the contradictory tracker views described in Tip state tracking allows for contradictory states #309.
  • Preserve STAR and Vantage pickup behavior with tip tracking enabled: LiquidHandler stages removal from the TipSpot before calling the backend, so Hamilton backends now use the Tip already captured in the pickup operation instead of rereading the mutated TipSpot.
  • Update Hamilton tip-type resolution accordingly.
  • Add regression coverage for pending add/remove, commit/rollback, and STAR/Vantage pickup with tip tracking enabled.

Hardware uncertainty / UNKNOWN physical state remains out of scope. This PR is independent of #1207.

Test plan

  • TipTracker transactional-state tests
  • STAR pickup with tip tracking enabled
  • Vantage pickup with tip tracking enabled
  • Relevant LiquidHandler/Hamilton tests
  • Ruff check / format

Combined validation with #1207 on current upstream/main:

  • 236 tests passed
  • 101 subtests passed
  • ruff check pylabrobot passed
  • ruff format --check pylabrobot passed

Out of scope

Vantage.pick_up_tips96 with tip tracking enabled is already broken on upstream/main: it checks pending has_tip after the frontend stages removal and fails before get_tip() is involved. This PR does not change that pre-existing behavior.

Align get_tip() with has_tip and VolumeTracker so public getters expose the same transactional view. Add regression tests for pending add and remove.
Co-authored-by: Cursor <cursoragent@cursor.com>
@VivienP
VivienPforce-pushed the fix/tip-state-consistency-309 branch from 7ddc71c to 1b4f86dCompareAugust 29, 2026 13:06
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

@VivienP@BioCam