diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,46 @@
 
 ---
 
+## [0.17.3] - 2026-08-01
+
+Point release on the 0.17.x line, focused on **release-artifact integrity**. The 0.17.2 release shipped
+two defects that every existing check missed because they validated only the generated `dist/` tree, never
+the packaged artifact: the `hydra-build` sdist shipped 3 of 8 modules, and the published Java `hydra-kernel`
+jar was a whole [#417](https://github.com/CategoricalData/hydra/issues/417) rename behind. This release adds
+an artifact-level publish-completeness gate that inspects the actual uploaded archive, closing that class of
+defect across all five registries.
+
+### Highlights
+
+- **Artifact-content completeness gate** ([#621](https://github.com/CategoricalData/hydra/issues/621)):
+  every publish path (Hackage sdist, Maven-Java jar, Maven-Scala jar, PyPI wheel, npm tarball) now inspects
+  the *packaged* archive and hard-fails if any module a package's manifest declares is missing. The gate also
+  asserts the post-#417 class names are present in the Java kernel jar.
+
+### Bug fixes
+
+- **PyPI wheels dropped non-`hydra.*` roots** ([#621](https://github.com/CategoricalData/hydra/issues/621)):
+  the wheel packaging hardcoded `packages = ["src/main/python/hydra"]`, silently omitting `hydra-pg`'s
+  `com.gdblab.*` and `openGql.*` modules. The generator now ships every emitted top-level root.
+
+### Improvements
+
+- **CI guard for dist-tree completeness** ([#524](https://github.com/CategoricalData/hydra/issues/524)):
+  asserts every manifest `mainModules` namespace is emitted into `dist/haskell`, catching the 0.17.2
+  `hydra-build` truncation at the tree level (the artifact gate is the packaged-archive counterpart).
+- **Manifest generation extracted** into `Hydra.ManifestGeneration`, and the structurally-unneeded #607
+  sed shims dropped ([#622](https://github.com/CategoricalData/hydra/issues/622)).
+- **Release-verification signing fix** ([#441](https://github.com/CategoricalData/hydra/issues/441)):
+  sign the reproducible uncompressed `.tar` and verify the `.asc` against the GitHub Release asset.
+- **Java CI signing gate** ([#591](https://github.com/CategoricalData/hydra/issues/591)): `publishToMavenLocal`
+  skips gpg signing when no key is present.
+
+### Internal
+
+- Version bump to 0.17.3; `hostVersion` advanced to 0.17.2 and the temporary #417 Java/Python local-host
+  shims removed now that 0.17.2 is published on the registries
+  ([#417](https://github.com/CategoricalData/hydra/issues/417)).
+
 ## [0.17.2] - 2026-07-28
 
 Point release on the 0.17.x line. Themes: promotion of the generator's routing and manifest
diff --git a/hydra-typescript.cabal b/hydra-typescript.cabal
--- a/hydra-typescript.cabal
+++ b/hydra-typescript.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hydra-typescript
-version:        0.17.3
+version:        0.17.4
 synopsis:       Hydra's TypeScript coder: emit TypeScript source from Hydra modules
 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". TypeScript support for Hydra
 category:       Data
@@ -40,6 +40,6 @@
   build-depends:
       base >=4.19.0 && <4.22
     , containers >=0.6.7 && <0.8
-    , hydra-kernel ==0.17.3
+    , hydra-kernel ==0.17.4
     , scientific >=0.3.7 && <0.4
   default-language: Haskell2010
diff --git a/src/main/haskell/Hydra/Dsl/TypeScript/Syntax.hs b/src/main/haskell/Hydra/Dsl/TypeScript/Syntax.hs
--- a/src/main/haskell/Hydra/Dsl/TypeScript/Syntax.hs
+++ b/src/main/haskell/Hydra/Dsl/TypeScript/Syntax.hs
@@ -5,7 +5,6 @@
 module Hydra.Dsl.TypeScript.Syntax where
 
 import qualified Hydra.Core as Core
-import qualified Hydra.Dsl.Core as DslCore
 import qualified Hydra.TypeScript.Syntax as Syntax
 import qualified Hydra.Typed as Typed
 import Prelude hiding  (Enum, Ordering, decodeFloat, encodeFloat, fail, map, pure, sum)
diff --git a/src/main/haskell/Hydra/TypeScript/Coder.hs b/src/main/haskell/Hydra/TypeScript/Coder.hs
--- a/src/main/haskell/Hydra/TypeScript/Coder.hs
+++ b/src/main/haskell/Hydra/TypeScript/Coder.hs
@@ -667,8 +667,8 @@
         Syntax.functionDeclarationGenerator = False}
 
 -- | Render a set of qualified names as TypeScript import statements grouped by source module
-importsToText :: String -> Packaging.ModuleName -> S.Set Core.Name -> String
-importsToText kind currentNs names =
+importsToText :: S.Set String -> String -> Packaging.ModuleName -> S.Set Core.Name -> String
+importsToText overlaySubs kind currentNs names =
 
       let pairs =
               Optionals.givens (Lists.map (\n -> Optionals.cases (Names.moduleNameOf n) Nothing (\ns -> Logic.ifElse (Equality.equal (Packaging.unModuleName currentNs) (Packaging.unModuleName ns)) Nothing (Just (ns, n)))) (Sets.toList names))
@@ -695,8 +695,9 @@
                         targetSegs = Lists.drop 1 (Strings.splitOn "." (Packaging.unModuleName ns))
                         targetIsTest =
                                 Logic.and (Logic.not (Lists.null targetSegs)) (Equality.equal (Optionals.withDefault "" (Lists.head targetSegs)) "test")
+                        targetSub = Optionals.withDefault "" (Lists.at 1 targetSegs)
                         targetPathSegs =
-                                Logic.ifElse (Equality.equal (Optionals.withDefault "" (Lists.head targetSegs)) "lib") (Lists.concat2 [
+                                Logic.ifElse (Logic.and (Equality.equal (Optionals.withDefault "" (Lists.head targetSegs)) "lib") (Sets.member targetSub overlaySubs)) (Lists.concat2 [
                                   "overlay",
                                   "typescript"] targetSegs) targetSegs
                         targetPath = Strings.join "/" targetPathSegs
@@ -743,8 +744,8 @@
       Syntax.documentationCommentTags = []})))
 
 -- | Convert a Hydra module to a map from .ts file path to TypeScript source
-moduleToTypeScript :: Packaging.Module -> [Packaging.Definition] -> Typing.InferenceContext -> Graph.Graph -> Either Errors.Error (M.Map String String)
-moduleToTypeScript mod defs cx g =
+moduleToTypeScript :: S.Set String -> Packaging.Module -> [Packaging.Definition] -> Typing.InferenceContext -> Graph.Graph -> Either Errors.Error (M.Map String String)
+moduleToTypeScript overlaySubs mod defs cx g =
 
       let currentNs = Packaging.moduleName mod
           partitioned = Environment.partitionDefinitions defs
@@ -760,8 +761,8 @@
           typeImports = Sets.union (Sets.union typeImportsFromTypes typeImportsFromTerms) typeImportsFromInner
           termImports =
                   Lists.foldl (\acc -> \td -> Sets.union acc (collectTermImports currentNs (Packaging.termDefinitionBody td))) Sets.empty termDefs
-          typeImportsBlock = importsToText "type" currentNs typeImports
-          termImportsBlock = importsToText "value" currentNs termImports
+          typeImportsBlock = importsToText overlaySubs "type" currentNs typeImports
+          termImportsBlock = importsToText overlaySubs "value" currentNs termImports
           importsBlock = Strings.concat2 typeImportsBlock termImportsBlock
       in (Eithers.bind (Eithers.mapList (encodeTypeDefinition cx g currentNs) typeDefs) (\typeItems ->
         let termItems = Lists.map (encodeTermDefinition cx g currentNs) termDefs
