{"_id":"@emdzej/ncsx-trace","_rev":"6-b56651d94b1312fdea91334002d96f60","name":"@emdzej/ncsx-trace","dist-tags":{"latest":"0.9.0"},"versions":{"0.4.0":{"name":"@emdzej/ncsx-trace","version":"0.4.0","_id":"@emdzej/ncsx-trace@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":"8462fdebb23dbb617d6b829f125fb21ec6f46a74","tarball":"https://registry.npmjs.org/@emdzej/ncsx-trace/-/ncsx-trace-0.4.0.tgz","fileCount":27,"integrity":"sha512-uo7aGQ0E04ciEZJiinVTOaKGh+wTPiEmSH4pQe7vAXlOmR82l0/vtl+1DI+PAZpO1y62P6yy7+lKBDg5YaPbsQ==","signatures":[{"sig":"MEYCIQD5Hz0Yay7wrxVmKXeDGGTqy1rW+EoPdrWEHIQteUzxxAIhAMVIwObqzaP9d+YnU971DSrCIQ3W/jWYOwX9Lg9WOfaH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60562},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-trace-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/27e0b06963fdc806261892e95e052a83/emdzej-ncsx-trace-0.4.0.tgz","_integrity":"sha512-uo7aGQ0E04ciEZJiinVTOaKGh+wTPiEmSH4pQe7vAXlOmR82l0/vtl+1DI+PAZpO1y62P6yy7+lKBDg5YaPbsQ==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/trace"},"_npmVersion":"11.14.1","description":"TRC/MAN trace-file readers, writers, and TraceOverlay model — the friendly checkbox editor's data plane. Mirrors NCSDummy's Classes/TraceFunctions. Spec: ../../docs/ncsdummy-analysis.md §2-3, ../../docs/user-flow.md.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-function-list":"0.4.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-trace_0.4.0_1779705648203_0.9256607064758098","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emdzej/ncsx-trace","version":"0.5.1","_id":"@emdzej/ncsx-trace@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":"71787dd7994b5ecb12b0d80d39830e37820a13b2","tarball":"https://registry.npmjs.org/@emdzej/ncsx-trace/-/ncsx-trace-0.5.1.tgz","fileCount":27,"integrity":"sha512-/eTcBHvNcR6Ej1ooUp0ocXSOKjLBzhs56O5pPLyabTdH88w7sMXtpLthlY5/oka0AG55Flmky0RaqWVdElpusA==","signatures":[{"sig":"MEQCIHkVcXTiUjQWMnduWYprdHL1ompiWOzzQMMZ82/lVoxgAiBEdrWK0SxZFDzrlV9nIjO1tFS/4AAM4KhzDfp5m4AUgw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63762},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-trace-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/7bc9fa87438d85411c959914f3d61438/emdzej-ncsx-trace-0.5.1.tgz","_integrity":"sha512-/eTcBHvNcR6Ej1ooUp0ocXSOKjLBzhs56O5pPLyabTdH88w7sMXtpLthlY5/oka0AG55Flmky0RaqWVdElpusA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/trace"},"_npmVersion":"11.14.1","description":"TRC/MAN trace-file readers, writers, and TraceOverlay model — the friendly checkbox editor's data plane. Mirrors NCSDummy's Classes/TraceFunctions. Spec: ../../docs/ncsdummy-analysis.md §2-3, ../../docs/user-flow.md.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-function-list":"0.5.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-trace_0.5.1_1779876456280_0.2028729107601066","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@emdzej/ncsx-trace","version":"0.6.0","_id":"@emdzej/ncsx-trace@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":"49b24a653116ff0620515cc741e4fbd575acf90b","tarball":"https://registry.npmjs.org/@emdzej/ncsx-trace/-/ncsx-trace-0.6.0.tgz","fileCount":27,"integrity":"sha512-GRft1/HZkLfpXxp1YEGKVOKh8+YrDD21M8T99JarQCmTH9j0QKGimDJkJBpsZHLoeWDMEJ3ZwD0kkSVt7nEsGQ==","signatures":[{"sig":"MEYCIQDVw+pxPmK2WDo7v9aKtUG8lNvyKptNDjKjG95ujeF0cgIhAK3AcykYX9Nxum9JbVmaYLirgdqu8viW10OyioXP/UAH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63762},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-trace-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/0dba9cf572be691d0225f3840d19e74c/emdzej-ncsx-trace-0.6.0.tgz","_integrity":"sha512-GRft1/HZkLfpXxp1YEGKVOKh8+YrDD21M8T99JarQCmTH9j0QKGimDJkJBpsZHLoeWDMEJ3ZwD0kkSVt7nEsGQ==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/trace"},"_npmVersion":"11.14.1","description":"TRC/MAN trace-file readers, writers, and TraceOverlay model — the friendly checkbox editor's data plane. Mirrors NCSDummy's Classes/TraceFunctions. Spec: ../../docs/ncsdummy-analysis.md §2-3, ../../docs/user-flow.md.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-function-list":"0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-trace_0.6.0_1779981259831_0.6892056218026485","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emdzej/ncsx-trace","version":"0.7.0","_id":"@emdzej/ncsx-trace@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":"73fb2606f4457c4c65617055df07296afe486c60","tarball":"https://registry.npmjs.org/@emdzej/ncsx-trace/-/ncsx-trace-0.7.0.tgz","fileCount":27,"integrity":"sha512-jd50MEaeA9ikQ/s5Sqxz+8QQ3rIZCEsELVAVE/2RA+D/LWpNHiitL8dOfNkhd3cdnPCI8p/UJkv9ScFxag9YPw==","signatures":[{"sig":"MEYCIQCpwqmBGuY+IDgJcnuEDhiY8OFp+DbwLd+dW4vOoYxiZAIhAIzaX/LwQynlJ3Vjtocdr0RN81cElMsKq27LMCMbcFen","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63762},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-trace-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/1a884bec178dd4c542e009815b6c3e44/emdzej-ncsx-trace-0.7.0.tgz","_integrity":"sha512-jd50MEaeA9ikQ/s5Sqxz+8QQ3rIZCEsELVAVE/2RA+D/LWpNHiitL8dOfNkhd3cdnPCI8p/UJkv9ScFxag9YPw==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/trace"},"_npmVersion":"11.14.1","description":"TRC/MAN trace-file readers, writers, and TraceOverlay model — the friendly checkbox editor's data plane. Mirrors NCSDummy's Classes/TraceFunctions. Spec: ../../docs/ncsdummy-analysis.md §2-3, ../../docs/user-flow.md.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-function-list":"0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-trace_0.7.0_1780063025807_0.10700902269312929","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@emdzej/ncsx-trace","version":"0.8.0","_id":"@emdzej/ncsx-trace@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":"81eede5cf6b864a77b6a0ea7c520c1b27f13a74a","tarball":"https://registry.npmjs.org/@emdzej/ncsx-trace/-/ncsx-trace-0.8.0.tgz","fileCount":27,"integrity":"sha512-SdqsUU2ZAG21mQkTJ676LlADVUKDvSU0U42Tbnb3W4oN1v+zkYCIAQzkaAgvkzIbuFZMrOI5vt4KdSWCJazsPA==","signatures":[{"sig":"MEUCIEe6a+DkqT6I+CtahgGyeOwb6joj/DVMREtxZLha8eFRAiEA85GJeyDQQW8lCO6XoGo2z2B98i1gUJIARZHtOTZhV1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63762},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-trace-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/0b5746ce8f30476c8d89f516cf97b57f/emdzej-ncsx-trace-0.8.0.tgz","_integrity":"sha512-SdqsUU2ZAG21mQkTJ676LlADVUKDvSU0U42Tbnb3W4oN1v+zkYCIAQzkaAgvkzIbuFZMrOI5vt4KdSWCJazsPA==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/trace"},"_npmVersion":"11.16.0","description":"TRC/MAN trace-file readers, writers, and TraceOverlay model — the friendly checkbox editor's data plane. Mirrors NCSDummy's Classes/TraceFunctions. Spec: ../../docs/ncsdummy-analysis.md §2-3, ../../docs/user-flow.md.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"@emdzej/ncsx-function-list":"0.8.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-trace_0.8.0_1780758436406_0.615913721395714","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@emdzej/ncsx-trace","version":"0.9.0","description":"TRC/MAN trace-file readers, writers, and TraceOverlay model — the friendly checkbox editor's data plane. Mirrors NCSDummy's Classes/TraceFunctions. Spec: ../../docs/ncsdummy-analysis.md §2-3, ../../docs/user-flow.md.","main":"dist/index.js","types":"dist/index.d.ts","type":"module","dependencies":{"@emdzej/ncsx-function-list":"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/trace"},"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-trace@0.9.0","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","_integrity":"sha512-/0VHeYSglWvPs8bFcsOlKqVO6CoFsMcbmEyURbLcFD+uLQVQYRNSOSkSZb/HZrR2MnbpS2pgwbwCyIBTzpORug==","_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/87a83f60f51631ea7a007bae7753a3e7/emdzej-ncsx-trace-0.9.0.tgz","_from":"file:emdzej-ncsx-trace-0.9.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-/0VHeYSglWvPs8bFcsOlKqVO6CoFsMcbmEyURbLcFD+uLQVQYRNSOSkSZb/HZrR2MnbpS2pgwbwCyIBTzpORug==","shasum":"11f41b44cdee575001e2bf970ca59a43cab81540","tarball":"https://registry.npmjs.org/@emdzej/ncsx-trace/-/ncsx-trace-0.9.0.tgz","fileCount":27,"unpackedSize":63762,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIB7i7pokKFaP6BBn+chLwyr0RHksxfkF/A8PpN06pck/AiA+qLYKtBy4LrRrpGwj05SWnbyqwBlBXjnQDamU3zsmcA=="}]},"_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-trace_0.9.0_1783336580035_0.06501444051177208"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T10:40:47.985Z","modified":"2026-07-06T11:16:20.292Z","0.4.0":"2026-05-25T10:40:48.358Z","0.5.1":"2026-05-27T10:07:36.459Z","0.6.0":"2026-05-28T15:14:19.967Z","0.7.0":"2026-05-29T13:57:05.989Z","0.8.0":"2026-06-06T15:07:16.555Z","0.9.0":"2026-07-06T11:16:20.188Z"},"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/trace"},"description":"TRC/MAN trace-file readers, writers, and TraceOverlay model — the friendly checkbox editor's data plane. Mirrors NCSDummy's Classes/TraceFunctions. Spec: ../../docs/ncsdummy-analysis.md §2-3, ../../docs/user-flow.md.","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"readme":"# @emdzej/ncsx-trace\n\n**TRC / MAN** trace-file readers, writers, and the `TraceOverlay` model that the friendly\ncheckbox editor edits. This is the data plane between \"user ticks a box\" and \"bytes hit\nthe ECU\".\n\nMirrors NCS Dummy's `Classes/TraceFunctions` family — see\n[`../../docs/ncsdummy-analysis.md` §2-3](../../docs/ncsdummy-analysis.md) for the design\nrationale and source-code anchors, and [`../../docs/user-flow.md`](../../docs/user-flow.md)\nfor how this fits into the end-user flow.\n\n## The four file types\n\n| File              | Direction in NCS Expert | Format       | What it carries                            |\n|-------------------|--------------------------|--------------|--------------------------------------------|\n| `FSW_PSW.TRC`     | written by NCS Expert    | FSW/PSW text | Current ECU coding, as keywords            |\n| `NETTODAT.TRC`    | written by NCS Expert    | Nettodata B/M | Current ECU coding, as raw bytes           |\n| `FSW_PSW.MAN`     | read by NCS Expert       | FSW/PSW text | \"Apply these FSW/PSW changes\"              |\n| `NETTODAT.MAN`    | read by NCS Expert       | Nettodata B/M | \"Apply these raw-byte changes\"             |\n\nBoth formats serialise the same in-memory `TraceOverlay` — just two ways of writing it.\n\n## Install\n\n```bash\npnpm add @emdzej/ncsx-trace\n# or:\n\"@emdzej/ncsx-trace\": \"workspace:*\"\n```\n\n## What you get\n\n```ts\ninterface TraceOverlay {\n  memoryStructure: MemoryStructure;  // BYTE / WORDMSB / WORDLSB\n  isWord: boolean;                   // true for word-mode SGs\n  items: TraceOverlayItem[];\n}\n\ntype TraceOverlayItem =\n  | TraceOverlayFunction      // function with parameters[], each with `selected: bool`\n  | TraceOverlayProperty      // property with optional `data: Uint8Array | null`\n  | TraceOverlayUnoccupied    // unoccupied byte range, optional `data`\n  | TraceOverlayGroup         // UI group header\n  | TraceOverlayUnresolved;   // FSW keyword that wasn't in the catalog\n```\n\n## Quick start\n\n```ts\nimport { parseDatenFile } from '@emdzej/ncsx-daten';\nimport { buildFunctionList } from '@emdzej/ncsx-function-list';\nimport {\n  buildTraceOverlay,\n  parseFswPswTrace,\n  applyFswPswTrace,\n  writeNettodataTrace,\n  sniffTraceFormat,\n  parseNettodataTrace,\n  applyNettodataTrace,\n} from '@emdzej/ncsx-trace';\n\n// 1. Build an unchecked overlay from the SG's catalog.\nconst cabd = parseDatenFile(await readBytes('KMBI_E60.C06'));\nconst list = buildFunctionList(cabd, { keywords: chassis.keywordSources });\nconst overlay = buildTraceOverlay(list);\n\n// 2. Load a TRC from disk (could be either format).\nconst text = await readText('FSW_PSW.TRC');\nif (sniffTraceFormat(text) === 'fsw-psw') {\n  applyFswPswTrace(overlay, parseFswPswTrace(text));\n} else {\n  applyNettodataTrace(overlay, parseNettodataTrace(text));\n}\n\n// 3. User toggles checkboxes by mutating overlay.items directly…\n\n// 4. Export to NETTODAT.MAN so NCS Expert can flash it.\nconst manText = writeNettodataTrace(overlay);\nawait writeText('NETTODAT.MAN', manText);\n```\n\n## API\n\n| Function                                  | Purpose                                              |\n|-------------------------------------------|------------------------------------------------------|\n| `buildTraceOverlay(list)`                 | Lift a `FunctionList` into a fresh `TraceOverlay`    |\n| `sniffTraceFormat(text)`                  | Detect `'fsw-psw'` / `'nettodata'` / `null`          |\n| `parseFswPswTrace(text)`                  | Parse FSW/PSW text → `FswPswSelection[]`             |\n| `applyFswPswTrace(overlay, sels, opts?)`  | Mark matching parameters as `selected`               |\n| `writeFswPswTrace(overlay)`               | Serialise checked items → FSW/PSW text               |\n| `parseNettodataTrace(text)`               | Parse Nettodata B/M records → `NettodataEntry[]`     |\n| `applyNettodataTrace(overlay, entries, opts?)` | Decode bytes back to checked PSWs / custom data |\n| `writeNettodataTrace(overlay)`            | Serialise overlay → coalesced B/M records            |\n| `unpackBlockAddress(packed, isWord)`      | Inverse of NCSEXPER's `BlockAddress` packing         |\n\n## File formats\n\n### FSW/PSW\n\nPlain text, one FSW per outer line, parameters indented with a tab:\n\n```\nLENKSEITE_LSZ\n\twert_01\nKALTUEBERWACHUNG_BL\n\taktiv\n```\n\n### Nettodata\n\nPlain text, two record types, all hex, no whitespace inside a record:\n\n```\nB AAAAAAAA,LLLL,XX,XX,XX,...        ; resolved consecutive bytes (or words)\nM AAAAAAAA,LLLL,MM,VV               ; one masked byte/word (mask, value)\n```\n\n- `AAAAAAAA` — 32-bit hex packed `(block << 8) + (isWord ? addr/2 : addr)`.\n- `LLLL` — number of values in this record.\n- `XX` (or `XXXX`) — data values. Width depends on the SG's memory structure.\n- `B` records run up to 16 bytes / 8 words and only encode fully-masked addresses.\n- `M` records cover any address whose function/property doesn't own every bit.\n\n## Strict / lenient modes\n\nBoth readers default to lenient: unknown keywords or partial coverage become\n`TraceOverlayUnresolved` items / synthetic `custom` data, so the UI can still render the\ntrace and surface what's wrong.\n\n```ts\napplyFswPswTrace(overlay, selections, { strict: true });\napplyNettodataTrace(overlay, entries, { strict: true });\n```\n\nIn strict mode the readers throw with a \"make sure chassis and module match those of the\ntrace file\" message — the same one NCS Dummy uses.\n\n## When to reach for it\n\n- Importing an existing `FSW_PSW.TRC` / `NETTODAT.TRC` someone made with NCS Expert.\n- Letting the user edit catalog options via checkboxes and writing the result out.\n- Roundtripping: read a trace, mutate, write — the writer canonical-orders by FSW id and\n  coalesces nettodata into compact B-runs.\n\n## Related\n\n- [`@emdzej/ncsx-function-list`](../function-list/) — the catalog this overlays.\n- [`@emdzej/ncsx-cabd`](../cabd/) — same MASKE-accumulator algorithm for writing nettodata.\n- [`@emdzej/ncsx-coder`](../coder/) — for the same edits at the EDIABAS-job level.\n- Design: [`../../docs/ncsdummy-analysis.md` §2-3](../../docs/ncsdummy-analysis.md).\n- User flow: [`../../docs/user-flow.md`](../../docs/user-flow.md).\n","readmeFilename":"README.md"}