finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

Description

@os-warren

Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

The measured state

Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

exclude kindpackagesnon-test files in tooling dirs today
directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
NAME only (*.test.ts / *.test.tsx)290
no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

Why this is the actual finding

objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

Options, not a recommendation

  1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
  2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
  3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

Reproduce

The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

Related

  • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
  • objectui#4006, objectui#4836 — the first two instances
  • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

Metadata

Metadata

Labels

ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , '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

    finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

    Description

    @os-warren

    Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

    The measured state

    Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

    exclude kindpackagesnon-test files in tooling dirs today
    directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
    NAME only (*.test.ts / *.test.tsx)290
    no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

    The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

    Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

    The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

    Why this is the actual finding

    objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

    Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

    Options, not a recommendation

    1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
    2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
    3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

    I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

    Reproduce

    The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

    Related

    • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
    • objectui#4006, objectui#4836 — the first two instances
    • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

    Metadata

    Metadata

    Labels

    ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , '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

      finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

      Description

      @os-warren

      Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

      The measured state

      Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

      exclude kindpackagesnon-test files in tooling dirs today
      directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
      NAME only (*.test.ts / *.test.tsx)290
      no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

      The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

      Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

      The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

      Why this is the actual finding

      objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

      Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

      Options, not a recommendation

      1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
      2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
      3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

      I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

      Reproduce

      The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

      Related

      • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
      • objectui#4006, objectui#4836 — the first two instances
      • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

      Metadata

      Metadata

      Labels

      ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , '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

        finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

        Description

        @os-warren

        Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

        The measured state

        Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

        exclude kindpackagesnon-test files in tooling dirs today
        directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
        NAME only (*.test.ts / *.test.tsx)290
        no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

        The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

        Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

        The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

        Why this is the actual finding

        objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

        Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

        Options, not a recommendation

        1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
        2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
        3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

        I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

        Reproduce

        The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

        Related

        • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
        • objectui#4006, objectui#4836 — the first two instances
        • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

        Metadata

        Metadata

        Labels

        ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , '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

          finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

          Description

          @os-warren

          Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

          The measured state

          Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

          exclude kindpackagesnon-test files in tooling dirs today
          directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
          NAME only (*.test.ts / *.test.tsx)290
          no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

          The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

          Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

          The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

          Why this is the actual finding

          objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

          Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

          Options, not a recommendation

          1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
          2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
          3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

          I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

          Reproduce

          The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

          Related

          • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
          • objectui#4006, objectui#4836 — the first two instances
          • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

          Metadata

          Metadata

          Labels

          ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , '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

            finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

            Description

            @os-warren

            Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

            The measured state

            Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

            exclude kindpackagesnon-test files in tooling dirs today
            directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
            NAME only (*.test.ts / *.test.tsx)290
            no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

            The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

            Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

            The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

            Why this is the actual finding

            objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

            Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

            Options, not a recommendation

            1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
            2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
            3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

            I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

            Reproduce

            The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

            Related

            • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
            • objectui#4006, objectui#4836 — the first two instances
            • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

            Metadata

            Metadata

            Labels

            ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , '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

              finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

              Description

              @os-warren

              Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

              The measured state

              Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

              exclude kindpackagesnon-test files in tooling dirs today
              directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
              NAME only (*.test.ts / *.test.tsx)290
              no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

              The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

              Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

              The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

              Why this is the actual finding

              objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

              Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

              Options, not a recommendation

              1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
              2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
              3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

              I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

              Reproduce

              The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

              Related

              • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
              • objectui#4006, objectui#4836 — the first two instances
              • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

              Metadata

              Metadata

              Labels

              ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , '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

                finding(build): 29 published packages still exclude tooling by NAME only — each is one non-*.test.* helper away from the same red, and the per-package fix is at the wrong altitude #7212

                Description

                @os-warren

                Filed unassigned by the os-dev seat while implementing objectui#6943 (the @object-ui/fields instance). Grading and domain:* are the triage seat's. This card is the half objectui#6943's dispatch explicitly ruled OUT of that PR: "report, do not ride — a cross-package build-config change is its own card with its own review."

                The measured state

                Swept every package in the changeset fixed group minus private: true (the same definition check-published-dist-tooling.mjs uses), reading each build tsconfig.json's exclude and counting files under a tooling directory that are not named *.test.* / *.spec.* / *.bench.* / *.stories.*.

                exclude kindpackagesnon-test files in tooling dirs today
                directory form (**/__tests__/** etc.)5 — components, core, fields, plugin-grid, plugin-view, plugin-designerthe known ones, all kept out of the emit
                NAME only (*.test.ts / *.test.tsx)290
                no exclude key / different emitter4 — cli, data-objectstack, plugin-charts, consolenot applicable, see below

                The 29 name-only packages: app-shell, auth, collaboration, create-plugin, i18n, layout, mobile, permissions, plugin-ai, plugin-calendar, plugin-chatbot, plugin-dashboard, plugin-detail, plugin-editor, plugin-form, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-markdown, plugin-report, plugin-timeline, plugin-tree, providers, react, react-runtime, runner, sdui-parser, types.

                Every one of them is green today, and that is the whole point: they are green because nobody has yet added a shared helper to a __tests__/ directory, not because their build config would stop one. check:published-dist cannot warn about this — it is an artifact-level gate, deliberately (its header explains why the cheap static form was measured and rejected in objectui#4846), so it can only report the instance after it ships.

                The four exempt ones are exempt for reasons the gate header already states: cli and data-objectstack emit from a tsup entry graph, plugin-charts passes its own exclude in the dts() options, and console sets noEmit: true so it writes no declarations at all. console is worth noting anyway — it has no exclude key and does carry src/__tests__/helpers/preview-page-sources.ts, so it is protected only by noEmit.

                Why this is the actual finding

                objectui#4006 fixed it in fields and plugin-editor. objectui#4836 fixed it in core, plugin-grid, plugin-view, plugin-designer. objectui#6943 has just fixed it in fieldsagain — the same package as the first instance, because the first fix wrote the name form and the directory form was never generalised.

                Three rounds, each one a correct local repair, each one leaving the same trap armed everywhere else. The recurrence interval is what argues the altitude is wrong, not the quality of any individual fix.

                Options, not a recommendation

                1. A shared base config the package build tsconfigs extend, carrying the tooling-directory exclude once. Cheapest to reason about; the risk is that a package that legitimately needs a tooling file in its program has to opt out, and check-published-dist-tooling.mjs's own header records that five zero-defect packages would be wrongly reded by a naive version of that rule.
                2. A ratchet gate that reads each published package's build tsconfig and requires the directory form wherever the emitter honours it — cheap, static, per-PR, and it would have caught all three instances at authoring time rather than at publish time. It needs the per-emitter carve-outs above spelled out, which is exactly the modelling objectui#4846 declined to do for the artifact-level gate; here the scope is narrower (config shape, not emit semantics), so it may be tractable where it was not there.
                3. Leave it per-package and accept an instance every few months, now that the gate at least catches them before a human hits them at publish time.

                I have deliberately not picked one — the trade involves how much emit-semantics modelling this repo wants to own, which objectui#4846 already ruled on once in the other direction.

                Reproduce

                The sweep script is not committed anywhere; it reads .changeset/config.json for the released set, strips // comments from each package tsconfig.json, and classifies exclude. TOOLING_FILE in scripts/check-phantom-dependencies.mjs is the canonical directory-vs-name regex it matches against.

                Related

                • objectui#6943 — the third instance, fixed per-package; its dispatch ruled the generalisation out of scope and into this card
                • objectui#4006, objectui#4836 — the first two instances
                • objectui#4846 — why the shipped gate is artifact-level rather than static, and the five packages a naive static rule reds

                Metadata

                Metadata

                Labels

                ci/cddomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions