{"version":"2.1.221","anchor":"whiteboard-hardening-permission-verdicts-state-sanitising-me","canonical_anchor":"whiteboard-hardening-permission-verdicts-state-sanitising-me","heading":"Whiteboard hardening: permission verdicts, state sanitising, merge-state validation","tier":"soon","area":"Whiteboard","scope":null,"heads_up":null,"url":"https:\/\/changelogs.core-directive.com\/v\/2.1.221\/e\/whiteboard-hardening-permission-verdicts-state-sanitising-me","release_url":"https:\/\/changelogs.core-directive.com\/v\/2.1.221","markdown":"### Whiteboard hardening: permission verdicts, state sanitising, merge-state validation\n\nWhiteboard permission checks and board data validation got stricter, but none of it runs here.\n\n**What**\n\nPermission checks, board state loading and merge-state application all got stricter validation. Not reachable in this build.\n\n**Details**\n\n- `sendAccess()` returns `'unknown'` for an absent module, a rejection, or a transient code; only `granted`, `prompt`, or a member of `PERMANENT` counts as a verdict\n- `capability_disabled` and `capability_removed` moved out of PERMANENT and are treated as transient, which leaves Send live\n- `sanitize()` drops duplicate ids, normalises negative width\/height to a top-left corner, clamps text `size` to 8..64, and nulls arrow bindings that do not point at a connectable element\n- ping counts are bounded to 0..1e9 and `ping.at` is sliced to 64 chars\n- the merge-state helper rejects addition ids over 40 characters, rejects `fromId`\/`toId` that do not name a box, sticky or text node, clamps `size`, and refines the rename guard so a board with an unreadable send marker gets its own message\n- gate: whiteboard skill `isEnabled g5v = Wms() && Ige()`, and `Wms` returns `!1`\n\n**Evidence**\n\n`const PERMANENT = ['denied', 'unavailable', 'consent_required', 'not_writer', 'not_granted', 'not_declared'];`\n\n- Area: Whiteboard\n- Tier: Nothing to try yet\n- Useful: 1\/5\n- Signal: 2\/5\n- Present in the build but not switched on"}