From f03741b03e7c5b106497f3129727ef388687b8fe Mon Sep 17 00:00:00 2001 From: Malte Ubl Date: Mon, 26 Oct 2026 05:49:39 -0700 Subject: [PATCH] Keep the branded-primitive rule compilable by the self-hosted frontend Once shadow mode imports the normalizer, the self-hosted frontend lowers it, and it cannot compare union-typed canonical nodes by identity. Co-Authored-By: Claude Opus 5.5 --- packages/compiler/src/frontend/canon.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/compiler/src/frontend/canon.ts b/packages/compiler/src/frontend/canon.ts index 9066e2e88..706ec1e89 100644 --- a/packages/compiler/src/frontend/canon.ts +++ b/packages/compiler/src/frontend/canon.ts @@ -392,7 +392,8 @@ export class Normalizer { return arms.length === 1 ? arms[0]! : { k: "union", arms }; } const prims = parts.filter((p) => p.k === "prim" || p.k === "lit"); - if (prims.length === 1 && parts.every((p) => p === prims[0] || p.k === "obj")) return prims[0]!; + if (prims.length === 1 && parts.every((p) => p.k === "prim" || p.k === "lit" || p.k === "obj")) + return prims[0]!; if (parts.every((p) => p.k === "obj" || (p.k === "top" && p.t === "object"))) return this.object(type, env, key); return { k: "opaque", ts: type, reason: "intersection" };