{"abstract":"\"10h\" with \"Jh\" is written \"JTo\".","category":"Poker hand evaluation","checks":8,"contract":"Input: two hole cards as strings (rank may be \"10\"; rank and suit case-insensitive). Return canonical hold'em notation: pairs \"QQ\", otherwise higher rank first with \"s\" for suited or \"o\" for offsuit (e.g. \"AKs\", \"T9o\"). Return \"invalid\" for duplicate cards or unknown ranks.","evaluation_group":"w2-poker_hand_evaluation-starting-hand-notation","failed_approach":"Fixing only the second card still reads the first card's suit from index 1.","family":"w2-poker_hand_evaluation-starting-hand-notation-suit-position","id":"FA-82111","implementations":{"attempt":{"sha256":"0e13b95a2a52c2d60c736c7206660e08b0aa33c7846b7392ea81503ba4e21fcc","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    R='23456789TJQKA'\n    if len(x)!=2 or x[0].upper()==x[1].upper(): return 'invalid'\n    def rank(c):\n        t=c[:-1].upper()\n        return 'T' if t=='10' else t\n    a,b=rank(x[0]),rank(x[1])\n    if a not in list(R) or b not in list(R): return 'invalid'\n    if a==b: return a+b\n    hi,lo=sorted([a,b], key=R.index, reverse=True)\n    return hi+lo+('s' if x[0][1].lower()==x[1][-1].lower() else 'o')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('nine ten mixed', ['9c', '10d'], 'T9o'),\n  ('pair of queens', ['Qh', 'Qs'], 'QQ'), ('duplicate card case', ['Ah', 'aH'], 'invalid'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')],\n [('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('pair of queens', ['Qh', 'Qs'], 'QQ'),\n  ('duplicate card case', ['Ah', 'aH'], 'invalid'), ('exact duplicate', ['7c', '7c'], 'invalid'),\n  ('queen ten', ['Tc', 'Qc'], 'QTs'), ('lower case ranks', ['kd', 'js'], 'KJo'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')],\n [('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('queen ten', ['Tc', 'Qc'], 'QTs'),\n  ('lower case ranks', ['kd', 'js'], 'KJo'), ('empty rank', ['h', 'Kd'], 'invalid'),\n  ('two-letter rank', ['KQh', '2d'], 'invalid'), ('ten first suited', ['10h', 'Jh'], 'JTs'),\n  ('deuce seven', ['2d', '7s'], '72o'), ('pair of tens mixed tokens', ['10h', 'Td'], 'TT')],\n [('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('suit case differs', ['Jh', 'TH'], 'JTs'),\n  ('two-letter rank', ['KQh', '2d'], 'invalid'), ('ten first suited', ['10h', 'Jh'], 'JTs'),\n  ('deuce seven', ['2d', '7s'], '72o'), ('pair of tens mixed tokens', ['10h', 'Td'], 'TT')],\n [('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('nine ten mixed', ['9c', '10d'], 'T9o'),\n  ('pair of queens', ['Qh', 'Qs'], 'QQ'), ('duplicate card case', ['Ah', 'aH'], 'invalid'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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":"b456b40936b33b98596875bcb50931b4d383d544b25b7cf73cd5b0c769086d03","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    R='23456789TJQKA'\n    if len(x)!=2 or x[0].upper()==x[1].upper(): return 'invalid'\n    def rank(c):\n        t=c[:-1].upper()\n        return 'T' if t=='10' else t\n    a,b=rank(x[0]),rank(x[1])\n    if a not in list(R) or b not in list(R): return 'invalid'\n    if a==b: return a+b\n    hi,lo=sorted([a,b], key=R.index, reverse=True)\n    return hi+lo+('s' if x[0][1]==x[1][1] else 'o')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('nine ten mixed', ['9c', '10d'], 'T9o'),\n  ('pair of queens', ['Qh', 'Qs'], 'QQ'), ('duplicate card case', ['Ah', 'aH'], 'invalid'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')],\n [('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('pair of queens', ['Qh', 'Qs'], 'QQ'),\n  ('duplicate card case', ['Ah', 'aH'], 'invalid'), ('exact duplicate', ['7c', '7c'], 'invalid'),\n  ('queen ten', ['Tc', 'Qc'], 'QTs'), ('lower case ranks', ['kd', 'js'], 'KJo'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')],\n [('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('queen ten', ['Tc', 'Qc'], 'QTs'),\n  ('lower case ranks', ['kd', 'js'], 'KJo'), ('empty rank', ['h', 'Kd'], 'invalid'),\n  ('two-letter rank', ['KQh', '2d'], 'invalid'), ('ten first suited', ['10h', 'Jh'], 'JTs'),\n  ('deuce seven', ['2d', '7s'], '72o'), ('pair of tens mixed tokens', ['10h', 'Td'], 'TT')],\n [('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('suit case differs', ['Jh', 'TH'], 'JTs'),\n  ('two-letter rank', ['KQh', '2d'], 'invalid'), ('ten first suited', ['10h', 'Jh'], 'JTs'),\n  ('deuce seven', ['2d', '7s'], '72o'), ('pair of tens mixed tokens', ['10h', 'Td'], 'TT')],\n [('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('nine ten mixed', ['9c', '10d'], 'T9o'),\n  ('pair of queens', ['Qh', 'Qs'], 'QQ'), ('duplicate card case', ['Ah', 'aH'], 'invalid'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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":"283a2ef2bc2e51add01d78d9172b263f80320dc0ea52da0411319e8d600dd1c5","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    R='23456789TJQKA'\n    if len(x)!=2 or x[0].upper()==x[1].upper(): return 'invalid'\n    def rank(c):\n        t=c[:-1].upper()\n        return 'T' if t=='10' else t\n    a,b=rank(x[0]),rank(x[1])\n    if a not in list(R) or b not in list(R): return 'invalid'\n    if a==b: return a+b\n    hi,lo=sorted([a,b], key=R.index, reverse=True)\n    return hi+lo+('s' if x[0][-1].lower()==x[1][-1].lower() else 'o')\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('nine ten mixed', ['9c', '10d'], 'T9o'),\n  ('pair of queens', ['Qh', 'Qs'], 'QQ'), ('duplicate card case', ['Ah', 'aH'], 'invalid'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')],\n [('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('pair of queens', ['Qh', 'Qs'], 'QQ'),\n  ('duplicate card case', ['Ah', 'aH'], 'invalid'), ('exact duplicate', ['7c', '7c'], 'invalid'),\n  ('queen ten', ['Tc', 'Qc'], 'QTs'), ('lower case ranks', ['kd', 'js'], 'KJo'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')],\n [('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('queen ten', ['Tc', 'Qc'], 'QTs'),\n  ('lower case ranks', ['kd', 'js'], 'KJo'), ('empty rank', ['h', 'Kd'], 'invalid'),\n  ('two-letter rank', ['KQh', '2d'], 'invalid'), ('ten first suited', ['10h', 'Jh'], 'JTs'),\n  ('deuce seven', ['2d', '7s'], '72o'), ('pair of tens mixed tokens', ['10h', 'Td'], 'TT')],\n [('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('suit case differs', ['Jh', 'TH'], 'JTs'),\n  ('two-letter rank', ['KQh', '2d'], 'invalid'), ('ten first suited', ['10h', 'Jh'], 'JTs'),\n  ('deuce seven', ['2d', '7s'], '72o'), ('pair of tens mixed tokens', ['10h', 'Td'], 'TT')],\n [('ace king suited', ['Ah', 'Kh'], 'AKs'), ('king ace offsuit order', ['Kd', 'Ah'], 'AKo'),\n  ('ten nine suited with 10', ['10s', '9s'], 'T9s'), ('nine ten mixed', ['9c', '10d'], 'T9o'),\n  ('pair of queens', ['Qh', 'Qs'], 'QQ'), ('duplicate card case', ['Ah', 'aH'], 'invalid'),\n  ('suit case differs', ['Jh', 'TH'], 'JTs'), ('ten first suited', ['10h', 'Jh'], 'JTs')]]\nfor label, args, expected in fixtures[N-1]:\n    try:\n        actual = solve(args)\n    except Exception as exc:\n        actual = 'error:' + type(exc).__name__\n    check(label, actual, 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 model with an explicitly stated contract; card strings are rank+suit (for example \"As\", \"Td\"); no claim of conformance to any casino or tournament rulebook. 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-poker_hand_evaluation-starting-hand-notation-suit-position","generated_at":"2026-09-29T14:50:09.037477+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Range tools, solvers and hand histories key statistics on this notation.","repair":"Read the suit from the last character of each card.","root_cause":"The suit is read from index 1, which is the \"0\" of a \"10\" token.","sha256":"08f5473228ffe87d47c09681106755fb0c707d42ce29fbbdc6ed1e4c73ca2188","title":"Ten token misreads suitedness · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":39.568,"exit_code":1,"observations":[{"actual":"AKs","check":"ace king suited","expected":"AKs","passed":true},{"actual":"AKo","check":"king ace offsuit order","expected":"AKo","passed":true},{"actual":"T9o","check":"ten nine suited with 10","expected":"T9s","passed":false},{"actual":"T9o","check":"nine ten mixed","expected":"T9o","passed":true},{"actual":"QQ","check":"pair of queens","expected":"QQ","passed":true},{"actual":"invalid","check":"duplicate card case","expected":"invalid","passed":true},{"actual":"JTs","check":"suit case differs","expected":"JTs","passed":true},{"actual":"JTo","check":"ten first suited","expected":"JTs","passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ace king suited\", \"actual\": \"AKs\", \"expected\": \"AKs\", \"passed\": true}, {\"check\": \"king ace offsuit order\", \"actual\": \"AKo\", \"expected\": \"AKo\", \"passed\": true}, {\"check\": \"ten nine suited with 10\", \"actual\": \"T9o\", \"expected\": \"T9s\", \"passed\": false}, {\"check\": \"nine ten mixed\", \"actual\": \"T9o\", \"expected\": \"T9o\", \"passed\": true}, {\"check\": \"pair of queens\", \"actual\": \"QQ\", \"expected\": \"QQ\", \"passed\": true}, {\"check\": \"duplicate card case\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"suit case differs\", \"actual\": \"JTs\", \"expected\": \"JTs\", \"passed\": true}, {\"check\": \"ten first suited\", \"actual\": \"JTo\", \"expected\": \"JTs\", \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":38.713,"exit_code":1,"observations":[{"actual":"AKs","check":"ace king suited","expected":"AKs","passed":true},{"actual":"AKo","check":"king ace offsuit order","expected":"AKo","passed":true},{"actual":"T9o","check":"ten nine suited with 10","expected":"T9s","passed":false},{"actual":"T9o","check":"nine ten mixed","expected":"T9o","passed":true},{"actual":"QQ","check":"pair of queens","expected":"QQ","passed":true},{"actual":"invalid","check":"duplicate card case","expected":"invalid","passed":true},{"actual":"JTo","check":"suit case differs","expected":"JTs","passed":false},{"actual":"JTo","check":"ten first suited","expected":"JTs","passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ace king suited\", \"actual\": \"AKs\", \"expected\": \"AKs\", \"passed\": true}, {\"check\": \"king ace offsuit order\", \"actual\": \"AKo\", \"expected\": \"AKo\", \"passed\": true}, {\"check\": \"ten nine suited with 10\", \"actual\": \"T9o\", \"expected\": \"T9s\", \"passed\": false}, {\"check\": \"nine ten mixed\", \"actual\": \"T9o\", \"expected\": \"T9o\", \"passed\": true}, {\"check\": \"pair of queens\", \"actual\": \"QQ\", \"expected\": \"QQ\", \"passed\": true}, {\"check\": \"duplicate card case\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"suit case differs\", \"actual\": \"JTo\", \"expected\": \"JTs\", \"passed\": false}, {\"check\": \"ten first suited\", \"actual\": \"JTo\", \"expected\": \"JTs\", \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":38.899,"exit_code":0,"observations":[{"actual":"AKs","check":"ace king suited","expected":"AKs","passed":true},{"actual":"AKo","check":"king ace offsuit order","expected":"AKo","passed":true},{"actual":"T9s","check":"ten nine suited with 10","expected":"T9s","passed":true},{"actual":"T9o","check":"nine ten mixed","expected":"T9o","passed":true},{"actual":"QQ","check":"pair of queens","expected":"QQ","passed":true},{"actual":"invalid","check":"duplicate card case","expected":"invalid","passed":true},{"actual":"JTs","check":"suit case differs","expected":"JTs","passed":true},{"actual":"JTs","check":"ten first suited","expected":"JTs","passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ace king suited\", \"actual\": \"AKs\", \"expected\": \"AKs\", \"passed\": true}, {\"check\": \"king ace offsuit order\", \"actual\": \"AKo\", \"expected\": \"AKo\", \"passed\": true}, {\"check\": \"ten nine suited with 10\", \"actual\": \"T9s\", \"expected\": \"T9s\", \"passed\": true}, {\"check\": \"nine ten mixed\", \"actual\": \"T9o\", \"expected\": \"T9o\", \"passed\": true}, {\"check\": \"pair of queens\", \"actual\": \"QQ\", \"expected\": \"QQ\", \"passed\": true}, {\"check\": \"duplicate card case\", \"actual\": \"invalid\", \"expected\": \"invalid\", \"passed\": true}, {\"check\": \"suit case differs\", \"actual\": \"JTs\", \"expected\": \"JTs\", \"passed\": true}, {\"check\": \"ten first suited\", \"actual\": \"JTs\", \"expected\": \"JTs\", \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}