{
  "format": "odb-registry/1",
  "components": [
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "ports": {
        "samples": {
          "direction": "in",
          "kind": "stream",
          "contract": "odb.scalar/1"
        }
      },
      "parameters": {},
      "permissions": [],
      "fixtures": [],
      "evidence": [],
      "id": "examples/number-display",
      "title": "Measurement display",
      "description": "Display scalar measurements inside an isolated web component.",
      "roles": [
        "interface"
      ],
      "source": {
        "path": "components/examples/number-display/1.0.0/display.js",
        "sha256": "df9575a3932a2f8fd966b8cf8724b63db60584b40aa9ce2bd2acaf21bad8a62c",
        "build": "No build step; artifact and source are the same JavaScript file."
      },
      "artifact": {
        "path": "components/examples/number-display/1.0.0/display.js",
        "sha256": "df9575a3932a2f8fd966b8cf8724b63db60584b40aa9ce2bd2acaf21bad8a62c"
      },
      "runtime": {
        "kind": "web-component",
        "entry": "odb-scalar-display",
        "abi": "odb.scalar-ui/1"
      },
      "behavior": "Displays only validated scalar data received over its private MessageChannel. The host creates an opaque-origin iframe with network access blocked by CSP. Stop removes the frame and releases the channel. No browser permissions, filesystem or parent DOM are exposed.",
      "manifest_sha256": "92db88b4850ded393807586b56bfb83477cabf5dd0e349c05b423faf9ad1055d"
    },
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "ports": {
        "samples": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.scalar/1"
        }
      },
      "parameters": {
        "interval": {
          "type": "integer",
          "default": 500,
          "minimum": 50,
          "maximum": 10000
        },
        "unit": {
          "type": "string",
          "default": "count"
        }
      },
      "permissions": [
        "file.scalar-values"
      ],
      "fixtures": [],
      "evidence": [],
      "id": "examples/recorded-scalars",
      "title": "Recorded measurements",
      "description": "Replay fixture measurements or a selected JSON array of numbers. No device required.",
      "roles": [
        "source"
      ],
      "source": {
        "path": "packages/components/src/host.ts",
        "sha256": "b19197f22f2765b9fce38a3fd10a601ab1ec02313536c03f2918bf055f2fb8aa",
        "build": "Provided by @opendevicedb/components/host; no contributor JavaScript is evaluated as a host service."
      },
      "runtime": {
        "kind": "host",
        "entry": "recorded-scalars",
        "abi": "odb.scalar-source/1"
      },
      "behavior": "Replays 10, 20, 30, 20, 10, or a user-selected array of 1–4096 finite numbers. Backpressure pauses production. Source timestamps and session IDs are assigned by the host; no data is uploaded.",
      "manifest_sha256": "62a3f191b9188e0a3ac52ea420a5fc91f21c835400ed742d91615134f2355741"
    },
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "ports": {
        "samples": {
          "direction": "in",
          "kind": "stream",
          "contract": "odb.scalar/1"
        },
        "scaled": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.scalar/1"
        }
      },
      "parameters": {
        "factor": {
          "type": "number",
          "default": 2,
          "minimum": -1000000,
          "maximum": 1000000
        }
      },
      "permissions": [],
      "fixtures": [
        {
          "input": 0,
          "factor": 2,
          "expected": 0
        },
        {
          "input": 3,
          "factor": 2,
          "expected": 6
        },
        {
          "input": -2.5,
          "factor": 4,
          "expected": -10
        }
      ],
      "evidence": [
        {
          "kind": "fixture",
          "reference": "packages/components/test/registry.test.ts"
        }
      ],
      "id": "examples/scale",
      "title": "Scale a measurement",
      "description": "Multiply a finite scalar by a configurable factor using a pure WASM module.",
      "roles": [
        "processing"
      ],
      "source": {
        "path": "components/examples/scale/1.0.0/scale.wat",
        "sha256": "1713c90b77c854ced2b39aaf7b2a4a9ebb8f152308ed327325cb8ace19837801",
        "build": "npm run components:build"
      },
      "artifact": {
        "path": "components/examples/scale/1.0.0/scale.wasm",
        "sha256": "67e9a6c20a97905b79823c82e913e981464dc26d38b96673952617f57fc7fb44"
      },
      "runtime": {
        "kind": "wasm",
        "entry": "process",
        "abi": "odb.scalar-transform/1"
      },
      "behavior": "process(value, factor) returns value * factor. The module imports nothing and has no memory or start function. Host envelopes preserve units, timestamp, source and session. Non-finite results stop the session.",
      "manifest_sha256": "01e43229434f2e27fb3ce8647fbb7594667d8e6542d7d113ee6159eab211a1be"
    },
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "ports": {
        "samples": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.scalar/1"
        }
      },
      "parameters": {
        "interval": {
          "type": "integer",
          "default": 1000,
          "minimum": 50,
          "maximum": 10000
        }
      },
      "permissions": [
        "usb.descriptors"
      ],
      "fixtures": [],
      "evidence": [],
      "id": "examples/usb-revision",
      "title": "USB device revision",
      "description": "Read the major device revision exposed for an explicitly selected USB device. No protocol transfers.",
      "roles": [
        "source",
        "adapter"
      ],
      "source": {
        "path": "packages/components/src/host.ts",
        "sha256": "b19197f22f2765b9fce38a3fd10a601ab1ec02313536c03f2918bf055f2fb8aa",
        "build": "Provided by @opendevicedb/components/host; no contributor JavaScript is evaluated as a host service."
      },
      "runtime": {
        "kind": "host",
        "entry": "usb-descriptors",
        "abi": "odb.scalar-source/1"
      },
      "behavior": "Reads deviceVersionMajor from the selected WebUSB device object. Does not open interfaces or issue transfers. Generic descriptor compatibility is not proof of product protocol support. Device selection remains explicit; no identifiers enter shared compositions or reports.",
      "manifest_sha256": "7fe0a23b69fa342248dc2bd84a84df7f89c93162bafe00b7662f33bfdfea43ef"
    },
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "fixtures": [],
      "evidence": [],
      "id": "ultrasound/convex-decoder",
      "title": "UC5-2S image decoder (WASM)",
      "description": "Shared Rust native/WASM reconstruction library with in-memory resources and an original grayscale option. Hardware profile dependencies remain.",
      "roles": [
        "processing"
      ],
      "source": {
        "path": "components/ultrasound/convex-decoder/1.0.0/src/lib.rs",
        "sha256": "93a7d80de814a9fdde3bdc131a8deb3980b3ff7fe399e2e5143bf8064228cfda",
        "build": "npm run probe:build (same Rust crate as native rlib; in-memory resource ABI6); npm run components:build",
        "files": [
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/Cargo.lock",
            "sha256": "a89f9d40168858def7e4ee35a1bba63208b8322e3a7ce64270157c2730f44165"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/Cargo.toml",
            "sha256": "7f927acd5159c79e9e5cd6e86da164fb52b8ecc0ff9f3676186c7e99899ce91c"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/source-origin.json",
            "sha256": "2105fe63c1c9ad1f565f0343e16abc23636a0e5a47b621979de8f140ff78d516"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/admission.rs",
            "sha256": "5aba1902cdaa2a8aeed10737896ee186ca8dcbc69d57b4cff92977c093557269"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/archive.rs",
            "sha256": "098ebf2b90a99e35d507fc8765184fc1f68631afb96382a2a2138f5104b409f6"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_bfsp.rs",
            "sha256": "9c078685c2ba936c640ca1f62d1cf45107e78e7d3040a284f2f60a20ae8d4c4f"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_command.rs",
            "sha256": "480fbc33846874ae68b0396cb2913f69f7ec199b90b873060af4946a09cb01bd"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_compound.rs",
            "sha256": "a87d04c92d51de21aec911267eb73c4ecccdcac75bef13c362b3b3e4f7967359"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_configuration.rs",
            "sha256": "dbdc8df42ad13c65de76e15ca08f767bdce12b79e4667845f94f58902cd61ef8"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_dsc.rs",
            "sha256": "1cfa44b12ba6b8b7d8b8f768460ca6e04a475444e0d58c14cae797aa49461e0d"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_dtgc.rs",
            "sha256": "dcd7fc2a0aaecdbf6c724689343b99fa00ad32f7d1eb7346023133ff32310e18"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_group.rs",
            "sha256": "d88d35ce2c5d7b1821f9f305379c11805c0dfb7c3dbdda64da80a07f5c75a7d3"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_lifecycle.rs",
            "sha256": "3e0b28199d0e95074fd454d06dbd9f83f309bab0f1a3fab38d7fe703b069175e"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_messages.rs",
            "sha256": "aa00a808c67b7daec150fb1fddf6121e9e38a3bf69f9d407b265d2b892bc4db2"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_parameters.rs",
            "sha256": "27dcc979d239197a2767d16783450c6c78aef4e89744e14167b965a8c74ea961"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_pipeline.rs",
            "sha256": "4fb4925ede9fc66f4fb0292fae144b25822a515b17c60f8567dcb339f33fb11e"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_producers.rs",
            "sha256": "41a50d9b9d549088c2caf6e1eff19531ae443df986427bee824190522a08e9f8"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_sri.rs",
            "sha256": "74057b9a8cdc0c1012ae40390bb832f05866a07fff2f90234e8ac5c73e9a6d4d"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/convex_sri_plan.rs",
            "sha256": "fabc74491f2b537dcfb50bc9c66045e4d962b2ca0d1391d596e32b9e1bdea57d"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/framing.rs",
            "sha256": "74c4e02ba50a5035517f7b1a7f4023a8ea259af7b92cb0b139e5853d707d653a"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/known_convex_assets.json",
            "sha256": "700e1c948dfb673980c38fba239bed9a3b01bff558f0d56ee17f1e10343fbd0f"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/known_convex_producer_assets.json",
            "sha256": "207ec2321a7c01de1b5462a3e61c0b46f09c9dc9e2d9dbcb3db748186fbdbd0a"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/known_convex_sri_layout.json",
            "sha256": "4cafbc69a11b93c19d04d390aa1989d5a241df0d928d027ebe7632bf1921f396"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/linear_dsp.rs",
            "sha256": "d711bf2d2221c23f4213a260e2429d2fac3a086d8fc3078d1acad0f8982cca38"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/linear_palette.rs",
            "sha256": "0b05f3f2d247222a0f730ee3f361646231c3cb351606bf62adf864788fdf4bc2"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/linear_post.rs",
            "sha256": "55bc8d05a021a34ff7da6d9f0aaab3e658a0018e875c78f914d0c8bcbaa069e6"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/rgba_png.rs",
            "sha256": "4d91a880687db02ebdaad20b63e28e653af8b15f943a577c34961ef70d3ff8ad"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/resources.rs",
            "sha256": "c8dcb773217ae1a6391a6092b902ebedb94bb19691202f24b07e307804aef3e4"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/examples/replay_memory.rs",
            "sha256": "2409ba64d2a8470976030b020075799aea4782834104567bd6cdf12c1b17edb3"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/src/selected_profile.rs",
            "sha256": "4c0c5b3e451a42a0ce930bdf51d31f031c318f39b66ffd19d8c194b28cb9bf3b"
          },
          {
            "path": "components/ultrasound/convex-decoder/1.0.0/build/reproducible-rustc.rs",
            "sha256": "35ad737748a656197b08b1033df4432bd9a0c444955275e4f9ec68d3c09344c1"
          }
        ]
      },
      "artifact": {
        "path": "components/ultrasound/convex-decoder/1.0.0/decoder.wasm",
        "sha256": "ef379cfbea1b30d915292dadb3a8a24acb06d11d24277fadd8e9fe69ad6c0769"
      },
      "runtime": {
        "kind": "wasm",
        "entry": "odb_call",
        "abi": "odb.ultrasound.decode/1"
      },
      "ports": {
        "bytes": {
          "direction": "in",
          "kind": "stream",
          "contract": "odb.usb.bytes/1"
        },
        "frames": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.video.frame/1"
        }
      },
      "parameters": {},
      "permissions": [],
      "behavior": "Shared Rust Session for native and browser WASM: incremental framing, group admission, BFSP, DTGC, compound, temporal processing, DSC and PNG. Explicit selected image profiles are supported in memory; enhancement0 can run without unused spatial-filter banks. Hosts own USB, storage and display. The browser adapter supports either ABI6 in-memory resources or ABI7 from compatible built-in-profile runtimes. This registry artifact uses ABI6. Maximum256MiB WASM memory. Warmup, explicit state and bounded processing remain required. Reference replays and cross-target numerical differences are measured separately; no clinical or geometric calibration claim.",
      "manifest_sha256": "74718a2f1e8351df057a1e1aab86cc51e5fadcad8dbe7b742ca5f82e095ee5ea"
    },
    {
      "format": "odb-component/1",
      "id": "ultrasound/convex-open-image",
      "version": "0.1.0",
      "status": "available",
      "title": "UC5-2S original reconstruction profile (WASM)",
      "description": "Resource-free mathematical image profile for recorded DATA; no acquisition configuration.",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "roles": [
        "processing"
      ],
      "source": {
        "path": "components/ultrasound/convex-open-image/0.1.0/src/lib.rs",
        "sha256": "499ac1bc5020b389c0185711335204949dceb09726656ee9e8eecda853565aa9",
        "build": "node scripts/build-open-image-wasm.ts; npm run components:build",
        "files": [
          {
            "path": "components/ultrasound/convex-open-image/0.1.0/Cargo.toml",
            "sha256": "2a9d33c0c2ce37af7164c815fde16f1944105f34112e123b1217cc8cf1da4807"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.0/Cargo.lock",
            "sha256": "7b6a9a3bb1fa2d432dbacfefe926fed0383e80f536fec5a8b00da4fd65e11e24"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.0/README.md",
            "sha256": "a9d336cd9e773549c816c1c293930498d74286cb21d93f16344e867bb31b581b"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.0/src/bin/replay_open.rs",
            "sha256": "5e0aaa40cbdeb706426a55677be33bbfcef5c027003ced94daab684a22a4425d"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.0/shared-sources.json",
            "sha256": "5d3b280d009c7cb2ddea2f923a36877636a69b03c93b50e2a84d6c2f54212fca"
          }
        ]
      },
      "artifact": {
        "path": "components/ultrasound/convex-open-image/0.1.0/decoder.wasm",
        "sha256": "c466a55c5cb5d7ea1cdb5e99039ac4d1707d49929a571ae38ae79e5f2a3e93fb"
      },
      "runtime": {
        "kind": "wasm",
        "entry": "odb_call",
        "abi": "odb.ultrasound.decode/1"
      },
      "ports": {
        "bytes": {
          "direction": "in",
          "kind": "stream",
          "contract": "odb.usb.bytes/1"
        },
        "frames": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.video.frame/1"
        }
      },
      "parameters": {},
      "permissions": [],
      "behavior": "Explicit reconstruction-only initialization; binomial FIR, adjustable native display settings, generated grayscale and normalized sector. No external resource files, hardware configuration, USB or network access. Shared Rust processing library for native/WASM. Recording host requires explicit reconstruction purpose. Shared processing sources are pinned by shared-sources.json. No metric calibration or clinical equivalence claim.",
      "fixtures": [],
      "evidence": [],
      "manifest_sha256": "378bc698210ae80163ca058a9667285ad90de47c29997e091d1e01307dd9540d"
    },
    {
      "format": "odb-component/1",
      "id": "ultrasound/convex-open-image",
      "version": "0.1.1",
      "status": "available",
      "title": "UC5-2S original reconstruction profile and verified native replay",
      "description": "Resource-free mathematical image profile for recorded DATA; no acquisition configuration.",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "roles": [
        "processing"
      ],
      "source": {
        "path": "components/ultrasound/convex-open-image/0.1.1/src/lib.rs",
        "sha256": "499ac1bc5020b389c0185711335204949dceb09726656ee9e8eecda853565aa9",
        "build": "node scripts/build-open-image-wasm.ts --version 0.1.1; npm run components:build",
        "files": [
          {
            "path": "components/ultrasound/convex-open-image/0.1.1/Cargo.toml",
            "sha256": "42db07af0a9058eb117124a0b32de0c013885ce5d349795ac078badb0e0dab2c"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.1/Cargo.lock",
            "sha256": "bb7e510b6c3697bb53ca6d5db2bf1fbce30f4f064c1d9ed1e5d5e4d59d13dc7b"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.1/README.md",
            "sha256": "a93fc3de29df0c4a7d128ea40c582148e7617f9fb6b3e7bab1d55b14186fdbe4"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.1/src/bin/replay_open.rs",
            "sha256": "062154485111286a755e62913f25b469f84bbdd7248f7f7f4026b3d420830aa4"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.1/shared-sources.json",
            "sha256": "5d3b280d009c7cb2ddea2f923a36877636a69b03c93b50e2a84d6c2f54212fca"
          },
          {
            "path": "components/ultrasound/convex-open-image/0.1.1/src/bin/capture/mod.rs",
            "sha256": "5a3a66f5aaf1ba09f1a9d79e8f1e3a49b8037aa2d904fa0ff83d58001239128b"
          }
        ]
      },
      "artifact": {
        "path": "components/ultrasound/convex-open-image/0.1.1/decoder.wasm",
        "sha256": "c466a55c5cb5d7ea1cdb5e99039ac4d1707d49929a571ae38ae79e5f2a3e93fb"
      },
      "runtime": {
        "kind": "wasm",
        "entry": "odb_call",
        "abi": "odb.ultrasound.decode/1"
      },
      "ports": {
        "bytes": {
          "direction": "in",
          "kind": "stream",
          "contract": "odb.usb.bytes/1"
        },
        "frames": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.video.frame/1"
        }
      },
      "parameters": {},
      "permissions": [],
      "behavior": "Explicit reconstruction-only initialization; binomial FIR, adjustable native display settings, generated grayscale and normalized sector. No external resource files, hardware configuration, USB or network access. Shared Rust processing library for native/WASM. Recording host requires explicit reconstruction purpose. Shared processing sources are pinned by shared-sources.json. No metric calibration or clinical equivalence claim.",
      "fixtures": [],
      "evidence": [],
      "manifest_sha256": "d72be1caa3d89168dbbee80e9cde474b0cf0e8ca5c7ae9bb0621cbe44ba18138"
    },
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "fixtures": [],
      "evidence": [],
      "id": "ultrasound/preview-source",
      "title": "Ultrasound preview source",
      "description": "Reads cached PNG frames from a locally configured, read-only probe preview bridge. Acquisition remains controlled by the native driver.",
      "roles": [
        "source",
        "adapter"
      ],
      "source": {
        "path": "components/ultrasound/preview-source/1.0.0/source.ts",
        "sha256": "1cda72d841ad4aa767b365712a236accf323823719c312636954dc1fd42964f1",
        "build": "Built into @opendevicedb/components/video; host service is explicitly implemented, never dynamically evaluated."
      },
      "runtime": {
        "kind": "host",
        "entry": "ultrasound-preview",
        "abi": "odb.video-source/1"
      },
      "ports": {
        "frames": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.video.frame/1"
        }
      },
      "parameters": {
        "profile": {
          "type": "string",
          "default": "convex-01"
        },
        "interval": {
          "type": "integer",
          "default": 250,
          "minimum": 100,
          "maximum": 10000
        }
      },
      "permissions": [
        "ultrasound.preview"
      ],
      "devices": [
        "unknown/puis-fx2-convex-usb-probe-04b4-4611",
        "bmv/ul10-5e"
      ],
      "behavior": "GET-only polling of /status and /image/<session>/<frame> on an explicitly selected loopback bridge. One frame in flight, bounded PNG dimensions and bytes. Known profiles must match. Unidentified recordings are labelled replay and never establish device compatibility. No acquisition, settings, USB transfers or calibrated measurement. Bridge address is runtime-only and excluded from compositions.",
      "manifest_sha256": "463944aa885b579763a41cafe212e9a4e8713597a3a37af591cef62809c51401"
    },
    {
      "format": "odb-component/1",
      "id": "ultrasound/recorded-data",
      "version": "1.0.0",
      "status": "available",
      "title": "Recorded probe DATA",
      "description": "Read a chosen local raw DATA or capture archive for reconstruction. No upload or device access.",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "roles": [
        "source"
      ],
      "source": {
        "path": "components/ultrasound/recorded-data/1.0.0/source.ts",
        "sha256": "b1526b60b146665ea4035386016a5f1d92679aad147d0ed2a9e37c2b9e0d6d38",
        "build": "Built into the explicit recording host; no dynamic source evaluation."
      },
      "runtime": {
        "kind": "host",
        "entry": "probe-recording",
        "abi": "odb.usb-source/1"
      },
      "ports": {
        "bytes": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.usb.bytes/1"
        }
      },
      "parameters": {},
      "permissions": [
        "file.probe-recording"
      ],
      "fixtures": [],
      "evidence": [],
      "behavior": "Reads .bin in 64KiB chunks, legacy .odb-capture containers bounded to96MiB, or unbounded-length .odb-stream JSONL with bounded lines. Validates encoding, ordinals and totals. Rejects declared storage losses. Journal/display records never become device commands. File selection is runtime-only, excluded from compositions. The stream provides format candidates, not device identification or acoustic calibration.",
      "manifest_sha256": "f2607f202a25c453ebfc6eada677bea568825ed8dd41ac8d8a52dc7f37847e4a"
    },
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "fixtures": [],
      "evidence": [],
      "id": "ultrasound/usb-capture",
      "title": "Ultrasound USB acquisition",
      "description": "Configure, start and stop UC5-2S acquisition directly with WebUSB. Emits raw USB bytes without a native server.",
      "roles": [
        "source",
        "adapter"
      ],
      "source": {
        "path": "components/ultrasound/usb-capture/1.0.0/source.ts",
        "sha256": "7439bec1faf4da969a819f26e222b8b5db4f7943256d7dc7fa8bf909c9024629",
        "build": "TypeScript host service compiled with the site; WebUSB is owned by the host."
      },
      "runtime": {
        "kind": "host",
        "entry": "probe-usb",
        "abi": "odb.usb-source/1"
      },
      "ports": {
        "bytes": {
          "direction": "out",
          "kind": "stream",
          "contract": "odb.usb.bytes/1"
        }
      },
      "parameters": {
        "seconds": {
          "type": "integer",
          "default": 1,
          "minimum": 1,
          "maximum": 30
        }
      },
      "permissions": [
        "usb.capture"
      ],
      "devices": [
        "unknown/puis-fx2-convex-usb-probe-04b4-4611"
      ],
      "behavior": "Requires explicit device selection and current phantom setup confirmation. Validates the connected UC5-2S identity, binds the configuration to the current complete PID0, queues IN readers on endpoints6/8/1 and sends the same fixed bootstrap/configuration/Start/Freeze packets as the Rust driver. No retry or further OUT after an uncertain write. WebUSB deadlines close the device; they do not attest acoustic stop. Bounded sessions use duration1–30s and64MiB raw byte limit. An explicit host seconds:null selects continuous reception until Stop/disconnect, with the same bounded IN queues; storage and decoding backpressure belong to the host. No further OUT after an explicit device disconnect. Raw data and configuration remain local.",
      "manifest_sha256": "a9418b859cd152010f40fb2fefcfb404de7d86768de6e7943a40513b4c5337e6"
    },
    {
      "format": "odb-component/1",
      "version": "1.0.0",
      "status": "available",
      "license": "AGPL-3.0-or-later",
      "authors": [
        "OpenDeviceDB contributors"
      ],
      "targets": [
        "browser"
      ],
      "fixtures": [],
      "evidence": [],
      "id": "video/frame-viewer",
      "title": "Video frame display",
      "description": "Reusable canvas display for PNG frame streams, including ultrasound previews and recorded replays.",
      "roles": [
        "interface"
      ],
      "source": {
        "path": "components/video/frame-viewer/1.0.0/viewer.js",
        "sha256": "78a13574f0771a01d12d4d2bc8ca109f0f446a2f63f81e32c23b29277e78abbf",
        "build": "No compilation; isolated web component JavaScript."
      },
      "artifact": {
        "path": "components/video/frame-viewer/1.0.0/viewer.js",
        "sha256": "78a13574f0771a01d12d4d2bc8ca109f0f446a2f63f81e32c23b29277e78abbf"
      },
      "runtime": {
        "kind": "web-component",
        "entry": "odb-video-viewer",
        "abi": "odb.video-ui/1"
      },
      "ports": {
        "frames": {
          "direction": "in",
          "kind": "stream",
          "contract": "odb.video.frame/1"
        }
      },
      "parameters": {},
      "permissions": [],
      "behavior": "Receives PNG ArrayBuffers through a private MessagePort. Decodes one frame, draws it on canvas, releases the bitmap, then acknowledges its session and sequence. No network or device access. Shows replay/live provenance, dimensions and uncalibrated status. No distance or diagnostic interpretation.",
      "manifest_sha256": "f8c01f5270517161d662fee400cf7ad37ea6ef939cf1ab590dffb3250b4aaa9b"
    }
  ],
  "compositions": [
    {
      "format": "odb-composition/1",
      "id": "examples/measurements",
      "title": "Simulated numbers — technical example",
      "description": "Demonstrates how components connect: fictional numbers → multiplication → number display. No device or sensor is used. Change the multiplier under Customize to explore the example.",
      "nodes": [
        {
          "id": "source",
          "component": "examples/recorded-scalars",
          "version": "1.0.0",
          "parameters": {}
        },
        {
          "id": "scale",
          "component": "examples/scale",
          "version": "1.0.0",
          "parameters": {
            "factor": 2
          }
        },
        {
          "id": "display",
          "component": "examples/number-display",
          "version": "1.0.0",
          "parameters": {}
        }
      ],
      "connections": [
        {
          "from": "source.samples",
          "to": "scale.samples"
        },
        {
          "from": "scale.scaled",
          "to": "display.samples"
        }
      ],
      "layout": {
        "application": {
          "display": {
            "x": 0,
            "y": 0,
            "width": 12,
            "height": 4
          }
        }
      },
      "purpose": "example",
      "lock": [
        {
          "component": "examples/recorded-scalars",
          "version": "1.0.0",
          "manifest_sha256": "62a3f191b9188e0a3ac52ea420a5fc91f21c835400ed742d91615134f2355741"
        },
        {
          "component": "examples/scale",
          "version": "1.0.0",
          "manifest_sha256": "01e43229434f2e27fb3ce8647fbb7594667d8e6542d7d113ee6159eab211a1be",
          "artifact_sha256": "67e9a6c20a97905b79823c82e913e981464dc26d38b96673952617f57fc7fb44"
        },
        {
          "component": "examples/number-display",
          "version": "1.0.0",
          "manifest_sha256": "92db88b4850ded393807586b56bfb83477cabf5dd0e349c05b423faf9ad1055d",
          "artifact_sha256": "df9575a3932a2f8fd966b8cf8724b63db60584b40aa9ce2bd2acaf21bad8a62c"
        }
      ]
    },
    {
      "format": "odb-composition/1",
      "id": "examples/usb-revision",
      "title": "USB revision — technical example",
      "description": "Reads the major part of the device revision number (bcdDevice), not the USB standard version. This fixed descriptor is not a sensor measurement. No device commands are sent.",
      "nodes": [
        {
          "id": "source",
          "component": "examples/usb-revision",
          "version": "1.0.0",
          "parameters": {}
        },
        {
          "id": "scale",
          "component": "examples/scale",
          "version": "1.0.0",
          "parameters": {
            "factor": 1
          }
        },
        {
          "id": "display",
          "component": "examples/number-display",
          "version": "1.0.0",
          "parameters": {}
        }
      ],
      "connections": [
        {
          "from": "source.samples",
          "to": "scale.samples"
        },
        {
          "from": "scale.scaled",
          "to": "display.samples"
        }
      ],
      "layout": {
        "application": {
          "display": {
            "x": 0,
            "y": 0,
            "width": 12,
            "height": 4
          }
        }
      },
      "purpose": "example",
      "lock": [
        {
          "component": "examples/usb-revision",
          "version": "1.0.0",
          "manifest_sha256": "7fe0a23b69fa342248dc2bd84a84df7f89c93162bafe00b7662f33bfdfea43ef"
        },
        {
          "component": "examples/scale",
          "version": "1.0.0",
          "manifest_sha256": "01e43229434f2e27fb3ce8647fbb7594667d8e6542d7d113ee6159eab211a1be",
          "artifact_sha256": "67e9a6c20a97905b79823c82e913e981464dc26d38b96673952617f57fc7fb44"
        },
        {
          "component": "examples/number-display",
          "version": "1.0.0",
          "manifest_sha256": "92db88b4850ded393807586b56bfb83477cabf5dd0e349c05b423faf9ad1055d",
          "artifact_sha256": "df9575a3932a2f8fd966b8cf8724b63db60584b40aa9ce2bd2acaf21bad8a62c"
        }
      ]
    },
    {
      "format": "odb-composition/1",
      "purpose": "application",
      "id": "ultrasound/convex-capture",
      "title": "Ultrasound live capture",
      "description": "Capture the convex probe directly over USB and decode its images in this browser. No local server is required. Load your probe resources, select the probe and start capture.",
      "devices": [
        "unknown/puis-fx2-convex-usb-probe-04b4-4611"
      ],
      "nodes": [
        {
          "id": "source",
          "component": "ultrasound/usb-capture",
          "version": "1.0.0",
          "parameters": {}
        },
        {
          "id": "decoder",
          "component": "ultrasound/convex-decoder",
          "version": "1.0.0",
          "parameters": {}
        },
        {
          "id": "display",
          "component": "video/frame-viewer",
          "version": "1.0.0",
          "parameters": {}
        }
      ],
      "connections": [
        {
          "from": "source.bytes",
          "to": "decoder.bytes"
        },
        {
          "from": "decoder.frames",
          "to": "display.frames"
        }
      ],
      "layout": {
        "application": {
          "display": {
            "x": 0,
            "y": 0,
            "width": 12,
            "height": 8
          }
        }
      },
      "lock": [
        {
          "component": "ultrasound/usb-capture",
          "version": "1.0.0",
          "manifest_sha256": "a9418b859cd152010f40fb2fefcfb404de7d86768de6e7943a40513b4c5337e6"
        },
        {
          "component": "ultrasound/convex-decoder",
          "version": "1.0.0",
          "manifest_sha256": "74718a2f1e8351df057a1e1aab86cc51e5fadcad8dbe7b742ca5f82e095ee5ea",
          "artifact_sha256": "ef379cfbea1b30d915292dadb3a8a24acb06d11d24277fadd8e9fe69ad6c0769"
        },
        {
          "component": "video/frame-viewer",
          "version": "1.0.0",
          "manifest_sha256": "f8c01f5270517161d662fee400cf7ad37ea6ef939cf1ab590dffb3250b4aaa9b",
          "artifact_sha256": "78a13574f0771a01d12d4d2bc8ca109f0f446a2f63f81e32c23b29277e78abbf"
        }
      ]
    },
    {
      "format": "odb-composition/1",
      "purpose": "example",
      "id": "ultrasound/convex-preview",
      "title": "Read existing driver images — utility",
      "description": "Display the images supplied by your local probe driver. Requires a read-only preview bridge; connecting this viewer does not start the probe. Live acquisition and recorded replay are labelled separately.",
      "devices": [
        "unknown/puis-fx2-convex-usb-probe-04b4-4611"
      ],
      "nodes": [
        {
          "id": "source",
          "component": "ultrasound/preview-source",
          "version": "1.0.0",
          "parameters": {
            "profile": "convex-01"
          }
        },
        {
          "id": "display",
          "component": "video/frame-viewer",
          "version": "1.0.0",
          "parameters": {}
        }
      ],
      "connections": [
        {
          "from": "source.frames",
          "to": "display.frames"
        }
      ],
      "layout": {
        "application": {
          "display": {
            "x": 0,
            "y": 0,
            "width": 12,
            "height": 8
          }
        }
      },
      "lock": [
        {
          "component": "ultrasound/preview-source",
          "version": "1.0.0",
          "manifest_sha256": "463944aa885b579763a41cafe212e9a4e8713597a3a37af591cef62809c51401"
        },
        {
          "component": "video/frame-viewer",
          "version": "1.0.0",
          "manifest_sha256": "f8c01f5270517161d662fee400cf7ad37ea6ef939cf1ab590dffb3250b4aaa9b",
          "artifact_sha256": "78a13574f0771a01d12d4d2bc8ca109f0f446a2f63f81e32c23b29277e78abbf"
        }
      ]
    },
    {
      "format": "odb-composition/1",
      "purpose": "application",
      "id": "ultrasound/convex-replay",
      "title": "Replay a convex probe recording",
      "description": "Open a local .bin, .odb-capture or .odb-stream acquisition and reconstruct its images with an original built-in profile. No probe, configuration file, upload or local server is needed. Rendering is uncalibrated.",
      "devices": [
        "unknown/puis-fx2-convex-usb-probe-04b4-4611"
      ],
      "nodes": [
        {
          "id": "source",
          "component": "ultrasound/recorded-data",
          "version": "1.0.0",
          "parameters": {}
        },
        {
          "id": "decoder",
          "component": "ultrasound/convex-open-image",
          "version": "0.1.1",
          "parameters": {}
        },
        {
          "id": "display",
          "component": "video/frame-viewer",
          "version": "1.0.0",
          "parameters": {}
        }
      ],
      "connections": [
        {
          "from": "source.bytes",
          "to": "decoder.bytes"
        },
        {
          "from": "decoder.frames",
          "to": "display.frames"
        }
      ],
      "layout": {
        "application": {
          "display": {
            "x": 0,
            "y": 0,
            "width": 12,
            "height": 8
          }
        }
      },
      "lock": [
        {
          "component": "ultrasound/recorded-data",
          "version": "1.0.0",
          "manifest_sha256": "f2607f202a25c453ebfc6eada677bea568825ed8dd41ac8d8a52dc7f37847e4a"
        },
        {
          "component": "ultrasound/convex-open-image",
          "version": "0.1.1",
          "manifest_sha256": "d72be1caa3d89168dbbee80e9cde474b0cf0e8ca5c7ae9bb0621cbe44ba18138",
          "artifact_sha256": "c466a55c5cb5d7ea1cdb5e99039ac4d1707d49929a571ae38ae79e5f2a3e93fb"
        },
        {
          "component": "video/frame-viewer",
          "version": "1.0.0",
          "manifest_sha256": "f8c01f5270517161d662fee400cf7ad37ea6ef939cf1ab590dffb3250b4aaa9b",
          "artifact_sha256": "78a13574f0771a01d12d4d2bc8ca109f0f446a2f63f81e32c23b29277e78abbf"
        }
      ]
    }
  ]
}