Skip to content

Enhance CrewCode Hub with updates, security details, and QOL improvements #29

Enhance CrewCode Hub with updates, security details, and QOL improvements

Enhance CrewCode Hub with updates, security details, and QOL improvements #29

Triggered via pull request August 28, 2026 20:54
@CjLogicCjLogic
opened #3
main
Status Failure
Total duration 3m 54s
Artifacts –

ci.yml

on: pull_request
Matrix: verify
Fit to window
Zoom out
Zoom in

Annotations

24 errors and 3 warnings
verify (macos-latest)
Process completed with exit code 1.
src/renderer/src/components/workspaces/mobile-workspace-drawer.test.ts > mobile workspace drawer > renders mobile sidebars as horizontal off-canvas overlays, never bottom sheets: src/renderer/src/components/workspaces/mobile-workspace-drawer.test.ts#L24
AssertionError: expected '' to contain '.ws-drawer.side.left {' - Expected + Received - .ws-drawer.side.left { ❯ src/renderer/src/components/workspaces/mobile-workspace-drawer.test.ts:24:32
src/renderer/src/components/chat/mobile-chat-layout.test.ts > mobile solo chat layout > keeps embedded terminal and Git side panes out of the solo-chat column: src/renderer/src/components/chat/mobile-chat-layout.test.ts#L38
AssertionError: expected '/* CrewCode desktop kit — extends col…' to contain '.chat-pane-row > .gs { display: none …' - Expected + Received - .chat-pane-row > .gs { display: none !important; } + /* CrewCode desktop kit — extends colors_and_type.css */ + * { box-sizing: border-box; } + html, body, #root { margin: 0; padding: 0; height: 100%; overflow: hidden; } + body { background: #000; font-family: var(--font-family-sans); color: var(--foreground); -webkit-font-smoothing: antialiased; overscroll-behavior: none; } + .provider-logo { transition: filter 140ms ease, opacity 140ms ease; } + /* Monochrome provider SVGs are black when loaded as <img>; invert only in dark mode. */ + body:not(.light) .provider-logo-monochrome { filter: invert(0.92) sepia(0.08) saturate(0.6); } + body.light .provider-logo-monochrome { filter: none; } + + /* App-wide replacement for native `title` bubbles. */ + .cc-tooltip { + position: fixed; + z-index: 12000; + max-width: min(320px, calc(100vw - 24px)); + padding: 7px 10px; + transform: translate(-50%, -100%); + pointer-events: none; + color: var(--foreground); + background: color-mix(in srgb, var(--popover) 94%, #000); + border: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + border-radius: 6px; + box-shadow: 0 5px 16px rgba(0, 0, 0, .38); + font-family: var(--font-family-sans); + font-size: 11.5px; + font-weight: 500; + line-height: 1.35; + text-align: center; + white-space: normal; + transform-origin: 52% calc(100% + 4px); + rotate: var(--cc-tooltip-tilt, -2.5deg); + animation: ccTooltipIn 120ms cubic-bezier(.2, .8, .2, 1) both; + } + .cc-tooltip-below { transform-origin: 48% -4px; } + .cc-tooltip-below { transform: translate(-50%, 0); } + .cc-tooltip::after { + content: ''; + position: absolute; + left: 50%; + bottom: -4px; + width: 7px; + height: 7px; + transform: translateX(-50%) rotate(45deg); + background: inherit; + border-right: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + border-bottom: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + } + .cc-tooltip-below::after { + top: -4px; + bottom: auto; + border: 0; + border-left: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + border-top: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + } + @Keyframes ccTooltipIn { + from { opacity: 0; rotate: var(--cc-tooltip-tilt, -2.5deg); scale: .97; } + to { opacity: 1; rotate: var(--cc-tooltip-tilt, -2.5deg); scale: 1; } + } + + /* ----- Window shell ----- */ + .loading-screen { + position: fixed; + inset: 0; + z-index: 10000; + display: grid; + place-items: center; + overflow: hidden; + background: + radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--primary, #285a48) 22%, transparent) 0 15%, transparent 42%), + linear-gradient(180deg, #111711 0%, #0f120f 52%, #080a08 100%); + color: var(--foreground); + transition: opacity 420ms ease, transform 420ms ease; + } + body.light .loading-screen { + background: + radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--primary, #285a48) 16%, transparent) 0 14%, transparent 42%), + linear-gradient(180deg, #fbfbf7 0%, #f3f4ef 55%, #e9ece5 100%); + } + .loading-screen.is-exiting { + opacity: 0; + transform: scale(1.015); + pointer-events: none; + } + .loading-screen::before, + .loading-screen::after { + content: ""; + position: absolute; + inset: 26px; + border: 1px solid color-mix(in srgb, var(--border) 72%, transparent); + border-radius: 18px; + pointer-events: none; + } + .loading-screen::after { + inset: auto 50% 18%; + width: 1px; + height: 28%; + border: 0; + border-left: 1px solid color-mix(in srgb, var(--border) 86%, transparent); + transform: translateX(-50%); + opacity: 0.75; + } + .loading-screen-mark { + position: relative; + z-index: 1; + display: grid; + justify-items: center; + gap: 24px; + animation: loadingMarkIn 760ms cubic-bezier(.2
src/renderer/src/components/canvas/CanvasMode.test.ts > CanvasMode chat pane bar > disables the mode prompt toggle after session context is delivered: src/renderer/src/hooks/useMobileLayout.ts#L27
ReferenceError: window is not defined ❯ src/renderer/src/hooks/useMobileLayout.ts:27:5 ❯ commitHookEffectListMount node_modules/react-test-renderer/cjs/react-test-renderer.development.js:13038:26 ❯ commitPassiveMountOnFiber node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14461:11 ❯ commitPassiveMountEffects_complete node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14421:9 ❯ commitPassiveMountEffects_begin node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14408:7 ❯ commitPassiveMountEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14396:3 ❯ flushPassiveEffectsImpl node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16287:3 ❯ flushPassiveEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16236:14 ❯ node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16051:9 ❯ flushActQueue node_modules/react/cjs/react.development.js:2667:24
src/renderer/src/components/canvas/CanvasMode.test.ts > CanvasMode chat pane bar > toggles the per-chat mode prompt while the session is fresh: src/renderer/src/hooks/useMobileLayout.ts#L27
ReferenceError: window is not defined ❯ src/renderer/src/hooks/useMobileLayout.ts:27:5 ❯ commitHookEffectListMount node_modules/react-test-renderer/cjs/react-test-renderer.development.js:13038:26 ❯ commitPassiveMountOnFiber node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14461:11 ❯ commitPassiveMountEffects_complete node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14421:9 ❯ commitPassiveMountEffects_begin node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14408:7 ❯ commitPassiveMountEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14396:3 ❯ flushPassiveEffectsImpl node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16287:3 ❯ flushPassiveEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16236:14 ❯ node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16051:9 ❯ flushActQueue node_modules/react/cjs/react.development.js:2667:24
src/main/pty-service.yuheard.test.ts > PtyService YuHeard bundle boundary > uses injected server access and statically imported wrappers for a Fish shell: src/main/pty-service.yuheard.test.ts#L80
AssertionError: expected "vi.fn()" to be called with arguments: [ '/usr/bin/fish', …(2) ] Received: 1st vi.fn() call: [ - "/usr/bin/fish", + "/bin/bash", [ "-C", "yuheard-init", ], - ObjectContaining { - "env": ObjectContaining { - "PATH": StringMatching /^\/tmp\/crewcode-yuheard-wrap\/pane-1:/, + { + "cols": 80, + "cwd": "/tmp", + "env": { + "ACTIONS_ORCHESTRATION_ID": "0f925d94-57f6-44a0-b16d-30d185d195e1.verify.macos-latest", + "ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE": "/Users/runner/actionarchivecache", + "AGENT_TOOLSDIRECTORY": "/Users/runner/hostedtoolcache", + "ANDROID_HOME": "/Users/runner/Library/Android/sdk", + "ANDROID_NDK": "/Users/runner/Library/Android/sdk/ndk/27.3.13750724", + "ANDROID_NDK_HOME": "/Users/runner/Library/Android/sdk/ndk/27.3.13750724", + "ANDROID_NDK_LATEST_HOME": "/Users/runner/Library/Android/sdk/ndk/29.0.14206865", + "ANDROID_NDK_ROOT": "/Users/runner/Library/Android/sdk/ndk/27.3.13750724", + "ANDROID_SDK_ROOT": "/Users/runner/Library/Android/sdk", + "BASE_URL": "/", + "BOOTSTRAP_HASKELL_INSTALL_NO_STACK_HOOK": "1", + "BOOTSTRAP_HASKELL_NONINTERACTIVE": "1", + "CHROMEWEBDRIVER": "/usr/local/share/chromedriver-mac-arm64", + "CI": "true", + "COLOR": "0", + "COLORTERM": "truecolor", + "DEV": "1", + "DOTNET_MULTILEVEL_LOOKUP": "0", + "DOTNET_NOLOGO": "1", + "DOTNET_SKIP_FIRST_TIME_EXPERIENCE": "1", + "EDGEWEBDRIVER": "/usr/local/share/edge_driver", + "EDITOR": "vi", + "ENABLE_RUNNER_TRACING": "true", + "FORCE_COLOR": "1", + "FORCE_TTY": "", + "GECKOWEBDRIVER": "/opt/homebrew/opt/geckodriver/bin", + "GITHUB_ACTION": "__run_4", + "GITHUB_ACTIONS": "true", + "GITHUB_ACTION_REF": "", + "GITHUB_ACTION_REPOSITORY": "", + "GITHUB_ACTOR": "CjLogic", + "GITHUB_ACTOR_ID": "78663554", + "GITHUB_API_URL": "https://api.github.com", + "GITHUB_ARTIFACTS": "/Users/runner/work/_temp/_runner_file_commands/artifacts_40d20794-5215-45bb-9029-a3c19b9b3cc5", + "GITHUB_ARTIFACTS_LIST": "/Users/runner/work/_temp/_runner_file_commands/artifacts_list_40d20794-5215-45bb-9029-a3c19b9b3cc5", + "GITHUB_BASE_REF": "dev", + "GITHUB_ENV": "/Users/runner/work/_temp/_runner_file_commands/set_env_40d20794-5215-45bb-9029-a3c19b9b3cc5", + "GITHUB_EVENT_NAME": "pull_request", + "GITHUB_EVENT_PATH": "/Users/runner/work/_temp/_github_workflow/event.json", + "GITHUB_GRAPHQL_URL": "https://api.github.com/graphql", + "GITHUB_HEAD_REF": "main", + "GITHUB_JOB": "verify", + "GITHUB_OUTPUT": "/Users/runner/work/_temp/_runner_file_commands/set_output_40d20794-5215-45bb-9029-a3c19b9b3cc5", + "GITHUB_PATH": "/Users/runner/work/_temp/_runner_file_commands/add_path_40d20794-5215-45bb-9029-a3c19b9b3cc5", + "GITHUB_REF": "refs/pull/3/merge", + "GITHUB_REF_NAME": "3/merge", + "GITHUB_REF_PROTECTED": "false", + "GITHUB_REF_TYPE": "branch", + "GITHUB_REPOSITORY": "OnPoint-Dev-Tools/crewcode", + "GITHUB_REPOSITORY_ID": "1326077029", + "GITHUB_REPOSITORY_OWNER": "OnPoint-Dev-Tools", + "GITHUB_REPOSITORY_OWNER_ID": "278743206", + "GITHUB_RETENTION_DAYS": "90", + "GITHUB_RUN_ATTEMPT": "1", + "GITHUB_RUN_ID": "33210265124", + "GITHUB_RUN_NUMBER": "29", + "GITHUB_SERVER_URL": "https://github.com", + "GITHUB_SHA": "06efbabf04fc4a92bd01bd2eae7d21730f71ec34", + "GITHUB_STATE": "/Users/runner/work/_temp/_runner_file_commands/save_state_40d20794-5215-45bb-9029-a3c19b9b3cc5", + "GITHUB_STEP_SUMMARY": "/Users/runner/work/_temp/_runner_file_commands/step_summary_40d20794-5215-45bb-9029-a3c19b9b3cc5", + "GITHUB_TRIGGERING_ACTOR": "CjLogic", + "GITHUB_WORKFLOW": "CI", + "GITHUB_WORKFLOW_REF": "OnPoint-Dev-Tools/crewcode/.github/workflows/ci.yml@refs/pull/3/merge", + "GITHUB_WORKFLOW_SHA": "06efbabf04fc4a92bd01bd2eae7d21730f71ec34", +
src/main/hub-relay.test.ts > authenticated encrypted Hub relay > applies Brain authorization reductions immediately and stops affected resources: src/main/hub-relay.test.ts#L564
AssertionError: expected { type: 'rpcResult', …(1) } to match object { type: 'rpcResult', …(1) } (5 matching properties omitted from actual) - Expected + Received @@ -1,11 +1,11 @@ { "response": { "ok": true, "result": { "roots": [ - "/var/folders/df/djsxfhc17x95674wsm_g8s980000gn/T/crewcode-hub-relay-UFuuVq", + "/private/var/folders/df/djsxfhc17x95674wsm_g8s980000gn/T/crewcode-hub-relay-UFuuVq", ], "scopes": [ "terminal", "workspace:write", ], ❯ src/main/hub-relay.test.ts:564:118
src/main/brain-authorization-policy.test.ts > Brain authorization policy > persists canonical roots, scopes, and local audit across restart: src/main/brain-authorization-policy.test.ts#L14
AssertionError: expected { version: 1, …(4) } to match object { scopes: [ 'agent', …(1) ], …(2) } (2 matching properties omitted from actual) - Expected + Received @@ -4,11 +4,11 @@ "at": 200, "userId": "owner", }, ], "roots": [ - "/var/folders/df/djsxfhc17x95674wsm_g8s980000gn/T/brain-policy-wp9BRE/workspace", + "/private/var/folders/df/djsxfhc17x95674wsm_g8s980000gn/T/brain-policy-wp9BRE/workspace", ], "scopes": [ "agent", "workspace:read", ], ❯ src/main/brain-authorization-policy.test.ts:14:21
verify (ubuntu-latest)
Process completed with exit code 1.
src/renderer/src/components/workspaces/mobile-workspace-drawer.test.ts > mobile workspace drawer > renders mobile sidebars as horizontal off-canvas overlays, never bottom sheets: src/renderer/src/components/workspaces/mobile-workspace-drawer.test.ts#L24
AssertionError: expected '' to contain '.ws-drawer.side.left {' - Expected + Received - .ws-drawer.side.left { ❯ src/renderer/src/components/workspaces/mobile-workspace-drawer.test.ts:24:32
src/renderer/src/components/chat/mobile-chat-layout.test.ts > mobile solo chat layout > keeps embedded terminal and Git side panes out of the solo-chat column: src/renderer/src/components/chat/mobile-chat-layout.test.ts#L38
AssertionError: expected '/* CrewCode desktop kit — extends col…' to contain '.chat-pane-row > .gs { display: none …' - Expected + Received - .chat-pane-row > .gs { display: none !important; } + /* CrewCode desktop kit — extends colors_and_type.css */ + * { box-sizing: border-box; } + html, body, #root { margin: 0; padding: 0; height: 100%; overflow: hidden; } + body { background: #000; font-family: var(--font-family-sans); color: var(--foreground); -webkit-font-smoothing: antialiased; overscroll-behavior: none; } + .provider-logo { transition: filter 140ms ease, opacity 140ms ease; } + /* Monochrome provider SVGs are black when loaded as <img>; invert only in dark mode. */ + body:not(.light) .provider-logo-monochrome { filter: invert(0.92) sepia(0.08) saturate(0.6); } + body.light .provider-logo-monochrome { filter: none; } + + /* App-wide replacement for native `title` bubbles. */ + .cc-tooltip { + position: fixed; + z-index: 12000; + max-width: min(320px, calc(100vw - 24px)); + padding: 7px 10px; + transform: translate(-50%, -100%); + pointer-events: none; + color: var(--foreground); + background: color-mix(in srgb, var(--popover) 94%, #000); + border: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + border-radius: 6px; + box-shadow: 0 5px 16px rgba(0, 0, 0, .38); + font-family: var(--font-family-sans); + font-size: 11.5px; + font-weight: 500; + line-height: 1.35; + text-align: center; + white-space: normal; + transform-origin: 52% calc(100% + 4px); + rotate: var(--cc-tooltip-tilt, -2.5deg); + animation: ccTooltipIn 120ms cubic-bezier(.2, .8, .2, 1) both; + } + .cc-tooltip-below { transform-origin: 48% -4px; } + .cc-tooltip-below { transform: translate(-50%, 0); } + .cc-tooltip::after { + content: ''; + position: absolute; + left: 50%; + bottom: -4px; + width: 7px; + height: 7px; + transform: translateX(-50%) rotate(45deg); + background: inherit; + border-right: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + border-bottom: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + } + .cc-tooltip-below::after { + top: -4px; + bottom: auto; + border: 0; + border-left: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + border-top: 1px solid color-mix(in srgb, var(--border) 72%, var(--muted-foreground)); + } + @Keyframes ccTooltipIn { + from { opacity: 0; rotate: var(--cc-tooltip-tilt, -2.5deg); scale: .97; } + to { opacity: 1; rotate: var(--cc-tooltip-tilt, -2.5deg); scale: 1; } + } + + /* ----- Window shell ----- */ + .loading-screen { + position: fixed; + inset: 0; + z-index: 10000; + display: grid; + place-items: center; + overflow: hidden; + background: + radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--primary, #285a48) 22%, transparent) 0 15%, transparent 42%), + linear-gradient(180deg, #111711 0%, #0f120f 52%, #080a08 100%); + color: var(--foreground); + transition: opacity 420ms ease, transform 420ms ease; + } + body.light .loading-screen { + background: + radial-gradient(circle at 50% 42%, color-mix(in srgb, var(--primary, #285a48) 16%, transparent) 0 14%, transparent 42%), + linear-gradient(180deg, #fbfbf7 0%, #f3f4ef 55%, #e9ece5 100%); + } + .loading-screen.is-exiting { + opacity: 0; + transform: scale(1.015); + pointer-events: none; + } + .loading-screen::before, + .loading-screen::after { + content: ""; + position: absolute; + inset: 26px; + border: 1px solid color-mix(in srgb, var(--border) 72%, transparent); + border-radius: 18px; + pointer-events: none; + } + .loading-screen::after { + inset: auto 50% 18%; + width: 1px; + height: 28%; + border: 0; + border-left: 1px solid color-mix(in srgb, var(--border) 86%, transparent); + transform: translateX(-50%); + opacity: 0.75; + } + .loading-screen-mark { + position: relative; + z-index: 1; + display: grid; + justify-items: center; + gap: 24px; + animation: loadingMarkIn 760ms cubic-bezier(.2
src/renderer/src/components/canvas/CanvasMode.test.ts > CanvasMode chat pane bar > disables the mode prompt toggle after session context is delivered: src/renderer/src/hooks/useMobileLayout.ts#L27
ReferenceError: window is not defined ❯ src/renderer/src/hooks/useMobileLayout.ts:27:5 ❯ commitHookEffectListMount node_modules/react-test-renderer/cjs/react-test-renderer.development.js:13038:26 ❯ commitPassiveMountOnFiber node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14461:11 ❯ commitPassiveMountEffects_complete node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14421:9 ❯ commitPassiveMountEffects_begin node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14408:7 ❯ commitPassiveMountEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14396:3 ❯ flushPassiveEffectsImpl node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16287:3 ❯ flushPassiveEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16236:14 ❯ node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16051:9 ❯ flushActQueue node_modules/react/cjs/react.development.js:2667:24
src/renderer/src/components/canvas/CanvasMode.test.ts > CanvasMode chat pane bar > toggles the per-chat mode prompt while the session is fresh: src/renderer/src/hooks/useMobileLayout.ts#L27
ReferenceError: window is not defined ❯ src/renderer/src/hooks/useMobileLayout.ts:27:5 ❯ commitHookEffectListMount node_modules/react-test-renderer/cjs/react-test-renderer.development.js:13038:26 ❯ commitPassiveMountOnFiber node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14461:11 ❯ commitPassiveMountEffects_complete node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14421:9 ❯ commitPassiveMountEffects_begin node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14408:7 ❯ commitPassiveMountEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14396:3 ❯ flushPassiveEffectsImpl node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16287:3 ❯ flushPassiveEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16236:14 ❯ node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16051:9 ❯ flushActQueue node_modules/react/cjs/react.development.js:2667:24
src/main/pty-service.yuheard.test.ts > PtyService YuHeard bundle boundary > uses injected server access and statically imported wrappers for a Fish shell: src/main/pty-service.yuheard.test.ts#L80
AssertionError: expected "vi.fn()" to be called with arguments: [ '/usr/bin/fish', …(2) ] Received: 1st vi.fn() call: [ - "/usr/bin/fish", + "/bin/bash", [ "-C", "yuheard-init", ], - ObjectContaining { - "env": ObjectContaining { - "PATH": StringMatching /^\/tmp\/crewcode-yuheard-wrap\/pane-1:/, + { + "cols": 80, + "cwd": "/tmp", + "env": { + "ACCEPT_EULA": "Y", + "ACTIONS_ORCHESTRATION_ID": "0f925d94-57f6-44a0-b16d-30d185d195e1.verify.ubuntu-latest", + "ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE": "/opt/actionarchivecache", + "ACTIONS_RUNNER_RETURN_JOB_RESULT_FOR_HOSTED": "1", + "AGENT_TOOLSDIRECTORY": "/opt/hostedtoolcache", + "ANDROID_HOME": "/usr/local/lib/android/sdk", + "ANDROID_NDK": "/usr/local/lib/android/sdk/ndk/27.3.13750724", + "ANDROID_NDK_HOME": "/usr/local/lib/android/sdk/ndk/27.3.13750724", + "ANDROID_NDK_LATEST_HOME": "/usr/local/lib/android/sdk/ndk/29.0.14206865", + "ANDROID_NDK_ROOT": "/usr/local/lib/android/sdk/ndk/27.3.13750724", + "ANDROID_SDK_ROOT": "/usr/local/lib/android/sdk", + "ANT_HOME": "/usr/share/ant", + "AZURE_EXTENSION_DIR": "/opt/az/azcliextensions", + "BASE_URL": "/", + "BOOTSTRAP_HASKELL_NONINTERACTIVE": "1", + "CHROMEWEBDRIVER": "/usr/local/share/chromedriver-linux64", + "CHROME_BIN": "/usr/bin/google-chrome", + "CI": "true", + "COLOR": "0", + "COLORTERM": "truecolor", + "CONDA": "/usr/share/miniconda", + "DEBIAN_FRONTEND": "noninteractive", + "DEV": "1", + "DOTNET_MULTILEVEL_LOOKUP": "0", + "DOTNET_NOLOGO": "1", + "DOTNET_SKIP_FIRST_TIME_EXPERIENCE": "1", + "EDGEWEBDRIVER": "/usr/local/share/edge_driver", + "EDITOR": "vi", + "ENABLE_RUNNER_TRACING": "true", + "FORCE_COLOR": "1", + "FORCE_TTY": "", + "GECKOWEBDRIVER": "/usr/local/share/gecko_driver", + "GHCUP_INSTALL_BASE_PREFIX": "/usr/local", + "GITHUB_ACTION": "__run_4", + "GITHUB_ACTIONS": "true", + "GITHUB_ACTION_REF": "", + "GITHUB_ACTION_REPOSITORY": "", + "GITHUB_ACTOR": "CjLogic", + "GITHUB_ACTOR_ID": "78663554", + "GITHUB_API_URL": "https://api.github.com", + "GITHUB_ARTIFACTS": "/home/runner/work/_temp/_runner_file_commands/artifacts_230698ef-cfb0-4f30-94b1-1e36e6409844", + "GITHUB_ARTIFACTS_LIST": "/home/runner/work/_temp/_runner_file_commands/artifacts_list_230698ef-cfb0-4f30-94b1-1e36e6409844", + "GITHUB_BASE_REF": "dev", + "GITHUB_ENV": "/home/runner/work/_temp/_runner_file_commands/set_env_230698ef-cfb0-4f30-94b1-1e36e6409844", + "GITHUB_EVENT_NAME": "pull_request", + "GITHUB_EVENT_PATH": "/home/runner/work/_temp/_github_workflow/event.json", + "GITHUB_GRAPHQL_URL": "https://api.github.com/graphql", + "GITHUB_HEAD_REF": "main", + "GITHUB_JOB": "verify", + "GITHUB_OUTPUT": "/home/runner/work/_temp/_runner_file_commands/set_output_230698ef-cfb0-4f30-94b1-1e36e6409844", + "GITHUB_PATH": "/home/runner/work/_temp/_runner_file_commands/add_path_230698ef-cfb0-4f30-94b1-1e36e6409844", + "GITHUB_REF": "refs/pull/3/merge", + "GITHUB_REF_NAME": "3/merge", + "GITHUB_REF_PROTECTED": "false", + "GITHUB_REF_TYPE": "branch", + "GITHUB_REPOSITORY": "OnPoint-Dev-Tools/crewcode", + "GITHUB_REPOSITORY_ID": "1326077029", + "GITHUB_REPOSITORY_OWNER": "OnPoint-Dev-Tools", + "GITHUB_REPOSITORY_OWNER_ID": "278743206", + "GITHUB_RETENTION_DAYS": "90", + "GITHUB_RUN_ATTEMPT": "1", + "GITHUB_RUN_ID": "33210265124", + "GITHUB_RUN_NUMBER": "29", + "GITHUB_SERVER_URL": "https://github.com", + "GITHUB_SHA": "06efbabf04fc4a92bd01bd2eae7d21730f71ec34", + "GITHUB_STATE": "/home/runner/work/_temp/_runner_file_commands/save_state_230698ef-cfb0-4f30-94b1-1e36e6409844", + "GITHUB_STEP_SUMMARY": "/home/runner/work/_temp/_runner_file_commands/step_summary_230698ef-cfb0-4f30-94b1-1e36e6409844", + "GITHUB_TRIG
src/renderer/src/components/canvas/CanvasMode.test.ts > CanvasMode chat pane bar > disables the mode prompt toggle after session context is delivered: src/renderer/src/hooks/useMobileLayout.ts#L27
ReferenceError: window is not defined ❯ src/renderer/src/hooks/useMobileLayout.ts:27:5 ❯ commitHookEffectListMount node_modules/react-test-renderer/cjs/react-test-renderer.development.js:13038:26 ❯ commitPassiveMountOnFiber node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14461:11 ❯ commitPassiveMountEffects_complete node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14421:9 ❯ commitPassiveMountEffects_begin node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14408:7 ❯ commitPassiveMountEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14396:3 ❯ flushPassiveEffectsImpl node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16287:3 ❯ flushPassiveEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16236:14 ❯ node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16051:9 ❯ flushActQueue node_modules/react/cjs/react.development.js:2667:24
src/renderer/src/components/canvas/CanvasMode.test.ts > CanvasMode chat pane bar > toggles the per-chat mode prompt while the session is fresh: src/renderer/src/hooks/useMobileLayout.ts#L27
ReferenceError: window is not defined ❯ src/renderer/src/hooks/useMobileLayout.ts:27:5 ❯ commitHookEffectListMount node_modules/react-test-renderer/cjs/react-test-renderer.development.js:13038:26 ❯ commitPassiveMountOnFiber node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14461:11 ❯ commitPassiveMountEffects_complete node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14421:9 ❯ commitPassiveMountEffects_begin node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14408:7 ❯ commitPassiveMountEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:14396:3 ❯ flushPassiveEffectsImpl node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16287:3 ❯ flushPassiveEffects node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16236:14 ❯ node_modules/react-test-renderer/cjs/react-test-renderer.development.js:16051:9 ❯ flushActQueue node_modules/react/cjs/react.development.js:2667:24
src/main/yuheard-wrapper.test.ts > prependWrapperToPath > prepends the wrapper dir to an existing PATH: src/main/yuheard-wrapper.test.ts#L191
AssertionError: expected '/wrappers/pn-1;/usr/bin:/bin' to be '/wrappers/pn-1:/usr/bin:/bin' // Object.is equality Expected: "/wrappers/pn-1:/usr/bin:/bin" Received: "/wrappers/pn-1;/usr/bin:/bin" ❯ src/main/yuheard-wrapper.test.ts:191:69
src/main/yuheard-wrapper.test.ts > installYuHeardWrapper > creates one shim per agent id and marks them executable: src/main/yuheard-wrapper.test.ts#L40
AssertionError: expected false to be true // Object.is equality - Expected + Received - true + false ❯ src/main/yuheard-wrapper.test.ts:40:37
src/main/pty-service.yuheard.test.ts > PtyService YuHeard bundle boundary > uses injected server access and statically imported wrappers for a Fish shell: src/main/pty-service.yuheard.test.ts#L69
AssertionError: expected "vi.fn()" to be called with arguments: [ 'pane-1', '/tmp' ] Received: 1st vi.fn() call: [ "pane-1", - "/tmp", + "C:\\Users\\runneradmin", ] Number of calls: 1 ❯ src/main/pty-service.yuheard.test.ts:69:29
src/main/hub-relay.test.ts > authenticated encrypted Hub relay > applies Brain authorization reductions immediately and stops affected resources: src/main/hub-relay.test.ts#L30
Error: EBUSY: resource busy or locked, rmdir 'C:\Users\RUNNER~1\AppData\Local\Temp\crewcode-hub-relay-7xsoBb' ❯ src/main/hub-relay.test.ts:30:23 ❯ src/main/hub-relay.test.ts:26:68 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { errno: -4082, code: 'EBUSY', syscall: 'rmdir', path: 'C:\Users\RUNNER~1\AppData\Local\Temp\crewcode-hub-relay-7xsoBb' }
src/main/hub-machine-enrollment.test.ts > Hub machine client security > parses enrollment and brain options without requiring secrets in argv: src/main/hub-machine-enrollment.test.ts#L66
AssertionError: expected { …(6) } to match object { …(2) } (4 matching properties omitted from actual) - Expected + Received @@ -2,8 +2,8 @@ "allowedScopes": [ "workspace:read", "agent", ], "allowedWorkspaceRoots": [ - "/tmp", + "D:\\tmp", ], } ❯ src/main/hub-machine-enrollment.test.ts:66:136
src/main/hub-local-brain.test.ts > local Brain supervisor > spawns the sibling Brain after owner setup and stops it: src/main/hub-local-brain.test.ts#L196
AssertionError: expected '\opt\crewcode\out\main\brain.js' to be '/opt/crewcode/out/main/brain.js' // Object.is equality Expected: "/opt/crewcode/out/main/brain.js" Received: "\opt\crewcode\out\main\brain.js" ❯ src/main/hub-local-brain.test.ts:196:29
src/main/hub-local-brain.test.ts > local Brain spawn plan > spawns sibling brain.js from a compiled Hub entry: src/main/hub-local-brain.test.ts#L58
AssertionError: expected { execPath: '/usr/bin/node', …(1) } to deeply equal { execPath: '/usr/bin/node', …(1) } - Expected + Received { "args": [ - "/opt/crewcode/out/main/brain.js", + "\\opt\\crewcode\\out\\main\\brain.js", "--data-dir", "/brain", ], "execPath": "/usr/bin/node", } ❯ src/main/hub-local-brain.test.ts:58:9
src/main/brain-authorization-policy.test.ts > Brain authorization policy > persists canonical roots, scopes, and local audit across restart: src/main/brain-authorization-policy.test.ts#L15
AssertionError: expected 438 to be 384 // Object.is equality - Expected + Received - 384 + 438 ❯ src/main/brain-authorization-policy.test.ts:15:41
verify (macos-latest)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
verify (ubuntu-latest)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
verify (windows-latest)
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-node@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/