@cosyte/synth 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -547,6 +547,155 @@ its public history at `0.0.x`, per the cosyte version ladder (`0.0.x` until firs
547
547
 
548
548
  ### Fixed
549
549
 
550
+ - **The exported `VERSION` constant reported `0.0.0` on every published release, and the fix is the
551
+ binding rather than the literal.** `src/index.ts` carried a hand-written constant while Changesets
552
+ bumped `package.json`, so the two were never connected and the export went stale at the first
553
+ publish. Measured 2026-08-03 against the registry rather than the source tree, by unpacking each
554
+ released tarball (`for v in 0.0.1 0.0.2 0.0.3 0.0.4 0.0.5; do npm pack @cosyte/synth@$v; done`):
555
+ **all five** carry `var VERSION = "0.0.0"` in `dist/index.cjs`, `0.0.5` included, which is what
556
+ `latest` serves today. `docs-content/installation.md` makes that constant the documented install
557
+ smoke test, so the documented way to confirm an install read the lying value; the assertion there
558
+ is on the value's _type_, which is why it never went red. `scripts/sync-version.mjs` now rewrites
559
+ the declaration from the manifest and runs from the `version` script between `changeset version`
560
+ and the formatter, so the bump and the constant land in one release commit. It is idempotent, and
561
+ refuses rather than no-opping on a renamed, reformatted or duplicated declaration, because a
562
+ silent no-op is precisely the failure being closed. The drift guard is a new equality assertion in
563
+ `test/sanity.test.ts` against `package.json` (never against a literal): the two assertions already
564
+ there require a non-empty string and a semver shape, and `"0.0.0"` satisfies both, so they were
565
+ green throughout. `test/scripts/sync-version.test.ts` covers the script itself, since it executes
566
+ only during a release and would otherwise first run at the moment it matters. `VERSION` is now
567
+ annotated `: string` instead of inferring its literal type, matching the sibling packages: a small
568
+ declaration-surface change, since consumers previously saw the literal type `"0.0.0"` and it would
569
+ have re-narrowed on every bump. Third instance of this class in the suite after `astm@0.0.1` and
570
+ `terminology@0.0.1`; the mechanism is theirs, ported with its claims re-measured here.
571
+ - **Two shipped documentation pages said this package was "not yet published to npm."**
572
+ `docs-content/intro.md` and `docs-content/installation.md` both carried it, and `docs-content/` is
573
+ tarred verbatim into the release asset the docs site ingests, so the claim reached readers. Both
574
+ now match what `README.md` already said: published, on the pre-alpha `0.0.x` ladder, without
575
+ repeating the number, because a version pinned into prose is stale by construction at the next
576
+ release and a released asset cannot be corrected in place.
577
+ - **The PHI scanner read a symbolic link as clean, on both of the routes that enumerate files.** A
578
+ link under a scan root pointing at a document carrying real-looking PHI passed the gate, and so
579
+ did the same link staged for commit. The two routes were blind for different reasons. The
580
+ working-tree walk collected only regular files, and a link is neither a file nor a directory to
581
+ the call it used, so it fell out of the loop silently — a linked _directory_ taking a whole
582
+ subtree with it. The staged route listed paths without their file mode and then read content with
583
+ `git show`, and git stores a link as its target path under mode `120000`, so that route was handed
584
+ the path text rather than the target's bytes, then counted the result in its own denominator as a
585
+ file scanned. Measured here before the fix, with a name-bearing synthetic document held outside
586
+ the scan roots: a working-tree sweep reported `OK — no hits (1 file(s) scanned)` and exit 0 where
587
+ the same bytes as a regular file reported two hits and exit 1; staging the link, and separately
588
+ replacing a tracked regular file with it, each reported that same clean line over a mode-`120000`
589
+ blob.
590
+
591
+ **An in-scope entry that is not a regular file now refuses the scan (exit 2) on both routes**,
592
+ rather than being skipped or followed. Neither route is taught to follow a link: following would
593
+ read bytes the enumeration does not control, and a commit does not carry those bytes anyway. A
594
+ refusal names every offender's own repository-relative path and an engine-owned word for its kind,
595
+ and **never the link target**, which is working-tree text that can itself carry PHI. A git-ignored
596
+ entry is still out of scope, so the escape hatch for something genuinely outside the corpus is
597
+ unchanged; the markdown exemption deliberately does not extend to a link, whose name says nothing
598
+ about what is on the other side of it. The earlier tolerance for a file that vanishes between
599
+ enumeration and read is untouched, and is deliberately not extended to this.
600
+
601
+ The rule's full statement is in `scripts/phi-scan.ts` under "NON-REGULAR ENTRIES". This entry
602
+ keeps the readings, because a reader deserves the evidence that the defect was real; the design
603
+ argument stays in that one place — why nothing is followed, the two residuals it discloses, and
604
+ the bound the listing flag moved. The split is deliberate: the previous version of this guard
605
+ ended up described in four files per repository, and every review found a drifted claim in one of
606
+ them.
607
+
608
+ - **The `attw` publish gate passed on a build that shipped no type declarations.** `attw` prints
609
+ "This package does not contain types." and **exits 0** — not a bug in `attw`, since an untyped
610
+ package is a legitimate npm package, so `getExitCode()` returns before the problem list is read and
611
+ no `--profile`, `--ignore-rules` or config setting reaches that early return. For a package that
612
+ does ship types it means the declarations were not in the tarball: a broken publish, reported as a
613
+ pass. Measured here with this repo's own arguments and no concurrency, both `rm -rf dist && pnpm
614
+ attw` and `find dist -name '*.d.*ts' -delete && pnpm attw` printed the sentence and exited 0.
615
+
616
+ **The trigger is the build, not a race.** `tsup` emits JavaScript in one pass and declarations in a
617
+ later one, so every build here has a window where `dist/` holds `.mjs`/`.cjs` and no `.d.ts` —
618
+ measured at 6.4 s, 8.6 s and 7.4 s across three consecutive clean builds, against a whole build of
619
+ roughly 11 s, and wide because this package emits declarations for eight entry points. A concurrent
620
+ build or a `clean` in the same tree lands the gate inside it. That is why the answer is not a lock
621
+ or a build queue: the gate must be able to report that its own inputs were missing.
622
+
623
+ **The scope is narrower than it first looks.** With the root entry intact and one subpath's
624
+ declarations missing, `attw` reports `UntypedResolution` and exits 1 on its own — a partial loss is
625
+ its catch, not ours. What silences it is every entry point being untyped at once, which is what
626
+ `rm -rf dist`, `clean` and the build window all produce. The preflight's message says which of
627
+ those it is looking at: it claims the exit-0 counterfactual only when every declared declaration
628
+ file is _missing_, says `attw` would have reported an untyped resolution and exited 1 when some
629
+ survive, and claims no exit code at all when a declaration is present but _zero-byte_ — such a file
630
+ still resolves, so it types the package while declaring nothing. That condition was got wrong twice,
631
+ both times overclaiming exit 0: first keyed on _any_ missing declaration, then on every declared
632
+ declaration being broken, which counts an empty one as gone.
633
+
634
+ The `attw` script now runs through `scripts/attw.mjs`, with two nets. A **preflight** requires every
635
+ relative path `package.json` promises (`main`, `module`, `types`, `typings`, and every string leaf
636
+ of `exports`, across all eight published subpaths) to exist and be non-empty before `attw` runs; it
637
+ names the missing artifact, where `attw` names none. A **post-check** turns a reported untyped
638
+ package into a failure, covering what the preflight structurally cannot — declarations present on
639
+ disk but excluded from the tarball by `files` or `.npmignore`.
640
+
641
+ Because the post-check reads printed output, the arguments the wrapper forwards are an
642
+ **allow-list** — `--profile` and `--no-definitely-typed`, nothing else. Six routes were measured to
643
+ make the sentence unreadable while `attw` still exited 0: `--quiet`, `-q`, `--format json`,
644
+ `-f json`, `--format=json`, and a `.attw.json` setting `quiet` or `format`. A deny-list of those
645
+ spellings was tried first and did not hold — it compared `arg.split("=")[0]`, so a value fused to a
646
+ short flag (`-fjson`) was neither `-f` nor `--format` and restored the exact false green.
647
+ Enumerating spellings buys one more per round, so the guard is total instead. The `.attw.json`
648
+ refusal is separate, because `readConfig()` applies it after argv and no argument guard can reach
649
+ it.
650
+
651
+ `--profile node16` is unchanged and still applied, forwarded through the wrapper rather than baked
652
+ into it, with the forwarding pinned by a test. **No published code changes** — no runtime code, no
653
+ types, not one generated byte under `dist/`. The tarball is not byte-identical: `CHANGELOG.md` is
654
+ in `files` and this entry is in it, and `package.json` always ships and now carries a different
655
+ `attw` script. Nothing a consumer imports or executes moves.
656
+ This changes what the release gate will let through. `test/scripts/attw-gate.test.ts` pins the upstream exit-0 as well as the fix, so
657
+ an `attw` upgrade that rewords the sentence or fixes the exit code reds the suite instead of letting
658
+ the net go slack, plus a negative control on a well-formed package and that a real `attw` failure
659
+ still fails with its own status.
660
+
661
+ - **A file that appeared and disappeared while the PHI gate was running made it refuse the whole
662
+ sweep.** A full scan lists every file under `src/`, `test/` and `scripts/` and then reads them one
663
+ by one. Anything created and deleted between those two steps was read after it was gone, and the
664
+ scanner stopped with an error rather than a verdict. That is reachable in this repository rather
665
+ than theoretical: the gate's own test suite writes short-lived files into two of the three
666
+ directories it scans, and sweeping the working tree while that suite ran stopped 8 of 165 sweeps.
667
+ A sibling package hit the same shape from its build tool and it blocked a release.
668
+
669
+ **The refusal was right; the file list was wrong, so the list is what changed.** Exactly one case
670
+ is now tolerated: a file the scan listed itself, that is not committed, and that is missing when
671
+ the scan reaches it. It is reported on stderr as skipped, never dropped in silence, and the
672
+ "files scanned" figure counts what was actually read, so a skip lowers it instead of padding it.
673
+
674
+ **Everything else still stops the scan.** A committed file that cannot be read, a read that fails
675
+ for any other reason (unreadable is not the same as absent), a skipped file that is back on disk
676
+ when the scan finishes, and a repository that cannot report what it tracks. A full scan that ends
677
+ up having read nothing at all is refused outright, so tolerating a missing file can never turn
678
+ into a clean report of a tree nothing was read from. Pre-commit scans read committed content
679
+ directly and never depended on any of this.
680
+
681
+ Each of those bounds is pinned by a test that reds when the bound is widened, verified by widening
682
+ each one in turn. **One is not pinned and is named here rather than implied:** the check that a
683
+ skipped file has not come back. Reaching it needs a timing-dependent test, which is the failure
684
+ this defect teaches, so it is left uncovered deliberately; losing it would cost that re-check, not
685
+ the tolerance's limits. **One residual is disclosed rather than closed:** the re-check matches on
686
+ the file's path, not its contents, so an uncommitted file _renamed_ mid-scan goes unread under a
687
+ clean report. Committing it makes it tracked and no longer tolerable, and pre-commit reads
688
+ committed content either way. Closing it in general needs a content-addressed scan; re-listing the
689
+ scanned directories afterwards would close the in-directory half more cheaply, at the cost of a
690
+ second walk and a new way to refuse. Both are a design trade for a later change rather than
691
+ something impossible.
692
+
693
+ **Two smaller limits are recorded rather than closed, and both fail in the refusing direction.**
694
+ When the repository cannot report what it tracks the scan still stops, but the message names the
695
+ file it could not read rather than that reason. And the tracked-file list is read through a 1 MiB
696
+ buffer, so a repository large enough to exceed it would quietly stop applying the tolerance —
697
+ measured here at 6,556 bytes, three orders of magnitude of headroom.
698
+
550
699
  - **The test suite could fail on a busy machine while the code under test was correct.** The
551
700
  per-test timeout is a wall-clock budget, so it measures the machine as much as the code. These
552
701
  suites are CPU-bound, in that their running time is set by how much processor they actually get
package/dist/index.cjs CHANGED
@@ -531,7 +531,7 @@ function resolveMix(allowed, requested, fallback) {
531
531
  }
532
532
 
533
533
  // src/index.ts
534
- var VERSION = "0.0.0";
534
+ var VERSION = "0.0.6";
535
535
 
536
536
  exports.DEA_REGISTRANT_TYPES = DEA_REGISTRANT_TYPES;
537
537
  exports.DOC_V6_PREFIX = DOC_V6_PREFIX;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rng/splitmix32.ts","../src/rng/sfc32.ts","../src/codes.ts","../src/rng/rng.ts","../src/safe/reserved.ts","../src/safe/names-pool.ts","../src/safe/providers.ts","../src/safe/index.ts","../src/corpus.ts","../src/profile.ts","../src/quirk.ts","../src/select.ts","../src/index.ts"],"names":["name"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `splitmix32` — a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed —\n * and only the seed — determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state) — the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets** — statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it — {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * Stable diagnostic codes for `@cosyte/synth` and the {@link SynthError} they travel on.\n *\n * Unlike a parser (which recovers from bad *input* into Tier-2 warnings), a **generator** has no input\n * to tolerate — its reflex is *synthetic-by-construction* and *fail-closed on impossibility*. So the\n * codes here are **fatal**: a caller asked for something the library cannot honor spec-clean, and the\n * only safe answer is to throw, never to silently fabricate a value or a byte workaround. Codes are `key ===\n * value` and part of the public contract —\n * renaming one is a breaking change.\n *\n * @module\n */\n\n/**\n * The stable **fatal** code registry. Additions-only thereafter.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SynthError } from \"@cosyte/synth\";\n * try {\n * // ...generate...\n * } catch (err) {\n * if (err instanceof SynthError && err.code === SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT) {\n * // handle an unsupported format request\n * }\n * }\n * ```\n */\nexport const SYNTH_FATAL_CODES = {\n /**\n * A format was requested that this build cannot generate through a real parser builder/serializer.\n * Fatal — never a hand-written byte fallback.\n *\n * **No code path in this build raises it.** All six formats generate, so it is reserved for a\n * future format that does not, and is kept because removing a published code is a breaking change.\n * An unsupported *kind* within a format that does generate is `SYNTH_UNSUPPORTED_KIND`.\n */\n SYNTH_UNSUPPORTED_FORMAT: \"SYNTH_UNSUPPORTED_FORMAT\",\n /**\n * A vendor quirk was requested that the target format's profile system does not support. Fatal —\n * never a silent no-op and never a fabricated quirk.\n */\n SYNTH_UNSUPPORTED_QUIRK: \"SYNTH_UNSUPPORTED_QUIRK\",\n /**\n * A quirk transform found no structural anchor to mutate, so the fixture would not carry the\n * deviation it is labelled with. Fatal — a golden file that lies about its parser verdict is worse\n * than no golden file.\n */\n SYNTH_QUIRK_ANCHOR_ABSENT: \"SYNTH_QUIRK_ANCHOR_ABSENT\",\n /**\n * A bare parse of a freshly-generated quirk artifact did not produce exactly the declared intended\n * warning code(s). Fatal — never emit a mislabeled fixture.\n */\n SYNTH_INTENDED_WARNING_MISMATCH: \"SYNTH_INTENDED_WARNING_MISMATCH\",\n /** A concept's code-system URI has no OID mapping in the C-CDA example-code table. Fatal. */\n SYNTH_UNMAPPED_CODE_SYSTEM: \"SYNTH_UNMAPPED_CODE_SYSTEM\",\n /** A money value could not be read as an X12 decimal. Fatal — a generator never rounds to a float. */\n SYNTH_INVALID_DECIMAL: \"SYNTH_INVALID_DECIMAL\",\n /** An integer range was requested with its maximum below its minimum. Fatal. */\n SYNTH_INVALID_RANGE: \"SYNTH_INVALID_RANGE\",\n /** A value was drawn from an empty pool. Fatal — never a fabricated substitute. */\n SYNTH_EMPTY_POOL: \"SYNTH_EMPTY_POOL\",\n /** A `defineSynthProfile` spec was not usable (a missing or blank `name`). Fatal. */\n SYNTH_INVALID_PROFILE: \"SYNTH_INVALID_PROFILE\",\n /**\n * A caller-supplied selector (a message kind, a document type, a corpus mix entry, a claim\n * variant, a Bundle type, a resource profile) is not in the closed set that governs it. Fatal —\n * see `resolveKind`: a selector union is erased at run time, and a selector that falls through\n * either mislabels the fixture or hands the value to a peer builder that quotes it back.\n */\n SYNTH_UNSUPPORTED_KIND: \"SYNTH_UNSUPPORTED_KIND\",\n} as const;\n\n/**\n * A value from {@link SYNTH_FATAL_CODES} — the type carried by a thrown {@link SynthError}.\n */\nexport type SynthFatalCode = (typeof SYNTH_FATAL_CODES)[keyof typeof SYNTH_FATAL_CODES];\n\n/**\n * The **frozen message registry** — the only place a {@link SynthError} message can come from.\n *\n * A message here is a fixed string. It never quotes the request that produced it, and there is no\n * parameter through which it could: {@link SynthError} takes a code and nothing else. That is the\n * whole mechanism, and it is deliberately a mechanism rather than a habit. Every one of these\n * messages used to be assembled by interpolating the caller's value into a template, and the reason\n * that was safe was not the design — it was that the caller happened to be passing a quirk name.\n *\n * The trade is real and is accepted: a fatal no longer tells you *which* value it rejected. It tells\n * you which rule refused, on `err.code`, and the stack frame tells you where. The caller already\n * holds the value it passed.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES } from \"@cosyte/synth\";\n * SYNTH_FATAL_MESSAGES[SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL]; // => \"A value was drawn from an empty pool.\"\n * ```\n */\nexport const SYNTH_FATAL_MESSAGES: Readonly<Record<SynthFatalCode, string>> = Object.freeze({\n SYNTH_UNSUPPORTED_FORMAT:\n \"The requested format is not generable by this build. A generator has no byte fallback: it \" +\n \"builds through a parser's own serializer or it refuses.\",\n SYNTH_UNSUPPORTED_QUIRK:\n \"The requested vendor quirk is not in the target format's quirk registry. Compare the request \" +\n \"against that format's exported registry (HL7_QUIRKS, CCDA_QUIRKS, ASTM_QUIRKS).\",\n SYNTH_QUIRK_ANCHOR_ABSENT:\n \"The quirk transform found no structural anchor to mutate, so the fixture would not carry the \" +\n \"deviation it is labelled with. Refusing to emit a mislabeled fixture.\",\n SYNTH_INTENDED_WARNING_MISMATCH:\n \"A bare parse of the generated quirk artifact did not produce exactly the declared intended \" +\n \"warning code(s). Refusing to emit a mislabeled fixture.\",\n SYNTH_UNMAPPED_CODE_SYSTEM:\n \"The concept's code-system URI has no OID mapping in the C-CDA example-code table.\",\n SYNTH_INVALID_DECIMAL: \"The value could not be read as an X12 decimal.\",\n SYNTH_INVALID_RANGE: \"An integer range was requested with its maximum below its minimum.\",\n SYNTH_EMPTY_POOL: \"A value was drawn from an empty pool.\",\n SYNTH_INVALID_PROFILE: \"defineSynthProfile requires a non-empty string name.\",\n SYNTH_UNSUPPORTED_KIND:\n \"The requested kind, document type, corpus mix entry, variant or profile is not one this \" +\n \"generator supports. The supported set is the exported union for that option.\",\n});\n\n/**\n * The typed error every fatal `@cosyte/synth` condition throws. Carries a stable\n * {@link SynthFatalCode} so callers branch on `err.code` without matching message text.\n *\n * It takes **no value parameter**. The message is whatever {@link SYNTH_FATAL_MESSAGES} holds for the\n * code, so no caller-supplied string can reach a diagnostic surface by any route — not `message`, not\n * `stack`, not a field on the thrown object.\n *\n * @example\n * ```ts\n * import { SynthError, SYNTH_FATAL_CODES } from \"@cosyte/synth\";\n * throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT);\n * ```\n */\nexport class SynthError extends Error {\n /** The stable fatal code. */\n public readonly code: SynthFatalCode;\n\n /**\n * @param code - The stable {@link SynthFatalCode}. The message comes from the frozen registry.\n */\n public constructor(code: SynthFatalCode) {\n super(SYNTH_FATAL_MESSAGES[code]);\n this.name = \"SynthError\";\n this.code = code;\n }\n}\n","/**\n * `Rng` — the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed — and only the seed — determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run — the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable — its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_RANGE);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL);\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic** — the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: authoritative ranges published by SSA, NANPA, and the\n * IETF that are guaranteed never to denote a real person or a real routable resource. Every provider\n * draws only from these; the predicates here are the executable half of the CI synthetic-safety gate —\n * they let a test assert that no emitted value falls **outside** a reserved source.\n *\n * Sources:\n * - **SSN** — SSA never issues area numbers `000`, `666`, or `900–999`; the `987-65-4320…4329` block\n * is SSA's explicitly-reserved advertising range. (ssa.gov)\n * - **Phone** — NANP reserves `555-0100…555-0199` as the fictional/non-working line range. (nanpa.com)\n * - **Email/domain** — RFC 2606 / RFC 6761 reserved: `example.com`/`.net`/`.org` and the `.example`,\n * `.test`, `.invalid`, `.localhost` TLDs.\n * - **IP** — RFC 5737 IPv4 TEST-NET-1/2/3 (`192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`) and\n * RFC 3849 IPv6 documentation prefix `2001:db8::/32`.\n * - **NPI** — a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base (CMS NPI check-digit rule, ISO\n * 7812). A number whose check digit is **wrong** therefore cannot be a NPPES-issued NPI. `synth`\n * emits NPIs with a deliberately-invalid check digit, so no generated NPI can collide with a real\n * provider.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under. There is **no** reserved MRN range (an MRN is unique only within its assigning-authority /\n * OID namespace), so — a documented design decision — every synthetic identifier\n * is scoped to a namespace that clearly cannot be a real facility's: a `SYNTH`-labelled authority whose\n * OID lives under HL7's designated **example** root `2.16.840.1.113883.19`. A value under this AA can\n * never collide with a real record because the *namespace itself* is synthetic.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id — an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check (the CMS NPI check-digit\n * rule — `80840` is the ISO 7812 issuer identifier for the US health-application namespace). A real\n * NPI satisfies `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base — the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * @param base9 - The 9-digit NPI base (positions 1–9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3 — so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose — they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The published DEA checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1–6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic** — its check digit\n * (the 7th digit) does **not** match the published DEA checksum, so it cannot be a validly-issued DEA\n * registration. A checksum-valid DEA number (which *could* denote a real prescriber) returns `false`; a\n * value that is not the DEA shape returns `false`.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base — true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic** — i.e. its check digit is invalid, so it cannot be\n * a NPPES-issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true — invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false — Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string is drawn from an SSA never-issued / reserved\n * space — area `000`, `666`, or `900–999`. A real, issuable SSN returns `false`.\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (never issued)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool** — `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address — the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose — structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer — every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng} — same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address — synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits) — unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN** — dashed `AAA-GG-SSSS`. Default draws the SSA never-issued area space\n * (`900–999`); `block: \"advertising\"` draws SSA's reserved advertising block (`987-65-4320…4329`).\n * A value from this function can never be a real SSN.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // SSA's explicitly-reserved advertising block: last digit 0..9 within -4320..-4329.\n return `987-65-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n const group = rng.digits(2);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block — `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain — `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32` — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker —\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI** — a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true — invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number** — `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so — like {@link npi} — non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true — invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address** — a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations — structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace — the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool — no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * The `Corpus` abstraction — a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen** — this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact — the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from — regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * `defineSynthProfile` — the growth-loop hook for site/vendor fixture recipes. A profile bundles the\n * value pools and the quirk recipe a fixture set should use, authored through the same public API as\n * the built-ins: a validated, frozen `SynthProfile` carrying a name, optional value overrides, and the\n * quirk names a format's quirk corpus should apply.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/** The user-authored spec passed to {@link defineSynthProfile}. */\nexport interface SynthProfileSpec {\n /** A stable, human-readable profile name (e.g. `\"acme-hospital\"`). Required, non-empty. */\n readonly name: string;\n /** Optional given-name pool override (clearly-synthetic names only — see the safety invariant). */\n readonly givenNames?: readonly string[];\n /** Optional family-name pool override (clearly-synthetic names only). */\n readonly familyNames?: readonly string[];\n /**\n * The vendor quirk recipe names this profile requests. Validated against the target format's quirk\n * registry when the profile drives a quirk corpus (an unsupported quirk is a fatal\n * `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op).\n */\n readonly quirks?: readonly string[];\n}\n\n/** A frozen, validated fixture recipe produced by {@link defineSynthProfile}. */\nexport interface SynthProfile {\n /** The profile name. */\n readonly name: string;\n /** The given-name pool this profile draws from (overrides or the built-in default). */\n readonly givenNames?: readonly string[];\n /** The family-name pool this profile draws from. */\n readonly familyNames?: readonly string[];\n /** The requested quirk recipe names. */\n readonly quirks: readonly string[];\n}\n\n/**\n * Define a reusable, frozen synthetic-fixture profile.\n *\n * @param spec - The profile spec; `name` is required and non-empty.\n * @returns A deep-frozen {@link SynthProfile}.\n * @throws SynthError `SYNTH_INVALID_PROFILE` when `name` is missing or blank.\n * @example\n * ```ts\n * import { defineSynthProfile } from \"@cosyte/synth\";\n * const acme = defineSynthProfile({ name: \"acme-hospital\", quirks: [] });\n * ```\n */\nexport function defineSynthProfile(spec: SynthProfileSpec): SynthProfile {\n if (typeof spec.name !== \"string\" || spec.name.trim().length === 0) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_PROFILE);\n }\n return Object.freeze({\n name: spec.name,\n ...(spec.givenNames ? { givenNames: Object.freeze([...spec.givenNames]) } : {}),\n ...(spec.familyNames ? { familyNames: Object.freeze([...spec.familyNames]) } : {}),\n quirks: Object.freeze([...(spec.quirks ?? [])]),\n });\n}\n","/**\n * The **quirk core**. Where the spec-clean generators prove\n * *synthetic-by-construction* through each parser's own builder, the quirk layer proves the mirror\n * property: a **deliberately off-spec** fixture round-trips to **exactly the intended parser warning\n * code(s)** — no more, no fewer. The quirk vocabulary **is the parsers' own profile systems**\n * (`hl7.defineProfile`, `ccda.defineCcdaProfile`, `astm.defineAstmProfile`): a quirk exercises exactly\n * the tolerance the corresponding parser profile encodes, so a quirk fixture is never a fiction — it\n * targets a documented, coded leniency (the **intended-warning contract**).\n *\n * This module is the **format-agnostic** part: the descriptor a quirk carries, the artifact a quirk\n * generator returns, the round-trip verdict shape, and the `SYNTH_UNSUPPORTED_QUIRK` fail-closed. Each\n * format's concrete quirk recipes + transforms live behind its own subpath (`@cosyte/synth/hl7`, …).\n *\n * @module\n */\n\nimport type { SynthFormat } from \"./corpus.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\nimport type { SynthProfile } from \"./profile.js\";\n\n/**\n * How the parser's matching profile treats a quirk once it is active — the three shapes the parsers'\n * profile systems actually exhibit (verified firsthand against each parser):\n *\n * - `\"suppressed\"` — the profile makes the warning **disappear** (HL7 v2: a `defineProfile`\n * `customSegments` claim suppresses `UNKNOWN_SEGMENT` for a declared Z-segment).\n * - `\"rebadged\"` — the profile **downgrades** the warning to the value-free `PROFILE_QUIRK_APPLIED`\n * marker with `expected: true` (C-CDA `defineCcdaProfile` / ASTM `defineAstmProfile`\n * `profileQuirkApplied`).\n * - `\"bare\"` — no shipped profile tolerates it; the quirk targets a real coded leniency a consumer can\n * tolerate via their own `defineProfile`/`defineAstmProfile`, but no built-in re-badges it.\n */\nexport type QuirkProfileDisposition = \"suppressed\" | \"rebadged\" | \"bare\";\n\n/**\n * The stable, value-free re-badge code the C-CDA and ASTM parsers emit when a profile tolerates a\n * quirk. HL7 v2 has no equivalent (it suppresses instead — see {@link QuirkProfileDisposition}).\n */\nexport const PROFILE_QUIRK_APPLIED = \"PROFILE_QUIRK_APPLIED\";\n\n/**\n * A public, grounded description of one vendor quirk — the metadata that binds a quirk recipe to a real\n * parser warning code and a **publicly-groundable** deviation (cited-public, never a private\n * vendor corpus).\n */\nexport interface QuirkDescriptor {\n /** The quirk recipe name (e.g. `\"unknown-zsegment\"`). Stable; part of the public contract. */\n readonly name: string;\n /** The format this quirk applies to. */\n readonly format: SynthFormat;\n /**\n * The **exact** parser warning code(s) a bare parse (no profile) surfaces for this quirk — the\n * intended-warning contract. A quirk that produces any other code, or none, is a generation bug.\n */\n readonly intendedWarnings: readonly string[];\n /**\n * The **public** grounding for this quirk — the spec clause or the parser's public profile that\n * documents the tolerance. Never a private vendor-attributed corpus.\n */\n readonly grounding: string;\n /** The parser profile that tolerates this quirk (when a built-in public one exists). */\n readonly toleratingProfile?: string;\n /** How {@link toleratingProfile} treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n}\n\n/** One generated quirk artifact — the off-spec wire text plus the contract it is meant to satisfy. */\nexport interface QuirkArtifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** The quirk recipe applied. */\n readonly quirk: string;\n /** The underlying spec-clean message kind the quirk was injected into (e.g. `\"ORU^R01\"`). */\n readonly kind: string;\n /** The **quirked** wire text (deterministic in the seed + quirk). */\n readonly content: string;\n /** The exact parser warning code(s) this artifact is meant to round-trip to. */\n readonly intendedWarnings: readonly string[];\n}\n\n/** The verdict of a bare parse under the tolerating profile, if any. */\nexport interface QuirkProfiledVerdict {\n /** The profile applied. */\n readonly profileName: string;\n /** How the profile treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n /** The warning codes the parser emitted with the profile active. */\n readonly warnings: readonly string[];\n /**\n * `true` iff the profile handled the quirk as its disposition declares: `\"suppressed\"` ⇒ the intended\n * code is gone; `\"rebadged\"` ⇒ the intended code is gone and `PROFILE_QUIRK_APPLIED` is present.\n */\n readonly tolerated: boolean;\n}\n\n/** The verdict of round-tripping a quirk artifact through its parser. */\nexport interface QuirkRoundTripResult {\n /** The quirked wire text that was parsed. */\n readonly content: string;\n /** The warning codes a **bare** parse (no profile) emitted. */\n readonly warnings: readonly string[];\n /** The exact code(s) the quirk is meant to produce. */\n readonly intendedWarnings: readonly string[];\n /**\n * `true` iff the bare parse produced **exactly** the intended code(s) — the intended-warning contract.\n */\n readonly intendedWarningHeld: boolean;\n /** The verdict under the tolerating profile, when a built-in public one exists. */\n readonly withProfile?: QuirkProfiledVerdict;\n}\n\n/**\n * Exact multiset (order-independent) equality of two code lists — the intended-warning comparison.\n *\n * @param a - The first code list.\n * @param b - The second code list.\n * @returns `true` iff the two lists contain the same codes with the same multiplicities.\n * @example\n * ```ts\n * import { sameCodeSet } from \"@cosyte/synth\";\n * sameCodeSet([\"A\", \"B\"], [\"B\", \"A\"]); // true\n * ```\n */\nexport function sameCodeSet(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const counts = new Map<string, number>();\n for (const c of a) counts.set(c, (counts.get(c) ?? 0) + 1);\n for (const c of b) {\n const n = counts.get(c);\n if (n === undefined) return false;\n if (n === 1) counts.delete(c);\n else counts.set(c, n - 1);\n }\n return counts.size === 0;\n}\n\n/**\n * Resolve a requested quirk name against a format's registry, or **fail closed**. A quirk the format's\n * profile system does not support is a fatal `SYNTH_UNSUPPORTED_QUIRK` — never a silent no-op and never\n * a fabricated quirk with a made-up warning.\n *\n * The refusal names neither the request nor the registry. `registry`, `format` and `name` are all\n * caller-supplied, and a diagnostic that quotes its input is a diagnostic that can be made to carry\n * anything the caller was holding — which for a fixture generator wired into someone else's pipeline\n * is not a hypothetical. Branch on `err.code`; the supported set is the registry you passed\n * (`HL7_QUIRKS`, `CCDA_QUIRKS`, `ASTM_QUIRKS`), which you can enumerate directly.\n *\n * @param registry - The format's quirk descriptors, keyed by name.\n * @param format - The format being generated.\n * @param name - The requested quirk name.\n * @returns The matching {@link QuirkDescriptor}.\n * @throws SynthError with code `SYNTH_UNSUPPORTED_QUIRK` when `name` is not a supported quirk.\n * @example\n * ```ts\n * import { resolveQuirk } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * resolveQuirk(HL7_QUIRKS, \"hl7v2\", \"unknown-zsegment\").intendedWarnings; // [\"UNKNOWN_SEGMENT\"]\n * ```\n */\nexport function resolveQuirk(\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n name: string,\n): QuirkDescriptor {\n const descriptor = registry[name];\n // `format` is compared, never rendered. A descriptor found under the wrong format's registry is a\n // mislabeled fixture waiting to happen, so the mismatch fails closed on the same code.\n if (descriptor === undefined || descriptor.format !== format) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_QUIRK);\n }\n return descriptor;\n}\n\n/**\n * Evaluate whether a profiled parse tolerated a quirk as its disposition declares. Shared across the\n * formats so the \"suppressed vs re-badged\" logic lives in exactly one place.\n *\n * @param disposition - The quirk's declared profile disposition.\n * @param intendedWarnings - The bare-parse intended code(s).\n * @param warningsUnderProfile - The code(s) the parser emitted with the profile active.\n * @returns `true` iff the profile handled the quirk correctly for its disposition.\n * @example\n * ```ts\n * import { profileTolerated } from \"@cosyte/synth\";\n * profileTolerated(\"suppressed\", [\"UNKNOWN_SEGMENT\"], []); // true — the profile suppressed it\n * ```\n */\nexport function profileTolerated(\n disposition: QuirkProfileDisposition,\n intendedWarnings: readonly string[],\n warningsUnderProfile: readonly string[],\n): boolean {\n const stillHasIntended = intendedWarnings.some((c) => warningsUnderProfile.includes(c));\n switch (disposition) {\n case \"suppressed\":\n return !stillHasIntended;\n case \"rebadged\":\n return !stillHasIntended && warningsUnderProfile.includes(PROFILE_QUIRK_APPLIED);\n case \"bare\":\n return false;\n }\n}\n\n/**\n * Assert a freshly-generated quirk artifact **actually** round-trips to its intended warning(s), or\n * **fail closed**. This is the generator's self-check on the intended-warning contract: a\n * fixture whose bare parse does not produce exactly the declared code(s) is a *mislabeled* fixture — a\n * golden file that lies about the parser verdict it anchors — and must never be emitted. It is a\n * stronger guard than \"the transform changed some bytes\": a transform can mutate the wrong element (a\n * template a given document type does not key its warning on) and still change bytes while producing no\n * warning. Every format's `generate*Quirk` calls this after transforming, so the contract is enforced at\n * generation time, not merely at round-trip time.\n *\n * It no longer takes the quirk name. That parameter existed for one reason — to be interpolated into\n * the refusal — and a parameter whose only job is to reach a message is the exact shape this package\n * is removing, so it is gone rather than merely unused. The refusal names neither code list either;\n * both are caller-supplied, and the caller reads the comparison back off the arguments it holds.\n *\n * @param intendedWarnings - The declared intended code(s).\n * @param bareWarnings - The code(s) a bare parse of the generated artifact actually produced.\n * @throws SynthError `SYNTH_INTENDED_WARNING_MISMATCH` when the bare parse did not produce exactly\n * the intended code(s).\n * @example\n * ```ts\n * import { assertIntendedWarnings } from \"@cosyte/synth\";\n * assertIntendedWarnings([\"UNKNOWN_SEGMENT\"], [\"UNKNOWN_SEGMENT\"]); // ok\n * ```\n */\nexport function assertIntendedWarnings(\n intendedWarnings: readonly string[],\n bareWarnings: readonly string[],\n): void {\n if (!sameCodeSet(bareWarnings, intendedWarnings)) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INTENDED_WARNING_MISMATCH);\n }\n}\n\n/**\n * Validate the quirk names carried by a {@link SynthProfile} against a format's registry, failing closed\n * on the first unsupported one. Lets a consumer author a fixture recipe with `defineSynthProfile` and\n * have its quirks checked against the *parser's* real tolerance before any fixture is generated.\n *\n * @param profile - The synth profile whose `quirks` to validate.\n * @param registry - The format's quirk descriptors.\n * @param format - The format being generated.\n * @returns The validated quirk names (the profile's, in order).\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` for the first unsupported quirk.\n * @example\n * ```ts\n * import { validateProfileQuirks, defineSynthProfile } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * const p = defineSynthProfile({ name: \"site\", quirks: [\"unknown-zsegment\"] });\n * validateProfileQuirks(p, HL7_QUIRKS, \"hl7v2\"); // [\"unknown-zsegment\"]\n * ```\n */\nexport function validateProfileQuirks(\n profile: SynthProfile,\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n): readonly string[] {\n for (const name of profile.quirks) resolveQuirk(registry, format, name);\n return profile.quirks;\n}\n","/**\n * The **selector chokepoint**. A generator's options are almost all *selectors*: a message kind, a\n * document type, a corpus mix, a claim variant, a Bundle type, a profile. Each is typed as a closed\n * union, and every one of those unions is **erased at run time**, so a JavaScript caller (or a\n * `as never` in someone's test) reaches the branch with any string at all.\n *\n * Three things went wrong when that was left unchecked, and they are all the same bug:\n *\n * 1. **The value reached a diagnostic.** An unrecognised `documentType` travelled into\n * `@cosyte/ccda`'s `buildCcda`, which is entitled to quote it back in its own `TypeError` and\n * does. This package then has a caller-supplied string on an `err.message` and an `err.stack`,\n * through its own public entry point, having taken no care of it.\n * 2. **The value reached the model.** A corpus mix entry becomes an `Artifact.kind` and a\n * `manifest.counts` key, which is precisely the structural-identifier position a downstream\n * package interpolates to describe a location.\n * 3. **The fixture was silently mislabeled.** An exhaustive `switch` over an erased union takes no\n * branch and returns `undefined`, or a trailing `else` quietly generates something else. A corpus\n * whose manifest says it holds one transaction and holds another is a golden file that lies.\n *\n * So a selector is resolved against its own set, once, before anything is generated, and an\n * unrecognised one is a fatal `SYNTH_UNSUPPORTED_KIND`. Like every fatal here it carries a code and a\n * fixed message, and quotes neither the request nor the set.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/**\n * Resolve one caller-supplied selector against the closed set that governs it, or **fail closed**.\n *\n * @param allowed - Every value the selector may take.\n * @param requested - The selector the caller supplied.\n * @returns `requested`, narrowed to the union.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` when `requested` is not in `allowed`.\n * @example\n * ```ts\n * import { resolveKind } from \"@cosyte/synth\";\n * resolveKind([\"ccd\", \"referralNote\"] as const, \"ccd\"); // \"ccd\"\n * ```\n */\nexport function resolveKind<T extends string>(allowed: readonly T[], requested: string): T {\n const match = allowed.find((value) => value === requested);\n if (match === undefined) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_KIND);\n return match;\n}\n\n/**\n * Resolve every entry of a caller-supplied corpus mix, in order, or **fail closed** on the first\n * unrecognised one.\n *\n * It substitutes the default **only** when the caller supplied nothing, which is exactly what the\n * `??` it replaced did. An empty array is a supplied mix and is returned as one. An earlier version\n * of this function also treated `[]` as \"nothing supplied\", on the stated grounds that it matched the\n * previous behaviour; it did not — `??` fires on `undefined` and never on `[]` — and it changed the\n * result of six published entry points, turning an explicit empty selection into \"generate one of\n * everything\". A convenience that fails open is not a convenience.\n *\n * @param allowed - Every kind the corpus may generate.\n * @param requested - The mix the caller supplied, or `undefined` for the default.\n * @param fallback - The default mix, used only when `requested` is `undefined`.\n * @returns The resolved mix.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` on the first unrecognised entry.\n * @example\n * ```ts\n * import { resolveMix } from \"@cosyte/synth\";\n * resolveMix([\"Result\", \"Order\"] as const, [\"Order\"], [\"Result\", \"Order\"]); // [\"Order\"]\n * ```\n */\nexport function resolveMix<T extends string>(\n allowed: readonly T[],\n requested: readonly string[] | undefined,\n fallback: readonly T[],\n): readonly T[] {\n if (requested === undefined) return fallback;\n return requested.map((entry) => resolveKind(allowed, entry));\n}\n","/**\n * `@cosyte/synth` — a deterministic, seedable **synthetic-data / test-fixture generator** for the\n * cosyte healthcare formats. A *consumer* of the parsers, not a parser: it builds artifacts **through\n * each parser's own builder/serializer** (so output is spec-clean by construction) and draws every\n * value from a **guaranteed-non-colliding synthetic source** (so no output can be real or\n * plausibly-real PHI). It is a **format/conformance generator, not a clinical simulator**.\n *\n * This root entry point exposes the **format-agnostic core**: the seeded PRNG, the synthetic-safety\n * providers, the `Corpus` abstraction, the profile skeleton, and the fatal codes. Per-format\n * generation lives behind its own subpath (`@cosyte/synth/hl7`) so importing the root never pulls a\n * parser — the lazy per-format boundary.\n *\n * @module\n */\n\n/**\n * Library version string, synced with `package.json#version` by downstream release tooling.\n *\n * @example\n * ```ts\n * import { VERSION } from \"@cosyte/synth\";\n * console.log(VERSION);\n * ```\n */\nexport const VERSION = \"0.0.0\";\n\n// ── Seeded, deterministic PRNG (the reproducibility contract, roadmap §5) ──\nexport { createRng, type Rng } from \"./rng/rng.js\";\nexport { splitmix32 } from \"./rng/splitmix32.js\";\nexport { sfc32Next, type Sfc32State } from \"./rng/sfc32.js\";\n\n// ── The synthetic-safety provider layer (roadmap §4) ──\nexport {\n safe,\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n type SyntheticName,\n type SyntheticAddress,\n type SyntheticIdentifier,\n type SsnBlock,\n} from \"./safe/index.js\";\nexport {\n isSyntheticSsn,\n isSyntheticPhone,\n isSyntheticEmail,\n isSyntheticIp,\n isSyntheticNpi,\n npiCheckDigit,\n luhnMod10,\n isSyntheticDea,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n NPI_LUHN_PREFIX,\n} from \"./safe/reserved.js\";\nexport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./safe/names-pool.js\";\n\n// ── The reproducible Corpus abstraction (roadmap §2, §5) ──\nexport {\n makeCorpus,\n type Corpus,\n type CorpusManifest,\n type Artifact,\n type SynthFormat,\n} from \"./corpus.js\";\n\n// ── The profile growth-loop skeleton (roadmap §Phase 1) ──\nexport { defineSynthProfile, type SynthProfile, type SynthProfileSpec } from \"./profile.js\";\n\n// ── The quirk core (roadmap §Phase 7 — the differentiator; format recipes live per-subpath) ──\nexport {\n resolveQuirk,\n sameCodeSet,\n profileTolerated,\n validateProfileQuirks,\n assertIntendedWarnings,\n PROFILE_QUIRK_APPLIED,\n type QuirkDescriptor,\n type QuirkArtifact,\n type QuirkProfileDisposition,\n type QuirkProfiledVerdict,\n type QuirkRoundTripResult,\n} from \"./quirk.js\";\n\n// ── Stable fatal codes + the typed error (roadmap §Phase 1) ──\nexport {\n SYNTH_FATAL_CODES,\n SYNTH_FATAL_MESSAGES,\n SynthError,\n type SynthFatalCode,\n} from \"./codes.js\";\nexport { resolveKind, resolveMix } from \"./select.js\";\n"]}
