') + ')', '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); } })(); })(); finding(app-shell): objectui#4567's grid pin no longer tests "a REAL column change" — cloud#1652's publishedFieldNames filter turned it into an identity-churn pin · Issue #6729 · objectstack-ai/objectui · GitHub
Skip to content

finding(app-shell): objectui#4567's grid pin no longer tests "a REAL column change" — cloud#1652's publishedFieldNames filter turned it into an identity-churn pin #6729

Description

@os-sales

Filed by the domain:ui execution seat on behalf of the developer that measured it, which could not file it itself: it was dispatched under a hard "no GitHub API calls" constraint during a rate-limit outage and made zero. Filing it here so the finding does not disappear because a channel was closed. Unassigned and unlabelled for triage routing; suggested domain:ui, type Task.

Measured

packages/app-shell/src/views/studio-design/StudioDesignSurface.gridColumns.test.tsx carries a pin whose docstring describes the case as "a REAL column change still refetches — the dependency stays live", contrasted against the identity-stability case above it.

Since cloud#1652 added the publishedFieldNames filter to gridColumns, that is no longer what the case does. The test drives the change by clicking "+ Add field", which appends an unpublishedfield_<N>. The filter removes it again, so the producer rebuilds an array with equal content and a fresh identity.

⇒ The pin exercises identity-churn liveness, not a content change. Its docstring asserts the opposite.

Why it is worth recording rather than quietly fixing

This is not a broken test. The assertion still has force, and it is the pin that caught a real regression — it went red on objectui#6697's first attempt, which is how that card's under-trigger was found at all. What is stale is the sentence explaining what it measures.

⚠️ The cost of the drift is exactly what #6697 paid: a reader (a human or an agent) who takes the docstring at face value concludes the file already covers "a real column change", and therefore that a change which alters column content without altering identity is already pinned. It is not. #6697's repair had to add that case:

a column change that does not move $expand must still refetch — asserted on $select.

So the drift has already misled once, and the misleading is the defect.

Options, as the measuring developer framed them

  • A — leave the assertion and the docstring as they are. It still guards ListView against a producer-side memo that freezes or constant-folds the columns, which is a real failure mode, and it is the pin that caught the regression.
  • B — re-point it at a published field so it exercises a genuine content change, and add a separate case for the identity-churn liveness it currently tests by accident.
  • C — record the drift and change nothing now.

The developer recommended C, then A, and deliberately did not touch the pin: it went green under its fix on the pin's own terms, and re-pointing another card's pin to match one's own reading of it is the kind of move that should need a ruling rather than a developer's judgement. That restraint is why this card exists instead of a quiet edit inside an unrelated PR.

⚠️ Note for whoever prices this: after #6697 lands, the content-change case is covered — by ListView.discardedExpandFieldsMemo.test.tsx, in a different package. So option B's second half may already be satisfied elsewhere, and the remaining question may be only whether the docstring should say what it actually measures.

Provenance

Measured while repairing the red Test (shard 1/4) on PR #6725 (objectui#6697). Related: objectui#4567 (the pin's own card, closed), cloud#1652 (the publishedFieldNames filter that caused the drift).

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2tests

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions