{"abstract":"A comma between a European and an Arabic number is absorbed.","category":"Bidirectional text layout","checks":8,"contract":"Input [classes of one isolating run sequence, sos]. W1 NSM takes the previous type (sos at start; ON after LRI/RLI/FSI/PDI). W2 EN after the last strong AL becomes AN. W3 AL->R. W4 a single ES between EN and EN -> EN; a single CS between two numbers of the same type takes that type. W5 a run of ET adjacent to EN -> EN. W6 remaining ES/ET/CS -> ON. W7 EN whose last strong (sos at start) is L -> L. Return resolved classes.","evaluation_group":"w2-bidirectional-text-layout-weak-types","failed_approach":"Handling only European numbers drops the Arabic-number case.","family":"w2-bidirectional-text-layout-weak-types-common-separator-number-types","id":"FA-80391","implementations":{"attempt":{"sha256":"f9762febf73b415573e40f331337a70eae939174755b6698104aa6dc22393cac","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    types, sos = x\n    t = list(types)\n    n = len(t)\n    prev = sos\n    for i in range(n):\n        if t[i] == 'NSM':\n            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev\n        prev = t[i]\n    last_strong = sos\n    for i in range(n):\n        if t[i] in ('L', 'R', 'AL'):\n            last_strong = t[i]\n        elif t[i] == 'EN' and last_strong == 'AL':\n            t[i] = 'AN'\n    t = ['R' if c == 'AL' else c for c in t]\n    for i in range(1, n - 1):\n        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':\n            t[i] = 'EN'\n        elif t[i] == 'CS' and t[i - 1] == t[i + 1] == 'EN':\n            t[i] = t[i - 1]\n    i = 0\n    while i < n:\n        if t[i] == 'ET':\n            j = i\n            while j < n and t[j] == 'ET':\n                j += 1\n            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):\n                for k in range(i, j):\n                    t[k] = 'EN'\n            i = j\n        else:\n            i += 1\n    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]\n    strong = sos\n    for i in range(n):\n        if t[i] in ('L', 'R'):\n            strong = t[i]\n        elif t[i] == 'EN' and strong == 'L':\n            t[i] = 'L'\n    return t\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'AN', 'L', 'PDI', 'ET', 'AL', 'NSM'], 'L'], ['L', 'AN', 'L', 'PDI', 'ON', 'R', 'R']), ('control layout', [['AL', 'WS', 'AL', 'L'], 'L'], ['R', 'WS', 'R', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'ON', 'LRI'], 'L'], ['ON', 'L', 'ON', 'AN', 'ON', 'LRI']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['AL', 'ET', 'L', 'L', 'ET', 'CS', 'NSM', 'ET', 'ON', 'L'], 'R'], ['R', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('control layout', [['L', 'L', 'AN', 'EN'], 'L'], ['L', 'L', 'AN', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('partial-repair probe', [['EN', 'EN', 'AL', 'EN', 'CS', 'EN', 'PDI', 'ON', 'AN'], 'R'], ['EN', 'EN', 'R', 'AN', 'AN', 'AN', 'PDI', 'ON', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['R', 'PDI', 'L', 'L', 'NSM', 'AL', 'EN', 'AN'], 'R'], ['R', 'PDI', 'L', 'L', 'L', 'R', 'AN', 'AN']), ('control layout', [['AL', 'NSM', 'CS', 'CS', 'AL'], 'L'], ['R', 'R', 'ON', 'ON', 'R'])], [('regression: common separator number types', [['AN', 'AN', 'CS', 'EN', 'ON', 'EN', 'EN'], 'R'], ['AN', 'AN', 'ON', 'EN', 'ON', 'EN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['ES', 'EN', 'ET', 'ON', 'WS', 'ET', 'AL', 'NSM', 'PDI', 'AL'], 'L'], ['ON', 'L', 'L', 'ON', 'WS', 'ON', 'R', 'R', 'PDI', 'R']), ('control layout', [['ET', 'AL', 'ES', 'NSM', 'ES', 'EN', 'PDI', 'WS', 'AN', 'CS'], 'R'], ['ON', 'R', 'ON', 'ON', 'ON', 'AN', 'PDI', 'WS', 'AN', 'ON'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['R', 'L', 'AN', 'CS', 'EN', 'CS', 'NSM', 'ES', 'AL'], 'L'], ['R', 'L', 'AN', 'ON', 'L', 'ON', 'ON', 'ON', 'R']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'LRI', 'EN'], 'L'], ['L', 'LRI', 'L']), ('control layout', [['AL', 'PDI', 'ES', 'EN', 'L', 'R', 'WS', 'ES', 'CS', 'CS'], 'L'], ['R', 'PDI', 'ON', 'AN', 'L', 'R', 'WS', 'ON', 'ON', 'ON'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(args), 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":"8b11d3a6c017476280984956199f7c3d86ea92196b7f7f7c542be2eed563261f","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    types, sos = x\n    t = list(types)\n    n = len(t)\n    prev = sos\n    for i in range(n):\n        if t[i] == 'NSM':\n            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev\n        prev = t[i]\n    last_strong = sos\n    for i in range(n):\n        if t[i] in ('L', 'R', 'AL'):\n            last_strong = t[i]\n        elif t[i] == 'EN' and last_strong == 'AL':\n            t[i] = 'AN'\n    t = ['R' if c == 'AL' else c for c in t]\n    for i in range(1, n - 1):\n        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':\n            t[i] = 'EN'\n        elif t[i] == 'CS' and t[i - 1] in ('EN', 'AN') and t[i + 1] in ('EN', 'AN'):\n            t[i] = t[i - 1]\n    i = 0\n    while i < n:\n        if t[i] == 'ET':\n            j = i\n            while j < n and t[j] == 'ET':\n                j += 1\n            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):\n                for k in range(i, j):\n                    t[k] = 'EN'\n            i = j\n        else:\n            i += 1\n    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]\n    strong = sos\n    for i in range(n):\n        if t[i] in ('L', 'R'):\n            strong = t[i]\n        elif t[i] == 'EN' and strong == 'L':\n            t[i] = 'L'\n    return t\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'AN', 'L', 'PDI', 'ET', 'AL', 'NSM'], 'L'], ['L', 'AN', 'L', 'PDI', 'ON', 'R', 'R']), ('control layout', [['AL', 'WS', 'AL', 'L'], 'L'], ['R', 'WS', 'R', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'ON', 'LRI'], 'L'], ['ON', 'L', 'ON', 'AN', 'ON', 'LRI']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['AL', 'ET', 'L', 'L', 'ET', 'CS', 'NSM', 'ET', 'ON', 'L'], 'R'], ['R', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('control layout', [['L', 'L', 'AN', 'EN'], 'L'], ['L', 'L', 'AN', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('partial-repair probe', [['EN', 'EN', 'AL', 'EN', 'CS', 'EN', 'PDI', 'ON', 'AN'], 'R'], ['EN', 'EN', 'R', 'AN', 'AN', 'AN', 'PDI', 'ON', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['R', 'PDI', 'L', 'L', 'NSM', 'AL', 'EN', 'AN'], 'R'], ['R', 'PDI', 'L', 'L', 'L', 'R', 'AN', 'AN']), ('control layout', [['AL', 'NSM', 'CS', 'CS', 'AL'], 'L'], ['R', 'R', 'ON', 'ON', 'R'])], [('regression: common separator number types', [['AN', 'AN', 'CS', 'EN', 'ON', 'EN', 'EN'], 'R'], ['AN', 'AN', 'ON', 'EN', 'ON', 'EN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['ES', 'EN', 'ET', 'ON', 'WS', 'ET', 'AL', 'NSM', 'PDI', 'AL'], 'L'], ['ON', 'L', 'L', 'ON', 'WS', 'ON', 'R', 'R', 'PDI', 'R']), ('control layout', [['ET', 'AL', 'ES', 'NSM', 'ES', 'EN', 'PDI', 'WS', 'AN', 'CS'], 'R'], ['ON', 'R', 'ON', 'ON', 'ON', 'AN', 'PDI', 'WS', 'AN', 'ON'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['R', 'L', 'AN', 'CS', 'EN', 'CS', 'NSM', 'ES', 'AL'], 'L'], ['R', 'L', 'AN', 'ON', 'L', 'ON', 'ON', 'ON', 'R']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'LRI', 'EN'], 'L'], ['L', 'LRI', 'L']), ('control layout', [['AL', 'PDI', 'ES', 'EN', 'L', 'R', 'WS', 'ES', 'CS', 'CS'], 'L'], ['R', 'PDI', 'ON', 'AN', 'L', 'R', 'WS', 'ON', 'ON', 'ON'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(args), 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":"db2d9bfe63a11cee7ac31df9ac6039b84508cb7520a6b9088f91e6547f8282e9","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    types, sos = x\n    t = list(types)\n    n = len(t)\n    prev = sos\n    for i in range(n):\n        if t[i] == 'NSM':\n            t[i] = 'ON' if prev in ('LRI', 'RLI', 'FSI', 'PDI') else prev\n        prev = t[i]\n    last_strong = sos\n    for i in range(n):\n        if t[i] in ('L', 'R', 'AL'):\n            last_strong = t[i]\n        elif t[i] == 'EN' and last_strong == 'AL':\n            t[i] = 'AN'\n    t = ['R' if c == 'AL' else c for c in t]\n    for i in range(1, n - 1):\n        if t[i] == 'ES' and t[i - 1] == 'EN' and t[i + 1] == 'EN':\n            t[i] = 'EN'\n        elif t[i] == 'CS' and t[i - 1] == t[i + 1] and t[i - 1] in ('EN', 'AN'):\n            t[i] = t[i - 1]\n    i = 0\n    while i < n:\n        if t[i] == 'ET':\n            j = i\n            while j < n and t[j] == 'ET':\n                j += 1\n            if (i > 0 and t[i - 1] == 'EN') or (j < n and t[j] == 'EN'):\n                for k in range(i, j):\n                    t[k] = 'EN'\n            i = j\n        else:\n            i += 1\n    t = ['ON' if c in ('ES', 'ET', 'CS') else c for c in t]\n    strong = sos\n    for i in range(n):\n        if t[i] in ('L', 'R'):\n            strong = t[i]\n        elif t[i] == 'EN' and strong == 'L':\n            t[i] = 'L'\n    return t\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'AN', 'L', 'PDI', 'ET', 'AL', 'NSM'], 'L'], ['L', 'AN', 'L', 'PDI', 'ON', 'R', 'R']), ('control layout', [['AL', 'WS', 'AL', 'L'], 'L'], ['R', 'WS', 'R', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'ON', 'LRI'], 'L'], ['ON', 'L', 'ON', 'AN', 'ON', 'LRI']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('NSM chain after R', [['R', 'NSM', 'NSM', 'EN'], 'L'], ['R', 'R', 'R', 'EN']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('control layout', [['AL', 'ET', 'L', 'L', 'ET', 'CS', 'NSM', 'ET', 'ON', 'L'], 'R'], ['R', 'ON', 'L', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L']), ('control layout', [['L', 'L', 'AN', 'EN'], 'L'], ['L', 'L', 'AN', 'L'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['AL', 'EN', 'NSM', 'R', 'NSM', 'EN', 'CS', 'AN', 'EN'], 'L'], ['R', 'AN', 'AN', 'R', 'R', 'EN', 'ON', 'AN', 'EN']), ('partial-repair probe', [['EN', 'EN', 'AL', 'EN', 'CS', 'EN', 'PDI', 'ON', 'AN'], 'R'], ['EN', 'EN', 'R', 'AN', 'AN', 'AN', 'PDI', 'ON', 'AN']), ('partial-repair probe', [['L', 'AL', 'PDI', 'LRI', 'AL', 'EN', 'CS', 'EN', 'WS', 'CS'], 'R'], ['L', 'R', 'PDI', 'LRI', 'R', 'AN', 'AN', 'AN', 'WS', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['R', 'PDI', 'L', 'L', 'NSM', 'AL', 'EN', 'AN'], 'R'], ['R', 'PDI', 'L', 'L', 'L', 'R', 'AN', 'AN']), ('control layout', [['AL', 'NSM', 'CS', 'CS', 'AL'], 'L'], ['R', 'R', 'ON', 'ON', 'R'])], [('regression: common separator number types', [['AN', 'AN', 'CS', 'EN', 'ON', 'EN', 'EN'], 'R'], ['AN', 'AN', 'ON', 'EN', 'ON', 'EN', 'EN']), ('regression: common separator number types', [['L', 'ET', 'AN', 'CS', 'EN', 'AL', 'NSM', 'AN', 'L', 'AN', 'PDI'], 'R'], ['L', 'ON', 'AN', 'ON', 'L', 'R', 'R', 'AN', 'L', 'AN', 'PDI']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('plus between numbers', [['EN', 'ES', 'EN', 'R'], 'R'], ['EN', 'EN', 'EN', 'R']), ('control layout', [['ES', 'EN', 'ET', 'ON', 'WS', 'ET', 'AL', 'NSM', 'PDI', 'AL'], 'L'], ['ON', 'L', 'L', 'ON', 'WS', 'ON', 'R', 'R', 'PDI', 'R']), ('control layout', [['ET', 'AL', 'ES', 'NSM', 'ES', 'EN', 'PDI', 'WS', 'AN', 'CS'], 'R'], ['ON', 'R', 'ON', 'ON', 'ON', 'AN', 'PDI', 'WS', 'AN', 'ON'])], [('regression: common separator number types', [['ES', 'EN', 'CS', 'AN', 'L', 'ON', 'AL'], 'L'], ['ON', 'L', 'ON', 'AN', 'L', 'ON', 'R']), ('regression: common separator number types', [['R', 'L', 'AN', 'CS', 'EN', 'CS', 'NSM', 'ES', 'AL'], 'L'], ['R', 'L', 'AN', 'ON', 'L', 'ON', 'ON', 'ON', 'R']), ('Arabic number context', [['AL', 'EN', 'CS', 'EN'], 'L'], ['R', 'AN', 'AN', 'AN']), ('partial-repair probe', [['AN', 'CS', 'AN', 'AL', 'EN', 'PDI', 'R', 'AL', 'ET'], 'R'], ['AN', 'AN', 'AN', 'R', 'AN', 'PDI', 'R', 'R', 'ON']), ('percent after number', [['EN', 'ET', 'ET', 'L'], 'R'], ['EN', 'EN', 'EN', 'L']), ('NSM after isolate initiator', [['LRI', 'NSM', 'L', 'PDI'], 'R'], ['LRI', 'ON', 'L', 'PDI']), ('control layout', [['L', 'LRI', 'EN'], 'L'], ['L', 'LRI', 'L']), ('control layout', [['AL', 'PDI', 'ES', 'EN', 'L', 'R', 'WS', 'ES', 'CS', 'CS'], 'L'], ['R', 'PDI', 'ON', 'AN', 'L', 'R', 'WS', 'ON', 'ON', 'ON'])]]\nfor label, args, expected in fixtures[N - 1]:\n    check(label, solve(args), 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 bidi model over stipulated class labels and integer levels; it is inspired by, but does not claim conformance to, any published algorithm. 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-bidirectional-text-layout-weak-types-common-separator-number-types","generated_at":"2026-09-29T14:49:53.488169+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Mixed right-to-left and left-to-right text must resolve levels and visual order exactly, or words, numbers and carets land in the wrong place.","repair":"Require both neighbours to be the same number type.","root_cause":"The W4 CS rule does not require both neighbours to have the same number type.","sha256":"faf8b650484d30bdba871147550ff3250751a4f32f7440af324a840ca0a4d701","title":"Weak type resolution: common separator number types · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":41.416,"exit_code":1,"observations":[{"actual":["R","AN","AN","R","R","EN","ON","AN","EN"],"check":"regression: common separator number types","expected":["R","AN","AN","R","R","EN","ON","AN","EN"],"passed":true},{"actual":["L","ON","AN","ON","L","R","R","AN","L","AN","PDI"],"check":"regression: common separator number types","expected":["L","ON","AN","ON","L","R","R","AN","L","AN","PDI"],"passed":true},{"actual":["AN","ON","AN","R","AN","PDI","R","R","ON"],"check":"partial-repair probe","expected":["AN","AN","AN","R","AN","PDI","R","R","ON"],"passed":false},{"actual":["R","AN","ON","AN"],"check":"Arabic number context","expected":["R","AN","AN","AN"],"passed":false},{"actual":["R","R","R","EN"],"check":"NSM chain after R","expected":["R","R","R","EN"],"passed":true},{"actual":["LRI","ON","L","PDI"],"check":"NSM after isolate initiator","expected":["LRI","ON","L","PDI"],"passed":true},{"actual":["L","AN","L","PDI","ON","R","R"],"check":"control layout","expected":["L","AN","L","PDI","ON","R","R"],"passed":true},{"actual":["R","WS","R","L"],"check":"control layout","expected":["R","WS","R","L"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: common separator number types\", \"actual\": [\"R\", \"AN\", \"AN\", \"R\", \"R\", \"EN\", \"ON\", \"AN\", \"EN\"], \"expected\": [\"R\", \"AN\", \"AN\", \"R\", \"R\", \"EN\", \"ON\", \"AN\", \"EN\"], \"passed\": true}, {\"check\": \"regression: common separator number types\", \"actual\": [\"L\", \"ON\", \"AN\", \"ON\", \"L\", \"R\", \"R\", \"AN\", \"L\", \"AN\", \"PDI\"], \"expected\": [\"L\", \"ON\", \"AN\", \"ON\", \"L\", \"R\", \"R\", \"AN\", \"L\", \"AN\", \"PDI\"], \"passed\": true}, {\"check\": \"partial-repair probe\", \"actual\": [\"AN\", \"ON\", \"AN\", \"R\", \"AN\", \"PDI\", \"R\", \"R\", \"ON\"], \"expected\": [\"AN\", \"AN\", \"AN\", \"R\", \"AN\", \"PDI\", \"R\", \"R\", \"ON\"], \"passed\": false}, {\"check\": \"Arabic number context\", \"actual\": [\"R\", \"AN\", \"ON\", \"AN\"], \"expected\": [\"R\", \"AN\", \"AN\", \"AN\"], \"passed\": false}, {\"check\": \"NSM chain after R\", \"actual\": [\"R\", \"R\", \"R\", \"EN\"], \"expected\": [\"R\", \"R\", \"R\", \"EN\"], \"passed\": true}, {\"check\": \"NSM after isolate initiator\", \"actual\": [\"LRI\", \"ON\", \"L\", \"PDI\"], \"expected\": [\"LRI\", \"ON\", \"L\", \"PDI\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"L\", \"AN\", \"L\", \"PDI\", \"ON\", \"R\", \"R\"], \"expected\": [\"L\", \"AN\", \"L\", \"PDI\", \"ON\", \"R\", \"R\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"R\", \"WS\", \"R\", \"L\"], \"expected\": [\"R\", \"WS\", \"R\", \"L\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":39.729,"exit_code":1,"observations":[{"actual":["R","AN","AN","R","R","EN","EN","AN","EN"],"check":"regression: common separator number types","expected":["R","AN","AN","R","R","EN","ON","AN","EN"],"passed":false},{"actual":["L","ON","AN","AN","L","R","R","AN","L","AN","PDI"],"check":"regression: common separator number types","expected":["L","ON","AN","ON","L","R","R","AN","L","AN","PDI"],"passed":false},{"actual":["AN","AN","AN","R","AN","PDI","R","R","ON"],"check":"partial-repair probe","expected":["AN","AN","AN","R","AN","PDI","R","R","ON"],"passed":true},{"actual":["R","AN","AN","AN"],"check":"Arabic number context","expected":["R","AN","AN","AN"],"passed":true},{"actual":["R","R","R","EN"],"check":"NSM chain after R","expected":["R","R","R","EN"],"passed":true},{"actual":["LRI","ON","L","PDI"],"check":"NSM after isolate initiator","expected":["LRI","ON","L","PDI"],"passed":true},{"actual":["L","AN","L","PDI","ON","R","R"],"check":"control layout","expected":["L","AN","L","PDI","ON","R","R"],"passed":true},{"actual":["R","WS","R","L"],"check":"control layout","expected":["R","WS","R","L"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: common separator number types\", \"actual\": [\"R\", \"AN\", \"AN\", \"R\", \"R\", \"EN\", \"EN\", \"AN\", \"EN\"], \"expected\": [\"R\", \"AN\", \"AN\", \"R\", \"R\", \"EN\", \"ON\", \"AN\", \"EN\"], \"passed\": false}, {\"check\": \"regression: common separator number types\", \"actual\": [\"L\", \"ON\", \"AN\", \"AN\", \"L\", \"R\", \"R\", \"AN\", \"L\", \"AN\", \"PDI\"], \"expected\": [\"L\", \"ON\", \"AN\", \"ON\", \"L\", \"R\", \"R\", \"AN\", \"L\", \"AN\", \"PDI\"], \"passed\": false}, {\"check\": \"partial-repair probe\", \"actual\": [\"AN\", \"AN\", \"AN\", \"R\", \"AN\", \"PDI\", \"R\", \"R\", \"ON\"], \"expected\": [\"AN\", \"AN\", \"AN\", \"R\", \"AN\", \"PDI\", \"R\", \"R\", \"ON\"], \"passed\": true}, {\"check\": \"Arabic number context\", \"actual\": [\"R\", \"AN\", \"AN\", \"AN\"], \"expected\": [\"R\", \"AN\", \"AN\", \"AN\"], \"passed\": true}, {\"check\": \"NSM chain after R\", \"actual\": [\"R\", \"R\", \"R\", \"EN\"], \"expected\": [\"R\", \"R\", \"R\", \"EN\"], \"passed\": true}, {\"check\": \"NSM after isolate initiator\", \"actual\": [\"LRI\", \"ON\", \"L\", \"PDI\"], \"expected\": [\"LRI\", \"ON\", \"L\", \"PDI\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"L\", \"AN\", \"L\", \"PDI\", \"ON\", \"R\", \"R\"], \"expected\": [\"L\", \"AN\", \"L\", \"PDI\", \"ON\", \"R\", \"R\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"R\", \"WS\", \"R\", \"L\"], \"expected\": [\"R\", \"WS\", \"R\", \"L\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":39.999,"exit_code":0,"observations":[{"actual":["R","AN","AN","R","R","EN","ON","AN","EN"],"check":"regression: common separator number types","expected":["R","AN","AN","R","R","EN","ON","AN","EN"],"passed":true},{"actual":["L","ON","AN","ON","L","R","R","AN","L","AN","PDI"],"check":"regression: common separator number types","expected":["L","ON","AN","ON","L","R","R","AN","L","AN","PDI"],"passed":true},{"actual":["AN","AN","AN","R","AN","PDI","R","R","ON"],"check":"partial-repair probe","expected":["AN","AN","AN","R","AN","PDI","R","R","ON"],"passed":true},{"actual":["R","AN","AN","AN"],"check":"Arabic number context","expected":["R","AN","AN","AN"],"passed":true},{"actual":["R","R","R","EN"],"check":"NSM chain after R","expected":["R","R","R","EN"],"passed":true},{"actual":["LRI","ON","L","PDI"],"check":"NSM after isolate initiator","expected":["LRI","ON","L","PDI"],"passed":true},{"actual":["L","AN","L","PDI","ON","R","R"],"check":"control layout","expected":["L","AN","L","PDI","ON","R","R"],"passed":true},{"actual":["R","WS","R","L"],"check":"control layout","expected":["R","WS","R","L"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"regression: common separator number types\", \"actual\": [\"R\", \"AN\", \"AN\", \"R\", \"R\", \"EN\", \"ON\", \"AN\", \"EN\"], \"expected\": [\"R\", \"AN\", \"AN\", \"R\", \"R\", \"EN\", \"ON\", \"AN\", \"EN\"], \"passed\": true}, {\"check\": \"regression: common separator number types\", \"actual\": [\"L\", \"ON\", \"AN\", \"ON\", \"L\", \"R\", \"R\", \"AN\", \"L\", \"AN\", \"PDI\"], \"expected\": [\"L\", \"ON\", \"AN\", \"ON\", \"L\", \"R\", \"R\", \"AN\", \"L\", \"AN\", \"PDI\"], \"passed\": true}, {\"check\": \"partial-repair probe\", \"actual\": [\"AN\", \"AN\", \"AN\", \"R\", \"AN\", \"PDI\", \"R\", \"R\", \"ON\"], \"expected\": [\"AN\", \"AN\", \"AN\", \"R\", \"AN\", \"PDI\", \"R\", \"R\", \"ON\"], \"passed\": true}, {\"check\": \"Arabic number context\", \"actual\": [\"R\", \"AN\", \"AN\", \"AN\"], \"expected\": [\"R\", \"AN\", \"AN\", \"AN\"], \"passed\": true}, {\"check\": \"NSM chain after R\", \"actual\": [\"R\", \"R\", \"R\", \"EN\"], \"expected\": [\"R\", \"R\", \"R\", \"EN\"], \"passed\": true}, {\"check\": \"NSM after isolate initiator\", \"actual\": [\"LRI\", \"ON\", \"L\", \"PDI\"], \"expected\": [\"LRI\", \"ON\", \"L\", \"PDI\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"L\", \"AN\", \"L\", \"PDI\", \"ON\", \"R\", \"R\"], \"expected\": [\"L\", \"AN\", \"L\", \"PDI\", \"ON\", \"R\", \"R\"], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [\"R\", \"WS\", \"R\", \"L\"], \"expected\": [\"R\", \"WS\", \"R\", \"L\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}