{"abstract":"\"555 - 0115\" becomes \"555---0115\".","category":"Phone number formatting","checks":9,"contract":"Input {\"number\", optional \"ext\", optional \"context\"}. A number starting with \"+\" is global. Digits are grouped at runs of visual separators (- . space parentheses); any other character returns None. Build \"tel:\" + (\"+\" if global) + groups joined by \"-\", then \";ext=\" + digits when an extension is given, then for local numbers \";phone-context=\" + context (required).","evaluation_group":"w2-phone-number-formatting-tel-uri","failed_approach":"Replacing double hyphens once leaves a double hyphen from a triple run.","family":"w2-phone-number-formatting-tel-uri-separator-runs","id":"FA-96596","implementations":{"attempt":{"sha256":"c98c987c22fb28821301c90195c388afe8a530369bc1fb9f990f9469d1507ee1","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    num, ext, ctx = x['number'].strip(), x.get('ext', ''), x.get('context', '')\n    glob = num.startswith('+')\n    body = num[1:] if glob else num\n    parts, cur = [], ''\n    for c in body:\n        if c.isdigit():\n            cur += c\n        elif c in '-. ()':\n            parts.append(cur)\n            cur = ''\n        else:\n            return None\n    if cur:\n        parts.append(cur)\n    if not parts:\n        return None\n    uri = 'tel:' + ('+' if glob else '') + '-'.join(parts).replace('--', '-')\n    if ext:\n        if not ext.isdigit():\n            return None\n        uri += ';ext=' + ext\n    if not glob:\n        if not ctx:\n            return None\n        uri += ';phone-context=' + ctx\n    return uri\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['global number', {'number': '+42 555-010-1211'}, 'tel:+42-555-010-1211'], ['local number with context', {'number': '555-0114', 'context': '+42'}, 'tel:555-0114;phone-context=+42'], ['local number with extension', {'number': '555-0114', 'ext': '12', 'context': '+42'}, 'tel:555-0114;ext=12;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0114', 'ext': '1'}, 'tel:+42-555-0114;ext=1'], ['local without context', {'number': '5550114'}, None], ['run of separators', {'number': '+42 555 - 0114'}, 'tel:+42-555-0114'], ['slash is not a visual separator', {'number': '+42 555/0114'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0114', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1222'}, 'tel:+42-555-010-1222'], ['local number with context', {'number': '555-0125', 'context': '+42'}, 'tel:555-0125;phone-context=+42'], ['local number with extension', {'number': '555-0125', 'ext': '22', 'context': '+42'}, 'tel:555-0125;ext=22;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0125', 'ext': '2'}, 'tel:+42-555-0125;ext=2'], ['local without context', {'number': '5550125'}, None], ['run of separators', {'number': '+42 555 - 0125'}, 'tel:+42-555-0125'], ['slash is not a visual separator', {'number': '+42 555/0125'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0125', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1233'}, 'tel:+42-555-010-1233'], ['local number with context', {'number': '555-0136', 'context': '+42'}, 'tel:555-0136;phone-context=+42'], ['local number with extension', {'number': '555-0136', 'ext': '32', 'context': '+42'}, 'tel:555-0136;ext=32;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0136', 'ext': '3'}, 'tel:+42-555-0136;ext=3'], ['local without context', {'number': '5550136'}, None], ['run of separators', {'number': '+42 555 - 0136'}, 'tel:+42-555-0136'], ['slash is not a visual separator', {'number': '+42 555/0136'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0136', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1244'}, 'tel:+42-555-010-1244'], ['local number with context', {'number': '555-0147', 'context': '+42'}, 'tel:555-0147;phone-context=+42'], ['local number with extension', {'number': '555-0147', 'ext': '42', 'context': '+42'}, 'tel:555-0147;ext=42;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0147', 'ext': '4'}, 'tel:+42-555-0147;ext=4'], ['local without context', {'number': '5550147'}, None], ['run of separators', {'number': '+42 555 - 0147'}, 'tel:+42-555-0147'], ['slash is not a visual separator', {'number': '+42 555/0147'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0147', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1255'}, 'tel:+42-555-010-1255'], ['local number with context', {'number': '555-0158', 'context': '+42'}, 'tel:555-0158;phone-context=+42'], ['local number with extension', {'number': '555-0158', 'ext': '52', 'context': '+42'}, 'tel:555-0158;ext=52;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0158', 'ext': '5'}, 'tel:+42-555-0158;ext=5'], ['local without context', {'number': '5550158'}, None], ['run of separators', {'number': '+42 555 - 0158'}, 'tel:+42-555-0158'], ['slash is not a visual separator', {'number': '+42 555/0158'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0158', 'ext': '1a'}, None]]]\nfor label, arg, expected in fixtures[N - 1]:\n    check(label, solve(arg), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"4f4c0491df33a634a08af213e73505b603a18fb49000537b0360a4a3c6adc6e2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    num, ext, ctx = x['number'].strip(), x.get('ext', ''), x.get('context', '')\n    glob = num.startswith('+')\n    body = num[1:] if glob else num\n    parts, cur = [], ''\n    for c in body:\n        if c.isdigit():\n            cur += c\n        elif c in '-. ()':\n            parts.append(cur)\n            cur = ''\n        else:\n            return None\n    if cur:\n        parts.append(cur)\n    if not parts:\n        return None\n    uri = 'tel:' + ('+' if glob else '') + '-'.join(parts)\n    if ext:\n        if not ext.isdigit():\n            return None\n        uri += ';ext=' + ext\n    if not glob:\n        if not ctx:\n            return None\n        uri += ';phone-context=' + ctx\n    return uri\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['global number', {'number': '+42 555-010-1211'}, 'tel:+42-555-010-1211'], ['local number with context', {'number': '555-0114', 'context': '+42'}, 'tel:555-0114;phone-context=+42'], ['local number with extension', {'number': '555-0114', 'ext': '12', 'context': '+42'}, 'tel:555-0114;ext=12;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0114', 'ext': '1'}, 'tel:+42-555-0114;ext=1'], ['local without context', {'number': '5550114'}, None], ['run of separators', {'number': '+42 555 - 0114'}, 'tel:+42-555-0114'], ['slash is not a visual separator', {'number': '+42 555/0114'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0114', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1222'}, 'tel:+42-555-010-1222'], ['local number with context', {'number': '555-0125', 'context': '+42'}, 'tel:555-0125;phone-context=+42'], ['local number with extension', {'number': '555-0125', 'ext': '22', 'context': '+42'}, 'tel:555-0125;ext=22;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0125', 'ext': '2'}, 'tel:+42-555-0125;ext=2'], ['local without context', {'number': '5550125'}, None], ['run of separators', {'number': '+42 555 - 0125'}, 'tel:+42-555-0125'], ['slash is not a visual separator', {'number': '+42 555/0125'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0125', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1233'}, 'tel:+42-555-010-1233'], ['local number with context', {'number': '555-0136', 'context': '+42'}, 'tel:555-0136;phone-context=+42'], ['local number with extension', {'number': '555-0136', 'ext': '32', 'context': '+42'}, 'tel:555-0136;ext=32;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0136', 'ext': '3'}, 'tel:+42-555-0136;ext=3'], ['local without context', {'number': '5550136'}, None], ['run of separators', {'number': '+42 555 - 0136'}, 'tel:+42-555-0136'], ['slash is not a visual separator', {'number': '+42 555/0136'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0136', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1244'}, 'tel:+42-555-010-1244'], ['local number with context', {'number': '555-0147', 'context': '+42'}, 'tel:555-0147;phone-context=+42'], ['local number with extension', {'number': '555-0147', 'ext': '42', 'context': '+42'}, 'tel:555-0147;ext=42;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0147', 'ext': '4'}, 'tel:+42-555-0147;ext=4'], ['local without context', {'number': '5550147'}, None], ['run of separators', {'number': '+42 555 - 0147'}, 'tel:+42-555-0147'], ['slash is not a visual separator', {'number': '+42 555/0147'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0147', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1255'}, 'tel:+42-555-010-1255'], ['local number with context', {'number': '555-0158', 'context': '+42'}, 'tel:555-0158;phone-context=+42'], ['local number with extension', {'number': '555-0158', 'ext': '52', 'context': '+42'}, 'tel:555-0158;ext=52;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0158', 'ext': '5'}, 'tel:+42-555-0158;ext=5'], ['local without context', {'number': '5550158'}, None], ['run of separators', {'number': '+42 555 - 0158'}, 'tel:+42-555-0158'], ['slash is not a visual separator', {'number': '+42 555/0158'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0158', 'ext': '1a'}, None]]]\nfor label, arg, expected in fixtures[N - 1]:\n    check(label, solve(arg), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"4d179db71c8c01f24d360bd5410491f19a8f7777909b0f89af55d69b0a3d4707","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    num, ext, ctx = x['number'].strip(), x.get('ext', ''), x.get('context', '')\n    glob = num.startswith('+')\n    body = num[1:] if glob else num\n    parts, cur = [], ''\n    for c in body:\n        if c.isdigit():\n            cur += c\n        elif c in '-. ()':\n            if cur:\n                parts.append(cur)\n                cur = ''\n        else:\n            return None\n    if cur:\n        parts.append(cur)\n    if not parts:\n        return None\n    uri = 'tel:' + ('+' if glob else '') + '-'.join(parts)\n    if ext:\n        if not ext.isdigit():\n            return None\n        uri += ';ext=' + ext\n    if not glob:\n        if not ctx:\n            return None\n        uri += ';phone-context=' + ctx\n    return uri\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[['global number', {'number': '+42 555-010-1211'}, 'tel:+42-555-010-1211'], ['local number with context', {'number': '555-0114', 'context': '+42'}, 'tel:555-0114;phone-context=+42'], ['local number with extension', {'number': '555-0114', 'ext': '12', 'context': '+42'}, 'tel:555-0114;ext=12;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0114', 'ext': '1'}, 'tel:+42-555-0114;ext=1'], ['local without context', {'number': '5550114'}, None], ['run of separators', {'number': '+42 555 - 0114'}, 'tel:+42-555-0114'], ['slash is not a visual separator', {'number': '+42 555/0114'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0114', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1222'}, 'tel:+42-555-010-1222'], ['local number with context', {'number': '555-0125', 'context': '+42'}, 'tel:555-0125;phone-context=+42'], ['local number with extension', {'number': '555-0125', 'ext': '22', 'context': '+42'}, 'tel:555-0125;ext=22;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0125', 'ext': '2'}, 'tel:+42-555-0125;ext=2'], ['local without context', {'number': '5550125'}, None], ['run of separators', {'number': '+42 555 - 0125'}, 'tel:+42-555-0125'], ['slash is not a visual separator', {'number': '+42 555/0125'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0125', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1233'}, 'tel:+42-555-010-1233'], ['local number with context', {'number': '555-0136', 'context': '+42'}, 'tel:555-0136;phone-context=+42'], ['local number with extension', {'number': '555-0136', 'ext': '32', 'context': '+42'}, 'tel:555-0136;ext=32;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0136', 'ext': '3'}, 'tel:+42-555-0136;ext=3'], ['local without context', {'number': '5550136'}, None], ['run of separators', {'number': '+42 555 - 0136'}, 'tel:+42-555-0136'], ['slash is not a visual separator', {'number': '+42 555/0136'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0136', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1244'}, 'tel:+42-555-010-1244'], ['local number with context', {'number': '555-0147', 'context': '+42'}, 'tel:555-0147;phone-context=+42'], ['local number with extension', {'number': '555-0147', 'ext': '42', 'context': '+42'}, 'tel:555-0147;ext=42;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0147', 'ext': '4'}, 'tel:+42-555-0147;ext=4'], ['local without context', {'number': '5550147'}, None], ['run of separators', {'number': '+42 555 - 0147'}, 'tel:+42-555-0147'], ['slash is not a visual separator', {'number': '+42 555/0147'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0147', 'ext': '1a'}, None]], [['global number', {'number': '+42 555-010-1255'}, 'tel:+42-555-010-1255'], ['local number with context', {'number': '555-0158', 'context': '+42'}, 'tel:555-0158;phone-context=+42'], ['local number with extension', {'number': '555-0158', 'ext': '52', 'context': '+42'}, 'tel:555-0158;ext=52;phone-context=+42'], ['global with extension', {'number': '+42 (555) 0158', 'ext': '5'}, 'tel:+42-555-0158;ext=5'], ['local without context', {'number': '5550158'}, None], ['run of separators', {'number': '+42 555 - 0158'}, 'tel:+42-555-0158'], ['slash is not a visual separator', {'number': '+42 555/0158'}, None], ['letters rejected', {'number': '+42 555 FAKE'}, None], ['non-numeric extension', {'number': '+42 555 0158', 'ext': '1a'}, None]]]\nfor label, arg, expected in fixtures[N - 1]:\n    check(label, solve(arg), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic toy contract over synthetic, obviously fictitious telephone numbers and toy country tables. The rules are stipulated for this model only and make no claim of conformance with any numbering plan or telecommunications standard. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-phone-number-formatting-tel-uri-separator-runs","generated_at":"2026-09-29T14:52:24.122800+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"tel URIs are exchanged between softphones, CRMs and SIP gateways; a missing context or misordered parameter makes local numbers undialable.","repair":"Flush only non-empty groups.","root_cause":"A group is flushed at every separator even when it is empty.","sha256":"b2e6c4e6d981cb9f3522f761b259b58ad3ab064fc8c8ab2f7848484456ea5f2b","title":"tel URI builder: runs of separators produce empty groups · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.723,"exit_code":1,"observations":[{"actual":"tel:+42-555-010-1211","check":"global number","expected":"tel:+42-555-010-1211","passed":true},{"actual":"tel:555-0114;phone-context=+42","check":"local number with context","expected":"tel:555-0114;phone-context=+42","passed":true},{"actual":"tel:555-0114;ext=12;phone-context=+42","check":"local number with extension","expected":"tel:555-0114;ext=12;phone-context=+42","passed":true},{"actual":"tel:+42-555-0114;ext=1","check":"global with extension","expected":"tel:+42-555-0114;ext=1","passed":true},{"actual":null,"check":"local without context","expected":null,"passed":true},{"actual":"tel:+42-555--0114","check":"run of separators","expected":"tel:+42-555-0114","passed":false},{"actual":null,"check":"slash is not a visual separator","expected":null,"passed":true},{"actual":null,"check":"letters rejected","expected":null,"passed":true},{"actual":null,"check":"non-numeric extension","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"global number\", \"actual\": \"tel:+42-555-010-1211\", \"expected\": \"tel:+42-555-010-1211\", \"passed\": true}, {\"check\": \"local number with context\", \"actual\": \"tel:555-0114;phone-context=+42\", \"expected\": \"tel:555-0114;phone-context=+42\", \"passed\": true}, {\"check\": \"local number with extension\", \"actual\": \"tel:555-0114;ext=12;phone-context=+42\", \"expected\": \"tel:555-0114;ext=12;phone-context=+42\", \"passed\": true}, {\"check\": \"global with extension\", \"actual\": \"tel:+42-555-0114;ext=1\", \"expected\": \"tel:+42-555-0114;ext=1\", \"passed\": true}, {\"check\": \"local without context\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"run of separators\", \"actual\": \"tel:+42-555--0114\", \"expected\": \"tel:+42-555-0114\", \"passed\": false}, {\"check\": \"slash is not a visual separator\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"letters rejected\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"non-numeric extension\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.218,"exit_code":1,"observations":[{"actual":"tel:+42-555-010-1211","check":"global number","expected":"tel:+42-555-010-1211","passed":true},{"actual":"tel:555-0114;phone-context=+42","check":"local number with context","expected":"tel:555-0114;phone-context=+42","passed":true},{"actual":"tel:555-0114;ext=12;phone-context=+42","check":"local number with extension","expected":"tel:555-0114;ext=12;phone-context=+42","passed":true},{"actual":"tel:+42--555--0114;ext=1","check":"global with extension","expected":"tel:+42-555-0114;ext=1","passed":false},{"actual":null,"check":"local without context","expected":null,"passed":true},{"actual":"tel:+42-555---0114","check":"run of separators","expected":"tel:+42-555-0114","passed":false},{"actual":null,"check":"slash is not a visual separator","expected":null,"passed":true},{"actual":null,"check":"letters rejected","expected":null,"passed":true},{"actual":null,"check":"non-numeric extension","expected":null,"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"global number\", \"actual\": \"tel:+42-555-010-1211\", \"expected\": \"tel:+42-555-010-1211\", \"passed\": true}, {\"check\": \"local number with context\", \"actual\": \"tel:555-0114;phone-context=+42\", \"expected\": \"tel:555-0114;phone-context=+42\", \"passed\": true}, {\"check\": \"local number with extension\", \"actual\": \"tel:555-0114;ext=12;phone-context=+42\", \"expected\": \"tel:555-0114;ext=12;phone-context=+42\", \"passed\": true}, {\"check\": \"global with extension\", \"actual\": \"tel:+42--555--0114;ext=1\", \"expected\": \"tel:+42-555-0114;ext=1\", \"passed\": false}, {\"check\": \"local without context\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"run of separators\", \"actual\": \"tel:+42-555---0114\", \"expected\": \"tel:+42-555-0114\", \"passed\": false}, {\"check\": \"slash is not a visual separator\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"letters rejected\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"non-numeric extension\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.221,"exit_code":0,"observations":[{"actual":"tel:+42-555-010-1211","check":"global number","expected":"tel:+42-555-010-1211","passed":true},{"actual":"tel:555-0114;phone-context=+42","check":"local number with context","expected":"tel:555-0114;phone-context=+42","passed":true},{"actual":"tel:555-0114;ext=12;phone-context=+42","check":"local number with extension","expected":"tel:555-0114;ext=12;phone-context=+42","passed":true},{"actual":"tel:+42-555-0114;ext=1","check":"global with extension","expected":"tel:+42-555-0114;ext=1","passed":true},{"actual":null,"check":"local without context","expected":null,"passed":true},{"actual":"tel:+42-555-0114","check":"run of separators","expected":"tel:+42-555-0114","passed":true},{"actual":null,"check":"slash is not a visual separator","expected":null,"passed":true},{"actual":null,"check":"letters rejected","expected":null,"passed":true},{"actual":null,"check":"non-numeric extension","expected":null,"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"global number\", \"actual\": \"tel:+42-555-010-1211\", \"expected\": \"tel:+42-555-010-1211\", \"passed\": true}, {\"check\": \"local number with context\", \"actual\": \"tel:555-0114;phone-context=+42\", \"expected\": \"tel:555-0114;phone-context=+42\", \"passed\": true}, {\"check\": \"local number with extension\", \"actual\": \"tel:555-0114;ext=12;phone-context=+42\", \"expected\": \"tel:555-0114;ext=12;phone-context=+42\", \"passed\": true}, {\"check\": \"global with extension\", \"actual\": \"tel:+42-555-0114;ext=1\", \"expected\": \"tel:+42-555-0114;ext=1\", \"passed\": true}, {\"check\": \"local without context\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"run of separators\", \"actual\": \"tel:+42-555-0114\", \"expected\": \"tel:+42-555-0114\", \"passed\": true}, {\"check\": \"slash is not a visual separator\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"letters rejected\", \"actual\": null, \"expected\": null, \"passed\": true}, {\"check\": \"non-numeric extension\", \"actual\": null, \"expected\": null, \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}