# LDC-E1355 — Case-package root outside its composition ## What it means A case package keeps a closed composition at its root: policies, calendars, and the cases themselves. Norms, relations, and facts live in a separate pinned package that the root depends on — never beside the cases. A relation or rule declared at the root breaks the split the whole resolution machinery assumes, so the engine stops at the root before linking any world. The repair is to move the declarations into the pinned model package and depend on it, leaving the root to cases and policies. The root asks questions; it never declares what they are about. ## Example ```run {"argv": ["ask", "$ROOT", "--query-id", "Q", "--query", "evaluate truth(sunny());"], "files": {"law.toml": "[package]\nname = \"demo.diagnostics\"\nversion = \"0.1.0\"\nlanguage = \"0.2\"\nnamespace = \"urn:law:demo:diagnostics\"\n\n[[cases]]\nname = \"Solo\"\npath = \"solo.lawcase\"\n", "package.law": "language \"law.core\" version \"0.2\";\npackage demo.diagnostics version \"0.1.0\";\nnamespace \"urn:law:demo:diagnostics\";\n\nrelation sunny() kind institutional;\n", "solo.lawcase": "language \"law.core\" version \"0.2\";\npackage demo.diagnostics version \"0.1.0\";\nnamespace \"urn:law:demo:diagnostics\";\n\nrelation sunny() kind institutional;\n\ncase Solo {\n context {\n legal_time @2026-08-26;\n }\n}\n", "law.lock": "{\n \"dependencyEdges\": [],\n \"languageSemantics\": \"law.core/0.2.0\",\n \"lockVersion\": \"0.1\",\n \"packages\": [],\n \"resolutionHash\": \"sha256:be03238a8c67b8f0879522d90b0750732ba05663f96df91cea6118d0a84076b1\",\n \"root\": {\n \"contentHash\": \"sha256:f6ee452b5a1b1ea60601c67b78a639066f8bda6b184f379b80749633c387331f\",\n \"name\": \"demo.diagnostics\",\n \"namespace\": \"urn:law:demo:diagnostics\",\n \"version\": \"0.1.0\"\n }\n}\n"}, "expect": "LDC-E1355"} ``` ## Fix ```run {"argv": ["ask", "$ROOT", "--query-id", "Q", "--query", "evaluate truth(sunny());"], "files": {"law.toml": "[package]\nname = \"demo.diagnostics\"\nversion = \"0.1.0\"\nlanguage = \"0.2\"\nnamespace = \"urn:law:demo:diagnostics\"\n\n[[cases]]\nname = \"Solo\"\npath = \"solo.lawcase\"\n", "package.law": "language \"law.core\" version \"0.2\";\npackage demo.diagnostics version \"0.1.0\";\nnamespace \"urn:law:demo:diagnostics\";\n", "solo.lawcase": "language \"law.core\" version \"0.2\";\npackage demo.diagnostics version \"0.1.0\";\nnamespace \"urn:law:demo:diagnostics\";\n\nrelation sunny() kind institutional;\n\ncase Solo {\n context {\n legal_time @2026-08-26;\n }\n}\n", "law.lock": "{\n \"dependencyEdges\": [],\n \"languageSemantics\": \"law.core/0.2.0\",\n \"lockVersion\": \"0.1\",\n \"packages\": [],\n \"resolutionHash\": \"sha256:be03238a8c67b8f0879522d90b0750732ba05663f96df91cea6118d0a84076b1\",\n \"root\": {\n \"contentHash\": \"sha256:f6ee452b5a1b1ea60601c67b78a639066f8bda6b184f379b80749633c387331f\",\n \"name\": \"demo.diagnostics\",\n \"namespace\": \"urn:law:demo:diagnostics\",\n \"version\": \"0.1.0\"\n }\n}\n"}, "expect": null} ``` ## Engine message The engine reports this in its own wording: ```text {"error":{"code":"LDC-E1355","message":"the case-package root contains declarations outside the closed composition: symbol_decl — norms and facts live in a separate pinned package (§168.4)"}} ``` ## Related - [LDC-E1354](/diagnostics/LDC-E1354/) — a question with no registered case.