{"_id":"@emdzej/ncsx-ecu-select","_rev":"6-c78966a33cf07c2ff2d1d24fd7622b94","name":"@emdzej/ncsx-ecu-select","dist-tags":{"latest":"0.9.0"},"versions":{"0.4.0":{"name":"@emdzej/ncsx-ecu-select","version":"0.4.0","_id":"@emdzej/ncsx-ecu-select@0.4.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"4b4706ce8ec17d23e1b2d2b8599874246177ba2f","tarball":"https://registry.npmjs.org/@emdzej/ncsx-ecu-select/-/ncsx-ecu-select-0.4.0.tgz","fileCount":11,"integrity":"sha512-4FVcyXhd1aZQgad5CX2e8u1a7l3RKk1p/9ejnPfp4M8qWi6VjSHIhjoJNRg+AXe7Pm/dsLqa8O1HH9iAiy+BGA==","signatures":[{"sig":"MEUCIQCkfNb3gz/E85muMmsgU5kHMC6s2lYHEAUNNuwY4B/EGQIgTaJwUZH0MxFnvGfAVB37v7gISyGfLBM0NL7eLQatSQU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20743},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-ecu-select-0.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/9bd5fb5f46efef9c5b7c5f11315a2897/emdzej-ncsx-ecu-select-0.4.0.tgz","_integrity":"sha512-4FVcyXhd1aZQgad5CX2e8u1a7l3RKk1p/9ejnPfp4M8qWi6VjSHIhjoJNRg+AXe7Pm/dsLqa8O1HH9iAiy+BGA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/ecu-select"},"_npmVersion":"11.14.1","description":"Walks <BR>SGET.000 to produce the in-scope SG list for a given chassis + ASW. Equivalent of NCSEXPER's coapiScanAllSgFromBr.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.4.0","@emdzej/ncsx-fa-asw":"0.4.0","@emdzej/ncsx-chassis":"0.4.0","@emdzej/ncsx-predicate":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-ecu-select_0.4.0_1779705650981_0.5748854237215741","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emdzej/ncsx-ecu-select","version":"0.5.1","_id":"@emdzej/ncsx-ecu-select@0.5.1","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"f5f0b214c28dae04a48c5688a2cdb8d1f7391c72","tarball":"https://registry.npmjs.org/@emdzej/ncsx-ecu-select/-/ncsx-ecu-select-0.5.1.tgz","fileCount":11,"integrity":"sha512-QuSHdCd+saVKXn38v57A2kXv6dC4kS3jhG1d5KHqY2nqLUOYGWaIzInpAQluRY4fh7p9X7IXpwElO21rDrZMpA==","signatures":[{"sig":"MEYCIQC9Bx0NNQ30SlkMhuB6DfCi8tUQgaIFOYTXctD8GTtcUwIhAOcoMDR+v0qK7S7tPXeIXeaInu37tk4tt+74NrQ5Z6Jd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20743},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-ecu-select-0.5.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/e31ef8376d9e68e35391840d5cc6f1cd/emdzej-ncsx-ecu-select-0.5.1.tgz","_integrity":"sha512-QuSHdCd+saVKXn38v57A2kXv6dC4kS3jhG1d5KHqY2nqLUOYGWaIzInpAQluRY4fh7p9X7IXpwElO21rDrZMpA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/ecu-select"},"_npmVersion":"11.14.1","description":"Walks <BR>SGET.000 to produce the in-scope SG list for a given chassis + ASW. Equivalent of NCSEXPER's coapiScanAllSgFromBr.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.5.1","@emdzej/ncsx-fa-asw":"0.5.1","@emdzej/ncsx-chassis":"0.5.1","@emdzej/ncsx-predicate":"0.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-ecu-select_0.5.1_1779876461718_0.003825472360330373","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@emdzej/ncsx-ecu-select","version":"0.6.0","_id":"@emdzej/ncsx-ecu-select@0.6.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"f0b0f9bb06586cd47004580c2228fd0016646ebd","tarball":"https://registry.npmjs.org/@emdzej/ncsx-ecu-select/-/ncsx-ecu-select-0.6.0.tgz","fileCount":11,"integrity":"sha512-DVFETlqB7h4zBMzViBG38MD4YW383U29QHJJ6gtTpMCy3uEJIskL8OkwsNgfARr7k3wVG886Kuymw6kYEsFlSA==","signatures":[{"sig":"MEYCIQD4Aq3KaJe61iRAZn0YrhA7cxeABJvk+bU+epecqavNFAIhANR2Nj2r33ZeVNO+7+oSgj5SQPQEv3sNAfuEuTZKpoou","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20743},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-ecu-select-0.6.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/a9c83f80b1a51b950260d5f5f1eba15d/emdzej-ncsx-ecu-select-0.6.0.tgz","_integrity":"sha512-DVFETlqB7h4zBMzViBG38MD4YW383U29QHJJ6gtTpMCy3uEJIskL8OkwsNgfARr7k3wVG886Kuymw6kYEsFlSA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/ecu-select"},"_npmVersion":"11.14.1","description":"Walks <BR>SGET.000 to produce the in-scope SG list for a given chassis + ASW. Equivalent of NCSEXPER's coapiScanAllSgFromBr.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.6.0","@emdzej/ncsx-fa-asw":"0.6.0","@emdzej/ncsx-chassis":"0.6.0","@emdzej/ncsx-predicate":"0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-ecu-select_0.6.0_1779981263741_0.662097505947886","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emdzej/ncsx-ecu-select","version":"0.7.0","_id":"@emdzej/ncsx-ecu-select@0.7.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"0fd1d522112d3840da8d7a257516646878b83181","tarball":"https://registry.npmjs.org/@emdzej/ncsx-ecu-select/-/ncsx-ecu-select-0.7.0.tgz","fileCount":11,"integrity":"sha512-wlkvo5T8PwTEZApphymc2GHQP56A27EkjzkcKgb0Q7rWof5SFW+KQMa9jUoiSgviCHiG1hfim1Q+eMuBrrn72w==","signatures":[{"sig":"MEYCIQDotfC9+Bcyj/evFZf2hU4MQR2fU+K7kjMOXyQXJnqZaAIhAN7hWxHp1UEAN87Vh9+1RikBcmct5dBDNFKBozLQiAul","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20743},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-ecu-select-0.7.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/e36436a771ff915ebae4c491faa69d4e/emdzej-ncsx-ecu-select-0.7.0.tgz","_integrity":"sha512-wlkvo5T8PwTEZApphymc2GHQP56A27EkjzkcKgb0Q7rWof5SFW+KQMa9jUoiSgviCHiG1hfim1Q+eMuBrrn72w==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/ecu-select"},"_npmVersion":"11.14.1","description":"Walks <BR>SGET.000 to produce the in-scope SG list for a given chassis + ASW. Equivalent of NCSEXPER's coapiScanAllSgFromBr.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.7.0","@emdzej/ncsx-fa-asw":"0.7.0","@emdzej/ncsx-chassis":"0.7.0","@emdzej/ncsx-predicate":"0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-ecu-select_0.7.0_1780063030854_0.2610645445879951","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@emdzej/ncsx-ecu-select","version":"0.8.0","_id":"@emdzej/ncsx-ecu-select@0.8.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"897c2a6da36494ced9e099f377493cc4f352fc8f","tarball":"https://registry.npmjs.org/@emdzej/ncsx-ecu-select/-/ncsx-ecu-select-0.8.0.tgz","fileCount":11,"integrity":"sha512-z5UE8pAnz5DLl0FDkL0UJh39eUjTABhreAYdKk8wBamxU2cV/VUn3P+uqvptxsQUVxUfct9I8qBgNrx9HrbpDw==","signatures":[{"sig":"MEYCIQDH6fuVW6IzXLVr3G1YXn4LtyP29R9FLDm893yPV72aYQIhAKCqaeINeOr2VPfHjw7B1Z0sMo4KW9g7dMA5cVTOI5Lz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20743},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-ecu-select-0.8.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/609d29fdc2c7f7a474e2eec546b60dd8/emdzej-ncsx-ecu-select-0.8.0.tgz","_integrity":"sha512-z5UE8pAnz5DLl0FDkL0UJh39eUjTABhreAYdKk8wBamxU2cV/VUn3P+uqvptxsQUVxUfct9I8qBgNrx9HrbpDw==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/ecu-select"},"_npmVersion":"11.16.0","description":"Walks <BR>SGET.000 to produce the in-scope SG list for a given chassis + ASW. Equivalent of NCSEXPER's coapiScanAllSgFromBr.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-daten":"0.8.0","@emdzej/ncsx-fa-asw":"0.8.0","@emdzej/ncsx-chassis":"0.8.0","@emdzej/ncsx-predicate":"0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-ecu-select_0.8.0_1780758441771_0.7826005612347422","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@emdzej/ncsx-ecu-select","version":"0.9.0","description":"Walks <BR>SGET.000 to produce the in-scope SG list for a given chassis + ASW. Equivalent of NCSEXPER's coapiScanAllSgFromBr.","main":"dist/index.js","types":"dist/index.d.ts","type":"module","dependencies":{"@emdzej/ncsx-chassis":"0.9.0","@emdzej/ncsx-fa-asw":"0.9.0","@emdzej/ncsx-daten":"0.9.0","@emdzej/ncsx-predicate":"0.9.0"},"devDependencies":{"@types/node":"^22.13.1","vitest":"^2.1.8"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/ecu-select"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run --passWithNoTests","test:watch":"vitest","lint":"eslint .","typecheck":"tsc --noEmit","clean":"rm -rf dist .turbo *.tsbuildinfo"},"_id":"@emdzej/ncsx-ecu-select@0.9.0","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","_integrity":"sha512-8PO79W6s0b86mKG1+SpUZjXSWb4ZH6csB5AaG5q+NJCCaIEydS+S/O2LWEF+5CEw9Nuj6MEIGirEyoZejvVQDQ==","_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/4b0e81a42d0b2dbb54122d602028e568/emdzej-ncsx-ecu-select-0.9.0.tgz","_from":"file:emdzej-ncsx-ecu-select-0.9.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-8PO79W6s0b86mKG1+SpUZjXSWb4ZH6csB5AaG5q+NJCCaIEydS+S/O2LWEF+5CEw9Nuj6MEIGirEyoZejvVQDQ==","shasum":"d8558e8d98e5f345d9e1406dd1efa99e9570186f","tarball":"https://registry.npmjs.org/@emdzej/ncsx-ecu-select/-/ncsx-ecu-select-0.9.0.tgz","fileCount":11,"unpackedSize":20743,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDxpraOBr1nnmcyIMMv4NuO+CxiGrvc8kuJ4QTHxYsFEgIgB2z5XVFaBpKRpqXc3Myuf/S4kTHc5fdu3MQzKHbymWI="}]},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"directories":{},"maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ncsx-ecu-select_0.9.0_1783336586080_0.2861668212984463"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T10:40:50.872Z","modified":"2026-07-06T11:16:26.319Z","0.4.0":"2026-05-25T10:40:51.117Z","0.5.1":"2026-05-27T10:07:41.868Z","0.6.0":"2026-05-28T15:14:23.880Z","0.7.0":"2026-05-29T13:57:11.004Z","0.8.0":"2026-06-06T15:07:21.944Z","0.9.0":"2026-07-06T11:16:26.224Z"},"bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/ecu-select"},"description":"Walks <BR>SGET.000 to produce the in-scope SG list for a given chassis + ASW. Equivalent of NCSEXPER's coapiScanAllSgFromBr.","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"readme":"# @emdzej/ncsx-ecu-select\n\nGiven a chassis bundle and the car's ASW bit set, returns the list of SGs (ECUs) that are\nin scope — the ones whose `AUFTRAGSAUSDRUCK` predicate matches.\n\nThis is **step 2 of the coding flow**: before you can code or read any SG, you need to\nknow which SGs the car actually has. NCS Expert calls this \"Process ECU\" and walks the\nsame `SGAUSWAHL_*` blocks in the same order; this package is the deterministic equivalent.\n\nNCSEXPER equivalent: `coapiScanAllSgFromBr` (with `coapiScanAllSgFromZcs` being the same\nfunction fed by a different ASW source).\n\nSpec: [`../../docs/ecu-selection.md` §3.4](../../docs/ecu-selection.md#34-step-4--sget-driven-enumeration-the-matcher).\n\n## What it does\n\nWalks the three `SGAUSWAHL_*` blocks of `<BR>SGET.000` in most-specific-first order:\n\n1. **`SGAUSWAHL_VMSGBD`** — variant + module-variant + SGBD-specific rows.\n2. **`SGAUSWAHL_SGBD`** — module-variant + SGBD-specific rows.\n3. **`SGAUSWAHL_VM`** — variant-only fallback.\n\nFor each row, evaluates the `AUFTRAGSAUSDRUCK` byte-coded predicate against the supplied\n`AswSet` (via [`@emdzej/ncsx-predicate`](../predicate/)). Matching rows are returned as a\n`SelectedSg[]` with the resolved `(sgName, cabd, sgbd, …)` tuple.\n\nBy default, deduplicates by `sgName` so the most-specific row wins for each SG.\n\n## Install\n\n```bash\npnpm add @emdzej/ncsx-ecu-select\n# or:\n\"@emdzej/ncsx-ecu-select\": \"workspace:*\"\n```\n\n## Quick start\n\n```ts\nimport { loadChassis } from '@emdzej/ncsx-chassis';\nimport { nodeChassisSource } from '@emdzej/ncsx-chassis/node';\nimport { faToAsw } from '@emdzej/ncsx-fa-asw';\nimport { selectEcus } from '@emdzej/ncsx-ecu-select';\n\nconst chassis = await loadChassis(nodeChassisSource('…/DATEN'), 'E46');\nconst asw = faToAsw('0205 0502 0524', { chassis });\nconst selected = selectEcus(chassis, asw);\n\nfor (const sg of selected) {\n  console.log(`${sg.source}  ${sg.sgName}  CBD=${sg.cbd}  CABD=${sg.cabd}  SGBD=${sg.sgbd}`);\n}\n```\n\n## API\n\n| Export                     | Purpose                                                |\n|----------------------------|--------------------------------------------------------|\n| `selectEcus(chassis, asw, opts?)` | Walk `SGAUSWAHL_*` and return matched SGs       |\n| `SelectedSg`               | One row in the result                                  |\n| `SelectionSource`          | `'VMSGBD' \\| 'SGBD' \\| 'VM'` — which block matched     |\n\n### `SelectedSg`\n\n```ts\ninterface SelectedSg {\n  sgName: string;       // logical SG short name (matches SGFAM)\n  cbd: string;          // CBD coding bundle name\n  cabd?: string;        // CABD coding module name (omitted for VM rows)\n  sgbd?: string;        // EDIABAS SGBD file (omitted for VM rows)\n  umrsg: string;        // conversion-SG hint\n  vmg?: string;         // module-variant (omitted for SGBD rows)\n  index: number | null;\n  source: SelectionSource;  // which SGAUSWAHL_* block this came from\n}\n```\n\n### `selectEcus` options\n\n```ts\nselectEcus(chassis, asw, {\n  dedupeBySgName: true,         // most-specific row wins per SG (default true)\n  maxPredicateLength: 100,      // skip predicates longer than this (safety)\n  onWarning: (msg) => { … },    // surface skip reasons (rare; mostly malformed predicates)\n});\n```\n\n## When to reach for it\n\n- Building a \"Pick a module\" UI — feed `selected` into a list.\n- Driving a multi-SG batch operation (planCoding does this internally).\n- Debugging \"why isn't NCS Expert seeing my module?\" — compare `selectEcus` output against\n  what NCS Expert lists for your VIN.\n\n## Tie-breaker semantics\n\nWhen `dedupeBySgName: true` (the default):\n\n- The walk order is most-specific → least-specific (VMSGBD → SGBD → VM).\n- The first `(sgName)` to match wins; subsequent rows for the same SG are skipped.\n- This matches NCSEXPER's behaviour: a VMSGBD-specific override beats a VM fallback.\n\nSet `dedupeBySgName: false` if you want every matching row (e.g. for diagnostic\n\"why didn't my preferred row match?\" exploration).\n\n## Related\n\n- [`@emdzej/ncsx-chassis`](../chassis/) — supplies the `SGET.000` data.\n- [`@emdzej/ncsx-fa-asw`](../fa-asw/) — produces the `AswSet` this consumes.\n- [`@emdzej/ncsx-predicate`](../predicate/) — used to evaluate each row's `AUFTRAGSAUSDRUCK`.\n- [`@emdzej/ncsx-coder`](../coder/) — top-level orchestrator that calls this internally.\n- Spec: [`../../docs/ecu-selection.md`](../../docs/ecu-selection.md).\n","readmeFilename":"README.md"}