← reports

#5701 · Server-native resolution corrupts remote Windows preview paths

Bug Medium Effort: Low plugins · inline-vis · confirmed-repro open on GitHub 2026-10-17 · base 6a639cfc0d66e0c789a1bd7309266973228d1a80

Verdict: REPRODUCED · Root-cause confidence: high

1. TL;DR

The inline preview RPC can report a missing file even when the correct host and source root are selected. Its server-side path resolver uses the server operating system's syntax for a root that belongs to a remote host. On Linux, a Windows drive or UNC root becomes a relative POSIX string, so the server's current directory is prepended and the wrong path is sent to the host. A focused test of the actual plugin RPC reproduces this for both workspace and thread-storage sources in two clean checkouts. This is an in-process reproduction with a path-keyed SDK file fixture, not a new live Windows enrollment or browser reproduction.

2. Claims vs findings

ClaimStatusEvidence
Windows-owned storage can return not-found despite an available fileVerified at RPC boundaryDirect fixture SDK read succeeds; actual preparePreview returns not-found for the same file.
Host selection is correct but path construction is wrongVerifiedThe fixture asserts unchanged hostId and rootPath. Logged actual paths contain the Linux checkout prefix followed by Windows root text.
Workspace and UNC variants share the defectVerified in fixture onlyBoth sources fail for drive and UNC roots. Two POSIX controls pass.
A live native Windows installation and core HTTP route behave as reportedUnverified in this investigationNo real enrolled machine, live server, or user runtime data was used.
Specific released versions and UI error textUnverified hereThis investigation executes the recorded main commit, not a released binary or browser.

3. Environment

4. Minimal reproduction

  1. Clone and install the trusted revision using the first five commands below.
  2. Save the complete author-written test below as plugins/inline-vis/host-path.repro.test.ts.
  3. Run the final two commands to reproduce the regression and check the existing suites.
git clone https://github.com/get-bb/bb.git bb-5701
cd bb-5701
git checkout --detach 6a639cfc0d66e0c789a1bd7309266973228d1a80
pnpm install --frozen-lockfile --prefer-offline
pnpm exec turbo run build
pnpm exec turbo run test --filter=bb-plugin-inline-vis -- host-path.repro.test.ts
pnpm exec turbo run test --filter=bb-plugin-inline-vis -- server.test.ts frame.test.ts app.test.tsx

The SDK fixture models a single existing file at each explicit absolute host path. It first reads that exact path successfully. The real registered plugin RPC must then return an HTML target for the same file. Host selection and source-root forwarding are asserted separately. The fixture never computes its expected path using the production resolver.

Expected: all six cases return HTML. Actual: four Windows cases return {"kind":"not-found","file":"reports/view.html"}; two POSIX cases pass.

Test Files  1 failed (1)
     Tests  4 failed | 2 passed (6)
AssertionError: expected { kind: 'not-found', …(1) } to match object { kind: 'html', …(5) }

No screenshot is claimed: this report verifies a nonvisual RPC/path defect, not a rendered UI state.

Complete author-written test
import { createFakePluginHost } from "@get-bb/plugin-sdk/testing";
import { describe, expect, it } from "vitest";
import { z } from "zod";
import plugin from "./server";

const roots = [
  {
    name: "POSIX",
    rootPath: "/preview-root",
    absolutePath: "/preview-root/reports/view.html",
  },
  {
    name: "Windows drive",
    rootPath: "R:\\preview-root",
    absolutePath: "R:\\preview-root\\reports\\view.html",
  },
  {
    name: "Windows UNC",
    rootPath: "\\\\preview-machine\\share\\preview-root",
    absolutePath:
      "\\\\preview-machine\\share\\preview-root\\reports\\view.html",
  },
];

