main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

Description

@pseudoseed

Summary

main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
341 files, 6779 tests. The other five CI jobs are green.

FAIL src/__tests__/extension-retirement.test.ts
Error: Hook timed out in 10000ms.
❯ src/__tests__/extension-retirement.test.ts:12:1

Cause — verified from the diff, not inferred

PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

The root package.json is:

{ "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

files: ["*"] means the root pack sweeps everything except two directories. The test packs
the workspace root:

execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

So the build step made the root tarball substantially larger, and a hook that was already close
to its 10s ceiling went over it. The build step is correct and should stay — without it the
publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
its own comment. The test is what needs to change.

Three defects here, not one

1. The pack is far more work than the assertion needs. The test writes a real tarball and
then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
file list with no tarball written and no tar process. #214's own publish-scrub guard already
uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
the package/ prefix, so the one assertion that uses them adjusts accordingly.

2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
(deletes the Stream Deck source tree, removes both extensions from active release automation,
keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
were reported skipped and the suite failed. One slow fixture took down four tests that never
depended on it.

3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

Fix

All three, in that order. The first alone probably clears the red; the second is what stops the
next slow fixture from failing unrelated tests; the third makes the budget explicit.

Related

Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
against real I/O sitting inside the unit suite on a default timeout
. Worth deciding whether the
pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
this fix. Get main green first.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/coreCore libraries and shared logic

    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

      main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

      Description

      @pseudoseed

      Summary

      main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
      whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
      341 files, 6779 tests. The other five CI jobs are green.

      FAIL src/__tests__/extension-retirement.test.ts
      Error: Hook timed out in 10000ms.
      ❯ src/__tests__/extension-retirement.test.ts:12:1
      

      Cause — verified from the diff, not inferred

      PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
      dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

      The root package.json is:

      { "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

      files: ["*"] means the root pack sweeps everything except two directories. The test packs
      the workspace root:

      execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

      So the build step made the root tarball substantially larger, and a hook that was already close
      to its 10s ceiling went over it. The build step is correct and should stay — without it the
      publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
      its own comment. The test is what needs to change.

      Three defects here, not one

      1. The pack is far more work than the assertion needs. The test writes a real tarball and
      then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
      file list with no tarball written and no tar process. #214's own publish-scrub guard already
      uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
      the package/ prefix, so the one assertion that uses them adjusts accordingly.

      2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
      (deletes the Stream Deck source tree, removes both extensions from active release automation,
      keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
      read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
      were reported skipped and the suite failed. One slow fixture took down four tests that never
      depended on it.

      3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
      keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

      Fix

      All three, in that order. The first alone probably clears the red; the second is what stops the
      next slow fixture from failing unrelated tests; the third makes the budget explicit.

      Related

      Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
      which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
      against real I/O sitting inside the unit suite on a default timeout
      . Worth deciding whether the
      pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
      this fix. Get main green first.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        area/coreCore libraries and shared logic

        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

          main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

          Description

          @pseudoseed

          Summary

          main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
          whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
          341 files, 6779 tests. The other five CI jobs are green.

          FAIL src/__tests__/extension-retirement.test.ts
          Error: Hook timed out in 10000ms.
          ❯ src/__tests__/extension-retirement.test.ts:12:1
          

          Cause — verified from the diff, not inferred

          PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
          dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

          The root package.json is:

          { "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

          files: ["*"] means the root pack sweeps everything except two directories. The test packs
          the workspace root:

          execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

          So the build step made the root tarball substantially larger, and a hook that was already close
          to its 10s ceiling went over it. The build step is correct and should stay — without it the
          publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
          its own comment. The test is what needs to change.

          Three defects here, not one

          1. The pack is far more work than the assertion needs. The test writes a real tarball and
          then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
          file list with no tarball written and no tar process. #214's own publish-scrub guard already
          uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
          the package/ prefix, so the one assertion that uses them adjusts accordingly.

          2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
          (deletes the Stream Deck source tree, removes both extensions from active release automation,
          keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
          read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
          were reported skipped and the suite failed. One slow fixture took down four tests that never
          depended on it.

          3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
          keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

          Fix

          All three, in that order. The first alone probably clears the red; the second is what stops the
          next slow fixture from failing unrelated tests; the third makes the budget explicit.

          Related

          Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
          which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
          against real I/O sitting inside the unit suite on a default timeout
          . Worth deciding whether the
          pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
          this fix. Get main green first.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            area/coreCore libraries and shared logic

            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

              main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

              Description

              @pseudoseed

              Summary

              main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
              whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
              341 files, 6779 tests. The other five CI jobs are green.

              FAIL src/__tests__/extension-retirement.test.ts
              Error: Hook timed out in 10000ms.
              ❯ src/__tests__/extension-retirement.test.ts:12:1
              

              Cause — verified from the diff, not inferred

              PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
              dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

              The root package.json is:

              { "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

              files: ["*"] means the root pack sweeps everything except two directories. The test packs
              the workspace root:

              execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

              So the build step made the root tarball substantially larger, and a hook that was already close
              to its 10s ceiling went over it. The build step is correct and should stay — without it the
              publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
              its own comment. The test is what needs to change.

              Three defects here, not one

              1. The pack is far more work than the assertion needs. The test writes a real tarball and
              then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
              file list with no tarball written and no tar process. #214's own publish-scrub guard already
              uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
              the package/ prefix, so the one assertion that uses them adjusts accordingly.

              2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
              (deletes the Stream Deck source tree, removes both extensions from active release automation,
              keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
              read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
              were reported skipped and the suite failed. One slow fixture took down four tests that never
              depended on it.

              3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
              keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

              Fix

              All three, in that order. The first alone probably clears the red; the second is what stops the
              next slow fixture from failing unrelated tests; the third makes the budget explicit.

              Related

              Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
              which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
              against real I/O sitting inside the unit suite on a default timeout
              . Worth deciding whether the
              pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
              this fix. Get main green first.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                area/coreCore libraries and shared logic

                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

                  main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

                  Description

                  @pseudoseed

                  Summary

                  main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
                  whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
                  341 files, 6779 tests. The other five CI jobs are green.

                  FAIL src/__tests__/extension-retirement.test.ts
                  Error: Hook timed out in 10000ms.
                  ❯ src/__tests__/extension-retirement.test.ts:12:1
                  

                  Cause — verified from the diff, not inferred

                  PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
                  dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

                  The root package.json is:

                  { "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

                  files: ["*"] means the root pack sweeps everything except two directories. The test packs
                  the workspace root:

                  execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

                  So the build step made the root tarball substantially larger, and a hook that was already close
                  to its 10s ceiling went over it. The build step is correct and should stay — without it the
                  publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
                  its own comment. The test is what needs to change.

                  Three defects here, not one

                  1. The pack is far more work than the assertion needs. The test writes a real tarball and
                  then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
                  file list with no tarball written and no tar process. #214's own publish-scrub guard already
                  uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
                  the package/ prefix, so the one assertion that uses them adjusts accordingly.

                  2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
                  (deletes the Stream Deck source tree, removes both extensions from active release automation,
                  keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
                  read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
                  were reported skipped and the suite failed. One slow fixture took down four tests that never
                  depended on it.

                  3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
                  keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

                  Fix

                  All three, in that order. The first alone probably clears the red; the second is what stops the
                  next slow fixture from failing unrelated tests; the third makes the budget explicit.

                  Related

                  Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
                  which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
                  against real I/O sitting inside the unit suite on a default timeout
                  . Worth deciding whether the
                  pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
                  this fix. Get main green first.

                  Activity

                  Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    area/coreCore libraries and shared logic

                    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

                      main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

                      Description

                      @pseudoseed

                      Summary

                      main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
                      whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
                      341 files, 6779 tests. The other five CI jobs are green.

                      FAIL src/__tests__/extension-retirement.test.ts
                      Error: Hook timed out in 10000ms.
                      ❯ src/__tests__/extension-retirement.test.ts:12:1
                      

                      Cause — verified from the diff, not inferred

                      PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
                      dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

                      The root package.json is:

                      { "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

                      files: ["*"] means the root pack sweeps everything except two directories. The test packs
                      the workspace root:

                      execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

                      So the build step made the root tarball substantially larger, and a hook that was already close
                      to its 10s ceiling went over it. The build step is correct and should stay — without it the
                      publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
                      its own comment. The test is what needs to change.

                      Three defects here, not one

                      1. The pack is far more work than the assertion needs. The test writes a real tarball and
                      then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
                      file list with no tarball written and no tar process. #214's own publish-scrub guard already
                      uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
                      the package/ prefix, so the one assertion that uses them adjusts accordingly.

                      2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
                      (deletes the Stream Deck source tree, removes both extensions from active release automation,
                      keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
                      read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
                      were reported skipped and the suite failed. One slow fixture took down four tests that never
                      depended on it.

                      3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
                      keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

                      Fix

                      All three, in that order. The first alone probably clears the red; the second is what stops the
                      next slow fixture from failing unrelated tests; the third makes the budget explicit.

                      Related

                      Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
                      which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
                      against real I/O sitting inside the unit suite on a default timeout
                      . Worth deciding whether the
                      pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
                      this fix. Get main green first.

                      Activity

                      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        area/coreCore libraries and shared logic

                        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

                          main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

                          Description

                          @pseudoseed

                          Summary

                          main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
                          whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
                          341 files, 6779 tests. The other five CI jobs are green.

                          FAIL src/__tests__/extension-retirement.test.ts
                          Error: Hook timed out in 10000ms.
                          ❯ src/__tests__/extension-retirement.test.ts:12:1
                          

                          Cause — verified from the diff, not inferred

                          PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
                          dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

                          The root package.json is:

                          { "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

                          files: ["*"] means the root pack sweeps everything except two directories. The test packs
                          the workspace root:

                          execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

                          So the build step made the root tarball substantially larger, and a hook that was already close
                          to its 10s ceiling went over it. The build step is correct and should stay — without it the
                          publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
                          its own comment. The test is what needs to change.

                          Three defects here, not one

                          1. The pack is far more work than the assertion needs. The test writes a real tarball and
                          then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
                          file list with no tarball written and no tar process. #214's own publish-scrub guard already
                          uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
                          the package/ prefix, so the one assertion that uses them adjusts accordingly.

                          2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
                          (deletes the Stream Deck source tree, removes both extensions from active release automation,
                          keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
                          read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
                          were reported skipped and the suite failed. One slow fixture took down four tests that never
                          depended on it.

                          3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
                          keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

                          Fix

                          All three, in that order. The first alone probably clears the red; the second is what stops the
                          next slow fixture from failing unrelated tests; the third makes the budget explicit.

                          Related

                          Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
                          which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
                          against real I/O sitting inside the unit suite on a default timeout
                          . Worth deciding whether the
                          pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
                          this fix. Get main green first.

                          Activity

                          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            area/coreCore libraries and shared logic

                            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

                              main is red: extension-retirement pack hook exceeds its 10s timeout after #215's build step #216

                              Description

                              @pseudoseed

                              Summary

                              main is red at 4ebaf36b6. One suite fails: packages/codev/src/__tests__/extension-retirement.test.ts,
                              whose beforeAll hook timed out at 10000ms after taking 10544ms. Everything else passed —
                              341 files, 6779 tests. The other five CI jobs are green.

                              FAIL src/__tests__/extension-retirement.test.ts
                              Error: Hook timed out in 10000ms.
                              ❯ src/__tests__/extension-retirement.test.ts:12:1
                              

                              Cause — verified from the diff, not inferred

                              PR #215 added a Build codev package step to the unit job (.github/workflows/test.yml), so
                              dist/, dashboard-dist/ and v2-dist/ now exist when the unit suite runs. They did not before.

                              The root package.json is:

                              { "name": "cluesmith-codev", "private": true, "files": ["*", "!apps/streamdeck", "!apps/vscode"] }

                              files: ["*"] means the root pack sweeps everything except two directories. The test packs
                              the workspace root:

                              execFileSync('npm',['pack','--pack-destination',packDirectory],{cwd: workspaceRoot})

                              So the build step made the root tarball substantially larger, and a hook that was already close
                              to its 10s ceiling went over it. The build step is correct and should stay — without it the
                              publish-scrub guard silently narrows to committed files and passes vacuously, which is stated in
                              its own comment. The test is what needs to change.

                              Three defects here, not one

                              1. The pack is far more work than the assertion needs. The test writes a real tarball and
                              then shells out to tar -tzf purely to read a file list. npm pack --dry-run --json returns the
                              file list with no tarball written and no tar process. #214's own publish-scrub guard already
                              uses exactly that idiom. Note the path shape differs: --dry-run --json yields paths without
                              the package/ prefix, so the one assertion that uses them adjusts accordingly.

                              2. The expensive fixture is in beforeAll, but only one of five tests uses it. Four tests
                              (deletes the Stream Deck source tree, removes both extensions from active release automation,
                              keeps supported apps in the pnpm workspace, marks the retained VS Code source unsupported)
                              read files and pnpm list. They need nothing from the pack. When the hook timed out, all five
                              were reported skipped and the suite failed. One slow fixture took down four tests that never
                              depended on it.

                              3. There is no explicit timeout. It runs on the 10s default. A pack of a built monorepo will
                              keep growing; whatever number is chosen should be a deliberate one with a reason next to it.

                              Fix

                              All three, in that order. The first alone probably clears the red; the second is what stops the
                              next slow fixture from failing unrelated tests; the third makes the budget explicit.

                              Related

                              Same class as #208, which raised a timeout on a different pack test earlier today, and #200,
                              which recorded that pack tests do not belong in the unit suite. Three instances now of a pack
                              against real I/O sitting inside the unit suite on a default timeout
                              . Worth deciding whether the
                              pattern gets a shared helper or an e2e split rather than a third individual patch — but not in
                              this fix. Get main green first.

                              Activity

                              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                area/coreCore libraries and shared logic

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions