# LDC-E8705 — Boundary does not match granularity ## What it means A parameter dataset reads time through one granularity: dates or instants. Every boundary — the coverage edges and each row edge — must sit on that grid: a date boundary is a calendar day, an instant boundary is a timestamped instant. A boundary written in the other shape cuts a grid cell in half, so the compiler stops at the first boundary that misses the grid. Snap the boundary to the dataset granularity: days for a date dataset, full timestamps for an instant one. ## Example ```run {"argv": ["check", "$ROOT"], "files": {"law.toml": "[package]\nname = \"demo.diagnostics\"\nversion = \"0.1.0\"\nlanguage = \"0.2\"\nnamespace = \"urn:demo:diagnostics\"\n", "main.law": "language \"law.core\" version \"0.2\";\npackage demo.diagnostics version \"0.1.0\";\nnamespace \"urn:demo:diagnostics\";\n\nentity Person;\n", "mrp.lawparam.json": "{\"schemaVersion\": \"law.params/0.1\", \"kind\": \"parameter-dataset\", \"id\": \"urn:demo:diagnostics#mrp\", \"parameter\": \"urn:demo:diagnostics#MRP\", \"valueType\": {\"name\": \"urn:law:std#Money\"}, \"timeAxis\": \"legal_time\", \"granularity\": \"instant\", \"coverage\": {\"start\": \"2025-01-01\", \"endExclusive\": null}, \"values\": [{\"id\": \"urn:demo:diagnostics#mrp#2025\", \"valid\": {\"start\": \"2025-01-01\", \"endExclusive\": \"2026-01-01\"}, \"value\": {\"kind\": \"value\", \"type\": {\"name\": \"urn:law:std#Money\"}, \"value\": \"3932\", \"currency\": \"KZT\"}, \"anchors\": [\"urn:demo:diagnostics#law#article-9\"]}, {\"id\": \"urn:demo:diagnostics#mrp#2026\", \"valid\": {\"start\": \"2026-01-01\", \"endExclusive\": null}, \"value\": {\"kind\": \"value\", \"type\": {\"name\": \"urn:law:std#Money\"}, \"value\": \"4325\", \"currency\": \"KZT\"}, \"anchors\": [\"urn:demo:diagnostics#law#article-9\"]}]}", "law.lock": "{\"lockVersion\": \"0.2\", \"resources\": [{\"capability\": \"compile_time\", \"contentHash\": \"sha256:611213f399942bb722634176727f846f80dc58ba7572818293fe7beb63a41cb3\", \"id\": \"urn:demo:diagnostics#mrp\", \"kind\": \"parameter-dataset\", \"path\": \"mrp.lawparam.json\"}]}"}, "expect": "LDC-E8705"} ``` ## Fix ```run {"argv": ["check", "$ROOT"], "files": {"law.toml": "[package]\nname = \"demo.diagnostics\"\nversion = \"0.1.0\"\nlanguage = \"0.2\"\nnamespace = \"urn:demo:diagnostics\"\n", "main.law": "language \"law.core\" version \"0.2\";\npackage demo.diagnostics version \"0.1.0\";\nnamespace \"urn:demo:diagnostics\";\n\nentity Person;\n", "mrp.lawparam.json": "{\"schemaVersion\": \"law.params/0.1\", \"kind\": \"parameter-dataset\", \"id\": \"urn:demo:diagnostics#mrp\", \"parameter\": \"urn:demo:diagnostics#MRP\", \"valueType\": {\"name\": \"urn:law:std#Money\"}, \"timeAxis\": \"legal_time\", \"granularity\": \"date\", \"coverage\": {\"start\": \"2025-01-01\", \"endExclusive\": null}, \"values\": [{\"id\": \"urn:demo:diagnostics#mrp#2025\", \"valid\": {\"start\": \"2025-01-01\", \"endExclusive\": \"2026-01-01\"}, \"value\": {\"kind\": \"value\", \"type\": {\"name\": \"urn:law:std#Money\"}, \"value\": \"3932\", \"currency\": \"KZT\"}, \"anchors\": [\"urn:demo:diagnostics#law#article-9\"]}, {\"id\": \"urn:demo:diagnostics#mrp#2026\", \"valid\": {\"start\": \"2026-01-01\", \"endExclusive\": null}, \"value\": {\"kind\": \"value\", \"type\": {\"name\": \"urn:law:std#Money\"}, \"value\": \"4325\", \"currency\": \"KZT\"}, \"anchors\": [\"urn:demo:diagnostics#law#article-9\"]}]}", "law.lock": "{\"lockVersion\": \"0.2\", \"resources\": [{\"capability\": \"compile_time\", \"contentHash\": \"sha256:4e67c8dd00f9f81714dac9ebb458546f98ab9a868cda961b9f181d474bdcb33d\", \"id\": \"urn:demo:diagnostics#mrp\", \"kind\": \"parameter-dataset\", \"path\": \"mrp.lawparam.json\"}]}"}, "expect": null} ``` ## Engine message The parameter checker reports this in its own wording: ```text LDC-E8705: coverage boundary does not match granularity ``` ## Related - [LDC-E8703](/diagnostics/LDC-E8703/) — the neighbouring parameter refusal.