Same pattern as ProjectID/SessionID: add branded MessageID type with
MessageID.zod and MessageID.ascending() helpers, type Drizzle columns
with $type<MessageID>(), and replace all Identifier.schema("message")
and z.string() usages. Brand flows through z.infer automatically.
Same pattern as ProjectID: add branded SessionID type with
SessionID.zod helper, type Drizzle columns with $type<SessionID>(),
and replace all z.string()/Identifier.schema("session") usages.
Brand flows through z.infer automatically, mapped at boundaries.
Introduce Effect branded ProjectID type into Drizzle table columns
and Zod schemas so the brand flows through z.infer automatically.
Adds ProjectID.zod helper to bridge Effect brands into Zod,
eliminating manual Omit & intersect type overrides.