describe.each(["workspace", "thread-storage"])("%s host paths", (source) => {
  it.each(roots)(
    "prepares an existing $name file",
    async ({ rootPath, absolutePath }) => {
      const content = "<!doctype html><h1>Remote preview</h1>";
      const fileResult = {
        content,
        contentEncoding: "utf8",
        sizeBytes: Buffer.byteLength(content),
        sha256: "fixture",
      };
      const hostId = "host_preview";
      const file = "reports/view.html";
      const { bb, harness } = createFakePluginHost({
        pluginId: "inline-vis",
        sdk: {
          threads: {
            get: () => ({
              id: "thr_preview",
              environment: { id: "env_preview", hostId, path: rootPath },
            }),
            storageLocation: () => ({ hostId, storageRootPath: rootPath }),
          },
          files: {
            read: async (input: unknown) => {
              const args = z
                .object({
                  path: z.string(),
                  rootPath: z.string(),
                  hostId: z.string(),
                })
                .parse(input);
              expect(args.rootPath).toBe(rootPath);
              expect(args.hostId).toBe(hostId);
              if (args.path !== absolutePath) {
                console.info(
                  JSON.stringify({
                    expectedPath: absolutePath,
                    actualPath: args.path,
                  }),
                );
                throw Object.assign(
                  new Error("No file at requested host path"),
                  { status: 404 },
                );
              }
              return fileResult;
            },
          },
        },
      });
      await plugin(bb);
      await expect(
        bb.sdk.files.read({ path: absolutePath, rootPath, hostId }),
      ).resolves.toMatchObject({ content });
      await expect(
        harness.callRpc("preparePreview", {
          threadId: "thr_preview",
          file,
          source,
        }),
      ).resolves.toMatchObject({
        kind: "html",
        content,
        file,
        source,
        target: { kind: source, path: file },
        url: expect.stringContaining("/reports/view.html"),
      });
    },
  );
});

5. Root cause

resolveContainedPreviewPath, lines 69–84 uses imported native node:path for resolution, relative containment, separators, and absolute-path checks:

export function resolveContainedPreviewPath(
  rootPath: string,
  relativeFile: string,
): string {
  const root = path.resolve(rootPath);
  const absolute = path.resolve(root, relativeFile);
  const relative = path.relative(root, absolute);
  if (
    relative === ".." ||
    relative.startsWith(`..${path.sep}`) ||
    path.isAbsolute(relative)
  ) {
    throw new Error(`"file" must not escape its source: ${relativeFile}`);
  }
  return absolute;
}

For a root like R:\preview-root, Linux resolves the path under its current working directory instead of retaining the drive root. UNC roots suffer the same conversion. The lexical containment check succeeds relative to this incorrect POSIX root.

The handler's source selection forwards the correct root and host. The read and error mapping sends the malformed absolute path to files.read and translates a 404 into not-found. This explains why choosing the right host does not avoid the failure.

The core file-route helpers explicitly distinguish Windows and POSIX syntax; their code supports the architectural diagnosis, but no live core HTTP request was made here.

6. Proposed fix and autopilot safety decision

Select path semantics from the owning absolute root, rather than from the server OS, and use that same path implementation for resolution and containment. Preserve existing host targeting, UTF-8/size checks, and source-relative input validation. Before landing, test drive and UNC roots, POSIX roots, absolute/drive-relative inputs, traversal, mixed separators, cross-drive paths, and sibling-prefix escapes.

No autopilot PR: the necessary change touches the lexical source-root containment security boundary in resolveContainedPreviewPath. The rule explicitly excludes security-boundary changes even if their textual diff is small. No production patch, branch, commit, or push to get-bb/bb was made. This is not a claim that an exploitable escape was found; it is a scope restriction on automated changes to the containment decision.

7. Related work

GitHub issue timeline and open-PR search for issue 5701 found no linked open PR at investigation time. No PR branch or code was executed. Repository label-history review included existing inline-vis issues; it does not establish that any superficially related report has the same cause.

8. Verification

The same agent repeated the reproduction in a second clean detached checkout at the identical full base SHA, with its own node_modules installation and generated build output. Only the newly authored reproduction file was copied. The exact Turbo command was run again and exited 1 with the same four Windows failures and two POSIX passes. This is a repeated clean-checkout check, not independent verification. No ports or data directories were needed, so no live instance was reused.

