diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,142 +15,197 @@
 
 ---
 
-## [0.17.1] - unreleased
+## [0.17.2] - 2026-07-28
 
-Development version. Opens the 0.17.x line — the first release built entirely against
-published 0.17.0 hosts (Hackage / PyPI / Maven Central), with the `hostOverrides` shims
-that were needed while 0.16.1 lacked the effect type and I/O primitives removed.
+Point release on the 0.17.x line. Themes: promotion of the generator's routing and manifest
+logic into Hydra (`hydra.build.*`), per-package API-doc publishing across Java/Scala/Python,
+constraint-polymorphic arithmetic, and new effectful stream/file primitives. Includes the base64
+binary-literal rename `literals.binaryToString`/`stringToBinary` → `binaryToBase64`/`base64ToBinary`,
+a step toward [#417](https://github.com/CategoricalData/hydra/issues/417) (which remains in progress).
 
+### Highlights
+
+- **Build system promoted into Hydra**: the three generator drivers now consume `hydra.build.routing`
+  ([#560](https://github.com/CategoricalData/hydra/issues/560)) and `hydra.build.manifest`
+  ([#607](https://github.com/CategoricalData/hydra/issues/607)), retiring the legacy static prefix
+  tables; the cold-seeder oil-and-water violation is fixed
+  ([#608](https://github.com/CategoricalData/hydra/issues/608)) and guarded
+  ([#617](https://github.com/CategoricalData/hydra/issues/617)).
+- **Per-package API docs** for all doc-bearing hosts: JavaDoc restructured with cross-links and a fixed
+  tag→CI→Pages chain ([#616](https://github.com/CategoricalData/hydra/issues/616)), plus mirrored
+  Scaladoc ([#619](https://github.com/CategoricalData/hydra/issues/619)) and Python API docs
+  ([#620](https://github.com/CategoricalData/hydra/issues/620)).
+- **Constraint-polymorphic arithmetic**: a `numeric` type class with enforcement and value-level dispatch
+  ([#566](https://github.com/CategoricalData/hydra/issues/566)), reflected on the target hosts
+  ([#618](https://github.com/CategoricalData/hydra/issues/618)).
+
 ### New features
 
+- Standard-stream primitives: `stdin`/`stdout`/`stderr` ([#526](https://github.com/CategoricalData/hydra/issues/526)).
+- Recursive flag for `hydra.lib.files.listDirectory` ([#527](https://github.com/CategoricalData/hydra/issues/527)).
+- Hydra-specific regex syntax with per-target translation (`hydra.read.regex` / `hydra.show.regex`)
+  ([#567](https://github.com/CategoricalData/hydra/issues/567)).
+- Constraint-polymorphic arithmetic: `numeric` type class + value-level dispatch
+  ([#566](https://github.com/CategoricalData/hydra/issues/566)).
+- Aggregated Java + Scala Maven publishing into a single Central Portal deployment
+  ([#591](https://github.com/CategoricalData/hydra/issues/591)).
+
+### Improvements
+
+- Generator drivers consume `hydra.build.routing` ([#560](https://github.com/CategoricalData/hydra/issues/560))
+  and `hydra.build.manifest` ([#607](https://github.com/CategoricalData/hydra/issues/607)).
+- Fixed the cold-seeder oil-and-water violation ([#608](https://github.com/CategoricalData/hydra/issues/608))
+  and extended `check-oil-and-water.py` to catch cold-seeder imports of unpublished `Hydra.Build.*`
+  ([#617](https://github.com/CategoricalData/hydra/issues/617)).
+- Moved non-kernel packages to strict validation, clearing the #575 backlog
+  ([#580](https://github.com/CategoricalData/hydra/issues/580)).
+- Decoupled `Hydra.Sources.Test.All` from `Hydra.Sources.All`'s re-export list
+  ([#601](https://github.com/CategoricalData/hydra/issues/601)).
+- Renamed `hydra.json.schema` to resolve the module-vs-namespace-prefix conflict that broke
+  file-per-module hosts ([#532](https://github.com/CategoricalData/hydra/issues/532)).
+- Coders route `hydra.lib.*` overlay imports by overlay-module existence, not name-matching
+  `hydra.lib.defaults` ([#568](https://github.com/CategoricalData/hydra/issues/568)).
+- Per-package JavaDoc/Scaladoc/Python-doc publishing
+  ([#616](https://github.com/CategoricalData/hydra/issues/616),
+  [#619](https://github.com/CategoricalData/hydra/issues/619),
+  [#620](https://github.com/CategoricalData/hydra/issues/620)).
+- Aligned Java-host Scala/TypeScript generation with Haskell on expression layout (line-wrapping,
+  declaration order) ([#612](https://github.com/CategoricalData/hydra/issues/612)).
+
+### Bug fixes
+
+- **TypeScript** — added the missing CI job (zero prior coverage)
+  ([#571](https://github.com/CategoricalData/hydra/issues/571)); fixed the
+  `verify-distribution.sh` smoke-test import so the gate actually gates
+  ([#578](https://github.com/CategoricalData/hydra/issues/578)); emit `hydra.parse.regex`'s
+  `regexSequence` before its alternation use (TS2448)
+  ([#604](https://github.com/CategoricalData/hydra/issues/604)).
+- **Build and sync** — `sync.sh` Phase 3 digest-cache now sees cross-package deps on moved kernel
+  symbols, fixing stale downstream output ([#606](https://github.com/CategoricalData/hydra/issues/606)).
+- **Numeric constraints** — `#566` polymorphism now reflected on the target hosts (targets were
+  monomorphizing `int32->int32->int32`) ([#618](https://github.com/CategoricalData/hydra/issues/618)).
+
+---
+
+## [0.17.1] - 2026-07-18
+
+Consolidation release on the 0.17.x line, built against published 0.17.0 hosts. Themes:
+generated term-reference DSLs, a translingual package-validation framework, promotion of the
+build system into Hydra (`hydra-build`), and broad TypeScript-host and cross-host hardening.
+
+### Highlights
+
 - **Generated term-reference DSLs** ([#467](https://github.com/CategoricalData/hydra/issues/467)):
-  kernel *term* modules now project generated DSL surfaces, completing the story begun with
-  type-module DSLs and the generated primitive wrappers (`hydra.dsl.lib.*`, 0.17.0). A
-  signature read-back in the DSL pass reuses the main pass's inference, and a demand-curated
-  set of 19 kernel term modules (plus the json/test/extract modules) emits one typed,
-  rename-safe reference per definition into every target language — e.g. Haskell
-  `Hydra.Dsl.Strip.deannotateType`, Java `hydra.dsl.Strip.deannotateType(...)`, Python
-  `hydra.dsl.strip.deannotate_type(...)`. The Java and Python coder sources were pivoted onto
-  the generated references, retiring ~700 stringly-typed inline `var("hydra....")` references
-  and shrinking Python's hand registry to the non-generatable remainder (byte-identical
-  generated output before and after). Follow-ups:
-  [#555](https://github.com/CategoricalData/hydra/issues/555) (typed references to derived
-  encode/decode/show functions via `TypedName`),
-  [#556](https://github.com/CategoricalData/hydra/issues/556) (non-kernel packages).
+  kernel term modules now emit one typed, rename-safe reference per definition into every target
+  language; the Java and Python coder sources were pivoted onto them, retiring ~700 stringly-typed
+  inline references.
 - **Package validation** ([#574](https://github.com/CategoricalData/hydra/issues/574),
   [#575](https://github.com/CategoricalData/hydra/issues/575)): a translingual `hydra.validate.*`
-  framework carries per-package `ValidationProfile`s (error/warning rules, error/warning caps) and a
-  catalog of checks — undeclared-package-dependency detection (now a fatal gate, #574),
-  definition-name convention (PascalCase), definition ordering, documentation completeness, and
-  conflicting-variant-name detection — layered on the existing core term/type well-formedness rules.
-  A kernel-strict / others-relaxed policy keeps `/sync` green fleet-wide while the documentation
-  backlog drains. See the new [Validation](https://github.com/CategoricalData/hydra/wiki/Validation)
-  wiki page for the full per-package constraint specification.
-- **DSL-authoring registration guards** ([#554](https://github.com/CategoricalData/hydra/issues/554)):
-  fail-fast authoring-time validation for the host-native DSL sources — every DSL-authoring module in
-  Java/`hydra-jvm`, Python, and Scala now asserts its definitions are fully registered
-  (`Defs.checkComplete` / `check_complete`), backed by a Haskell kernel-source registration-completeness
-  scanner, so a definition added to a source file but omitted from its `definitions` list fails loudly
-  instead of silently vanishing from the generated output.
-- **`hydra-build` package** ([#546](https://github.com/CategoricalData/hydra/issues/546),
-  [#529](https://github.com/CategoricalData/hydra/issues/529),
-  [#530](https://github.com/CategoricalData/hydra/issues/530)): the build-orchestration logic that had
-  lived only in host scripts is now translingual Hydra. Pure module-list utilities became
-  `hydra.build.modules` (#529) and the orphan-reconcile decision became `hydra.build.reconcile` (#530),
-  each with a translingual test suite; the `hydra.build.*` modules were then extracted into a dedicated
-  `hydra-build` package (#546), separate from the kernel.
-- **Metadata sidecar + content/version-addressed freshness**
-  ([#415](https://github.com/CategoricalData/hydra/issues/415)): dist manifests now carry a
-  `moduleFormatVersion` field, and the generator's freshness basis is content/version-addressed — the
-  groundwork for reproducible, cache-correct incremental generation.
-- **Structured generation-provenance record**
-  ([#523](https://github.com/CategoricalData/hydra/issues/523)): each generation run now records a
-  structured `Generation` provenance entry (digest v2), replacing the ad-hoc shell threading of
-  generation metadata.
-- **Worker + issue hierarchy** ([#557](https://github.com/CategoricalData/hydra/issues/557)): a
-  principled agent/worker framework — roles and parentage mirroring the GitHub issue tree, a
-  cross-worktree message transport with a verify-after-copy protocol, a blocking-aware design-question
-  (`decisions/`) channel, an issue-proposal queue with the `/issues` command, an autonomy-dial banner,
-  and cross-machine staging coordination. Contributor-facing process only; no change to generated code.
+  framework with per-package `ValidationProfile`s (undeclared-dependency gate, naming/ordering/docs
+  checks). See the [Validation](https://github.com/CategoricalData/hydra/wiki/Validation) wiki page.
+- **`hydra-build` package** ([#546](https://github.com/CategoricalData/hydra/issues/546)):
+  build-orchestration logic that lived only in host scripts is now translingual Hydra
+  (`hydra.build.*`), extracted into a dedicated package.
 
-### API and usability
+### New features
 
-- **DSL usability passes** ([#430](https://github.com/CategoricalData/hydra/issues/430),
-  [#553](https://github.com/CategoricalData/hydra/issues/553)): reviewed the host-native Java, Python,
-  and Scala DSL surfaces for ergonomics and cross-host parity (documented def shapes, added a Scala
-  projection helper), bringing the three authoring dialects into closer alignment.
+- Generated term-reference DSLs ([#467](https://github.com/CategoricalData/hydra/issues/467));
+  follow-ups: `TypedName` refs to derived encode/decode/show
+  ([#555](https://github.com/CategoricalData/hydra/issues/555)), non-kernel packages
+  ([#556](https://github.com/CategoricalData/hydra/issues/556)).
+- Translingual package-validation framework ([#574](https://github.com/CategoricalData/hydra/issues/574),
+  [#575](https://github.com/CategoricalData/hydra/issues/575)).
+- DSL-authoring registration guards: fail-fast completeness checks for the Java/Python/Scala DSL sources
+  ([#554](https://github.com/CategoricalData/hydra/issues/554)).
+- `hydra-build` package: `hydra.build.modules`
+  ([#529](https://github.com/CategoricalData/hydra/issues/529)), `hydra.build.reconcile`
+  ([#530](https://github.com/CategoricalData/hydra/issues/530)), extracted from the kernel
+  ([#546](https://github.com/CategoricalData/hydra/issues/546)).
+- Effectful `hydra.lib.system` primitive library ([#498](https://github.com/CategoricalData/hydra/issues/498)).
+- SHA-256 cryptographic hash primitive in `hydra.lib` ([#524](https://github.com/CategoricalData/hydra/issues/524)).
+- `hydra-jvm` package: shared JVM serde helpers relocated out of `hydra.java.serde`
+  ([#505](https://github.com/CategoricalData/hydra/issues/505)).
+- Internalized the Hydra-TinkerPop bindings (formerly HydraPop)
+  ([#442](https://github.com/CategoricalData/hydra/issues/442)).
+- Compact unit-valued variants in the JSON encoding ([#520](https://github.com/CategoricalData/hydra/issues/520)).
+- Structured generation-provenance record (digest v2) ([#413](https://github.com/CategoricalData/hydra/issues/413),
+  [#523](https://github.com/CategoricalData/hydra/issues/523)).
+- Metadata sidecar + content/version-addressed freshness (`moduleFormatVersion`)
+  ([#415](https://github.com/CategoricalData/hydra/issues/415)).
+- Worker + issue hierarchy: agent/worker framework, cross-worktree messaging, issue-proposal queue
+  (contributor process only) ([#557](https://github.com/CategoricalData/hydra/issues/557)).
 
-### Fixed
+### Improvements
 
-Bug fixes landed this cycle, grouped by area (see each issue for detail):
+- Type inference for annotations ([#229](https://github.com/CategoricalData/hydra/issues/229)).
+- Fixed the signature / definition split in primitive definitions
+  ([#502](https://github.com/CategoricalData/hydra/issues/502)).
+- DSL usability passes across the host-native Java/Python/Scala surfaces
+  ([#430](https://github.com/CategoricalData/hydra/issues/430),
+  [#553](https://github.com/CategoricalData/hydra/issues/553)).
+- Audited the Scala and Lisp-family coders for the unconditional `hydra.lib.*` overlay-import rewrite
+  ([#569](https://github.com/CategoricalData/hydra/issues/569)).
 
-- **TypeScript** — reactivated `hydra.lib.*` primitive tests surfaced encoder gaps: lazy show-calling
-  let bindings and compact bare-string `LiteralType` expansion in the test converter
-  ([#564](https://github.com/CategoricalData/hydra/issues/564)),
-  `binaryToBytes` registration + base64 binary decode in `decodeUtf8`
-  ([#561](https://github.com/CategoricalData/hydra/issues/561)),
+### Bug fixes
+
+- **TypeScript host** — V8 stack budget on ts→Java ([#390](https://github.com/CategoricalData/hydra/issues/390));
+  effectful libs not generated / 484 tsc errors ([#503](https://github.com/CategoricalData/hydra/issues/503));
+  15 effect/file inference cases ([#504](https://github.com/CategoricalData/hydra/issues/504));
+  ts→ts self-host regression ([#507](https://github.com/CategoricalData/hydra/issues/507)); npm packages
+  bundling a duplicate kernel ([#584](https://github.com/CategoricalData/hydra/issues/584)); broken npm
+  entry points ([#587](https://github.com/CategoricalData/hydra/issues/587));
+  `hydra.test.build.modules.allTests` gen-universe gap ([#588](https://github.com/CategoricalData/hydra/issues/588)).
+- **TypeScript coder** — reactivated `hydra.lib.*` tests: lazy show-calling let bindings + compact
+  `LiteralType` expansion ([#564](https://github.com/CategoricalData/hydra/issues/564)); `binaryToBytes`
+  registration + base64 decode in `decodeUtf8` ([#561](https://github.com/CategoricalData/hydra/issues/561));
   `hydra.test.build.*` emission after the #546 split
-  ([#570](https://github.com/CategoricalData/hydra/issues/570)), and `HYDRA_DEFAULT_IMPLS` support in
-  the test runner ([#536](https://github.com/CategoricalData/hydra/issues/536)).
-- **Tests and CI** — restored the default-primitive-implementation testing solution
-  ([#388](https://github.com/CategoricalData/hydra/issues/388),
-  [#549](https://github.com/CategoricalData/hydra/issues/549)), reactivated previously-ignored kernel
-  test cases ([#513](https://github.com/CategoricalData/hydra/issues/513),
-  [#550](https://github.com/CategoricalData/hydra/issues/550)), wired the regression harnesses into CI
-  and split them out of the monolithic Haskell job for timeout headroom
-  ([#535](https://github.com/CategoricalData/hydra/issues/535),
-  [#563](https://github.com/CategoricalData/hydra/issues/563)), added Scala/Go/Lisp
-  self-containment gates to `verify-distribution.sh`
-  ([#537](https://github.com/CategoricalData/hydra/issues/537)), a manifest-JSON-tracked CI check
-  ([#541](https://github.com/CategoricalData/hydra/issues/541)), a per-package test-digest freshness
-  fix ([#551](https://github.com/CategoricalData/hydra/issues/551)), overlay-file restoration in
-  `test-stale-output-prune.sh` ([#558](https://github.com/CategoricalData/hydra/issues/558)), and a
-  sync-freshness fingerprint that now sees host-native DSL sources
-  ([#562](https://github.com/CategoricalData/hydra/issues/562)).
+  ([#570](https://github.com/CategoricalData/hydra/issues/570)); `HYDRA_DEFAULT_IMPLS` in the test runner
+  ([#536](https://github.com/CategoricalData/hydra/issues/536)); overlay-import rewrite no longer captures
+  `hydra.lib.defaults` ([#565](https://github.com/CategoricalData/hydra/issues/565)).
+- **Lisp family** — clj→clj bootstrap hang in `generate_source_files`
+  ([#479](https://github.com/CategoricalData/hydra/issues/479)); Common Lisp `test_graph.lisp` loader
+  forward-reference ([#496](https://github.com/CategoricalData/hydra/issues/496)); Scheme maps
+  last-writer-wins in `union` ([#545](https://github.com/CategoricalData/hydra/issues/545)); Emacs Lisp
+  bootstrap `wrong-type-argument (listp :string)` ([#586](https://github.com/CategoricalData/hydra/issues/586));
+  `hydra.build.*` regeneration into the Lisp dialects ([#544](https://github.com/CategoricalData/hydra/issues/544)).
 - **Kernel and coders** — Java binary-literal signed-byte emission
-  ([#528](https://github.com/CategoricalData/hydra/issues/528)), `hydra.json.Decode.fromJson`
-  parametric-type (Application/Forall) support
-  ([#531](https://github.com/CategoricalData/hydra/issues/531)), stale 2-param `Coder` shape in
-  Java/Scala test bootstrap ([#552](https://github.com/CategoricalData/hydra/issues/552)), and a
-  kernel dead-code/TODO cleanup ([#538](https://github.com/CategoricalData/hydra/issues/538)).
+  ([#528](https://github.com/CategoricalData/hydra/issues/528)); `hydra.json.Decode.fromJson`
+  parametric-type support ([#531](https://github.com/CategoricalData/hydra/issues/531)); stale 2-param
+  `Coder` shape in Java/Scala test bootstrap ([#552](https://github.com/CategoricalData/hydra/issues/552));
+  Java Javadoc ampersand escaping ([#493](https://github.com/CategoricalData/hydra/issues/493)); Scala
+  coder over-generalizing `Schema[S,T,V,E]` args, breaking `hydra-pg`
+  ([#589](https://github.com/CategoricalData/hydra/issues/589)); kernel dead-code/TODO cleanup
+  ([#538](https://github.com/CategoricalData/hydra/issues/538)).
+- **Publishing and packaging** — self-broken 0.16.0 `hydra-kernel`/`hydra-python` wheels
+  ([#472](https://github.com/CategoricalData/hydra/issues/472)).
 - **Lib and build** — `hydra.lib.files` copy/removeDirectory/status overlays across all nine hosts
-  ([#525](https://github.com/CategoricalData/hydra/issues/525)), `hydra.build.*` regeneration into the
-  Lisp dialects ([#544](https://github.com/CategoricalData/hydra/issues/544)), Scheme maps
-  last-writer-wins in `union` ([#545](https://github.com/CategoricalData/hydra/issues/545)),
-  standalone-kernel SHA dependency ([#542](https://github.com/CategoricalData/hydra/issues/542)),
-  the lexicon's empty Types section ([#539](https://github.com/CategoricalData/hydra/issues/539)), and
-  a duplicated generated-file header in `generate-head-haskell-build.py`
-  ([#540](https://github.com/CategoricalData/hydra/issues/540)).
-
-- **TypeScript overlay-import rewrite** ([#565](https://github.com/CategoricalData/hydra/issues/565)):
-  the TypeScript coder's lib overlay-import rewrite no longer captures `hydra.lib.defaults`, which is a
-  generated (not overlaid) module; excluding it fixes spurious import references in generated TypeScript.
-
-- **Lexicon generation** (`bin/regenerate-lexicon.sh`): the generator had been failing
-  silently since the encoder/decoder modules moved to in-memory synthesis
-  ([#448](https://github.com/CategoricalData/hydra/issues/448)) — the script masked the
-  failure and left a stale `docs/hydra-lexicon.txt` missing the four effectful primitive
-  libraries (`hydra.lib.{effects,files,system,text}`). The synthesized coder modules are
-  now included in the lexicon universe, the script fails loudly, and the regenerated
-  lexicon covers all 267 primitives across 17 library modules.
-- **`bin/prepare-release.sh`**: the non-blocking Java quality check invoked Gradle
-  subprojects (`:hydra-rdf4j:test` etc.) that were removed in
-  [#511](https://github.com/CategoricalData/hydra/issues/511), so it always warned without
-  checking anything; it now runs the `dist/java/hydra-pg` package tests (the current home
-  of the former binding tests).
-- **`.gitignore`**: the ignore rules for the overlaid hand-written Haskell runtime still
-  named pre-[#501](https://github.com/CategoricalData/hydra/issues/501) paths, so 41
-  duplicate copies under `dist/haskell/` had become tracked; the rules now match the
-  `Hydra/Overlay/` location and the duplicates are untracked.
+  ([#525](https://github.com/CategoricalData/hydra/issues/525)); standalone-kernel SHA dependency
+  ([#542](https://github.com/CategoricalData/hydra/issues/542)); lexicon's empty Types section
+  ([#539](https://github.com/CategoricalData/hydra/issues/539)); silent lexicon-generation failure since
+  the coders moved to in-memory synthesis ([#448](https://github.com/CategoricalData/hydra/issues/448));
+  duplicated generated-file header in `generate-head-haskell-build.py`
+  ([#540](https://github.com/CategoricalData/hydra/issues/540)); `.gitignore` untracking 41 duplicate
+  overlaid-runtime copies under `dist/haskell/` ([#501](https://github.com/CategoricalData/hydra/issues/501));
+  `bin/prepare-release.sh` Java quality check repointed to `dist/java/hydra-pg` tests after
+  ([#511](https://github.com/CategoricalData/hydra/issues/511)).
+- **Tests and CI** — restored default-primitive-implementation testing
+  ([#388](https://github.com/CategoricalData/hydra/issues/388),
+  [#549](https://github.com/CategoricalData/hydra/issues/549)); reactivated ignored kernel test cases
+  ([#513](https://github.com/CategoricalData/hydra/issues/513),
+  [#550](https://github.com/CategoricalData/hydra/issues/550)); wired + split out the regression harnesses
+  ([#535](https://github.com/CategoricalData/hydra/issues/535),
+  [#563](https://github.com/CategoricalData/hydra/issues/563)); Scala/Go/Lisp self-containment gates
+  ([#537](https://github.com/CategoricalData/hydra/issues/537)); manifest-JSON-tracked CI check
+  ([#541](https://github.com/CategoricalData/hydra/issues/541)); per-package test-digest freshness
+  ([#551](https://github.com/CategoricalData/hydra/issues/551)); overlay-file restoration in
+  `test-stale-output-prune.sh` ([#558](https://github.com/CategoricalData/hydra/issues/558)); DSL-aware
+  sync-freshness fingerprint ([#562](https://github.com/CategoricalData/hydra/issues/562)).
 
 ### Documentation
 
-- Corrected the 0.17.0 Maven coordinates throughout (Java artifacts publish under group
-  `net.fortytwo.hydra.java`, Scala under `net.fortytwo.hydra.scala`,
-  [#519](https://github.com/CategoricalData/hydra/issues/519)); added the npm and Scala
-  release channels to the README; added TypeScript/Scala/Lisp sections to Getting started;
-  repointed stale pre-#418/#501 DSL paths in the architecture docs; added GitHub issue and
-  PR templates.
+- Corrected 0.17.0 Maven coordinates and added npm/Scala release channels, TypeScript/Scala/Lisp
+  Getting-started sections, and issue/PR templates
+  ([#519](https://github.com/CategoricalData/hydra/issues/519)).
 
 ---
 
diff --git a/hydra-jvm.cabal b/hydra-jvm.cabal
--- a/hydra-jvm.cabal
+++ b/hydra-jvm.cabal
@@ -1,11 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.38.1.
+-- This file has been generated from package.yaml by hpack version 0.39.1.
 --
 -- see: https://github.com/sol/hpack
 
 name:           hydra-jvm
-version:        0.17.1
+version:        0.17.2
 synopsis:       Shared JVM support for Hydra's Java, Scala, and Clojure coders
 description:    Hydra is an implementation of the LambdaGraph data model, which takes advantage of an isomorphism between labeled hypergraphs and typed lambda calculus: in Hydra, "graphs are programs, and programs are graphs". Common JVM support for Hydra (shared by hydra-java, hydra-scala, hydra-clojure)
 category:       Data
@@ -34,5 +34,6 @@
       src/main/haskell
   build-depends:
       base >=4.19.0 && <4.22
-    , hydra-kernel ==0.17.1
+    , hydra-kernel ==0.17.2
+    , scientific >=0.3.7 && <0.4
   default-language: Haskell2010
diff --git a/src/main/haskell/Hydra/Jvm/Serde.hs b/src/main/haskell/Hydra/Jvm/Serde.hs
--- a/src/main/haskell/Hydra/Jvm/Serde.hs
+++ b/src/main/haskell/Hydra/Jvm/Serde.hs
@@ -1,50 +1,72 @@
 -- Note: this is an automatically generated file. Do not edit.
+
 -- | Common JVM serialization helpers: Java/Scala string and character escaping
 
 module Hydra.Jvm.Serde where
+
+import qualified Hydra.Ast as Ast
+import qualified Hydra.Classes as Classes
+import qualified Hydra.Coders as Coders
+import qualified Hydra.Core as Core
+import qualified Hydra.Error.Checking as Checking
+import qualified Hydra.Error.Core as ErrorCore
+import qualified Hydra.Error.Packaging as ErrorPackaging
+import qualified Hydra.Errors as Errors
+import qualified Hydra.Graph as Graph
+import qualified Hydra.Json.Model as Model
+import qualified Hydra.Overlay.Haskell.Lib.Equality as Equality
 import qualified Hydra.Overlay.Haskell.Lib.Lists as Lists
 import qualified Hydra.Overlay.Haskell.Lib.Logic as Logic
+import qualified Hydra.Overlay.Haskell.Lib.Math as Math
+import qualified Hydra.Overlay.Haskell.Lib.Optionals as Optionals
 import qualified Hydra.Overlay.Haskell.Lib.Strings as Strings
+import qualified Hydra.Packaging as Packaging
+import qualified Hydra.Parsing as Parsing
+import qualified Hydra.Paths as Paths
+import qualified Hydra.Query as Query
+import qualified Hydra.Relational as Relational
+import qualified Hydra.Tabular as Tabular
+import qualified Hydra.Testing as Testing
+import qualified Hydra.Topology as Topology
+import qualified Hydra.Typed as Typed
+import qualified Hydra.Typing as Typing
+import qualified Hydra.Util as Util
+import qualified Hydra.Validation as Validation
+import qualified Hydra.Variants as Variants
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
+import qualified Data.Scientific as Sci
 
--- | Escape a single character for use in a Java/Scala string or character literal
+-- | Escape a single character for inclusion in a Java string or char literal
 escapeJavaChar :: Int -> String
 escapeJavaChar c =
-    Logic.ifElse (c == 34) "\\\""
-    (Logic.ifElse (c == 92) "\\\\"
-    (Logic.ifElse (c == 10) "\\n"
-    (Logic.ifElse (c == 13) "\\r"
-    (Logic.ifElse (c == 9)  "\\t"
-    (Logic.ifElse (c == 8)  "\\b"
-    (Logic.ifElse (c == 12) "\\f"
-    (Logic.ifElse (c >= 32 && c < 127) (Strings.fromList [c])
-    (javaUnicodeEscape c))))))))
+    Logic.ifElse (Equality.equal c 34) "\\\"" (Logic.ifElse (Equality.equal c 92) "\\\\" (Logic.ifElse (Equality.equal c 10) "\\n" (Logic.ifElse (Equality.equal c 13) "\\r" (Logic.ifElse (Equality.equal c 9) "\\t" (Logic.ifElse (Equality.equal c 8) "\\b" (Logic.ifElse (Equality.equal c 12) "\\f" (Logic.ifElse (Logic.and (Equality.gte c 32) (Equality.lt c 127)) (Strings.fromList [
+      c]) (javaUnicodeEscape c))))))))
 
--- | Escape a string for use in a Java/Scala string literal
 escapeJavaString :: String -> String
-escapeJavaString s = Strings.cat (Lists.map escapeJavaChar (Strings.toList s))
+escapeJavaString s = Strings.cat (Lists.map (\c -> escapeJavaChar c) (Strings.toList s))
 
--- | Convert an integer in [0,15] to the ASCII code of the corresponding hex digit
 hexDigit :: Int -> Int
-hexDigit n = Logic.ifElse (n < 10) (n + 48) (n - 10 + 65)
+hexDigit n = Logic.ifElse (Equality.lt n 10) (Math.add n 48) (Math.add (Math.sub n 10) 65)
 
--- | Produce a \\uXXXX Unicode escape for the given code point
 javaUnicodeEscape :: Int -> String
 javaUnicodeEscape n =
-    Logic.ifElse (n > 65535)
-      (let n' = n - 65536
-           hi = 55296 + (n' `div` 1024)
-           lo = 56320 + (n' `mod` 1024)
-       in "\\u" ++ padHex4 hi ++ "\\u" ++ padHex4 lo)
-      ("\\u" ++ padHex4 n)
+    Logic.ifElse (Equality.gt n 65535) (
+      let n_ = Math.sub n 65536
+          hi = Math.add 55296 (Optionals.fromOptional 0 (Math.maybeDiv n_ 1024))
+          lo = Math.add 56320 (Optionals.fromOptional 0 (Math.maybeMod n_ 1024))
+      in (Strings.cat2 (Strings.cat2 "\\u" (padHex4 hi)) (Strings.cat2 "\\u" (padHex4 lo)))) (Strings.cat2 "\\u" (padHex4 n))
 
--- | Pad an integer to 4 hex digits
 padHex4 :: Int -> String
 padHex4 n =
-    let d3 = n `div` 4096
-        r3 = n `mod` 4096
-        d2 = r3 `div` 256
-        r2 = r3 `mod` 256
-        d1 = r2 `div` 16
-        d0 = r2 `mod` 16
-    in Strings.fromList [hexDigit d3, hexDigit d2, hexDigit d1, hexDigit d0]
+
+      let d3 = Optionals.fromOptional 0 (Math.maybeDiv n 4096)
+          r3 = Optionals.fromOptional 0 (Math.maybeMod n 4096)
+          d2 = Optionals.fromOptional 0 (Math.maybeDiv r3 256)
+          r2 = Optionals.fromOptional 0 (Math.maybeMod r3 256)
+          d1 = Optionals.fromOptional 0 (Math.maybeDiv r2 16)
+          d0 = Optionals.fromOptional 0 (Math.maybeMod r2 16)
+      in (Strings.fromList [
+        hexDigit d3,
+        (hexDigit d2),
+        (hexDigit d1),
+        (hexDigit d0)])
