diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,15 @@
 
 ## [Unreleased]
 
+## 0.17.0.0 — 2026-09-17
+
+### Other Changes
+
+- `IntegrationEvent.messageId` is now documented as opaque application-level
+  text: canonical Keiro producers derive it deterministically from source-event
+  coordinates, and explicit callers own their identity policy. It was previously
+  described as a time-ordered UUID. The type is unchanged.
+
 ## 0.16.0.0 — 2026-09-07
 
 ### Other Changes
diff --git a/keiro-core.cabal b/keiro-core.cabal
--- a/keiro-core.cabal
+++ b/keiro-core.cabal
@@ -1,34 +1,39 @@
-cabal-version:   3.0
-name:            keiro-core
-version:         0.16.0.0
-synopsis:        Core contracts for Keiro packages
+cabal-version: 3.0
+name: keiro-core
+version: 0.17.0.0
+synopsis: Core contracts for Keiro packages
 description:
   Stable stream, codec, event-stream, and integration-event contracts
   shared by Keiro packages.
 
-license:         BSD-3-Clause
-license-file:    LICENSE
-author:          Nadeem Bitar
-maintainer:      nadeem@gmail.com
-copyright:       2026 Nadeem Bitar
-category:        Control
-homepage:        https://github.com/shinzui/keiro#readme
-bug-reports:     https://github.com/shinzui/keiro/issues
-build-type:      Simple
-tested-with:     GHC >=9.12 && <9.13
+license: BSD-3-Clause
+license-file: LICENSE
+author: Nadeem Bitar
+maintainer: nadeem@gmail.com
+copyright: 2026 Nadeem Bitar
+category: Control
+homepage: https://github.com/shinzui/keiro#readme
+bug-reports: https://github.com/shinzui/keiro/issues
+build-type: Simple
+tested-with: ghc >=9.12 && <9.13
 extra-doc-files: CHANGELOG.md
 
 source-repository head
-  type:     git
+  type: git
   location: https://github.com/shinzui/keiro.git
 
 common warnings
   ghc-options:
-    -Wall -Wcompat -Widentities -Wincomplete-record-updates
-    -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints
+    -Wall
+    -Wcompat
+    -Widentities
+    -Wincomplete-record-updates
+    -Wincomplete-uni-patterns
+    -Wpartial-fields
+    -Wredundant-constraints
 
 common shared
-  default-language:   GHC2024
+  default-language: GHC2024
   default-extensions:
     DeriveAnyClass
     DuplicateRecordFields
@@ -39,7 +44,7 @@
     PackageImports
 
 library
-  import:          warnings, shared
+  import: warnings, shared
   exposed-modules:
     Keiro.Codec
     Keiro.Codec.IdDomain
@@ -54,19 +59,19 @@
     Keiro.Snapshot.Policy
     Keiro.Stream
 
-  hs-source-dirs:  src
+  hs-source-dirs: src
   build-depends:
-    , aeson         >=2.2  && <2.3
-    , aeson-casing  >=0.2  && <0.3
-    , base          >=4.21 && <5
-    , bytestring    >=0.11 && <0.13
-    , deepseq       >=1.5  && <1.6
-    , generic-lens  >=2.2  && <2.4
-    , keiki         >=0.9  && <0.10
-    , kiroku-store  >=0.8  && <0.9
-    , lens          >=5.2  && <5.4
-    , mmzk-typeid   >=0.7  && <0.8
-    , scientific    >=0.3  && <0.4
-    , text          >=2.1  && <2.2
-    , time          >=1.12 && <1.15
-    , uuid          >=1.3  && <1.4
+    aeson >=2.2 && <2.3,
+    aeson-casing >=0.2 && <0.3,
+    base >=4.21 && <5,
+    bytestring >=0.11 && <0.13,
+    deepseq >=1.5 && <1.6,
+    generic-lens >=2.2 && <2.4,
+    keiki >=0.9 && <0.10,
+    kiroku-store >=0.8 && <0.9,
+    lens >=5.2 && <5.4,
+    mmzk-typeid >=0.7 && <0.8,
+    scientific >=0.3 && <0.4,
+    text >=2.1 && <2.2,
+    time >=1.12 && <1.15,
+    uuid >=1.3 && <1.4,
diff --git a/src/Keiro/Integration/Event.hs b/src/Keiro/Integration/Event.hs
--- a/src/Keiro/Integration/Event.hs
+++ b/src/Keiro/Integration/Event.hs
@@ -68,11 +68,10 @@
 --
 -- Identity rules:
 --
--- * 'messageId' is an application-level id (UUIDv7 or equivalent
---   time-ordered UUID) minted by the producer subscription when it writes
---   the outbox row. It is stable across publish retries because it lives in
---   the row; Kafka topic/partition/offset are delivery metadata only and
---   are /not/ the canonical dedupe key.
+-- * 'messageId' is opaque application-level text. Canonical producers derive
+--   it deterministically from source-event coordinates; explicit callers own
+--   their identity policy. It is stable across publication retries. Kafka
+--   topic/partition/offset are delivery metadata, not the canonical dedupe key.
 -- * 'sourceEventId' and 'sourceGlobalPosition' identify the private event
 --   that produced this integration event. A single source event can fan out
 --   to multiple integration events with distinct 'messageId's; consumers