1
+ {"version":3,"sources":["../src/rng/splitmix32.ts","../src/rng/sfc32.ts","../src/codes.ts","../src/rng/rng.ts","../src/safe/reserved.ts","../src/safe/names-pool.ts","../src/safe/providers.ts","../src/safe/index.ts","../src/corpus.ts","../src/profile.ts","../src/quirk.ts","../src/select.ts","../src/index.ts"],"names":["name"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `splitmix32` — a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed —\n * and only the seed — determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state) — the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets** — statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it — {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * Stable diagnostic codes for `@cosyte/synth` and the {@link SynthError} they travel on.\n *\n * Unlike a parser (which recovers from bad *input* into Tier-2 warnings), a **generator** has no input\n * to tolerate — its reflex is *synthetic-by-construction* and *fail-closed on impossibility*. So the\n * codes here are **fatal**: a caller asked for something the library cannot honor spec-clean, and the\n * only safe answer is to throw, never to silently fabricate a value or a byte workaround. Codes are `key ===\n * value` and part of the public contract —\n * renaming one is a breaking change.\n *\n * @module\n */\n\n/**\n * The stable **fatal** code registry. Additions-only thereafter.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SynthError } from \"@cosyte/synth\";\n * try {\n * // ...generate...\n * } catch (err) {\n * if (err instanceof SynthError && err.code === SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT) {\n * // handle an unsupported format request\n * }\n * }\n * ```\n */\nexport const SYNTH_FATAL_CODES = {\n /**\n * A format was requested that this build cannot generate through a real parser builder/serializer.\n * Fatal — never a hand-written byte fallback.\n *\n * **No code path in this build raises it.** All six formats generate, so it is reserved for a\n * future format that does not, and is kept because removing a published code is a breaking change.\n * An unsupported *kind* within a format that does generate is `SYNTH_UNSUPPORTED_KIND`.\n */\n SYNTH_UNSUPPORTED_FORMAT: \"SYNTH_UNSUPPORTED_FORMAT\",\n /**\n * A vendor quirk was requested that the target format's profile system does not support. Fatal —\n * never a silent no-op and never a fabricated quirk.\n */\n SYNTH_UNSUPPORTED_QUIRK: \"SYNTH_UNSUPPORTED_QUIRK\",\n /**\n * A quirk transform found no structural anchor to mutate, so the fixture would not carry the\n * deviation it is labelled with. Fatal — a golden file that lies about its parser verdict is worse\n * than no golden file.\n */\n SYNTH_QUIRK_ANCHOR_ABSENT: \"SYNTH_QUIRK_ANCHOR_ABSENT\",\n /**\n * A bare parse of a freshly-generated quirk artifact did not produce exactly the declared intended\n * warning code(s). Fatal — never emit a mislabeled fixture.\n */\n SYNTH_INTENDED_WARNING_MISMATCH: \"SYNTH_INTENDED_WARNING_MISMATCH\",\n /** A concept's code-system URI has no OID mapping in the C-CDA example-code table. Fatal. */\n SYNTH_UNMAPPED_CODE_SYSTEM: \"SYNTH_UNMAPPED_CODE_SYSTEM\",\n /** A money value could not be read as an X12 decimal. Fatal — a generator never rounds to a float. */\n SYNTH_INVALID_DECIMAL: \"SYNTH_INVALID_DECIMAL\",\n /** An integer range was requested with its maximum below its minimum. Fatal. */\n SYNTH_INVALID_RANGE: \"SYNTH_INVALID_RANGE\",\n /** A value was drawn from an empty pool. Fatal — never a fabricated substitute. */\n SYNTH_EMPTY_POOL: \"SYNTH_EMPTY_POOL\",\n /** A `defineSynthProfile` spec was not usable (a missing or blank `name`). Fatal. */\n SYNTH_INVALID_PROFILE: \"SYNTH_INVALID_PROFILE\",\n /**\n * A caller-supplied selector (a message kind, a document type, a corpus mix entry, a claim\n * variant, a Bundle type, a resource profile) is not in the closed set that governs it. Fatal —\n * see `resolveKind`: a selector union is erased at run time, and a selector that falls through\n * either mislabels the fixture or hands the value to a peer builder that quotes it back.\n */\n SYNTH_UNSUPPORTED_KIND: \"SYNTH_UNSUPPORTED_KIND\",\n} as const;\n\n/**\n * A value from {@link SYNTH_FATAL_CODES} — the type carried by a thrown {@link SynthError}.\n */\nexport type SynthFatalCode = (typeof SYNTH_FATAL_CODES)[keyof typeof SYNTH_FATAL_CODES];\n\n/**\n * The **frozen message registry** — the only place a {@link SynthError} message can come from.\n *\n * A message here is a fixed string. It never quotes the request that produced it, and there is no\n * parameter through which it could: {@link SynthError} takes a code and nothing else. That is the\n * whole mechanism, and it is deliberately a mechanism rather than a habit. Every one of these\n * messages used to be assembled by interpolating the caller's value into a template, and the reason\n * that was safe was not the design — it was that the caller happened to be passing a quirk name.\n *\n * The trade is real and is accepted: a fatal no longer tells you *which* value it rejected. It tells\n * you which rule refused, on `err.code`, and the stack frame tells you where. The caller already\n * holds the value it passed.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES } from \"@cosyte/synth\";\n * SYNTH_FATAL_MESSAGES[SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL]; // => \"A value was drawn from an empty pool.\"\n * ```\n */\nexport const SYNTH_FATAL_MESSAGES: Readonly<Record<SynthFatalCode, string>> = Object.freeze({\n SYNTH_UNSUPPORTED_FORMAT:\n \"The requested format is not generable by this build. A generator has no byte fallback: it \" +\n \"builds through a parser's own serializer or it refuses.\",\n SYNTH_UNSUPPORTED_QUIRK:\n \"The requested vendor quirk is not in the target format's quirk registry. Compare the request \" +\n \"against that format's exported registry (HL7_QUIRKS, CCDA_QUIRKS, ASTM_QUIRKS).\",\n SYNTH_QUIRK_ANCHOR_ABSENT:\n \"The quirk transform found no structural anchor to mutate, so the fixture would not carry the \" +\n \"deviation it is labelled with. Refusing to emit a mislabeled fixture.\",\n SYNTH_INTENDED_WARNING_MISMATCH:\n \"A bare parse of the generated quirk artifact did not produce exactly the declared intended \" +\n \"warning code(s). Refusing to emit a mislabeled fixture.\",\n SYNTH_UNMAPPED_CODE_SYSTEM:\n \"The concept's code-system URI has no OID mapping in the C-CDA example-code table.\",\n SYNTH_INVALID_DECIMAL: \"The value could not be read as an X12 decimal.\",\n SYNTH_INVALID_RANGE: \"An integer range was requested with its maximum below its minimum.\",\n SYNTH_EMPTY_POOL: \"A value was drawn from an empty pool.\",\n SYNTH_INVALID_PROFILE: \"defineSynthProfile requires a non-empty string name.\",\n SYNTH_UNSUPPORTED_KIND:\n \"The requested kind, document type, corpus mix entry, variant or profile is not one this \" +\n \"generator supports. The supported set is the exported union for that option.\",\n});\n\n/**\n * The typed error every fatal `@cosyte/synth` condition throws. Carries a stable\n * {@link SynthFatalCode} so callers branch on `err.code` without matching message text.\n *\n * It takes **no value parameter**. The message is whatever {@link SYNTH_FATAL_MESSAGES} holds for the\n * code, so no caller-supplied string can reach a diagnostic surface by any route — not `message`, not\n * `stack`, not a field on the thrown object.\n *\n * @example\n * ```ts\n * import { SynthError, SYNTH_FATAL_CODES } from \"@cosyte/synth\";\n * throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT);\n * ```\n */\nexport class SynthError extends Error {\n /** The stable fatal code. */\n public readonly code: SynthFatalCode;\n\n /**\n * @param code - The stable {@link SynthFatalCode}. The message comes from the frozen registry.\n */\n public constructor(code: SynthFatalCode) {\n super(SYNTH_FATAL_MESSAGES[code]);\n this.name = \"SynthError\";\n this.code = code;\n }\n}\n","/**\n * `Rng` — the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed — and only the seed — determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run — the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable — its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_RANGE);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL);\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic** — the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: authoritative ranges published by SSA, NANPA, and the\n * IETF that are guaranteed never to denote a real person or a real routable resource. Every provider\n * draws only from these; the predicates here are the executable half of the CI synthetic-safety gate —\n * they let a test assert that no emitted value falls **outside** a reserved source.\n *\n * Sources:\n * - **SSN** — SSA never issues area numbers `000`, `666`, or `900–999`; the `987-65-4320…4329` block\n * is SSA's explicitly-reserved advertising range. (ssa.gov)\n * - **Phone** — NANP reserves `555-0100…555-0199` as the fictional/non-working line range. (nanpa.com)\n * - **Email/domain** — RFC 2606 / RFC 6761 reserved: `example.com`/`.net`/`.org` and the `.example`,\n * `.test`, `.invalid`, `.localhost` TLDs.\n * - **IP** — RFC 5737 IPv4 TEST-NET-1/2/3 (`192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`) and\n * RFC 3849 IPv6 documentation prefix `2001:db8::/32`.\n * - **NPI** — a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base (CMS NPI check-digit rule, ISO\n * 7812). A number whose check digit is **wrong** therefore cannot be a NPPES-issued NPI. `synth`\n * emits NPIs with a deliberately-invalid check digit, so no generated NPI can collide with a real\n * provider.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under. There is **no** reserved MRN range (an MRN is unique only within its assigning-authority /\n * OID namespace), so — a documented design decision — every synthetic identifier\n * is scoped to a namespace that clearly cannot be a real facility's: a `SYNTH`-labelled authority whose\n * OID lives under HL7's designated **example** root `2.16.840.1.113883.19`. A value under this AA can\n * never collide with a real record because the *namespace itself* is synthetic.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id — an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check (the CMS NPI check-digit\n * rule — `80840` is the ISO 7812 issuer identifier for the US health-application namespace). A real\n * NPI satisfies `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base — the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * @param base9 - The 9-digit NPI base (positions 1–9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3 — so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose — they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The published DEA checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1–6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic** — its check digit\n * (the 7th digit) does **not** match the published DEA checksum, so it cannot be a validly-issued DEA\n * registration. A checksum-valid DEA number (which *could* denote a real prescriber) returns `false`; a\n * value that is not the DEA shape returns `false`.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base — true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic** — i.e. its check digit is invalid, so it cannot be\n * a NPPES-issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true — invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false — Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string is drawn from an SSA never-issued / reserved\n * space — area `000`, `666`, or `900–999`. A real, issuable SSN returns `false`.\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (never issued)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool** — `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address — the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose — structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer — every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng} — same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address — synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits) — unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN** — dashed `AAA-GG-SSSS`. Default draws the SSA never-issued area space\n * (`900–999`); `block: \"advertising\"` draws SSA's reserved advertising block (`987-65-4320…4329`).\n * A value from this function can never be a real SSN.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // SSA's explicitly-reserved advertising block: last digit 0..9 within -4320..-4329.\n return `987-65-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n const group = rng.digits(2);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block — `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain — `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32` — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker —\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI** — a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true — invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number** — `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so — like {@link npi} — non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true — invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address** — a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations — structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace — the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool — no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * The `Corpus` abstraction — a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen** — this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact — the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from — regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * `defineSynthProfile` — the growth-loop hook for site/vendor fixture recipes. A profile bundles the\n * value pools and the quirk recipe a fixture set should use, authored through the same public API as\n * the built-ins: a validated, frozen `SynthProfile` carrying a name, optional value overrides, and the\n * quirk names a format's quirk corpus should apply.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/** The user-authored spec passed to {@link defineSynthProfile}. */\nexport interface SynthProfileSpec {\n /** A stable, human-readable profile name (e.g. `\"acme-hospital\"`). Required, non-empty. */\n readonly name: string;\n /** Optional given-name pool override (clearly-synthetic names only — see the safety invariant). */\n readonly givenNames?: readonly string[];\n /** Optional family-name pool override (clearly-synthetic names only). */\n readonly familyNames?: readonly string[];\n /**\n * The vendor quirk recipe names this profile requests. Validated against the target format's quirk\n * registry when the profile drives a quirk corpus (an unsupported quirk is a fatal\n * `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op).\n */\n readonly quirks?: readonly string[];\n}\n\n/** A frozen, validated fixture recipe produced by {@link defineSynthProfile}. */\nexport interface SynthProfile {\n /** The profile name. */\n readonly name: string;\n /** The given-name pool this profile draws from (overrides or the built-in default). */\n readonly givenNames?: readonly string[];\n /** The family-name pool this profile draws from. */\n readonly familyNames?: readonly string[];\n /** The requested quirk recipe names. */\n readonly quirks: readonly string[];\n}\n\n/**\n * Define a reusable, frozen synthetic-fixture profile.\n *\n * @param spec - The profile spec; `name` is required and non-empty.\n * @returns A deep-frozen {@link SynthProfile}.\n * @throws SynthError `SYNTH_INVALID_PROFILE` when `name` is missing or blank.\n * @example\n * ```ts\n * import { defineSynthProfile } from \"@cosyte/synth\";\n * const acme = defineSynthProfile({ name: \"acme-hospital\", quirks: [] });\n * ```\n */\nexport function defineSynthProfile(spec: SynthProfileSpec): SynthProfile {\n if (typeof spec.name !== \"string\" || spec.name.trim().length === 0) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_PROFILE);\n }\n return Object.freeze({\n name: spec.name,\n ...(spec.givenNames ? { givenNames: Object.freeze([...spec.givenNames]) } : {}),\n ...(spec.familyNames ? { familyNames: Object.freeze([...spec.familyNames]) } : {}),\n quirks: Object.freeze([...(spec.quirks ?? [])]),\n });\n}\n","/**\n * The **quirk core**. Where the spec-clean generators prove\n * *synthetic-by-construction* through each parser's own builder, the quirk layer proves the mirror\n * property: a **deliberately off-spec** fixture round-trips to **exactly the intended parser warning\n * code(s)** — no more, no fewer. The quirk vocabulary **is the parsers' own profile systems**\n * (`hl7.defineProfile`, `ccda.defineCcdaProfile`, `astm.defineAstmProfile`): a quirk exercises exactly\n * the tolerance the corresponding parser profile encodes, so a quirk fixture is never a fiction — it\n * targets a documented, coded leniency (the **intended-warning contract**).\n *\n * This module is the **format-agnostic** part: the descriptor a quirk carries, the artifact a quirk\n * generator returns, the round-trip verdict shape, and the `SYNTH_UNSUPPORTED_QUIRK` fail-closed. Each\n * format's concrete quirk recipes + transforms live behind its own subpath (`@cosyte/synth/hl7`, …).\n *\n * @module\n */\n\nimport type { SynthFormat } from \"./corpus.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\nimport type { SynthProfile } from \"./profile.js\";\n\n/**\n * How the parser's matching profile treats a quirk once it is active — the three shapes the parsers'\n * profile systems actually exhibit (verified firsthand against each parser):\n *\n * - `\"suppressed\"` — the profile makes the warning **disappear** (HL7 v2: a `defineProfile`\n * `customSegments` claim suppresses `UNKNOWN_SEGMENT` for a declared Z-segment).\n * - `\"rebadged\"` — the profile **downgrades** the warning to the value-free `PROFILE_QUIRK_APPLIED`\n * marker with `expected: true` (C-CDA `defineCcdaProfile` / ASTM `defineAstmProfile`\n * `profileQuirkApplied`).\n * - `\"bare\"` — no shipped profile tolerates it; the quirk targets a real coded leniency a consumer can\n * tolerate via their own `defineProfile`/`defineAstmProfile`, but no built-in re-badges it.\n */\nexport type QuirkProfileDisposition = \"suppressed\" | \"rebadged\" | \"bare\";\n\n/**\n * The stable, value-free re-badge code the C-CDA and ASTM parsers emit when a profile tolerates a\n * quirk. HL7 v2 has no equivalent (it suppresses instead — see {@link QuirkProfileDisposition}).\n */\nexport const PROFILE_QUIRK_APPLIED = \"PROFILE_QUIRK_APPLIED\";\n\n/**\n * A public, grounded description of one vendor quirk — the metadata that binds a quirk recipe to a real\n * parser warning code and a **publicly-groundable** deviation (cited-public, never a private\n * vendor corpus).\n */\nexport interface QuirkDescriptor {\n /** The quirk recipe name (e.g. `\"unknown-zsegment\"`). Stable; part of the public contract. */\n readonly name: string;\n /** The format this quirk applies to. */\n readonly format: SynthFormat;\n /**\n * The **exact** parser warning code(s) a bare parse (no profile) surfaces for this quirk — the\n * intended-warning contract. A quirk that produces any other code, or none, is a generation bug.\n */\n readonly intendedWarnings: readonly string[];\n /**\n * The **public** grounding for this quirk — the spec clause or the parser's public profile that\n * documents the tolerance. Never a private vendor-attributed corpus.\n */\n readonly grounding: string;\n /** The parser profile that tolerates this quirk (when a built-in public one exists). */\n readonly toleratingProfile?: string;\n /** How {@link toleratingProfile} treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n}\n\n/** One generated quirk artifact — the off-spec wire text plus the contract it is meant to satisfy. */\nexport interface QuirkArtifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** The quirk recipe applied. */\n readonly quirk: string;\n /** The underlying spec-clean message kind the quirk was injected into (e.g. `\"ORU^R01\"`). */\n readonly kind: string;\n /** The **quirked** wire text (deterministic in the seed + quirk). */\n readonly content: string;\n /** The exact parser warning code(s) this artifact is meant to round-trip to. */\n readonly intendedWarnings: readonly string[];\n}\n\n/** The verdict of a bare parse under the tolerating profile, if any. */\nexport interface QuirkProfiledVerdict {\n /** The profile applied. */\n readonly profileName: string;\n /** How the profile treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n /** The warning codes the parser emitted with the profile active. */\n readonly warnings: readonly string[];\n /**\n * `true` iff the profile handled the quirk as its disposition declares: `\"suppressed\"` ⇒ the intended\n * code is gone; `\"rebadged\"` ⇒ the intended code is gone and `PROFILE_QUIRK_APPLIED` is present.\n */\n readonly tolerated: boolean;\n}\n\n/** The verdict of round-tripping a quirk artifact through its parser. */\nexport interface QuirkRoundTripResult {\n /** The quirked wire text that was parsed. */\n readonly content: string;\n /** The warning codes a **bare** parse (no profile) emitted. */\n readonly warnings: readonly string[];\n /** The exact code(s) the quirk is meant to produce. */\n readonly intendedWarnings: readonly string[];\n /**\n * `true` iff the bare parse produced **exactly** the intended code(s) — the intended-warning contract.\n */\n readonly intendedWarningHeld: boolean;\n /** The verdict under the tolerating profile, when a built-in public one exists. */\n readonly withProfile?: QuirkProfiledVerdict;\n}\n\n/**\n * Exact multiset (order-independent) equality of two code lists — the intended-warning comparison.\n *\n * @param a - The first code list.\n * @param b - The second code list.\n * @returns `true` iff the two lists contain the same codes with the same multiplicities.\n * @example\n * ```ts\n * import { sameCodeSet } from \"@cosyte/synth\";\n * sameCodeSet([\"A\", \"B\"], [\"B\", \"A\"]); // true\n * ```\n */\nexport function sameCodeSet(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const counts = new Map<string, number>();\n for (const c of a) counts.set(c, (counts.get(c) ?? 0) + 1);\n for (const c of b) {\n const n = counts.get(c);\n if (n === undefined) return false;\n if (n === 1) counts.delete(c);\n else counts.set(c, n - 1);\n }\n return counts.size === 0;\n}\n\n/**\n * Resolve a requested quirk name against a format's registry, or **fail closed**. A quirk the format's\n * profile system does not support is a fatal `SYNTH_UNSUPPORTED_QUIRK` — never a silent no-op and never\n * a fabricated quirk with a made-up warning.\n *\n * The refusal names neither the request nor the registry. `registry`, `format` and `name` are all\n * caller-supplied, and a diagnostic that quotes its input is a diagnostic that can be made to carry\n * anything the caller was holding — which for a fixture generator wired into someone else's pipeline\n * is not a hypothetical. Branch on `err.code`; the supported set is the registry you passed\n * (`HL7_QUIRKS`, `CCDA_QUIRKS`, `ASTM_QUIRKS`), which you can enumerate directly.\n *\n * @param registry - The format's quirk descriptors, keyed by name.\n * @param format - The format being generated.\n * @param name - The requested quirk name.\n * @returns The matching {@link QuirkDescriptor}.\n * @throws SynthError with code `SYNTH_UNSUPPORTED_QUIRK` when `name` is not a supported quirk.\n * @example\n * ```ts\n * import { resolveQuirk } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * resolveQuirk(HL7_QUIRKS, \"hl7v2\", \"unknown-zsegment\").intendedWarnings; // [\"UNKNOWN_SEGMENT\"]\n * ```\n */\nexport function resolveQuirk(\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n name: string,\n): QuirkDescriptor {\n const descriptor = registry[name];\n // `format` is compared, never rendered. A descriptor found under the wrong format's registry is a\n // mislabeled fixture waiting to happen, so the mismatch fails closed on the same code.\n if (descriptor === undefined || descriptor.format !== format) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_QUIRK);\n }\n return descriptor;\n}\n\n/**\n * Evaluate whether a profiled parse tolerated a quirk as its disposition declares. Shared across the\n * formats so the \"suppressed vs re-badged\" logic lives in exactly one place.\n *\n * @param disposition - The quirk's declared profile disposition.\n * @param intendedWarnings - The bare-parse intended code(s).\n * @param warningsUnderProfile - The code(s) the parser emitted with the profile active.\n * @returns `true` iff the profile handled the quirk correctly for its disposition.\n * @example\n * ```ts\n * import { profileTolerated } from \"@cosyte/synth\";\n * profileTolerated(\"suppressed\", [\"UNKNOWN_SEGMENT\"], []); // true — the profile suppressed it\n * ```\n */\nexport function profileTolerated(\n disposition: QuirkProfileDisposition,\n intendedWarnings: readonly string[],\n warningsUnderProfile: readonly string[],\n): boolean {\n const stillHasIntended = intendedWarnings.some((c) => warningsUnderProfile.includes(c));\n switch (disposition) {\n case \"suppressed\":\n return !stillHasIntended;\n case \"rebadged\":\n return !stillHasIntended && warningsUnderProfile.includes(PROFILE_QUIRK_APPLIED);\n case \"bare\":\n return false;\n }\n}\n\n/**\n * Assert a freshly-generated quirk artifact **actually** round-trips to its intended warning(s), or\n * **fail closed**. This is the generator's self-check on the intended-warning contract: a\n * fixture whose bare parse does not produce exactly the declared code(s) is a *mislabeled* fixture — a\n * golden file that lies about the parser verdict it anchors — and must never be emitted. It is a\n * stronger guard than \"the transform changed some bytes\": a transform can mutate the wrong element (a\n * template a given document type does not key its warning on) and still change bytes while producing no\n * warning. Every format's `generate*Quirk` calls this after transforming, so the contract is enforced at\n * generation time, not merely at round-trip time.\n *\n * It no longer takes the quirk name. That parameter existed for one reason — to be interpolated into\n * the refusal — and a parameter whose only job is to reach a message is the exact shape this package\n * is removing, so it is gone rather than merely unused. The refusal names neither code list either;\n * both are caller-supplied, and the caller reads the comparison back off the arguments it holds.\n *\n * @param intendedWarnings - The declared intended code(s).\n * @param bareWarnings - The code(s) a bare parse of the generated artifact actually produced.\n * @throws SynthError `SYNTH_INTENDED_WARNING_MISMATCH` when the bare parse did not produce exactly\n * the intended code(s).\n * @example\n * ```ts\n * import { assertIntendedWarnings } from \"@cosyte/synth\";\n * assertIntendedWarnings([\"UNKNOWN_SEGMENT\"], [\"UNKNOWN_SEGMENT\"]); // ok\n * ```\n */\nexport function assertIntendedWarnings(\n intendedWarnings: readonly string[],\n bareWarnings: readonly string[],\n): void {\n if (!sameCodeSet(bareWarnings, intendedWarnings)) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INTENDED_WARNING_MISMATCH);\n }\n}\n\n/**\n * Validate the quirk names carried by a {@link SynthProfile} against a format's registry, failing closed\n * on the first unsupported one. Lets a consumer author a fixture recipe with `defineSynthProfile` and\n * have its quirks checked against the *parser's* real tolerance before any fixture is generated.\n *\n * @param profile - The synth profile whose `quirks` to validate.\n * @param registry - The format's quirk descriptors.\n * @param format - The format being generated.\n * @returns The validated quirk names (the profile's, in order).\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` for the first unsupported quirk.\n * @example\n * ```ts\n * import { validateProfileQuirks, defineSynthProfile } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * const p = defineSynthProfile({ name: \"site\", quirks: [\"unknown-zsegment\"] });\n * validateProfileQuirks(p, HL7_QUIRKS, \"hl7v2\"); // [\"unknown-zsegment\"]\n * ```\n */\nexport function validateProfileQuirks(\n profile: SynthProfile,\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n): readonly string[] {\n for (const name of profile.quirks) resolveQuirk(registry, format, name);\n return profile.quirks;\n}\n","/**\n * The **selector chokepoint**. A generator's options are almost all *selectors*: a message kind, a\n * document type, a corpus mix, a claim variant, a Bundle type, a profile. Each is typed as a closed\n * union, and every one of those unions is **erased at run time**, so a JavaScript caller (or a\n * `as never` in someone's test) reaches the branch with any string at all.\n *\n * Three things went wrong when that was left unchecked, and they are all the same bug:\n *\n * 1. **The value reached a diagnostic.** An unrecognised `documentType` travelled into\n * `@cosyte/ccda`'s `buildCcda`, which is entitled to quote it back in its own `TypeError` and\n * does. This package then has a caller-supplied string on an `err.message` and an `err.stack`,\n * through its own public entry point, having taken no care of it.\n * 2. **The value reached the model.** A corpus mix entry becomes an `Artifact.kind` and a\n * `manifest.counts` key, which is precisely the structural-identifier position a downstream\n * package interpolates to describe a location.\n * 3. **The fixture was silently mislabeled.** An exhaustive `switch` over an erased union takes no\n * branch and returns `undefined`, or a trailing `else` quietly generates something else. A corpus\n * whose manifest says it holds one transaction and holds another is a golden file that lies.\n *\n * So a selector is resolved against its own set, once, before anything is generated, and an\n * unrecognised one is a fatal `SYNTH_UNSUPPORTED_KIND`. Like every fatal here it carries a code and a\n * fixed message, and quotes neither the request nor the set.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/**\n * Resolve one caller-supplied selector against the closed set that governs it, or **fail closed**.\n *\n * @param allowed - Every value the selector may take.\n * @param requested - The selector the caller supplied.\n * @returns `requested`, narrowed to the union.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` when `requested` is not in `allowed`.\n * @example\n * ```ts\n * import { resolveKind } from \"@cosyte/synth\";\n * resolveKind([\"ccd\", \"referralNote\"] as const, \"ccd\"); // \"ccd\"\n * ```\n */\nexport function resolveKind<T extends string>(allowed: readonly T[], requested: string): T {\n const match = allowed.find((value) => value === requested);\n if (match === undefined) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_KIND);\n return match;\n}\n\n/**\n * Resolve every entry of a caller-supplied corpus mix, in order, or **fail closed** on the first\n * unrecognised one.\n *\n * It substitutes the default **only** when the caller supplied nothing, which is exactly what the\n * `??` it replaced did. An empty array is a supplied mix and is returned as one. An earlier version\n * of this function also treated `[]` as \"nothing supplied\", on the stated grounds that it matched the\n * previous behaviour; it did not — `??` fires on `undefined` and never on `[]` — and it changed the\n * result of six published entry points, turning an explicit empty selection into \"generate one of\n * everything\". A convenience that fails open is not a convenience.\n *\n * @param allowed - Every kind the corpus may generate.\n * @param requested - The mix the caller supplied, or `undefined` for the default.\n * @param fallback - The default mix, used only when `requested` is `undefined`.\n * @returns The resolved mix.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` on the first unrecognised entry.\n * @example\n * ```ts\n * import { resolveMix } from \"@cosyte/synth\";\n * resolveMix([\"Result\", \"Order\"] as const, [\"Order\"], [\"Result\", \"Order\"]); // [\"Order\"]\n * ```\n */\nexport function resolveMix<T extends string>(\n allowed: readonly T[],\n requested: readonly string[] | undefined,\n fallback: readonly T[],\n): readonly T[] {\n if (requested === undefined) return fallback;\n return requested.map((entry) => resolveKind(allowed, entry));\n}\n","/**\n * `@cosyte/synth` — a deterministic, seedable **synthetic-data / test-fixture generator** for the\n * cosyte healthcare formats. A *consumer* of the parsers, not a parser: it builds artifacts **through\n * each parser's own builder/serializer** (so output is spec-clean by construction) and draws every\n * value from a **guaranteed-non-colliding synthetic source** (so no output can be real or\n * plausibly-real PHI). It is a **format/conformance generator, not a clinical simulator**.\n *\n * This root entry point exposes the **format-agnostic core**: the seeded PRNG, the synthetic-safety\n * providers, the `Corpus` abstraction, the profile skeleton, and the fatal codes. Per-format\n * generation lives behind its own subpath (`@cosyte/synth/hl7`) so importing the root never pulls a\n * parser — the lazy per-format boundary.\n *\n * @module\n */\n\n/**\n * Library version string, equal to this package's published `package.json#version`.\n *\n * Changesets owns the bump and rewrites `package.json` only, so the release `version` script runs\n * `scripts/sync-version.mjs` to rewrite this declaration in the same commit, and\n * `test/sanity.test.ts` compares the two so a skipped sync goes red instead of shipping a version\n * string that lies.\n *\n * The `: string` annotation is deliberate: without it the declaration's inferred type is the string\n * literal itself, which bakes the current release into the emitted declarations and narrows every\n * consumer's type on each bump.\n *\n * @example\n * ```ts\n * import { VERSION } from \"@cosyte/synth\";\n * console.log(VERSION);\n * ```\n */\nexport const VERSION: string = \"0.0.6\";\n\n// ── Seeded, deterministic PRNG (the reproducibility contract, roadmap §5) ──\nexport { createRng, type Rng } from \"./rng/rng.js\";\nexport { splitmix32 } from \"./rng/splitmix32.js\";\nexport { sfc32Next, type Sfc32State } from \"./rng/sfc32.js\";\n\n// ── The synthetic-safety provider layer (roadmap §4) ──\nexport {\n safe,\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n type SyntheticName,\n type SyntheticAddress,\n type SyntheticIdentifier,\n type SsnBlock,\n} from \"./safe/index.js\";\nexport {\n isSyntheticSsn,\n isSyntheticPhone,\n isSyntheticEmail,\n isSyntheticIp,\n isSyntheticNpi,\n npiCheckDigit,\n luhnMod10,\n isSyntheticDea,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n NPI_LUHN_PREFIX,\n} from \"./safe/reserved.js\";\nexport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./safe/names-pool.js\";\n\n// ── The reproducible Corpus abstraction (roadmap §2, §5) ──\nexport {\n makeCorpus,\n type Corpus,\n type CorpusManifest,\n type Artifact,\n type SynthFormat,\n} from \"./corpus.js\";\n\n// ── The profile growth-loop skeleton (roadmap §Phase 1) ──\nexport { defineSynthProfile, type SynthProfile, type SynthProfileSpec } from \"./profile.js\";\n\n// ── The quirk core (roadmap §Phase 7 — the differentiator; format recipes live per-subpath) ──\nexport {\n resolveQuirk,\n sameCodeSet,\n profileTolerated,\n validateProfileQuirks,\n assertIntendedWarnings,\n PROFILE_QUIRK_APPLIED,\n type QuirkDescriptor,\n type QuirkArtifact,\n type QuirkProfileDisposition,\n type QuirkProfiledVerdict,\n type QuirkRoundTripResult,\n} from \"./quirk.js\";\n\n// ── Stable fatal codes + the typed error (roadmap §Phase 1) ──\nexport {\n SYNTH_FATAL_CODES,\n SYNTH_FATAL_MESSAGES,\n SynthError,\n type SynthFatalCode,\n} from \"./codes.js\";\nexport { resolveKind, resolveMix } from \"./select.js\";\n"]}
package/dist/index.d.cts CHANGED
@@ -512,7 +512,16 @@ declare function resolveMix<T extends string>(allowed: readonly T[], requested:
512
512
  * @module
513
513
  */
514
514
  /**
515
- * Library version string, synced with `package.json#version` by downstream release tooling.
515
+ * Library version string, equal to this package's published `package.json#version`.
516
+ *
517
+ * Changesets owns the bump and rewrites `package.json` only, so the release `version` script runs
518
+ * `scripts/sync-version.mjs` to rewrite this declaration in the same commit, and
519
+ * `test/sanity.test.ts` compares the two so a skipped sync goes red instead of shipping a version
520
+ * string that lies.
521
+ *
522
+ * The `: string` annotation is deliberate: without it the declaration's inferred type is the string
523
+ * literal itself, which bakes the current release into the emitted declarations and narrows every
524
+ * consumer's type on each bump.
516
525
  *
517
526
  * @example
518
527
  * ```ts
@@ -520,6 +529,6 @@ declare function resolveMix<T extends string>(allowed: readonly T[], requested:
520
529
  * console.log(VERSION);
521
530
  * ```
522
531
  */
523
- declare const VERSION = "0.0.0";
532
+ declare const VERSION: string;
524
533
 
525
534
  export { DEA_REGISTRANT_TYPES, DOC_V6_PREFIX, NPI_LUHN_PREFIX, RESERVED_EMAIL_DOMAINS, SYNTHETIC_ASSIGNING_AUTHORITY, SYNTHETIC_CITY_NAMES, SYNTHETIC_FAMILY_NAMES, SYNTHETIC_GIVEN_NAMES, SYNTHETIC_STREET_NAMES, SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES, type Sfc32State, SynthError, type SynthFatalCode, TEST_NET_V4_PREFIXES, VERSION, address, dateYmd, dea, deaCheckDigit, email, identifier, ipv4, ipv6, isSyntheticDea, isSyntheticEmail, isSyntheticIp, isSyntheticNpi, isSyntheticPhone, isSyntheticSsn, luhnMod10, name, npi, npiCheckDigit, phone, resolveKind, resolveMix, safe, sfc32Next, splitmix32, ssn, uuid };
package/dist/index.d.ts CHANGED
@@ -512,7 +512,16 @@ declare function resolveMix<T extends string>(allowed: readonly T[], requested:
512
512
  * @module
513
513
  */
514
514
  /**
515
- * Library version string, synced with `package.json#version` by downstream release tooling.
515
+ * Library version string, equal to this package's published `package.json#version`.
516
+ *
517
+ * Changesets owns the bump and rewrites `package.json` only, so the release `version` script runs
518
+ * `scripts/sync-version.mjs` to rewrite this declaration in the same commit, and
519
+ * `test/sanity.test.ts` compares the two so a skipped sync goes red instead of shipping a version
520
+ * string that lies.
521
+ *
522
+ * The `: string` annotation is deliberate: without it the declaration's inferred type is the string
523
+ * literal itself, which bakes the current release into the emitted declarations and narrows every
524
+ * consumer's type on each bump.
516
525
  *
517
526
  * @example
518
527
  * ```ts
@@ -520,6 +529,6 @@ declare function resolveMix<T extends string>(allowed: readonly T[], requested:
520
529
  * console.log(VERSION);
521
530
  * ```
522
531
  */
523
- declare const VERSION = "0.0.0";
532
+ declare const VERSION: string;
524
533
 
525
534
  export { DEA_REGISTRANT_TYPES, DOC_V6_PREFIX, NPI_LUHN_PREFIX, RESERVED_EMAIL_DOMAINS, SYNTHETIC_ASSIGNING_AUTHORITY, SYNTHETIC_CITY_NAMES, SYNTHETIC_FAMILY_NAMES, SYNTHETIC_GIVEN_NAMES, SYNTHETIC_STREET_NAMES, SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES, type Sfc32State, SynthError, type SynthFatalCode, TEST_NET_V4_PREFIXES, VERSION, address, dateYmd, dea, deaCheckDigit, email, identifier, ipv4, ipv6, isSyntheticDea, isSyntheticEmail, isSyntheticIp, isSyntheticNpi, isSyntheticPhone, isSyntheticSsn, luhnMod10, name, npi, npiCheckDigit, phone, resolveKind, resolveMix, safe, sfc32Next, splitmix32, ssn, uuid };
package/dist/index.mjs CHANGED
@@ -529,7 +529,7 @@ function resolveMix(allowed, requested, fallback) {
529
529
  }
530
530
 
531
531
  // src/index.ts
532
- var VERSION = "0.0.0";
532
+ var VERSION = "0.0.6";
533
533
 
534
534
  export { DEA_REGISTRANT_TYPES, DOC_V6_PREFIX, NPI_LUHN_PREFIX, PROFILE_QUIRK_APPLIED, RESERVED_EMAIL_DOMAINS, SYNTHETIC_ASSIGNING_AUTHORITY, SYNTHETIC_CITY_NAMES, SYNTHETIC_FAMILY_NAMES, SYNTHETIC_GIVEN_NAMES, SYNTHETIC_STREET_NAMES, SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES, SynthError, TEST_NET_V4_PREFIXES, VERSION, address, assertIntendedWarnings, createRng, dateYmd, dea, deaCheckDigit, defineSynthProfile, email, identifier, ipv4, ipv6, isSyntheticDea, isSyntheticEmail, isSyntheticIp, isSyntheticNpi, isSyntheticPhone, isSyntheticSsn, luhnMod10, makeCorpus, name, npi, npiCheckDigit, phone, profileTolerated, resolveKind, resolveMix, resolveQuirk, safe, sameCodeSet, sfc32Next, splitmix32, ssn, uuid, validateProfileQuirks };
535
535
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rng/splitmix32.ts","../src/rng/sfc32.ts","../src/codes.ts","../src/rng/rng.ts","../src/safe/reserved.ts","../src/safe/names-pool.ts","../src/safe/providers.ts","../src/safe/index.ts","../src/corpus.ts","../src/profile.ts","../src/quirk.ts","../src/select.ts","../src/index.ts"],"names":["name"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * `splitmix32` — a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed —\n * and only the seed — determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state) — the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets** — statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it — {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * Stable diagnostic codes for `@cosyte/synth` and the {@link SynthError} they travel on.\n *\n * Unlike a parser (which recovers from bad *input* into Tier-2 warnings), a **generator** has no input\n * to tolerate — its reflex is *synthetic-by-construction* and *fail-closed on impossibility*. So the\n * codes here are **fatal**: a caller asked for something the library cannot honor spec-clean, and the\n * only safe answer is to throw, never to silently fabricate a value or a byte workaround. Codes are `key ===\n * value` and part of the public contract —\n * renaming one is a breaking change.\n *\n * @module\n */\n\n/**\n * The stable **fatal** code registry. Additions-only thereafter.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SynthError } from \"@cosyte/synth\";\n * try {\n * // ...generate...\n * } catch (err) {\n * if (err instanceof SynthError && err.code === SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT) {\n * // handle an unsupported format request\n * }\n * }\n * ```\n */\nexport const SYNTH_FATAL_CODES = {\n /**\n * A format was requested that this build cannot generate through a real parser builder/serializer.\n * Fatal — never a hand-written byte fallback.\n *\n * **No code path in this build raises it.** All six formats generate, so it is reserved for a\n * future format that does not, and is kept because removing a published code is a breaking change.\n * An unsupported *kind* within a format that does generate is `SYNTH_UNSUPPORTED_KIND`.\n */\n SYNTH_UNSUPPORTED_FORMAT: \"SYNTH_UNSUPPORTED_FORMAT\",\n /**\n * A vendor quirk was requested that the target format's profile system does not support. Fatal —\n * never a silent no-op and never a fabricated quirk.\n */\n SYNTH_UNSUPPORTED_QUIRK: \"SYNTH_UNSUPPORTED_QUIRK\",\n /**\n * A quirk transform found no structural anchor to mutate, so the fixture would not carry the\n * deviation it is labelled with. Fatal — a golden file that lies about its parser verdict is worse\n * than no golden file.\n */\n SYNTH_QUIRK_ANCHOR_ABSENT: \"SYNTH_QUIRK_ANCHOR_ABSENT\",\n /**\n * A bare parse of a freshly-generated quirk artifact did not produce exactly the declared intended\n * warning code(s). Fatal — never emit a mislabeled fixture.\n */\n SYNTH_INTENDED_WARNING_MISMATCH: \"SYNTH_INTENDED_WARNING_MISMATCH\",\n /** A concept's code-system URI has no OID mapping in the C-CDA example-code table. Fatal. */\n SYNTH_UNMAPPED_CODE_SYSTEM: \"SYNTH_UNMAPPED_CODE_SYSTEM\",\n /** A money value could not be read as an X12 decimal. Fatal — a generator never rounds to a float. */\n SYNTH_INVALID_DECIMAL: \"SYNTH_INVALID_DECIMAL\",\n /** An integer range was requested with its maximum below its minimum. Fatal. */\n SYNTH_INVALID_RANGE: \"SYNTH_INVALID_RANGE\",\n /** A value was drawn from an empty pool. Fatal — never a fabricated substitute. */\n SYNTH_EMPTY_POOL: \"SYNTH_EMPTY_POOL\",\n /** A `defineSynthProfile` spec was not usable (a missing or blank `name`). Fatal. */\n SYNTH_INVALID_PROFILE: \"SYNTH_INVALID_PROFILE\",\n /**\n * A caller-supplied selector (a message kind, a document type, a corpus mix entry, a claim\n * variant, a Bundle type, a resource profile) is not in the closed set that governs it. Fatal —\n * see `resolveKind`: a selector union is erased at run time, and a selector that falls through\n * either mislabels the fixture or hands the value to a peer builder that quotes it back.\n */\n SYNTH_UNSUPPORTED_KIND: \"SYNTH_UNSUPPORTED_KIND\",\n} as const;\n\n/**\n * A value from {@link SYNTH_FATAL_CODES} — the type carried by a thrown {@link SynthError}.\n */\nexport type SynthFatalCode = (typeof SYNTH_FATAL_CODES)[keyof typeof SYNTH_FATAL_CODES];\n\n/**\n * The **frozen message registry** — the only place a {@link SynthError} message can come from.\n *\n * A message here is a fixed string. It never quotes the request that produced it, and there is no\n * parameter through which it could: {@link SynthError} takes a code and nothing else. That is the\n * whole mechanism, and it is deliberately a mechanism rather than a habit. Every one of these\n * messages used to be assembled by interpolating the caller's value into a template, and the reason\n * that was safe was not the design — it was that the caller happened to be passing a quirk name.\n *\n * The trade is real and is accepted: a fatal no longer tells you *which* value it rejected. It tells\n * you which rule refused, on `err.code`, and the stack frame tells you where. The caller already\n * holds the value it passed.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES } from \"@cosyte/synth\";\n * SYNTH_FATAL_MESSAGES[SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL]; // => \"A value was drawn from an empty pool.\"\n * ```\n */\nexport const SYNTH_FATAL_MESSAGES: Readonly<Record<SynthFatalCode, string>> = Object.freeze({\n SYNTH_UNSUPPORTED_FORMAT:\n \"The requested format is not generable by this build. A generator has no byte fallback: it \" +\n \"builds through a parser's own serializer or it refuses.\",\n SYNTH_UNSUPPORTED_QUIRK:\n \"The requested vendor quirk is not in the target format's quirk registry. Compare the request \" +\n \"against that format's exported registry (HL7_QUIRKS, CCDA_QUIRKS, ASTM_QUIRKS).\",\n SYNTH_QUIRK_ANCHOR_ABSENT:\n \"The quirk transform found no structural anchor to mutate, so the fixture would not carry the \" +\n \"deviation it is labelled with. Refusing to emit a mislabeled fixture.\",\n SYNTH_INTENDED_WARNING_MISMATCH:\n \"A bare parse of the generated quirk artifact did not produce exactly the declared intended \" +\n \"warning code(s). Refusing to emit a mislabeled fixture.\",\n SYNTH_UNMAPPED_CODE_SYSTEM:\n \"The concept's code-system URI has no OID mapping in the C-CDA example-code table.\",\n SYNTH_INVALID_DECIMAL: \"The value could not be read as an X12 decimal.\",\n SYNTH_INVALID_RANGE: \"An integer range was requested with its maximum below its minimum.\",\n SYNTH_EMPTY_POOL: \"A value was drawn from an empty pool.\",\n SYNTH_INVALID_PROFILE: \"defineSynthProfile requires a non-empty string name.\",\n SYNTH_UNSUPPORTED_KIND:\n \"The requested kind, document type, corpus mix entry, variant or profile is not one this \" +\n \"generator supports. The supported set is the exported union for that option.\",\n});\n\n/**\n * The typed error every fatal `@cosyte/synth` condition throws. Carries a stable\n * {@link SynthFatalCode} so callers branch on `err.code` without matching message text.\n *\n * It takes **no value parameter**. The message is whatever {@link SYNTH_FATAL_MESSAGES} holds for the\n * code, so no caller-supplied string can reach a diagnostic surface by any route — not `message`, not\n * `stack`, not a field on the thrown object.\n *\n * @example\n * ```ts\n * import { SynthError, SYNTH_FATAL_CODES } from \"@cosyte/synth\";\n * throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT);\n * ```\n */\nexport class SynthError extends Error {\n /** The stable fatal code. */\n public readonly code: SynthFatalCode;\n\n /**\n * @param code - The stable {@link SynthFatalCode}. The message comes from the frozen registry.\n */\n public constructor(code: SynthFatalCode) {\n super(SYNTH_FATAL_MESSAGES[code]);\n this.name = \"SynthError\";\n this.code = code;\n }\n}\n","/**\n * `Rng` — the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed — and only the seed — determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run — the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable — its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_RANGE);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL);\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic** — the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: authoritative ranges published by SSA, NANPA, and the\n * IETF that are guaranteed never to denote a real person or a real routable resource. Every provider\n * draws only from these; the predicates here are the executable half of the CI synthetic-safety gate —\n * they let a test assert that no emitted value falls **outside** a reserved source.\n *\n * Sources:\n * - **SSN** — SSA never issues area numbers `000`, `666`, or `900–999`; the `987-65-4320…4329` block\n * is SSA's explicitly-reserved advertising range. (ssa.gov)\n * - **Phone** — NANP reserves `555-0100…555-0199` as the fictional/non-working line range. (nanpa.com)\n * - **Email/domain** — RFC 2606 / RFC 6761 reserved: `example.com`/`.net`/`.org` and the `.example`,\n * `.test`, `.invalid`, `.localhost` TLDs.\n * - **IP** — RFC 5737 IPv4 TEST-NET-1/2/3 (`192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`) and\n * RFC 3849 IPv6 documentation prefix `2001:db8::/32`.\n * - **NPI** — a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base (CMS NPI check-digit rule, ISO\n * 7812). A number whose check digit is **wrong** therefore cannot be a NPPES-issued NPI. `synth`\n * emits NPIs with a deliberately-invalid check digit, so no generated NPI can collide with a real\n * provider.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under. There is **no** reserved MRN range (an MRN is unique only within its assigning-authority /\n * OID namespace), so — a documented design decision — every synthetic identifier\n * is scoped to a namespace that clearly cannot be a real facility's: a `SYNTH`-labelled authority whose\n * OID lives under HL7's designated **example** root `2.16.840.1.113883.19`. A value under this AA can\n * never collide with a real record because the *namespace itself* is synthetic.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id — an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check (the CMS NPI check-digit\n * rule — `80840` is the ISO 7812 issuer identifier for the US health-application namespace). A real\n * NPI satisfies `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base — the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * @param base9 - The 9-digit NPI base (positions 1–9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3 — so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose — they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The published DEA checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1–6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic** — its check digit\n * (the 7th digit) does **not** match the published DEA checksum, so it cannot be a validly-issued DEA\n * registration. A checksum-valid DEA number (which *could* denote a real prescriber) returns `false`; a\n * value that is not the DEA shape returns `false`.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base — true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic** — i.e. its check digit is invalid, so it cannot be\n * a NPPES-issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true — invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false — Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string is drawn from an SSA never-issued / reserved\n * space — area `000`, `666`, or `900–999`. A real, issuable SSN returns `false`.\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (never issued)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool** — `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address — the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose — structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer — every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng} — same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address — synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits) — unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN** — dashed `AAA-GG-SSSS`. Default draws the SSA never-issued area space\n * (`900–999`); `block: \"advertising\"` draws SSA's reserved advertising block (`987-65-4320…4329`).\n * A value from this function can never be a real SSN.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // SSA's explicitly-reserved advertising block: last digit 0..9 within -4320..-4329.\n return `987-65-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n const group = rng.digits(2);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block — `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain — `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32` — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker —\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI** — a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true — invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number** — `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so — like {@link npi} — non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true — invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address** — a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations — structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace — the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool — no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * The `Corpus` abstraction — a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen** — this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact — the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from — regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * `defineSynthProfile` — the growth-loop hook for site/vendor fixture recipes. A profile bundles the\n * value pools and the quirk recipe a fixture set should use, authored through the same public API as\n * the built-ins: a validated, frozen `SynthProfile` carrying a name, optional value overrides, and the\n * quirk names a format's quirk corpus should apply.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/** The user-authored spec passed to {@link defineSynthProfile}. */\nexport interface SynthProfileSpec {\n /** A stable, human-readable profile name (e.g. `\"acme-hospital\"`). Required, non-empty. */\n readonly name: string;\n /** Optional given-name pool override (clearly-synthetic names only — see the safety invariant). */\n readonly givenNames?: readonly string[];\n /** Optional family-name pool override (clearly-synthetic names only). */\n readonly familyNames?: readonly string[];\n /**\n * The vendor quirk recipe names this profile requests. Validated against the target format's quirk\n * registry when the profile drives a quirk corpus (an unsupported quirk is a fatal\n * `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op).\n */\n readonly quirks?: readonly string[];\n}\n\n/** A frozen, validated fixture recipe produced by {@link defineSynthProfile}. */\nexport interface SynthProfile {\n /** The profile name. */\n readonly name: string;\n /** The given-name pool this profile draws from (overrides or the built-in default). */\n readonly givenNames?: readonly string[];\n /** The family-name pool this profile draws from. */\n readonly familyNames?: readonly string[];\n /** The requested quirk recipe names. */\n readonly quirks: readonly string[];\n}\n\n/**\n * Define a reusable, frozen synthetic-fixture profile.\n *\n * @param spec - The profile spec; `name` is required and non-empty.\n * @returns A deep-frozen {@link SynthProfile}.\n * @throws SynthError `SYNTH_INVALID_PROFILE` when `name` is missing or blank.\n * @example\n * ```ts\n * import { defineSynthProfile } from \"@cosyte/synth\";\n * const acme = defineSynthProfile({ name: \"acme-hospital\", quirks: [] });\n * ```\n */\nexport function defineSynthProfile(spec: SynthProfileSpec): SynthProfile {\n if (typeof spec.name !== \"string\" || spec.name.trim().length === 0) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_PROFILE);\n }\n return Object.freeze({\n name: spec.name,\n ...(spec.givenNames ? { givenNames: Object.freeze([...spec.givenNames]) } : {}),\n ...(spec.familyNames ? { familyNames: Object.freeze([...spec.familyNames]) } : {}),\n quirks: Object.freeze([...(spec.quirks ?? [])]),\n });\n}\n","/**\n * The **quirk core**. Where the spec-clean generators prove\n * *synthetic-by-construction* through each parser's own builder, the quirk layer proves the mirror\n * property: a **deliberately off-spec** fixture round-trips to **exactly the intended parser warning\n * code(s)** — no more, no fewer. The quirk vocabulary **is the parsers' own profile systems**\n * (`hl7.defineProfile`, `ccda.defineCcdaProfile`, `astm.defineAstmProfile`): a quirk exercises exactly\n * the tolerance the corresponding parser profile encodes, so a quirk fixture is never a fiction — it\n * targets a documented, coded leniency (the **intended-warning contract**).\n *\n * This module is the **format-agnostic** part: the descriptor a quirk carries, the artifact a quirk\n * generator returns, the round-trip verdict shape, and the `SYNTH_UNSUPPORTED_QUIRK` fail-closed. Each\n * format's concrete quirk recipes + transforms live behind its own subpath (`@cosyte/synth/hl7`, …).\n *\n * @module\n */\n\nimport type { SynthFormat } from \"./corpus.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\nimport type { SynthProfile } from \"./profile.js\";\n\n/**\n * How the parser's matching profile treats a quirk once it is active — the three shapes the parsers'\n * profile systems actually exhibit (verified firsthand against each parser):\n *\n * - `\"suppressed\"` — the profile makes the warning **disappear** (HL7 v2: a `defineProfile`\n * `customSegments` claim suppresses `UNKNOWN_SEGMENT` for a declared Z-segment).\n * - `\"rebadged\"` — the profile **downgrades** the warning to the value-free `PROFILE_QUIRK_APPLIED`\n * marker with `expected: true` (C-CDA `defineCcdaProfile` / ASTM `defineAstmProfile`\n * `profileQuirkApplied`).\n * - `\"bare\"` — no shipped profile tolerates it; the quirk targets a real coded leniency a consumer can\n * tolerate via their own `defineProfile`/`defineAstmProfile`, but no built-in re-badges it.\n */\nexport type QuirkProfileDisposition = \"suppressed\" | \"rebadged\" | \"bare\";\n\n/**\n * The stable, value-free re-badge code the C-CDA and ASTM parsers emit when a profile tolerates a\n * quirk. HL7 v2 has no equivalent (it suppresses instead — see {@link QuirkProfileDisposition}).\n */\nexport const PROFILE_QUIRK_APPLIED = \"PROFILE_QUIRK_APPLIED\";\n\n/**\n * A public, grounded description of one vendor quirk — the metadata that binds a quirk recipe to a real\n * parser warning code and a **publicly-groundable** deviation (cited-public, never a private\n * vendor corpus).\n */\nexport interface QuirkDescriptor {\n /** The quirk recipe name (e.g. `\"unknown-zsegment\"`). Stable; part of the public contract. */\n readonly name: string;\n /** The format this quirk applies to. */\n readonly format: SynthFormat;\n /**\n * The **exact** parser warning code(s) a bare parse (no profile) surfaces for this quirk — the\n * intended-warning contract. A quirk that produces any other code, or none, is a generation bug.\n */\n readonly intendedWarnings: readonly string[];\n /**\n * The **public** grounding for this quirk — the spec clause or the parser's public profile that\n * documents the tolerance. Never a private vendor-attributed corpus.\n */\n readonly grounding: string;\n /** The parser profile that tolerates this quirk (when a built-in public one exists). */\n readonly toleratingProfile?: string;\n /** How {@link toleratingProfile} treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n}\n\n/** One generated quirk artifact — the off-spec wire text plus the contract it is meant to satisfy. */\nexport interface QuirkArtifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** The quirk recipe applied. */\n readonly quirk: string;\n /** The underlying spec-clean message kind the quirk was injected into (e.g. `\"ORU^R01\"`). */\n readonly kind: string;\n /** The **quirked** wire text (deterministic in the seed + quirk). */\n readonly content: string;\n /** The exact parser warning code(s) this artifact is meant to round-trip to. */\n readonly intendedWarnings: readonly string[];\n}\n\n/** The verdict of a bare parse under the tolerating profile, if any. */\nexport interface QuirkProfiledVerdict {\n /** The profile applied. */\n readonly profileName: string;\n /** How the profile treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n /** The warning codes the parser emitted with the profile active. */\n readonly warnings: readonly string[];\n /**\n * `true` iff the profile handled the quirk as its disposition declares: `\"suppressed\"` ⇒ the intended\n * code is gone; `\"rebadged\"` ⇒ the intended code is gone and `PROFILE_QUIRK_APPLIED` is present.\n */\n readonly tolerated: boolean;\n}\n\n/** The verdict of round-tripping a quirk artifact through its parser. */\nexport interface QuirkRoundTripResult {\n /** The quirked wire text that was parsed. */\n readonly content: string;\n /** The warning codes a **bare** parse (no profile) emitted. */\n readonly warnings: readonly string[];\n /** The exact code(s) the quirk is meant to produce. */\n readonly intendedWarnings: readonly string[];\n /**\n * `true` iff the bare parse produced **exactly** the intended code(s) — the intended-warning contract.\n */\n readonly intendedWarningHeld: boolean;\n /** The verdict under the tolerating profile, when a built-in public one exists. */\n readonly withProfile?: QuirkProfiledVerdict;\n}\n\n/**\n * Exact multiset (order-independent) equality of two code lists — the intended-warning comparison.\n *\n * @param a - The first code list.\n * @param b - The second code list.\n * @returns `true` iff the two lists contain the same codes with the same multiplicities.\n * @example\n * ```ts\n * import { sameCodeSet } from \"@cosyte/synth\";\n * sameCodeSet([\"A\", \"B\"], [\"B\", \"A\"]); // true\n * ```\n */\nexport function sameCodeSet(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const counts = new Map<string, number>();\n for (const c of a) counts.set(c, (counts.get(c) ?? 0) + 1);\n for (const c of b) {\n const n = counts.get(c);\n if (n === undefined) return false;\n if (n === 1) counts.delete(c);\n else counts.set(c, n - 1);\n }\n return counts.size === 0;\n}\n\n/**\n * Resolve a requested quirk name against a format's registry, or **fail closed**. A quirk the format's\n * profile system does not support is a fatal `SYNTH_UNSUPPORTED_QUIRK` — never a silent no-op and never\n * a fabricated quirk with a made-up warning.\n *\n * The refusal names neither the request nor the registry. `registry`, `format` and `name` are all\n * caller-supplied, and a diagnostic that quotes its input is a diagnostic that can be made to carry\n * anything the caller was holding — which for a fixture generator wired into someone else's pipeline\n * is not a hypothetical. Branch on `err.code`; the supported set is the registry you passed\n * (`HL7_QUIRKS`, `CCDA_QUIRKS`, `ASTM_QUIRKS`), which you can enumerate directly.\n *\n * @param registry - The format's quirk descriptors, keyed by name.\n * @param format - The format being generated.\n * @param name - The requested quirk name.\n * @returns The matching {@link QuirkDescriptor}.\n * @throws SynthError with code `SYNTH_UNSUPPORTED_QUIRK` when `name` is not a supported quirk.\n * @example\n * ```ts\n * import { resolveQuirk } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * resolveQuirk(HL7_QUIRKS, \"hl7v2\", \"unknown-zsegment\").intendedWarnings; // [\"UNKNOWN_SEGMENT\"]\n * ```\n */\nexport function resolveQuirk(\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n name: string,\n): QuirkDescriptor {\n const descriptor = registry[name];\n // `format` is compared, never rendered. A descriptor found under the wrong format's registry is a\n // mislabeled fixture waiting to happen, so the mismatch fails closed on the same code.\n if (descriptor === undefined || descriptor.format !== format) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_QUIRK);\n }\n return descriptor;\n}\n\n/**\n * Evaluate whether a profiled parse tolerated a quirk as its disposition declares. Shared across the\n * formats so the \"suppressed vs re-badged\" logic lives in exactly one place.\n *\n * @param disposition - The quirk's declared profile disposition.\n * @param intendedWarnings - The bare-parse intended code(s).\n * @param warningsUnderProfile - The code(s) the parser emitted with the profile active.\n * @returns `true` iff the profile handled the quirk correctly for its disposition.\n * @example\n * ```ts\n * import { profileTolerated } from \"@cosyte/synth\";\n * profileTolerated(\"suppressed\", [\"UNKNOWN_SEGMENT\"], []); // true — the profile suppressed it\n * ```\n */\nexport function profileTolerated(\n disposition: QuirkProfileDisposition,\n intendedWarnings: readonly string[],\n warningsUnderProfile: readonly string[],\n): boolean {\n const stillHasIntended = intendedWarnings.some((c) => warningsUnderProfile.includes(c));\n switch (disposition) {\n case \"suppressed\":\n return !stillHasIntended;\n case \"rebadged\":\n return !stillHasIntended && warningsUnderProfile.includes(PROFILE_QUIRK_APPLIED);\n case \"bare\":\n return false;\n }\n}\n\n/**\n * Assert a freshly-generated quirk artifact **actually** round-trips to its intended warning(s), or\n * **fail closed**. This is the generator's self-check on the intended-warning contract: a\n * fixture whose bare parse does not produce exactly the declared code(s) is a *mislabeled* fixture — a\n * golden file that lies about the parser verdict it anchors — and must never be emitted. It is a\n * stronger guard than \"the transform changed some bytes\": a transform can mutate the wrong element (a\n * template a given document type does not key its warning on) and still change bytes while producing no\n * warning. Every format's `generate*Quirk` calls this after transforming, so the contract is enforced at\n * generation time, not merely at round-trip time.\n *\n * It no longer takes the quirk name. That parameter existed for one reason — to be interpolated into\n * the refusal — and a parameter whose only job is to reach a message is the exact shape this package\n * is removing, so it is gone rather than merely unused. The refusal names neither code list either;\n * both are caller-supplied, and the caller reads the comparison back off the arguments it holds.\n *\n * @param intendedWarnings - The declared intended code(s).\n * @param bareWarnings - The code(s) a bare parse of the generated artifact actually produced.\n * @throws SynthError `SYNTH_INTENDED_WARNING_MISMATCH` when the bare parse did not produce exactly\n * the intended code(s).\n * @example\n * ```ts\n * import { assertIntendedWarnings } from \"@cosyte/synth\";\n * assertIntendedWarnings([\"UNKNOWN_SEGMENT\"], [\"UNKNOWN_SEGMENT\"]); // ok\n * ```\n */\nexport function assertIntendedWarnings(\n intendedWarnings: readonly string[],\n bareWarnings: readonly string[],\n): void {\n if (!sameCodeSet(bareWarnings, intendedWarnings)) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INTENDED_WARNING_MISMATCH);\n }\n}\n\n/**\n * Validate the quirk names carried by a {@link SynthProfile} against a format's registry, failing closed\n * on the first unsupported one. Lets a consumer author a fixture recipe with `defineSynthProfile` and\n * have its quirks checked against the *parser's* real tolerance before any fixture is generated.\n *\n * @param profile - The synth profile whose `quirks` to validate.\n * @param registry - The format's quirk descriptors.\n * @param format - The format being generated.\n * @returns The validated quirk names (the profile's, in order).\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` for the first unsupported quirk.\n * @example\n * ```ts\n * import { validateProfileQuirks, defineSynthProfile } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * const p = defineSynthProfile({ name: \"site\", quirks: [\"unknown-zsegment\"] });\n * validateProfileQuirks(p, HL7_QUIRKS, \"hl7v2\"); // [\"unknown-zsegment\"]\n * ```\n */\nexport function validateProfileQuirks(\n profile: SynthProfile,\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n): readonly string[] {\n for (const name of profile.quirks) resolveQuirk(registry, format, name);\n return profile.quirks;\n}\n","/**\n * The **selector chokepoint**. A generator's options are almost all *selectors*: a message kind, a\n * document type, a corpus mix, a claim variant, a Bundle type, a profile. Each is typed as a closed\n * union, and every one of those unions is **erased at run time**, so a JavaScript caller (or a\n * `as never` in someone's test) reaches the branch with any string at all.\n *\n * Three things went wrong when that was left unchecked, and they are all the same bug:\n *\n * 1. **The value reached a diagnostic.** An unrecognised `documentType` travelled into\n * `@cosyte/ccda`'s `buildCcda`, which is entitled to quote it back in its own `TypeError` and\n * does. This package then has a caller-supplied string on an `err.message` and an `err.stack`,\n * through its own public entry point, having taken no care of it.\n * 2. **The value reached the model.** A corpus mix entry becomes an `Artifact.kind` and a\n * `manifest.counts` key, which is precisely the structural-identifier position a downstream\n * package interpolates to describe a location.\n * 3. **The fixture was silently mislabeled.** An exhaustive `switch` over an erased union takes no\n * branch and returns `undefined`, or a trailing `else` quietly generates something else. A corpus\n * whose manifest says it holds one transaction and holds another is a golden file that lies.\n *\n * So a selector is resolved against its own set, once, before anything is generated, and an\n * unrecognised one is a fatal `SYNTH_UNSUPPORTED_KIND`. Like every fatal here it carries a code and a\n * fixed message, and quotes neither the request nor the set.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/**\n * Resolve one caller-supplied selector against the closed set that governs it, or **fail closed**.\n *\n * @param allowed - Every value the selector may take.\n * @param requested - The selector the caller supplied.\n * @returns `requested`, narrowed to the union.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` when `requested` is not in `allowed`.\n * @example\n * ```ts\n * import { resolveKind } from \"@cosyte/synth\";\n * resolveKind([\"ccd\", \"referralNote\"] as const, \"ccd\"); // \"ccd\"\n * ```\n */\nexport function resolveKind<T extends string>(allowed: readonly T[], requested: string): T {\n const match = allowed.find((value) => value === requested);\n if (match === undefined) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_KIND);\n return match;\n}\n\n/**\n * Resolve every entry of a caller-supplied corpus mix, in order, or **fail closed** on the first\n * unrecognised one.\n *\n * It substitutes the default **only** when the caller supplied nothing, which is exactly what the\n * `??` it replaced did. An empty array is a supplied mix and is returned as one. An earlier version\n * of this function also treated `[]` as \"nothing supplied\", on the stated grounds that it matched the\n * previous behaviour; it did not — `??` fires on `undefined` and never on `[]` — and it changed the\n * result of six published entry points, turning an explicit empty selection into \"generate one of\n * everything\". A convenience that fails open is not a convenience.\n *\n * @param allowed - Every kind the corpus may generate.\n * @param requested - The mix the caller supplied, or `undefined` for the default.\n * @param fallback - The default mix, used only when `requested` is `undefined`.\n * @returns The resolved mix.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` on the first unrecognised entry.\n * @example\n * ```ts\n * import { resolveMix } from \"@cosyte/synth\";\n * resolveMix([\"Result\", \"Order\"] as const, [\"Order\"], [\"Result\", \"Order\"]); // [\"Order\"]\n * ```\n */\nexport function resolveMix<T extends string>(\n allowed: readonly T[],\n requested: readonly string[] | undefined,\n fallback: readonly T[],\n): readonly T[] {\n if (requested === undefined) return fallback;\n return requested.map((entry) => resolveKind(allowed, entry));\n}\n","/**\n * `@cosyte/synth` — a deterministic, seedable **synthetic-data / test-fixture generator** for the\n * cosyte healthcare formats. A *consumer* of the parsers, not a parser: it builds artifacts **through\n * each parser's own builder/serializer** (so output is spec-clean by construction) and draws every\n * value from a **guaranteed-non-colliding synthetic source** (so no output can be real or\n * plausibly-real PHI). It is a **format/conformance generator, not a clinical simulator**.\n *\n * This root entry point exposes the **format-agnostic core**: the seeded PRNG, the synthetic-safety\n * providers, the `Corpus` abstraction, the profile skeleton, and the fatal codes. Per-format\n * generation lives behind its own subpath (`@cosyte/synth/hl7`) so importing the root never pulls a\n * parser — the lazy per-format boundary.\n *\n * @module\n */\n\n/**\n * Library version string, synced with `package.json#version` by downstream release tooling.\n *\n * @example\n * ```ts\n * import { VERSION } from \"@cosyte/synth\";\n * console.log(VERSION);\n * ```\n */\nexport const VERSION = \"0.0.0\";\n\n// ── Seeded, deterministic PRNG (the reproducibility contract, roadmap §5) ──\nexport { createRng, type Rng } from \"./rng/rng.js\";\nexport { splitmix32 } from \"./rng/splitmix32.js\";\nexport { sfc32Next, type Sfc32State } from \"./rng/sfc32.js\";\n\n// ── The synthetic-safety provider layer (roadmap §4) ──\nexport {\n safe,\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n type SyntheticName,\n type SyntheticAddress,\n type SyntheticIdentifier,\n type SsnBlock,\n} from \"./safe/index.js\";\nexport {\n isSyntheticSsn,\n isSyntheticPhone,\n isSyntheticEmail,\n isSyntheticIp,\n isSyntheticNpi,\n npiCheckDigit,\n luhnMod10,\n isSyntheticDea,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n NPI_LUHN_PREFIX,\n} from \"./safe/reserved.js\";\nexport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./safe/names-pool.js\";\n\n// ── The reproducible Corpus abstraction (roadmap §2, §5) ──\nexport {\n makeCorpus,\n type Corpus,\n type CorpusManifest,\n type Artifact,\n type SynthFormat,\n} from \"./corpus.js\";\n\n// ── The profile growth-loop skeleton (roadmap §Phase 1) ──\nexport { defineSynthProfile, type SynthProfile, type SynthProfileSpec } from \"./profile.js\";\n\n// ── The quirk core (roadmap §Phase 7 — the differentiator; format recipes live per-subpath) ──\nexport {\n resolveQuirk,\n sameCodeSet,\n profileTolerated,\n validateProfileQuirks,\n assertIntendedWarnings,\n PROFILE_QUIRK_APPLIED,\n type QuirkDescriptor,\n type QuirkArtifact,\n type QuirkProfileDisposition,\n type QuirkProfiledVerdict,\n type QuirkRoundTripResult,\n} from \"./quirk.js\";\n\n// ── Stable fatal codes + the typed error (roadmap §Phase 1) ──\nexport {\n SYNTH_FATAL_CODES,\n SYNTH_FATAL_MESSAGES,\n SynthError,\n type SynthFatalCode,\n} from \"./codes.js\";\nexport { resolveKind, resolveMix } from \"./select.js\";\n"]}
1
+ {"version":3,"sources":["../src/rng/splitmix32.ts","../src/rng/sfc32.ts","../src/codes.ts","../src/rng/rng.ts","../src/safe/reserved.ts","../src/safe/names-pool.ts","../src/safe/providers.ts","../src/safe/index.ts","../src/corpus.ts","../src/profile.ts","../src/quirk.ts","../src/select.ts","../src/index.ts"],"names":["name"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * `splitmix32` — a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed —\n * and only the seed — determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state) — the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets** — statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it — {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * Stable diagnostic codes for `@cosyte/synth` and the {@link SynthError} they travel on.\n *\n * Unlike a parser (which recovers from bad *input* into Tier-2 warnings), a **generator** has no input\n * to tolerate — its reflex is *synthetic-by-construction* and *fail-closed on impossibility*. So the\n * codes here are **fatal**: a caller asked for something the library cannot honor spec-clean, and the\n * only safe answer is to throw, never to silently fabricate a value or a byte workaround. Codes are `key ===\n * value` and part of the public contract —\n * renaming one is a breaking change.\n *\n * @module\n */\n\n/**\n * The stable **fatal** code registry. Additions-only thereafter.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SynthError } from \"@cosyte/synth\";\n * try {\n * // ...generate...\n * } catch (err) {\n * if (err instanceof SynthError && err.code === SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT) {\n * // handle an unsupported format request\n * }\n * }\n * ```\n */\nexport const SYNTH_FATAL_CODES = {\n /**\n * A format was requested that this build cannot generate through a real parser builder/serializer.\n * Fatal — never a hand-written byte fallback.\n *\n * **No code path in this build raises it.** All six formats generate, so it is reserved for a\n * future format that does not, and is kept because removing a published code is a breaking change.\n * An unsupported *kind* within a format that does generate is `SYNTH_UNSUPPORTED_KIND`.\n */\n SYNTH_UNSUPPORTED_FORMAT: \"SYNTH_UNSUPPORTED_FORMAT\",\n /**\n * A vendor quirk was requested that the target format's profile system does not support. Fatal —\n * never a silent no-op and never a fabricated quirk.\n */\n SYNTH_UNSUPPORTED_QUIRK: \"SYNTH_UNSUPPORTED_QUIRK\",\n /**\n * A quirk transform found no structural anchor to mutate, so the fixture would not carry the\n * deviation it is labelled with. Fatal — a golden file that lies about its parser verdict is worse\n * than no golden file.\n */\n SYNTH_QUIRK_ANCHOR_ABSENT: \"SYNTH_QUIRK_ANCHOR_ABSENT\",\n /**\n * A bare parse of a freshly-generated quirk artifact did not produce exactly the declared intended\n * warning code(s). Fatal — never emit a mislabeled fixture.\n */\n SYNTH_INTENDED_WARNING_MISMATCH: \"SYNTH_INTENDED_WARNING_MISMATCH\",\n /** A concept's code-system URI has no OID mapping in the C-CDA example-code table. Fatal. */\n SYNTH_UNMAPPED_CODE_SYSTEM: \"SYNTH_UNMAPPED_CODE_SYSTEM\",\n /** A money value could not be read as an X12 decimal. Fatal — a generator never rounds to a float. */\n SYNTH_INVALID_DECIMAL: \"SYNTH_INVALID_DECIMAL\",\n /** An integer range was requested with its maximum below its minimum. Fatal. */\n SYNTH_INVALID_RANGE: \"SYNTH_INVALID_RANGE\",\n /** A value was drawn from an empty pool. Fatal — never a fabricated substitute. */\n SYNTH_EMPTY_POOL: \"SYNTH_EMPTY_POOL\",\n /** A `defineSynthProfile` spec was not usable (a missing or blank `name`). Fatal. */\n SYNTH_INVALID_PROFILE: \"SYNTH_INVALID_PROFILE\",\n /**\n * A caller-supplied selector (a message kind, a document type, a corpus mix entry, a claim\n * variant, a Bundle type, a resource profile) is not in the closed set that governs it. Fatal —\n * see `resolveKind`: a selector union is erased at run time, and a selector that falls through\n * either mislabels the fixture or hands the value to a peer builder that quotes it back.\n */\n SYNTH_UNSUPPORTED_KIND: \"SYNTH_UNSUPPORTED_KIND\",\n} as const;\n\n/**\n * A value from {@link SYNTH_FATAL_CODES} — the type carried by a thrown {@link SynthError}.\n */\nexport type SynthFatalCode = (typeof SYNTH_FATAL_CODES)[keyof typeof SYNTH_FATAL_CODES];\n\n/**\n * The **frozen message registry** — the only place a {@link SynthError} message can come from.\n *\n * A message here is a fixed string. It never quotes the request that produced it, and there is no\n * parameter through which it could: {@link SynthError} takes a code and nothing else. That is the\n * whole mechanism, and it is deliberately a mechanism rather than a habit. Every one of these\n * messages used to be assembled by interpolating the caller's value into a template, and the reason\n * that was safe was not the design — it was that the caller happened to be passing a quirk name.\n *\n * The trade is real and is accepted: a fatal no longer tells you *which* value it rejected. It tells\n * you which rule refused, on `err.code`, and the stack frame tells you where. The caller already\n * holds the value it passed.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES } from \"@cosyte/synth\";\n * SYNTH_FATAL_MESSAGES[SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL]; // => \"A value was drawn from an empty pool.\"\n * ```\n */\nexport const SYNTH_FATAL_MESSAGES: Readonly<Record<SynthFatalCode, string>> = Object.freeze({\n SYNTH_UNSUPPORTED_FORMAT:\n \"The requested format is not generable by this build. A generator has no byte fallback: it \" +\n \"builds through a parser's own serializer or it refuses.\",\n SYNTH_UNSUPPORTED_QUIRK:\n \"The requested vendor quirk is not in the target format's quirk registry. Compare the request \" +\n \"against that format's exported registry (HL7_QUIRKS, CCDA_QUIRKS, ASTM_QUIRKS).\",\n SYNTH_QUIRK_ANCHOR_ABSENT:\n \"The quirk transform found no structural anchor to mutate, so the fixture would not carry the \" +\n \"deviation it is labelled with. Refusing to emit a mislabeled fixture.\",\n SYNTH_INTENDED_WARNING_MISMATCH:\n \"A bare parse of the generated quirk artifact did not produce exactly the declared intended \" +\n \"warning code(s). Refusing to emit a mislabeled fixture.\",\n SYNTH_UNMAPPED_CODE_SYSTEM:\n \"The concept's code-system URI has no OID mapping in the C-CDA example-code table.\",\n SYNTH_INVALID_DECIMAL: \"The value could not be read as an X12 decimal.\",\n SYNTH_INVALID_RANGE: \"An integer range was requested with its maximum below its minimum.\",\n SYNTH_EMPTY_POOL: \"A value was drawn from an empty pool.\",\n SYNTH_INVALID_PROFILE: \"defineSynthProfile requires a non-empty string name.\",\n SYNTH_UNSUPPORTED_KIND:\n \"The requested kind, document type, corpus mix entry, variant or profile is not one this \" +\n \"generator supports. The supported set is the exported union for that option.\",\n});\n\n/**\n * The typed error every fatal `@cosyte/synth` condition throws. Carries a stable\n * {@link SynthFatalCode} so callers branch on `err.code` without matching message text.\n *\n * It takes **no value parameter**. The message is whatever {@link SYNTH_FATAL_MESSAGES} holds for the\n * code, so no caller-supplied string can reach a diagnostic surface by any route — not `message`, not\n * `stack`, not a field on the thrown object.\n *\n * @example\n * ```ts\n * import { SynthError, SYNTH_FATAL_CODES } from \"@cosyte/synth\";\n * throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT);\n * ```\n */\nexport class SynthError extends Error {\n /** The stable fatal code. */\n public readonly code: SynthFatalCode;\n\n /**\n * @param code - The stable {@link SynthFatalCode}. The message comes from the frozen registry.\n */\n public constructor(code: SynthFatalCode) {\n super(SYNTH_FATAL_MESSAGES[code]);\n this.name = \"SynthError\";\n this.code = code;\n }\n}\n","/**\n * `Rng` — the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed — and only the seed — determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run — the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable — its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_RANGE);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL);\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic** — the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: authoritative ranges published by SSA, NANPA, and the\n * IETF that are guaranteed never to denote a real person or a real routable resource. Every provider\n * draws only from these; the predicates here are the executable half of the CI synthetic-safety gate —\n * they let a test assert that no emitted value falls **outside** a reserved source.\n *\n * Sources:\n * - **SSN** — SSA never issues area numbers `000`, `666`, or `900–999`; the `987-65-4320…4329` block\n * is SSA's explicitly-reserved advertising range. (ssa.gov)\n * - **Phone** — NANP reserves `555-0100…555-0199` as the fictional/non-working line range. (nanpa.com)\n * - **Email/domain** — RFC 2606 / RFC 6761 reserved: `example.com`/`.net`/`.org` and the `.example`,\n * `.test`, `.invalid`, `.localhost` TLDs.\n * - **IP** — RFC 5737 IPv4 TEST-NET-1/2/3 (`192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`) and\n * RFC 3849 IPv6 documentation prefix `2001:db8::/32`.\n * - **NPI** — a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base (CMS NPI check-digit rule, ISO\n * 7812). A number whose check digit is **wrong** therefore cannot be a NPPES-issued NPI. `synth`\n * emits NPIs with a deliberately-invalid check digit, so no generated NPI can collide with a real\n * provider.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under. There is **no** reserved MRN range (an MRN is unique only within its assigning-authority /\n * OID namespace), so — a documented design decision — every synthetic identifier\n * is scoped to a namespace that clearly cannot be a real facility's: a `SYNTH`-labelled authority whose\n * OID lives under HL7's designated **example** root `2.16.840.1.113883.19`. A value under this AA can\n * never collide with a real record because the *namespace itself* is synthetic.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id — an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check (the CMS NPI check-digit\n * rule — `80840` is the ISO 7812 issuer identifier for the US health-application namespace). A real\n * NPI satisfies `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base — the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * @param base9 - The 9-digit NPI base (positions 1–9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3 — so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose — they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The published DEA checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1–6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic** — its check digit\n * (the 7th digit) does **not** match the published DEA checksum, so it cannot be a validly-issued DEA\n * registration. A checksum-valid DEA number (which *could* denote a real prescriber) returns `false`; a\n * value that is not the DEA shape returns `false`.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base — true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic** — i.e. its check digit is invalid, so it cannot be\n * a NPPES-issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true — invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false — Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string is drawn from an SSA never-issued / reserved\n * space — area `000`, `666`, or `900–999`. A real, issuable SSN returns `false`.\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (never issued)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool** — `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address — the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose — structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer — every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng} — same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address — synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits) — unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN** — dashed `AAA-GG-SSSS`. Default draws the SSA never-issued area space\n * (`900–999`); `block: \"advertising\"` draws SSA's reserved advertising block (`987-65-4320…4329`).\n * A value from this function can never be a real SSN.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // SSA's explicitly-reserved advertising block: last digit 0..9 within -4320..-4329.\n return `987-65-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n const group = rng.digits(2);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block — `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain — `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32` — never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker —\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI** — a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true — invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number** — `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so — like {@link npi} — non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true — invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address** — a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations — structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace — the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool — no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * The `Corpus` abstraction — a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen** — this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact — the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from — regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * `defineSynthProfile` — the growth-loop hook for site/vendor fixture recipes. A profile bundles the\n * value pools and the quirk recipe a fixture set should use, authored through the same public API as\n * the built-ins: a validated, frozen `SynthProfile` carrying a name, optional value overrides, and the\n * quirk names a format's quirk corpus should apply.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/** The user-authored spec passed to {@link defineSynthProfile}. */\nexport interface SynthProfileSpec {\n /** A stable, human-readable profile name (e.g. `\"acme-hospital\"`). Required, non-empty. */\n readonly name: string;\n /** Optional given-name pool override (clearly-synthetic names only — see the safety invariant). */\n readonly givenNames?: readonly string[];\n /** Optional family-name pool override (clearly-synthetic names only). */\n readonly familyNames?: readonly string[];\n /**\n * The vendor quirk recipe names this profile requests. Validated against the target format's quirk\n * registry when the profile drives a quirk corpus (an unsupported quirk is a fatal\n * `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op).\n */\n readonly quirks?: readonly string[];\n}\n\n/** A frozen, validated fixture recipe produced by {@link defineSynthProfile}. */\nexport interface SynthProfile {\n /** The profile name. */\n readonly name: string;\n /** The given-name pool this profile draws from (overrides or the built-in default). */\n readonly givenNames?: readonly string[];\n /** The family-name pool this profile draws from. */\n readonly familyNames?: readonly string[];\n /** The requested quirk recipe names. */\n readonly quirks: readonly string[];\n}\n\n/**\n * Define a reusable, frozen synthetic-fixture profile.\n *\n * @param spec - The profile spec; `name` is required and non-empty.\n * @returns A deep-frozen {@link SynthProfile}.\n * @throws SynthError `SYNTH_INVALID_PROFILE` when `name` is missing or blank.\n * @example\n * ```ts\n * import { defineSynthProfile } from \"@cosyte/synth\";\n * const acme = defineSynthProfile({ name: \"acme-hospital\", quirks: [] });\n * ```\n */\nexport function defineSynthProfile(spec: SynthProfileSpec): SynthProfile {\n if (typeof spec.name !== \"string\" || spec.name.trim().length === 0) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_PROFILE);\n }\n return Object.freeze({\n name: spec.name,\n ...(spec.givenNames ? { givenNames: Object.freeze([...spec.givenNames]) } : {}),\n ...(spec.familyNames ? { familyNames: Object.freeze([...spec.familyNames]) } : {}),\n quirks: Object.freeze([...(spec.quirks ?? [])]),\n });\n}\n","/**\n * The **quirk core**. Where the spec-clean generators prove\n * *synthetic-by-construction* through each parser's own builder, the quirk layer proves the mirror\n * property: a **deliberately off-spec** fixture round-trips to **exactly the intended parser warning\n * code(s)** — no more, no fewer. The quirk vocabulary **is the parsers' own profile systems**\n * (`hl7.defineProfile`, `ccda.defineCcdaProfile`, `astm.defineAstmProfile`): a quirk exercises exactly\n * the tolerance the corresponding parser profile encodes, so a quirk fixture is never a fiction — it\n * targets a documented, coded leniency (the **intended-warning contract**).\n *\n * This module is the **format-agnostic** part: the descriptor a quirk carries, the artifact a quirk\n * generator returns, the round-trip verdict shape, and the `SYNTH_UNSUPPORTED_QUIRK` fail-closed. Each\n * format's concrete quirk recipes + transforms live behind its own subpath (`@cosyte/synth/hl7`, …).\n *\n * @module\n */\n\nimport type { SynthFormat } from \"./corpus.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\nimport type { SynthProfile } from \"./profile.js\";\n\n/**\n * How the parser's matching profile treats a quirk once it is active — the three shapes the parsers'\n * profile systems actually exhibit (verified firsthand against each parser):\n *\n * - `\"suppressed\"` — the profile makes the warning **disappear** (HL7 v2: a `defineProfile`\n * `customSegments` claim suppresses `UNKNOWN_SEGMENT` for a declared Z-segment).\n * - `\"rebadged\"` — the profile **downgrades** the warning to the value-free `PROFILE_QUIRK_APPLIED`\n * marker with `expected: true` (C-CDA `defineCcdaProfile` / ASTM `defineAstmProfile`\n * `profileQuirkApplied`).\n * - `\"bare\"` — no shipped profile tolerates it; the quirk targets a real coded leniency a consumer can\n * tolerate via their own `defineProfile`/`defineAstmProfile`, but no built-in re-badges it.\n */\nexport type QuirkProfileDisposition = \"suppressed\" | \"rebadged\" | \"bare\";\n\n/**\n * The stable, value-free re-badge code the C-CDA and ASTM parsers emit when a profile tolerates a\n * quirk. HL7 v2 has no equivalent (it suppresses instead — see {@link QuirkProfileDisposition}).\n */\nexport const PROFILE_QUIRK_APPLIED = \"PROFILE_QUIRK_APPLIED\";\n\n/**\n * A public, grounded description of one vendor quirk — the metadata that binds a quirk recipe to a real\n * parser warning code and a **publicly-groundable** deviation (cited-public, never a private\n * vendor corpus).\n */\nexport interface QuirkDescriptor {\n /** The quirk recipe name (e.g. `\"unknown-zsegment\"`). Stable; part of the public contract. */\n readonly name: string;\n /** The format this quirk applies to. */\n readonly format: SynthFormat;\n /**\n * The **exact** parser warning code(s) a bare parse (no profile) surfaces for this quirk — the\n * intended-warning contract. A quirk that produces any other code, or none, is a generation bug.\n */\n readonly intendedWarnings: readonly string[];\n /**\n * The **public** grounding for this quirk — the spec clause or the parser's public profile that\n * documents the tolerance. Never a private vendor-attributed corpus.\n */\n readonly grounding: string;\n /** The parser profile that tolerates this quirk (when a built-in public one exists). */\n readonly toleratingProfile?: string;\n /** How {@link toleratingProfile} treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n}\n\n/** One generated quirk artifact — the off-spec wire text plus the contract it is meant to satisfy. */\nexport interface QuirkArtifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** The quirk recipe applied. */\n readonly quirk: string;\n /** The underlying spec-clean message kind the quirk was injected into (e.g. `\"ORU^R01\"`). */\n readonly kind: string;\n /** The **quirked** wire text (deterministic in the seed + quirk). */\n readonly content: string;\n /** The exact parser warning code(s) this artifact is meant to round-trip to. */\n readonly intendedWarnings: readonly string[];\n}\n\n/** The verdict of a bare parse under the tolerating profile, if any. */\nexport interface QuirkProfiledVerdict {\n /** The profile applied. */\n readonly profileName: string;\n /** How the profile treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n /** The warning codes the parser emitted with the profile active. */\n readonly warnings: readonly string[];\n /**\n * `true` iff the profile handled the quirk as its disposition declares: `\"suppressed\"` ⇒ the intended\n * code is gone; `\"rebadged\"` ⇒ the intended code is gone and `PROFILE_QUIRK_APPLIED` is present.\n */\n readonly tolerated: boolean;\n}\n\n/** The verdict of round-tripping a quirk artifact through its parser. */\nexport interface QuirkRoundTripResult {\n /** The quirked wire text that was parsed. */\n readonly content: string;\n /** The warning codes a **bare** parse (no profile) emitted. */\n readonly warnings: readonly string[];\n /** The exact code(s) the quirk is meant to produce. */\n readonly intendedWarnings: readonly string[];\n /**\n * `true` iff the bare parse produced **exactly** the intended code(s) — the intended-warning contract.\n */\n readonly intendedWarningHeld: boolean;\n /** The verdict under the tolerating profile, when a built-in public one exists. */\n readonly withProfile?: QuirkProfiledVerdict;\n}\n\n/**\n * Exact multiset (order-independent) equality of two code lists — the intended-warning comparison.\n *\n * @param a - The first code list.\n * @param b - The second code list.\n * @returns `true` iff the two lists contain the same codes with the same multiplicities.\n * @example\n * ```ts\n * import { sameCodeSet } from \"@cosyte/synth\";\n * sameCodeSet([\"A\", \"B\"], [\"B\", \"A\"]); // true\n * ```\n */\nexport function sameCodeSet(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const counts = new Map<string, number>();\n for (const c of a) counts.set(c, (counts.get(c) ?? 0) + 1);\n for (const c of b) {\n const n = counts.get(c);\n if (n === undefined) return false;\n if (n === 1) counts.delete(c);\n else counts.set(c, n - 1);\n }\n return counts.size === 0;\n}\n\n/**\n * Resolve a requested quirk name against a format's registry, or **fail closed**. A quirk the format's\n * profile system does not support is a fatal `SYNTH_UNSUPPORTED_QUIRK` — never a silent no-op and never\n * a fabricated quirk with a made-up warning.\n *\n * The refusal names neither the request nor the registry. `registry`, `format` and `name` are all\n * caller-supplied, and a diagnostic that quotes its input is a diagnostic that can be made to carry\n * anything the caller was holding — which for a fixture generator wired into someone else's pipeline\n * is not a hypothetical. Branch on `err.code`; the supported set is the registry you passed\n * (`HL7_QUIRKS`, `CCDA_QUIRKS`, `ASTM_QUIRKS`), which you can enumerate directly.\n *\n * @param registry - The format's quirk descriptors, keyed by name.\n * @param format - The format being generated.\n * @param name - The requested quirk name.\n * @returns The matching {@link QuirkDescriptor}.\n * @throws SynthError with code `SYNTH_UNSUPPORTED_QUIRK` when `name` is not a supported quirk.\n * @example\n * ```ts\n * import { resolveQuirk } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * resolveQuirk(HL7_QUIRKS, \"hl7v2\", \"unknown-zsegment\").intendedWarnings; // [\"UNKNOWN_SEGMENT\"]\n * ```\n */\nexport function resolveQuirk(\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n name: string,\n): QuirkDescriptor {\n const descriptor = registry[name];\n // `format` is compared, never rendered. A descriptor found under the wrong format's registry is a\n // mislabeled fixture waiting to happen, so the mismatch fails closed on the same code.\n if (descriptor === undefined || descriptor.format !== format) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_QUIRK);\n }\n return descriptor;\n}\n\n/**\n * Evaluate whether a profiled parse tolerated a quirk as its disposition declares. Shared across the\n * formats so the \"suppressed vs re-badged\" logic lives in exactly one place.\n *\n * @param disposition - The quirk's declared profile disposition.\n * @param intendedWarnings - The bare-parse intended code(s).\n * @param warningsUnderProfile - The code(s) the parser emitted with the profile active.\n * @returns `true` iff the profile handled the quirk correctly for its disposition.\n * @example\n * ```ts\n * import { profileTolerated } from \"@cosyte/synth\";\n * profileTolerated(\"suppressed\", [\"UNKNOWN_SEGMENT\"], []); // true — the profile suppressed it\n * ```\n */\nexport function profileTolerated(\n disposition: QuirkProfileDisposition,\n intendedWarnings: readonly string[],\n warningsUnderProfile: readonly string[],\n): boolean {\n const stillHasIntended = intendedWarnings.some((c) => warningsUnderProfile.includes(c));\n switch (disposition) {\n case \"suppressed\":\n return !stillHasIntended;\n case \"rebadged\":\n return !stillHasIntended && warningsUnderProfile.includes(PROFILE_QUIRK_APPLIED);\n case \"bare\":\n return false;\n }\n}\n\n/**\n * Assert a freshly-generated quirk artifact **actually** round-trips to its intended warning(s), or\n * **fail closed**. This is the generator's self-check on the intended-warning contract: a\n * fixture whose bare parse does not produce exactly the declared code(s) is a *mislabeled* fixture — a\n * golden file that lies about the parser verdict it anchors — and must never be emitted. It is a\n * stronger guard than \"the transform changed some bytes\": a transform can mutate the wrong element (a\n * template a given document type does not key its warning on) and still change bytes while producing no\n * warning. Every format's `generate*Quirk` calls this after transforming, so the contract is enforced at\n * generation time, not merely at round-trip time.\n *\n * It no longer takes the quirk name. That parameter existed for one reason — to be interpolated into\n * the refusal — and a parameter whose only job is to reach a message is the exact shape this package\n * is removing, so it is gone rather than merely unused. The refusal names neither code list either;\n * both are caller-supplied, and the caller reads the comparison back off the arguments it holds.\n *\n * @param intendedWarnings - The declared intended code(s).\n * @param bareWarnings - The code(s) a bare parse of the generated artifact actually produced.\n * @throws SynthError `SYNTH_INTENDED_WARNING_MISMATCH` when the bare parse did not produce exactly\n * the intended code(s).\n * @example\n * ```ts\n * import { assertIntendedWarnings } from \"@cosyte/synth\";\n * assertIntendedWarnings([\"UNKNOWN_SEGMENT\"], [\"UNKNOWN_SEGMENT\"]); // ok\n * ```\n */\nexport function assertIntendedWarnings(\n intendedWarnings: readonly string[],\n bareWarnings: readonly string[],\n): void {\n if (!sameCodeSet(bareWarnings, intendedWarnings)) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INTENDED_WARNING_MISMATCH);\n }\n}\n\n/**\n * Validate the quirk names carried by a {@link SynthProfile} against a format's registry, failing closed\n * on the first unsupported one. Lets a consumer author a fixture recipe with `defineSynthProfile` and\n * have its quirks checked against the *parser's* real tolerance before any fixture is generated.\n *\n * @param profile - The synth profile whose `quirks` to validate.\n * @param registry - The format's quirk descriptors.\n * @param format - The format being generated.\n * @returns The validated quirk names (the profile's, in order).\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` for the first unsupported quirk.\n * @example\n * ```ts\n * import { validateProfileQuirks, defineSynthProfile } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * const p = defineSynthProfile({ name: \"site\", quirks: [\"unknown-zsegment\"] });\n * validateProfileQuirks(p, HL7_QUIRKS, \"hl7v2\"); // [\"unknown-zsegment\"]\n * ```\n */\nexport function validateProfileQuirks(\n profile: SynthProfile,\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n): readonly string[] {\n for (const name of profile.quirks) resolveQuirk(registry, format, name);\n return profile.quirks;\n}\n","/**\n * The **selector chokepoint**. A generator's options are almost all *selectors*: a message kind, a\n * document type, a corpus mix, a claim variant, a Bundle type, a profile. Each is typed as a closed\n * union, and every one of those unions is **erased at run time**, so a JavaScript caller (or a\n * `as never` in someone's test) reaches the branch with any string at all.\n *\n * Three things went wrong when that was left unchecked, and they are all the same bug:\n *\n * 1. **The value reached a diagnostic.** An unrecognised `documentType` travelled into\n * `@cosyte/ccda`'s `buildCcda`, which is entitled to quote it back in its own `TypeError` and\n * does. This package then has a caller-supplied string on an `err.message` and an `err.stack`,\n * through its own public entry point, having taken no care of it.\n * 2. **The value reached the model.** A corpus mix entry becomes an `Artifact.kind` and a\n * `manifest.counts` key, which is precisely the structural-identifier position a downstream\n * package interpolates to describe a location.\n * 3. **The fixture was silently mislabeled.** An exhaustive `switch` over an erased union takes no\n * branch and returns `undefined`, or a trailing `else` quietly generates something else. A corpus\n * whose manifest says it holds one transaction and holds another is a golden file that lies.\n *\n * So a selector is resolved against its own set, once, before anything is generated, and an\n * unrecognised one is a fatal `SYNTH_UNSUPPORTED_KIND`. Like every fatal here it carries a code and a\n * fixed message, and quotes neither the request nor the set.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/**\n * Resolve one caller-supplied selector against the closed set that governs it, or **fail closed**.\n *\n * @param allowed - Every value the selector may take.\n * @param requested - The selector the caller supplied.\n * @returns `requested`, narrowed to the union.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` when `requested` is not in `allowed`.\n * @example\n * ```ts\n * import { resolveKind } from \"@cosyte/synth\";\n * resolveKind([\"ccd\", \"referralNote\"] as const, \"ccd\"); // \"ccd\"\n * ```\n */\nexport function resolveKind<T extends string>(allowed: readonly T[], requested: string): T {\n const match = allowed.find((value) => value === requested);\n if (match === undefined) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_KIND);\n return match;\n}\n\n/**\n * Resolve every entry of a caller-supplied corpus mix, in order, or **fail closed** on the first\n * unrecognised one.\n *\n * It substitutes the default **only** when the caller supplied nothing, which is exactly what the\n * `??` it replaced did. An empty array is a supplied mix and is returned as one. An earlier version\n * of this function also treated `[]` as \"nothing supplied\", on the stated grounds that it matched the\n * previous behaviour; it did not — `??` fires on `undefined` and never on `[]` — and it changed the\n * result of six published entry points, turning an explicit empty selection into \"generate one of\n * everything\". A convenience that fails open is not a convenience.\n *\n * @param allowed - Every kind the corpus may generate.\n * @param requested - The mix the caller supplied, or `undefined` for the default.\n * @param fallback - The default mix, used only when `requested` is `undefined`.\n * @returns The resolved mix.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` on the first unrecognised entry.\n * @example\n * ```ts\n * import { resolveMix } from \"@cosyte/synth\";\n * resolveMix([\"Result\", \"Order\"] as const, [\"Order\"], [\"Result\", \"Order\"]); // [\"Order\"]\n * ```\n */\nexport function resolveMix<T extends string>(\n allowed: readonly T[],\n requested: readonly string[] | undefined,\n fallback: readonly T[],\n): readonly T[] {\n if (requested === undefined) return fallback;\n return requested.map((entry) => resolveKind(allowed, entry));\n}\n","/**\n * `@cosyte/synth` — a deterministic, seedable **synthetic-data / test-fixture generator** for the\n * cosyte healthcare formats. A *consumer* of the parsers, not a parser: it builds artifacts **through\n * each parser's own builder/serializer** (so output is spec-clean by construction) and draws every\n * value from a **guaranteed-non-colliding synthetic source** (so no output can be real or\n * plausibly-real PHI). It is a **format/conformance generator, not a clinical simulator**.\n *\n * This root entry point exposes the **format-agnostic core**: the seeded PRNG, the synthetic-safety\n * providers, the `Corpus` abstraction, the profile skeleton, and the fatal codes. Per-format\n * generation lives behind its own subpath (`@cosyte/synth/hl7`) so importing the root never pulls a\n * parser — the lazy per-format boundary.\n *\n * @module\n */\n\n/**\n * Library version string, equal to this package's published `package.json#version`.\n *\n * Changesets owns the bump and rewrites `package.json` only, so the release `version` script runs\n * `scripts/sync-version.mjs` to rewrite this declaration in the same commit, and\n * `test/sanity.test.ts` compares the two so a skipped sync goes red instead of shipping a version\n * string that lies.\n *\n * The `: string` annotation is deliberate: without it the declaration's inferred type is the string\n * literal itself, which bakes the current release into the emitted declarations and narrows every\n * consumer's type on each bump.\n *\n * @example\n * ```ts\n * import { VERSION } from \"@cosyte/synth\";\n * console.log(VERSION);\n * ```\n */\nexport const VERSION: string = \"0.0.6\";\n\n// ── Seeded, deterministic PRNG (the reproducibility contract, roadmap §5) ──\nexport { createRng, type Rng } from \"./rng/rng.js\";\nexport { splitmix32 } from \"./rng/splitmix32.js\";\nexport { sfc32Next, type Sfc32State } from \"./rng/sfc32.js\";\n\n// ── The synthetic-safety provider layer (roadmap §4) ──\nexport {\n safe,\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n type SyntheticName,\n type SyntheticAddress,\n type SyntheticIdentifier,\n type SsnBlock,\n} from \"./safe/index.js\";\nexport {\n isSyntheticSsn,\n isSyntheticPhone,\n isSyntheticEmail,\n isSyntheticIp,\n isSyntheticNpi,\n npiCheckDigit,\n luhnMod10,\n isSyntheticDea,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n NPI_LUHN_PREFIX,\n} from \"./safe/reserved.js\";\nexport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./safe/names-pool.js\";\n\n// ── The reproducible Corpus abstraction (roadmap §2, §5) ──\nexport {\n makeCorpus,\n type Corpus,\n type CorpusManifest,\n type Artifact,\n type SynthFormat,\n} from \"./corpus.js\";\n\n// ── The profile growth-loop skeleton (roadmap §Phase 1) ──\nexport { defineSynthProfile, type SynthProfile, type SynthProfileSpec } from \"./profile.js\";\n\n// ── The quirk core (roadmap §Phase 7 — the differentiator; format recipes live per-subpath) ──\nexport {\n resolveQuirk,\n sameCodeSet,\n profileTolerated,\n validateProfileQuirks,\n assertIntendedWarnings,\n PROFILE_QUIRK_APPLIED,\n type QuirkDescriptor,\n type QuirkArtifact,\n type QuirkProfileDisposition,\n type QuirkProfiledVerdict,\n type QuirkRoundTripResult,\n} from \"./quirk.js\";\n\n// ── Stable fatal codes + the typed error (roadmap §Phase 1) ──\nexport {\n SYNTH_FATAL_CODES,\n SYNTH_FATAL_MESSAGES,\n SynthError,\n type SynthFatalCode,\n} from \"./codes.js\";\nexport { resolveKind, resolveMix } from \"./select.js\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cosyte/synth",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Deterministic, seedable synthetic healthcare-fixture generator for Node.js and TypeScript — spec-clean by construction, never real PHI.",
5
5
  "keywords": [
6
6
  "synth",
@@ -205,8 +205,8 @@
205
205
  "smoke": "node scripts/smoke.mjs",
206
206
  "clean": "rm -rf dist coverage",
207
207
  "pack:docs": "bash scripts/build-docs-artifacts.sh",
208
- "attw": "attw --pack . --profile node16",
209
- "version": "changeset version && prettier --write package.json CHANGELOG.md",
208
+ "attw": "node scripts/attw.mjs --profile node16",
209
+ "version": "changeset version && node scripts/sync-version.mjs && prettier --write package.json CHANGELOG.md src/index.ts",
210
210
  "release": "changeset publish"
211
211
  }
212
212
  }