{"abstract":"Punctuation after a ligature is kerned against a hidden component glyph.","category":"Typography line breaking","checks":8,"contract":"Input [words, width]. Glyph widths: i,l,j,.,, 4; t,f 6; m 15; w 14; M 16; W 18; other lowercase 10; other uppercase 13; space 5. Within a word, fi/fl/ff form ligatures (11/11/12) with no kerning into or out of them; case-sensitive kern pairs apply between adjacent glyphs; \"|\" is a non-joiner (invisible, blocks ligatures and kerning). No kerning across spaces. Greedy fill. Return [[text, width]].","contract_signature":"x","evaluation_group":"w2-typography-line-breaking-kern-ligature-measure","failed_approach":"Using the first component is the same mistake with a different pair.","family":"w2-typography-line-breaking-kern-ligature-measure-kerning-after-ligature","id":"FA-80161","implementations":{"attempt":{"sha256":"028818cb77ea71e53e928a325c8b80428690498dc18d3fbec2d51e3129115f94","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    words, width = x\n    W = {'i': 4, 'l': 4, 'j': 4, '.': 4, ',': 4, 't': 6, 'f': 6, 'm': 15, 'w': 14, 'M': 16, 'W': 18}\n    LIG = {'fi': 11, 'fl': 11, 'ff': 12}\n    KERN = {'AV': -3, 'VA': -3, 'To': -2, 'Ta': -2, 'Yo': -2, 'LT': -3, 'Wa': -2, 'av': -1, 'va': -1, 'y.': -2, 'r.': -2, 'l.': -1, 'f.': -1, 'Va': -2}\n    SPACE = 5\n    def glyph(c):\n        return W.get(c, 13 if c.isupper() else 10)\n    def measure(w):\n        total, prev, i = 0, None, 0\n        while i < len(w):\n            if w[i] == '|':\n                prev = None\n                i += 1\n                continue\n            pair = w[i:i + 2]\n            if pair in LIG:\n                total += LIG[pair]\n                prev = w[i]\n                i += 2\n                continue\n            g = w[i]\n            total += glyph(g)\n            if prev is not None:\n                total += KERN.get(prev + g, 0)\n            prev = g\n            i += 1\n        return total\n    def line_width(ws):\n        return sum(measure(t) for t in ws) + SPACE * (len(ws) - 1)\n    lines, cur = [], []\n    for w in words:\n        cand = cur + [w]\n        if not cur or line_width(cand) <= width:\n            cur = cand\n        else:\n            lines.append(cur)\n            cur = [w]\n    if cur:\n        lines.append(cur)\n    return [[' '.join(t.replace('|', '') for t in ln), line_width(ln)] for ln in lines]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('ligature then period', [['fl.', 'fi,'], 200], [['fl. fi,', 35]]), ('regression: kerning after ligature', [['fi', 'fl.', 'AVAIL', 'fly.', 'Tofu'], 100], [['fi fl. AVAIL', 95], ['fly. Tofu', 65]]), ('regression: kerning after ligature', [['staff.', 'LA|VALLE', 'fl.', 'shelf|life', 'our'], 95], [['staff.', 42], ['LAVALLE', 88], ['fl. shelflife', 84], ['our', 30]]), ('regression: kerning after ligature', [['VIA', 'flow', 'dry.', 'y.', 'AVAIL', 'fl.', 'av'], 42], [['VIA', 39], ['flow', 35], ['dry.', 32], ['y.', 12], ['AVAIL', 59], ['fl. av', 39]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('control layout', [['Av', 'office', 'Ta', 'LA|VALLE', 'AVAIL', 'Wavy', 'Vat'], 99], [['Av office', 74], ['Ta', 21], ['LAVALLE', 88], ['AVAIL', 59], ['Wavy Vat', 77]]), ('control layout', [['fly.', 'office', 'Vat', 'AT', 'Av', 'our'], 57], [['fly.', 23], ['office', 46], ['Vat', 27], ['AT Av', 54], ['our', 30]])], [('regression: kerning after ligature', [['fl.', 'staff.', 'flow', 'Tofu'], 109], [['fl. staff. flow', 102], ['Tofu', 37]]), ('regression: kerning after ligature', [['staff.', 'wolf|like', 'Ta', 'Tofu', 'flow'], 94], [['staff.', 42], ['wolflike Ta', 88], ['Tofu flow', 77]]), ('regression: kerning after ligature', [['LA', 'staff.', 'Av'], 120], [['LA staff. Av', 101]]), ('regression: kerning after ligature', [['fi', 'staff.', 'fi', 'fi'], 118], [['fi staff. fi fi', 90]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('control layout', [['VIA', 'AVAIL', 'office', 'Av'], 112], [['VIA AVAIL', 103], ['office Av', 74]]), ('control layout', [['fi', 'Ta', 'Ta', 'Tofu', 'y.'], 103], [['fi Ta Ta', 63], ['Tofu y.', 54]])], [('regression: kerning after ligature', [['fly.', 'staff.', 'y.', 'raffle', 'av', 'raffle'], 99], [['fly. staff. y.', 87], ['raffle av', 70], ['raffle', 46]]), ('regression: kerning after ligature', [['staff.', 'AVAIL', 'LA', 'LA|VALLE'], 42], [['staff.', 42], ['AVAIL', 59], ['LA', 26], ['LAVALLE', 88]]), ('regression: kerning after ligature', [['fl.', 'Wavy', 'our', 'VIA', 'Tofu', 'staff.', 'staff.'], 58], [['fl.', 15], ['Wavy', 45], ['our', 30], ['VIA', 39], ['Tofu', 37], ['staff.', 42], ['staff.', 42]]), ('regression: kerning after ligature', [['shelf|life', 'raffle', 'av', 'our', 'staff.', 'y.'], 43], [['shelflife', 64], ['raffle', 46], ['av', 19], ['our', 30], ['staff.', 42], ['y.', 12]]), ('ligature then period', [['fl.', 'fi,'], 200], [['fl. fi,', 35]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('control layout', [['Ta', 'raffle', 'Yo'], 80], [['Ta raffle', 72], ['Yo', 21]]), ('control layout', [['fly.', 'shelf|life', 'AT', 'flow', 'av'], 91], [['fly.', 23], ['shelflife', 64], ['AT flow av', 90]])], [('regression: kerning after ligature', [['our', 'av', 'staff.', 'Av'], 56], [['our av', 54], ['staff.', 42], ['Av', 23]]), ('regression: kerning after ligature', [['av', 'fl.', 'Tofu', 'flow'], 112], [['av fl. Tofu', 81], ['flow', 35]]), ('regression: kerning after ligature', [['fl.', 'wolf|like', 'Wavy', 'Vat'], 50], [['fl.', 15], ['wolflike', 62], ['Wavy', 45], ['Vat', 27]]), ('regression: kerning after ligature', [['flow', 'av', 'av', 'wolf|like', 'fl.', 'Av'], 88], [['flow av av', 83], ['wolflike fl.', 82], ['Av', 23]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('ligature then period', [['fl.', 'fi,'], 200], [['fl. fi,', 35]]), ('control layout', [['AT', 'flow', 'raffle', 'wolf|like', 'VIA', 'dry.'], 79], [['AT flow', 66], ['raffle', 46], ['wolflike', 62], ['VIA dry.', 76]]), ('control layout', [['flow', 'Yo', 'y.', 'y.'], 102], [['flow Yo y. y.', 95]])], [('regression: kerning after ligature', [['dry.', 'LA', 'shelf|life', 'staff.', 'fi', 'staff.', 'av'], 116], [['dry. LA', 63], ['shelflife staff.', 111], ['fi staff. av', 82]]), ('regression: kerning after ligature', [['fly.', 'office', 'raffle', 'staff.', 'fly.', 'VIA'], 68], [['fly.', 23], ['office', 46], ['raffle', 46], ['staff.', 42], ['fly. VIA', 67]]), ('regression: kerning after ligature', [['fl.', 'wolf|like', 'Wavy', 'Vat'], 50], [['fl.', 15], ['wolflike', 62], ['Wavy', 45], ['Vat', 27]]), ('regression: kerning after ligature', [['Av', 'staff.', 'office'], 55], [['Av', 23], ['staff.', 42], ['office', 46]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('control layout', [['office', 'wolf|like'], 70], [['office', 46], ['wolflike', 62]]), ('control layout', [['our', 'av', 'our', 'Wavy'], 94], [['our av our', 89], ['Wavy', 45]])]]\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":"3904c7dec3787f392e19b3dd33607c5dcf34c8fa4601124f62c1f59706a302e3","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(x):\n    words, width = x\n    W = {'i': 4, 'l': 4, 'j': 4, '.': 4, ',': 4, 't': 6, 'f': 6, 'm': 15, 'w': 14, 'M': 16, 'W': 18}\n    LIG = {'fi': 11, 'fl': 11, 'ff': 12}\n    KERN = {'AV': -3, 'VA': -3, 'To': -2, 'Ta': -2, 'Yo': -2, 'LT': -3, 'Wa': -2, 'av': -1, 'va': -1, 'y.': -2, 'r.': -2, 'l.': -1, 'f.': -1, 'Va': -2}\n    SPACE = 5\n    def glyph(c):\n        return W.get(c, 13 if c.isupper() else 10)\n    def measure(w):\n        total, prev, i = 0, None, 0\n        while i < len(w):\n            if w[i] == '|':\n                prev = None\n                i += 1\n                continue\n            pair = w[i:i + 2]\n            if pair in LIG:\n                total += LIG[pair]\n                prev = w[i + 1]\n                i += 2\n                continue\n            g = w[i]\n            total += glyph(g)\n            if prev is not None:\n                total += KERN.get(prev + g, 0)\n            prev = g\n            i += 1\n        return total\n    def line_width(ws):\n        return sum(measure(t) for t in ws) + SPACE * (len(ws) - 1)\n    lines, cur = [], []\n    for w in words:\n        cand = cur + [w]\n        if not cur or line_width(cand) <= width:\n            cur = cand\n        else:\n            lines.append(cur)\n            cur = [w]\n    if cur:\n        lines.append(cur)\n    return [[' '.join(t.replace('|', '') for t in ln), line_width(ln)] for ln in lines]\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\nfixtures = [[('ligature then period', [['fl.', 'fi,'], 200], [['fl. fi,', 35]]), ('regression: kerning after ligature', [['fi', 'fl.', 'AVAIL', 'fly.', 'Tofu'], 100], [['fi fl. AVAIL', 95], ['fly. Tofu', 65]]), ('regression: kerning after ligature', [['staff.', 'LA|VALLE', 'fl.', 'shelf|life', 'our'], 95], [['staff.', 42], ['LAVALLE', 88], ['fl. shelflife', 84], ['our', 30]]), ('regression: kerning after ligature', [['VIA', 'flow', 'dry.', 'y.', 'AVAIL', 'fl.', 'av'], 42], [['VIA', 39], ['flow', 35], ['dry.', 32], ['y.', 12], ['AVAIL', 59], ['fl. av', 39]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('control layout', [['Av', 'office', 'Ta', 'LA|VALLE', 'AVAIL', 'Wavy', 'Vat'], 99], [['Av office', 74], ['Ta', 21], ['LAVALLE', 88], ['AVAIL', 59], ['Wavy Vat', 77]]), ('control layout', [['fly.', 'office', 'Vat', 'AT', 'Av', 'our'], 57], [['fly.', 23], ['office', 46], ['Vat', 27], ['AT Av', 54], ['our', 30]])], [('regression: kerning after ligature', [['fl.', 'staff.', 'flow', 'Tofu'], 109], [['fl. staff. flow', 102], ['Tofu', 37]]), ('regression: kerning after ligature', [['staff.', 'wolf|like', 'Ta', 'Tofu', 'flow'], 94], [['staff.', 42], ['wolflike Ta', 88], ['Tofu flow', 77]]), ('regression: kerning after ligature', [['LA', 'staff.', 'Av'], 120], [['LA staff. Av', 101]]), ('regression: kerning after ligature', [['fi', 'staff.', 'fi', 'fi'], 118], [['fi staff. fi fi', 90]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('control layout', [['VIA', 'AVAIL', 'office', 'Av'], 112], [['VIA AVAIL', 103], ['office Av', 74]]), ('control layout', [['fi', 'Ta', 'Ta', 'Tofu', 'y.'], 103], [['fi Ta Ta', 63], ['Tofu y.', 54]])], [('regression: kerning after ligature', [['fly.', 'staff.', 'y.', 'raffle', 'av', 'raffle'], 99], [['fly. staff. y.', 87], ['raffle av', 70], ['raffle', 46]]), ('regression: kerning after ligature', [['staff.', 'AVAIL', 'LA', 'LA|VALLE'], 42], [['staff.', 42], ['AVAIL', 59], ['LA', 26], ['LAVALLE', 88]]), ('regression: kerning after ligature', [['fl.', 'Wavy', 'our', 'VIA', 'Tofu', 'staff.', 'staff.'], 58], [['fl.', 15], ['Wavy', 45], ['our', 30], ['VIA', 39], ['Tofu', 37], ['staff.', 42], ['staff.', 42]]), ('regression: kerning after ligature', [['shelf|life', 'raffle', 'av', 'our', 'staff.', 'y.'], 43], [['shelflife', 64], ['raffle', 46], ['av', 19], ['our', 30], ['staff.', 42], ['y.', 12]]), ('ligature then period', [['fl.', 'fi,'], 200], [['fl. fi,', 35]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('control layout', [['Ta', 'raffle', 'Yo'], 80], [['Ta raffle', 72], ['Yo', 21]]), ('control layout', [['fly.', 'shelf|life', 'AT', 'flow', 'av'], 91], [['fly.', 23], ['shelflife', 64], ['AT flow av', 90]])], [('regression: kerning after ligature', [['our', 'av', 'staff.', 'Av'], 56], [['our av', 54], ['staff.', 42], ['Av', 23]]), ('regression: kerning after ligature', [['av', 'fl.', 'Tofu', 'flow'], 112], [['av fl. Tofu', 81], ['flow', 35]]), ('regression: kerning after ligature', [['fl.', 'wolf|like', 'Wavy', 'Vat'], 50], [['fl.', 15], ['wolflike', 62], ['Wavy', 45], ['Vat', 27]]), ('regression: kerning after ligature', [['flow', 'av', 'av', 'wolf|like', 'fl.', 'Av'], 88], [['flow av av', 83], ['wolflike fl.', 82], ['Av', 23]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('ligature then period', [['fl.', 'fi,'], 200], [['fl. fi,', 35]]), ('control layout', [['AT', 'flow', 'raffle', 'wolf|like', 'VIA', 'dry.'], 79], [['AT flow', 66], ['raffle', 46], ['wolflike', 62], ['VIA dry.', 76]]), ('control layout', [['flow', 'Yo', 'y.', 'y.'], 102], [['flow Yo y. y.', 95]])], [('regression: kerning after ligature', [['dry.', 'LA', 'shelf|life', 'staff.', 'fi', 'staff.', 'av'], 116], [['dry. LA', 63], ['shelflife staff.', 111], ['fi staff. av', 82]]), ('regression: kerning after ligature', [['fly.', 'office', 'raffle', 'staff.', 'fly.', 'VIA'], 68], [['fly.', 23], ['office', 46], ['raffle', 46], ['staff.', 42], ['fly. VIA', 67]]), ('regression: kerning after ligature', [['fl.', 'wolf|like', 'Wavy', 'Vat'], 50], [['fl.', 15], ['wolflike', 62], ['Wavy', 45], ['Vat', 27]]), ('regression: kerning after ligature', [['Av', 'staff.', 'office'], 55], [['Av', 23], ['staff.', 42], ['office', 46]]), ('non-joiner blocks ligature', [['shelf|life'], 200], [['shelflife', 64]]), ('case-sensitive pair', [['Av', 'av'], 200], [['Av av', 47]]), ('control layout', [['office', 'wolf|like'], 70], [['office', 46], ['wolflike', 62]]), ('control layout', [['our', 'av', 'our', 'Wavy'], 94], [['our av our', 89], ['Wavy', 45]])]]\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 typesetting model with integer widths and a stipulated rule set; it does not claim conformance to any engine. 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-typography-line-breaking-kern-ligature-measure-kerning-after-ligature","generated_at":"2026-09-29T14:49:51.285899+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Line breaking decides where paragraphs wrap on screen and in print; a wrong decision point shifts every following line.","root_cause":"After emitting a ligature the previous-glyph state is set to its last component.","sha256":"363b3d40427fda64ceac8b8c56c7c783bc85426941e0f65feaaebc9bfc6433cd","title":"Kerning and ligature line measure: kerning after ligature · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verified":true,"visibility":"public","verification":{"attempt":{"elapsed_ms":41.574,"exit_code":1,"observations":[{"actual":[["fl. fi,",34]],"check":"ligature then period","expected":[["fl. fi,",35]],"passed":false},{"actual":[["fi fl. AVAIL",94],["fly. Tofu",65]],"check":"regression: kerning after ligature","expected":[["fi fl. AVAIL",95],["fly. Tofu",65]],"passed":false},{"actual":[["staff.",41],["LAVALLE",88],["fl. shelflife",83],["our",30]],"check":"regression: kerning after ligature","expected":[["staff.",42],["LAVALLE",88],["fl. shelflife",84],["our",30]],"passed":false},{"actual":[["VIA",39],["flow",35],["dry.",32],["y.",12],["AVAIL",59],["fl. av",38]],"check":"regression: kerning after ligature","expected":[["VIA",39],["flow",35],["dry.",32],["y.",12],["AVAIL",59],["fl. av",39]],"passed":false},{"actual":[["Av av",47]],"check":"case-sensitive pair","expected":[["Av av",47]],"passed":true},{"actual":[["shelflife",64]],"check":"non-joiner blocks ligature","expected":[["shelflife",64]],"passed":true},{"actual":[["Av office",74],["Ta",21],["LAVALLE",88],["AVAIL",59],["Wavy Vat",77]],"check":"control layout","expected":[["Av office",74],["Ta",21],["LAVALLE",88],["AVAIL",59],["Wavy Vat",77]],"passed":true},{"actual":[["fly.",23],["office",46],["Vat",27],["AT Av",54],["our",30]],"check":"control layout","expected":[["fly.",23],["office",46],["Vat",27],["AT Av",54],["our",30]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ligature then period\", \"actual\": [[\"fl. fi,\", 34]], \"expected\": [[\"fl. fi,\", 35]], \"passed\": false}, {\"check\": \"regression: kerning after ligature\", \"actual\": [[\"fi fl. AVAIL\", 94], [\"fly. Tofu\", 65]], \"expected\": [[\"fi fl. AVAIL\", 95], [\"fly. Tofu\", 65]], \"passed\": false}, {\"check\": \"regression: kerning after ligature\", \"actual\": [[\"staff.\", 41], [\"LAVALLE\", 88], [\"fl. shelflife\", 83], [\"our\", 30]], \"expected\": [[\"staff.\", 42], [\"LAVALLE\", 88], [\"fl. shelflife\", 84], [\"our\", 30]], \"passed\": false}, {\"check\": \"regression: kerning after ligature\", \"actual\": [[\"VIA\", 39], [\"flow\", 35], [\"dry.\", 32], [\"y.\", 12], [\"AVAIL\", 59], [\"fl. av\", 38]], \"expected\": [[\"VIA\", 39], [\"flow\", 35], [\"dry.\", 32], [\"y.\", 12], [\"AVAIL\", 59], [\"fl. av\", 39]], \"passed\": false}, {\"check\": \"case-sensitive pair\", \"actual\": [[\"Av av\", 47]], \"expected\": [[\"Av av\", 47]], \"passed\": true}, {\"check\": \"non-joiner blocks ligature\", \"actual\": [[\"shelflife\", 64]], \"expected\": [[\"shelflife\", 64]], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [[\"Av office\", 74], [\"Ta\", 21], [\"LAVALLE\", 88], [\"AVAIL\", 59], [\"Wavy Vat\", 77]], \"expected\": [[\"Av office\", 74], [\"Ta\", 21], [\"LAVALLE\", 88], [\"AVAIL\", 59], [\"Wavy Vat\", 77]], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [[\"fly.\", 23], [\"office\", 46], [\"Vat\", 27], [\"AT Av\", 54], [\"our\", 30]], \"expected\": [[\"fly.\", 23], [\"office\", 46], [\"Vat\", 27], [\"AT Av\", 54], [\"our\", 30]], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.618,"exit_code":1,"observations":[{"actual":[["fl. fi,",34]],"check":"ligature then period","expected":[["fl. fi,",35]],"passed":false},{"actual":[["fi fl. AVAIL",94],["fly. Tofu",65]],"check":"regression: kerning after ligature","expected":[["fi fl. AVAIL",95],["fly. Tofu",65]],"passed":false},{"actual":[["staff.",41],["LAVALLE",88],["fl. shelflife",83],["our",30]],"check":"regression: kerning after ligature","expected":[["staff.",42],["LAVALLE",88],["fl. shelflife",84],["our",30]],"passed":false},{"actual":[["VIA",39],["flow",35],["dry.",32],["y.",12],["AVAIL",59],["fl. av",38]],"check":"regression: kerning after ligature","expected":[["VIA",39],["flow",35],["dry.",32],["y.",12],["AVAIL",59],["fl. av",39]],"passed":false},{"actual":[["Av av",47]],"check":"case-sensitive pair","expected":[["Av av",47]],"passed":true},{"actual":[["shelflife",64]],"check":"non-joiner blocks ligature","expected":[["shelflife",64]],"passed":true},{"actual":[["Av office",74],["Ta",21],["LAVALLE",88],["AVAIL",59],["Wavy Vat",77]],"check":"control layout","expected":[["Av office",74],["Ta",21],["LAVALLE",88],["AVAIL",59],["Wavy Vat",77]],"passed":true},{"actual":[["fly.",23],["office",46],["Vat",27],["AT Av",54],["our",30]],"check":"control layout","expected":[["fly.",23],["office",46],["Vat",27],["AT Av",54],["our",30]],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"ligature then period\", \"actual\": [[\"fl. fi,\", 34]], \"expected\": [[\"fl. fi,\", 35]], \"passed\": false}, {\"check\": \"regression: kerning after ligature\", \"actual\": [[\"fi fl. AVAIL\", 94], [\"fly. Tofu\", 65]], \"expected\": [[\"fi fl. AVAIL\", 95], [\"fly. Tofu\", 65]], \"passed\": false}, {\"check\": \"regression: kerning after ligature\", \"actual\": [[\"staff.\", 41], [\"LAVALLE\", 88], [\"fl. shelflife\", 83], [\"our\", 30]], \"expected\": [[\"staff.\", 42], [\"LAVALLE\", 88], [\"fl. shelflife\", 84], [\"our\", 30]], \"passed\": false}, {\"check\": \"regression: kerning after ligature\", \"actual\": [[\"VIA\", 39], [\"flow\", 35], [\"dry.\", 32], [\"y.\", 12], [\"AVAIL\", 59], [\"fl. av\", 38]], \"expected\": [[\"VIA\", 39], [\"flow\", 35], [\"dry.\", 32], [\"y.\", 12], [\"AVAIL\", 59], [\"fl. av\", 39]], \"passed\": false}, {\"check\": \"case-sensitive pair\", \"actual\": [[\"Av av\", 47]], \"expected\": [[\"Av av\", 47]], \"passed\": true}, {\"check\": \"non-joiner blocks ligature\", \"actual\": [[\"shelflife\", 64]], \"expected\": [[\"shelflife\", 64]], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [[\"Av office\", 74], [\"Ta\", 21], [\"LAVALLE\", 88], [\"AVAIL\", 59], [\"Wavy Vat\", 77]], \"expected\": [[\"Av office\", 74], [\"Ta\", 21], [\"LAVALLE\", 88], [\"AVAIL\", 59], [\"Wavy Vat\", 77]], \"passed\": true}, {\"check\": \"control layout\", \"actual\": [[\"fly.\", 23], [\"office\", 46], [\"Vat\", 27], [\"AT Av\", 54], [\"our\", 30]], \"expected\": [[\"fly.\", 23], [\"office\", 46], [\"Vat\", 27], [\"AT Av\", 54], [\"our\", 30]], \"passed\": true}], \"passed\": false}\n"}},"member_only":{"stages":["fixed"],"fields":["implementations.fixed","verification.fixed","harness","repair"],"note":"The verified repair, its recorded checks, the repair description, and the scoring harness are available to members."}}