The first fixture draft incorrectly expected an asynchronous return from a synchronous fake. It was corrected to return a Promise before both recorded runs. The final evidence fails for the intended wrong-path/not-found result, not for fixture initialization.

The existing plugin suites pass unchanged: 3 files, 50 tests. No production fix was attempted, so a fail-before/pass-after claim is not made.

9. Appendix

Raw evidence stays outside the public repository; sanitized diagnostic output is embedded below.

repro-first.log
• turbo 2.10.12

   • Packages in scope: bb-plugin-inline-vis
   • Running test in 1 packages
   • Remote caching disabled, using shared worktree cache

//:ensure-native-modules: cache bypass, force executing dd1688e2596bf7da
@bb/templates:generate:templates: cache hit, replaying logs 7521d6f2201f79f8
@bb/templates:generate:templates: 
@bb/templates:generate:templates: > @bb/templates@0.0.1 generate:templates <investigation>/base/packages/templates
@bb/templates:generate:templates: > node ./scripts/generate-templates.mjs
@bb/templates:generate:templates: 
@bb/templates:generate:plugin-scaffold: cache hit, replaying logs 8bce7db4024339bb
@bb/templates:generate:plugin-scaffold: 
@bb/templates:generate:plugin-scaffold: > @bb/templates@0.0.1 generate:plugin-scaffold <investigation>/base/packages/templates
@bb/templates:generate:plugin-scaffold: > node ./scripts/generate-plugin-scaffold.mjs
@bb/templates:generate:plugin-scaffold: 
@bb/plugin-build:generate: cache hit, replaying logs 4b1f052337c96dc2
@bb/plugin-build:generate: 
@bb/plugin-build:generate: > @bb/plugin-build@0.0.1 generate <investigation>/base/packages/plugin-build
@bb/plugin-build:generate: > node ./scripts/generate-plugin-theme.mjs && node ./scripts/generate-runtime-export-manifest.mjs
@bb/plugin-build:generate: 
@bb/plugin-build:generate: plugin-theme.generated.ts up to date
@bb/plugin-build:generate: wrote <investigation>/base/packages/plugin-build/src/generated/runtime-export-manifest.generated.ts (react@19.2.4)
@get-bb/plugin-sdk:build: cache hit, replaying logs 77d838ad388aa42d
@get-bb/plugin-sdk:build: 
@get-bb/plugin-sdk:build: > @get-bb/plugin-sdk@0.6.54 build <investigation>/base/packages/plugin-sdk
@get-bb/plugin-sdk:build: > node scripts/build-runtime.mjs
@get-bb/plugin-sdk:build: 
@get-bb/plugin-sdk:build: Built 20 @get-bb/plugin-sdk runtime entries.
//:ensure-native-modules: 
//:ensure-native-modules: > bb@ ensure-native-modules <investigation>/base
//:ensure-native-modules: > node scripts/ensure-native-modules.mjs
//:ensure-native-modules: 
bb-plugin-inline-vis:test: cache miss, executing 1fa95d0a843a70b4
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: > bb-plugin-inline-vis@0.1.0 test <investigation>/base/plugins/inline-vis
bb-plugin-inline-vis:test: > vitest run --config vitest.config.ts "host-path.repro.test.ts"
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  RUN  v4.1.1 <investigation>/base/plugins/inline-vis
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test: {"expectedPath":"R:\\preview-root\\reports\\view.html","actualPath":"<investigation>/base/plugins/inline-vis/R:\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: {"expectedPath":"\\\\preview-machine\\share\\preview-root\\reports\\view.html","actualPath":"<investigation>/base/plugins/inline-vis/\\\\preview-machine\\share\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test: {"expectedPath":"R:\\preview-root\\reports\\view.html","actualPath":"<investigation>/base/plugins/inline-vis/R:\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: {"expectedPath":"\\\\preview-machine\\share\\preview-root\\reports\\view.html","actualPath":"<investigation>/base/plugins/inline-vis/\\\\preview-machine\\share\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ❯ |bb-plugin-inline-vis| host-path.repro.test.ts (6 tests | 4 failed) 25ms
bb-plugin-inline-vis:test:      ✓ prepares an existing 'POSIX' file 9ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows drive' file 8ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows UNC' file 2ms
bb-plugin-inline-vis:test:      ✓ prepares an existing 'POSIX' file 1ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows drive' file 2ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows UNC' file 2ms
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: AssertionError: expected { kind: 'not-found', …(1) } to match object { kind: 'html', …(5) }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: - Expected
bb-plugin-inline-vis:test: + Received
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:   {
bb-plugin-inline-vis:test: -   "content": "<!doctype html><h1>Remote preview</h1>",
bb-plugin-inline-vis:test:     "file": "reports/view.html",
bb-plugin-inline-vis:test: -   "kind": "html",
bb-plugin-inline-vis:test: -   "source": "workspace",
bb-plugin-inline-vis:test: -   "target": {
bb-plugin-inline-vis:test: -     "kind": "workspace",
bb-plugin-inline-vis:test: -     "path": "reports/view.html",
bb-plugin-inline-vis:test: -   },
bb-plugin-inline-vis:test: -   "url": StringContaining "/reports/view.html",
bb-plugin-inline-vis:test: +   "kind": "not-found",
bb-plugin-inline-vis:test:   }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ❯ host-path.repro.test.ts:86:8
bb-plugin-inline-vis:test:      84|           source,
bb-plugin-inline-vis:test:      85|         }),
bb-plugin-inline-vis:test:      86|       ).resolves.toMatchObject({
bb-plugin-inline-vis:test:        |        ^
bb-plugin-inline-vis:test:      87|         kind: "html",
bb-plugin-inline-vis:test:      88|         content,
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: AssertionError: expected { kind: 'not-found', …(1) } to match object { kind: 'html', …(5) }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: - Expected
bb-plugin-inline-vis:test: + Received
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:   {
bb-plugin-inline-vis:test: -   "content": "<!doctype html><h1>Remote preview</h1>",
bb-plugin-inline-vis:test:     "file": "reports/view.html",
bb-plugin-inline-vis:test: -   "kind": "html",
bb-plugin-inline-vis:test: -   "source": "thread-storage",
bb-plugin-inline-vis:test: -   "target": {
bb-plugin-inline-vis:test: -     "kind": "thread-storage",
bb-plugin-inline-vis:test: -     "path": "reports/view.html",
bb-plugin-inline-vis:test: -   },
bb-plugin-inline-vis:test: -   "url": StringContaining "/reports/view.html",
bb-plugin-inline-vis:test: +   "kind": "not-found",
bb-plugin-inline-vis:test:   }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ❯ host-path.repro.test.ts:86:8
bb-plugin-inline-vis:test:      84|           source,
bb-plugin-inline-vis:test:      85|         }),
bb-plugin-inline-vis:test:      86|       ).resolves.toMatchObject({
bb-plugin-inline-vis:test:        |        ^
bb-plugin-inline-vis:test:      87|         kind: "html",
bb-plugin-inline-vis:test:      88|         content,
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  Test Files  1 failed (1)
bb-plugin-inline-vis:test:       Tests  4 failed | 2 passed (6)
bb-plugin-inline-vis:test:    Start at  19:12:03
bb-plugin-inline-vis:test:    Duration  466ms (transform 228ms, setup 0ms, import 322ms, tests 25ms, environment 0ms)
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ELIFECYCLE  Test failed. See above for more details.
bb-plugin-inline-vis#test:  ERROR  command (<investigation>/base/plugins/inline-vis) /usr/local/bin/pnpm run test host-path.repro.test.ts exited (1)

 Tasks:    5 successful, 6 total
Cached:    4 cached, 6 total
  Time:    1.505s 
Failed:    bb-plugin-inline-vis#test

 ERROR  run failed: command  exited (1)
repro-second.log
• turbo 2.10.12

   • Packages in scope: bb-plugin-inline-vis
   • Running test in 1 packages
   • Remote caching disabled, using shared worktree cache

//:ensure-native-modules: cache bypass, force executing dd1688e2596bf7da
@bb/plugin-build:generate: cache hit, replaying logs 4b1f052337c96dc2
@bb/plugin-build:generate: 
@bb/plugin-build:generate: > @bb/plugin-build@0.0.1 generate <investigation>/base/packages/plugin-build
@bb/plugin-build:generate: > node ./scripts/generate-plugin-theme.mjs && node ./scripts/generate-runtime-export-manifest.mjs
@bb/plugin-build:generate: 
@bb/plugin-build:generate: plugin-theme.generated.ts up to date
@bb/plugin-build:generate: wrote <investigation>/base/packages/plugin-build/src/generated/runtime-export-manifest.generated.ts (react@19.2.4)
@bb/templates:generate:plugin-scaffold: cache hit, replaying logs 8bce7db4024339bb
@bb/templates:generate:plugin-scaffold: 
@bb/templates:generate:plugin-scaffold: > @bb/templates@0.0.1 generate:plugin-scaffold <investigation>/base/packages/templates
@bb/templates:generate:plugin-scaffold: > node ./scripts/generate-plugin-scaffold.mjs
@bb/templates:generate:plugin-scaffold: 
@bb/templates:generate:templates: cache hit, replaying logs 7521d6f2201f79f8
@bb/templates:generate:templates: 
@bb/templates:generate:templates: > @bb/templates@0.0.1 generate:templates <investigation>/base/packages/templates
@bb/templates:generate:templates: > node ./scripts/generate-templates.mjs
@bb/templates:generate:templates: 
@get-bb/plugin-sdk:build: cache hit, replaying logs 77d838ad388aa42d
@get-bb/plugin-sdk:build: 
@get-bb/plugin-sdk:build: > @get-bb/plugin-sdk@0.6.54 build <investigation>/base/packages/plugin-sdk
@get-bb/plugin-sdk:build: > node scripts/build-runtime.mjs
@get-bb/plugin-sdk:build: 
@get-bb/plugin-sdk:build: Built 20 @get-bb/plugin-sdk runtime entries.
//:ensure-native-modules: 
//:ensure-native-modules: > bb@ ensure-native-modules <investigation>/verification
//:ensure-native-modules: > node scripts/ensure-native-modules.mjs
//:ensure-native-modules: 
//:ensure-native-modules: [ensure-native-modules] Detached hardlinked better-sqlite3 binary before verification
bb-plugin-inline-vis:test: cache miss, executing 1fa95d0a843a70b4
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: > bb-plugin-inline-vis@0.1.0 test <investigation>/verification/plugins/inline-vis
bb-plugin-inline-vis:test: > vitest run --config vitest.config.ts "host-path.repro.test.ts"
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  RUN  v4.1.1 <investigation>/verification/plugins/inline-vis
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test: {"expectedPath":"R:\\preview-root\\reports\\view.html","actualPath":"<investigation>/verification/plugins/inline-vis/R:\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: {"expectedPath":"\\\\preview-machine\\share\\preview-root\\reports\\view.html","actualPath":"<investigation>/verification/plugins/inline-vis/\\\\preview-machine\\share\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test: {"expectedPath":"R:\\preview-root\\reports\\view.html","actualPath":"<investigation>/verification/plugins/inline-vis/R:\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: stdout | host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: {"expectedPath":"\\\\preview-machine\\share\\preview-root\\reports\\view.html","actualPath":"<investigation>/verification/plugins/inline-vis/\\\\preview-machine\\share\\preview-root/reports/view.html"}
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ❯ |bb-plugin-inline-vis| host-path.repro.test.ts (6 tests | 4 failed) 25ms
bb-plugin-inline-vis:test:      ✓ prepares an existing 'POSIX' file 9ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows drive' file 8ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows UNC' file 2ms
bb-plugin-inline-vis:test:      ✓ prepares an existing 'POSIX' file 1ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows drive' file 3ms
bb-plugin-inline-vis:test:      × prepares an existing 'Windows UNC' file 2ms
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: ⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > workspace host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: AssertionError: expected { kind: 'not-found', …(1) } to match object { kind: 'html', …(5) }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: - Expected
bb-plugin-inline-vis:test: + Received
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:   {
bb-plugin-inline-vis:test: -   "content": "<!doctype html><h1>Remote preview</h1>",
bb-plugin-inline-vis:test:     "file": "reports/view.html",
bb-plugin-inline-vis:test: -   "kind": "html",
bb-plugin-inline-vis:test: -   "source": "workspace",
bb-plugin-inline-vis:test: -   "target": {
bb-plugin-inline-vis:test: -     "kind": "workspace",
bb-plugin-inline-vis:test: -     "path": "reports/view.html",
bb-plugin-inline-vis:test: -   },
bb-plugin-inline-vis:test: -   "url": StringContaining "/reports/view.html",
bb-plugin-inline-vis:test: +   "kind": "not-found",
bb-plugin-inline-vis:test:   }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ❯ host-path.repro.test.ts:86:8
bb-plugin-inline-vis:test:      84|           source,
bb-plugin-inline-vis:test:      85|         }),
bb-plugin-inline-vis:test:      86|       ).resolves.toMatchObject({
bb-plugin-inline-vis:test:        |        ^
bb-plugin-inline-vis:test:      87|         kind: "html",
bb-plugin-inline-vis:test:      88|         content,
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows drive' file
bb-plugin-inline-vis:test:  FAIL  |bb-plugin-inline-vis| host-path.repro.test.ts > thread-storage host paths > prepares an existing 'Windows UNC' file
bb-plugin-inline-vis:test: AssertionError: expected { kind: 'not-found', …(1) } to match object { kind: 'html', …(5) }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: - Expected
bb-plugin-inline-vis:test: + Received
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:   {
bb-plugin-inline-vis:test: -   "content": "<!doctype html><h1>Remote preview</h1>",
bb-plugin-inline-vis:test:     "file": "reports/view.html",
bb-plugin-inline-vis:test: -   "kind": "html",
bb-plugin-inline-vis:test: -   "source": "thread-storage",
bb-plugin-inline-vis:test: -   "target": {
bb-plugin-inline-vis:test: -     "kind": "thread-storage",
bb-plugin-inline-vis:test: -     "path": "reports/view.html",
bb-plugin-inline-vis:test: -   },
bb-plugin-inline-vis:test: -   "url": StringContaining "/reports/view.html",
bb-plugin-inline-vis:test: +   "kind": "not-found",
bb-plugin-inline-vis:test:   }
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ❯ host-path.repro.test.ts:86:8
bb-plugin-inline-vis:test:      84|           source,
bb-plugin-inline-vis:test:      85|         }),
bb-plugin-inline-vis:test:      86|       ).resolves.toMatchObject({
bb-plugin-inline-vis:test:        |        ^
bb-plugin-inline-vis:test:      87|         kind: "html",
bb-plugin-inline-vis:test:      88|         content,
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  Test Files  1 failed (1)
bb-plugin-inline-vis:test:       Tests  4 failed | 2 passed (6)
bb-plugin-inline-vis:test:    Start at  19:12:21
bb-plugin-inline-vis:test:    Duration  444ms (transform 198ms, setup 0ms, import 295ms, tests 25ms, environment 0ms)
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ELIFECYCLE  Test failed. See above for more details.
bb-plugin-inline-vis#test:  ERROR  command (<investigation>/verification/plugins/inline-vis) /usr/local/bin/pnpm run test host-path.repro.test.ts exited (1)

 Tasks:    5 successful, 6 total
Cached:    4 cached, 6 total
  Time:    1.523s 
Failed:    bb-plugin-inline-vis#test

 ERROR  run failed: command  exited (1)
existing-tests.log
• turbo 2.10.12

   • Packages in scope: bb-plugin-inline-vis
   • Running test in 1 packages
   • Remote caching disabled, using shared worktree cache

@bb/templates:generate:templates: cache miss, executing 84112c6740e86af0
@bb/templates:generate:plugin-scaffold: cache miss, executing 061cdf15211b23be
//:ensure-native-modules: cache bypass, force executing 5ca768c4e59fab01
@bb/plugin-build:generate: cache miss, executing f63c4a7c1e1e2557
//:ensure-native-modules: 
//:ensure-native-modules: > bb@ ensure-native-modules <investigation>/base
//:ensure-native-modules: > node scripts/ensure-native-modules.mjs
//:ensure-native-modules: 
@bb/templates:generate:plugin-scaffold: 
@bb/templates:generate:plugin-scaffold: > @bb/templates@0.0.1 generate:plugin-scaffold <investigation>/base/packages/templates
@bb/templates:generate:plugin-scaffold: > node ./scripts/generate-plugin-scaffold.mjs
@bb/templates:generate:plugin-scaffold: 
@bb/templates:generate:templates: 
@bb/templates:generate:templates: > @bb/templates@0.0.1 generate:templates <investigation>/base/packages/templates
@bb/templates:generate:templates: > node ./scripts/generate-templates.mjs
@bb/templates:generate:templates: 
@bb/plugin-build:generate: 
@bb/plugin-build:generate: > @bb/plugin-build@0.0.1 generate <investigation>/base/packages/plugin-build
@bb/plugin-build:generate: > node ./scripts/generate-plugin-theme.mjs && node ./scripts/generate-runtime-export-manifest.mjs
@bb/plugin-build:generate: 
@bb/plugin-build:generate: plugin-theme.generated.ts up to date
@get-bb/plugin-sdk:build: cache miss, executing 8335604adc69d3ad
@bb/plugin-build:generate: wrote <investigation>/base/packages/plugin-build/src/generated/runtime-export-manifest.generated.ts (react@19.2.4)
@get-bb/plugin-sdk:build: 
@get-bb/plugin-sdk:build: > @get-bb/plugin-sdk@0.6.54 build <investigation>/base/packages/plugin-sdk
@get-bb/plugin-sdk:build: > node scripts/build-runtime.mjs
@get-bb/plugin-sdk:build: 
@get-bb/plugin-sdk:build: Built 20 @get-bb/plugin-sdk runtime entries.
bb-plugin-inline-vis:test: cache miss, executing 78cbbe23d75f114e
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: > bb-plugin-inline-vis@0.1.0 test <investigation>/base/plugins/inline-vis
bb-plugin-inline-vis:test: > vitest run --config vitest.config.ts "server.test.ts" "frame.test.ts" "app.test.tsx"
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  RUN  v4.1.1 <investigation>/base/plugins/inline-vis
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  ✓ |bb-plugin-inline-vis| server.test.ts (14 tests) 22ms
bb-plugin-inline-vis:test:  ✓ |bb-plugin-inline-vis| frame.test.ts (8 tests) 17ms
bb-plugin-inline-vis:test:  ✓ |bb-plugin-inline-vis| app.test.tsx (28 tests) 778ms
bb-plugin-inline-vis:test:      ✓ revalidates a cached Markdown preview after not-found and does not resurrect missing content  342ms
bb-plugin-inline-vis:test: 
bb-plugin-inline-vis:test:  Test Files  3 passed (3)
bb-plugin-inline-vis:test:       Tests  50 passed (50)
bb-plugin-inline-vis:test:    Start at  19:12:24
bb-plugin-inline-vis:test:    Duration  1.98s (transform 600ms, setup 0ms, import 699ms, tests 818ms, environment 1.51s)
bb-plugin-inline-vis:test: 

 Tasks:    6 successful, 6 total
Cached:    0 cached, 6 total
  Time:    3.758s 

Logs retain observed diagnostics with only the temporary investigation directory replaced by <investigation>. Reproduction commands appear above; setup for the second checkout used git worktree add --detach at the same SHA, frozen install, and pnpm exec turbo run build --filter=bb-plugin-inline-vis....

Trust handling: all issue text, links, comments, and code were treated as untrusted claims. No issue-provided command or linked code was executed. The test was designed from trusted source and the existing SDK test harness. No private session data or credentials are included.

> AGENT GENERATED