# LPK-E0801 โ€” fact already proposed ## What it means Proposing records a fact for the case exactly once: each proposal gets an identifier, and proposing the same fact again returns the existing identifier instead of duplicating the record. The refusal is the lookup succeeding โ€” it names the proposal that already carries the fact. Nothing is created or changed by the refusal. Using the named proposal identifier downstream, or replacing the fact explicitly when it changed, is the whole fix. ## Example ```pkgtest { "files": { "law.toml": "[package]\nname = \"demo.case\"\nversion = \"0.1.0\"\nlanguage = \"0.2\"\nnamespace = \"urn:law:demo:case\"\n\n[[cases]]\nname = \"Main\"\npath = \"main.lawcase\"\n", "main.lawcase": "language \"law.core\" version \"0.2\";\npackage demo.case version \"0.1.0\";\nnamespace \"urn:law:demo:case\";\n\ncase Main {\n}\n", "facts.json": "[{\"predicate\": \"enrolled\", \"args\": [\"Ada\"]}, {\"predicate\": \"enrolled\", \"args\": [\"Ada\"]}]" }, "cmd": [ "case", "facts", "propose", "--from", "facts.json", "--by", "urn:law:registrar", "--at", "2026-01-01T00:00:00Z", "--project", "." ], "expect": "LPK-E0801" } ``` ## Fix ```pkgtest {"files": {}, "cmd": ["init", ".", "--name", "demo.diag"]} ``` ## Engine message The tool reports this in its own wording: ```text law: REFUSAL LPK-E0801: fact already proposed p-0001 (ยง168.4) ``` ## Related - [Package, context, snapshots](/recipes/n-package/) โ€” what a project directory holds.