') + ')', '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(test-infra): `check-sdui-registration-pins.test.ts` fails on any tree where `packages/app-shell/dist` exists · Issue #6893 · objectstack-ai/objectui · GitHub
Skip to content

finding(test-infra): check-sdui-registration-pins.test.ts fails on any tree where packages/app-shell/dist exists #6893

Description

@os-sam

Surfaced while implementing #6849 (it was the one red case in that branch's scripts/ run, and had to be shown independent of the diff before the branch could be reported). Filed unassigned; out of that card's scope.

The symptom

FAIL scripts/__tests__/check-sdui-registration-pins.test.ts
> the real workspace > derives the keys from the arrays, and the ruled controls are among them
AssertionError: expected 'packages/app-shell/dist/console/conne…' to be 'packages/app-shell/src/console/connec…'
Expected: "packages/app-shell/src/console/connect/ConnectAgentWidget.tsx"
Received: "packages/app-shell/dist/console/connect/ConnectAgentWidget.js"

The assertion pins a src/ path. The derivation resolves through the package's built output when that output is on disk, so it answers dist/ instead.

What decides it is untracked state, not the tree

packages/app-shell/dist is gitignoredgit ls-files packages/app-shell/dist returns 0 entries — and check-sdui-registration-pins.mjs walks the filesystem (fs.existsSync), not git ls-files. So the same commit passes or fails depending on whether anyone has built app-shell in that checkout.

Measured in a clean worktree of origin/main at 9ce20233f plus an unrelated branch: the case fails, with byte-identical Expected/Received, with the branch's own changes reverted — so it is not a regression from any diff, it is a property of a built tree.

Why it is worth a card rather than a shrug

This is the same family as the instruments this repo has been grading all round: a test whose verdict is a function of hidden local state. Two directions, both bad:

  • On a developer or agent machine that has built app-shell, it is a permanently red case sitting in an otherwise green suite. A red case that everyone learns to expect is a case nobody reads — and it is in the same file as the pins that actually matter.
  • The reverse reading is the one that costs: someone lands a change that genuinely breaks the derivation, sees this familiar red, and attributes it to "the dist thing".

It also makes every scripts/ suite run in a built worktree non-deterministic from the runner's point of view, which is precisely what makes an agent seat unable to tell "my diff did this" from "this tree does this" without spending a control run on it.

Shape of a fix (for triage)

  1. Make the derivation source-first — prefer src/ when both exist, so the answer does not depend on build state. Probably right, but it changes what the gate reads in CI too, so it needs a reading of whether the dist preference is load-bearing for the real check.
  2. Make the test declare its precondition — skip (loudly) when packages/app-shell/dist is present, or assert against whichever spelling is on disk. Cheap; keeps the ambiguity.
  3. Assert BOTH spellings are acceptable and pin the module identity rather than the path.

⭐ Recommend 1 if the dist preference turns out to be incidental, 3 otherwise; ⛔ not 2 on its own — a conditional skip is how a case stops being run on exactly the machines where it would have fired.

Not measured here: whether CI hits this. ci.yml builds, so whether it reproduces depends on step order between the build and the shard that owns scripts/. Worth checking as part of the fix rather than assumed either way.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions