{"abstract":"Adding or removing the final newline produces an empty diff.","category":"Text diff and three-way merge","checks":8,"contract":"Split each text on \"\\n\" into [line, terminated] tokens; a final empty piece produces no token, a final non-empty piece is an unterminated token. Diff the token lists with an LCS walk (tokens equal only if text and terminator flag both match, deletions before insertions on ties) and render each op as tag + text, followed by \"\\ No newline at end of file\" after any unterminated token.","evaluation_group":"w2-text-diff-merge-eof-newline-diff","failed_approach":"Allowing a terminated line to match an unterminated one still hides one direction of the change.","family":"w2-text-diff-merge-eof-newline-diff-token-equality","id":"FA-75496","implementations":{"attempt":{"sha256":"953aee2c7d0dde918d69cacfc9a3969b787a5643119d3f14cbfcd9c0efbe1a32","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old, new):\n    def toks(s):\n        parts = s.split('\\n')\n        res = [[p, True] for p in parts[:-1]]\n        if parts[-1] != '':\n            res.append([parts[-1], False])\n        return res\n    def same(x, y):\n        return x[0] == y[0] and x[1] >= y[1]\n    A, B = toks(old), toks(new)\n    n, m = len(A), len(B)\n    T = [[0] * (m + 1) for _ in range(n + 1)]\n    for i in range(n - 1, -1, -1):\n        for j in range(m - 1, -1, -1):\n            T[i][j] = T[i + 1][j + 1] + 1 if same(A[i], B[j]) else max(T[i + 1][j], T[i][j + 1])\n    ops = []\n    i = j = 0\n    while i < n or j < m:\n        if i < n and j < m and same(A[i], B[j]):\n            ops.append((' ', A[i])); i += 1; j += 1\n        elif i < n and (j >= m or T[i + 1][j] >= T[i][j + 1]):\n            ops.append(('-', A[i])); i += 1\n        else:\n            ops.append(('+', B[j])); j += 1\n    out = []\n    for tag, (text, nl) in ops:\n        out.append(tag + text)\n        if not nl:\n            out.append('\\\\ No newline at end of file')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only1'], ['+only1', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nold', 'k\\nnew'], [' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    2: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only2'], ['+only2', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nold', 'k\\nk\\nnew'], [' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    3: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only3'], ['+only3', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nold', 'k\\nk\\nk\\nnew'], [' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    4: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only4'], ['+only4', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nk\\nold', 'k\\nk\\nk\\nk\\nnew'], [' k', ' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    5: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only5'], ['+only5', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nk\\nk\\nold', 'k\\nk\\nk\\nk\\nk\\nnew'], [' k', ' k', ' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n}[N]\nfor label, args, expected in cases:\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":"b1dc83dcd11262acb75f7c1c43d976e6a1ae36c3b44dbde9f6188ff3d058c4e4","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old, new):\n    def toks(s):\n        parts = s.split('\\n')\n        res = [[p, True] for p in parts[:-1]]\n        if parts[-1] != '':\n            res.append([parts[-1], False])\n        return res\n    def same(x, y):\n        return x[0] == y[0]\n    A, B = toks(old), toks(new)\n    n, m = len(A), len(B)\n    T = [[0] * (m + 1) for _ in range(n + 1)]\n    for i in range(n - 1, -1, -1):\n        for j in range(m - 1, -1, -1):\n            T[i][j] = T[i + 1][j + 1] + 1 if same(A[i], B[j]) else max(T[i + 1][j], T[i][j + 1])\n    ops = []\n    i = j = 0\n    while i < n or j < m:\n        if i < n and j < m and same(A[i], B[j]):\n            ops.append((' ', A[i])); i += 1; j += 1\n        elif i < n and (j >= m or T[i + 1][j] >= T[i][j + 1]):\n            ops.append(('-', A[i])); i += 1\n        else:\n            ops.append(('+', B[j])); j += 1\n    out = []\n    for tag, (text, nl) in ops:\n        out.append(tag + text)\n        if not nl:\n            out.append('\\\\ No newline at end of file')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only1'], ['+only1', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nold', 'k\\nnew'], [' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    2: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only2'], ['+only2', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nold', 'k\\nk\\nnew'], [' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    3: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only3'], ['+only3', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nold', 'k\\nk\\nk\\nnew'], [' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    4: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only4'], ['+only4', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nk\\nold', 'k\\nk\\nk\\nk\\nnew'], [' k', ' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    5: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only5'], ['+only5', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nk\\nk\\nold', 'k\\nk\\nk\\nk\\nk\\nnew'], [' k', ' k', ' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n}[N]\nfor label, args, expected in cases:\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":"3a8d8a863b6d5480c8e26c56d9572c3e18ed3e622d909e232de99c8798f60f72","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(old, new):\n    def toks(s):\n        parts = s.split('\\n')\n        res = [[p, True] for p in parts[:-1]]\n        if parts[-1] != '':\n            res.append([parts[-1], False])\n        return res\n    def same(x, y):\n        return x == y\n    A, B = toks(old), toks(new)\n    n, m = len(A), len(B)\n    T = [[0] * (m + 1) for _ in range(n + 1)]\n    for i in range(n - 1, -1, -1):\n        for j in range(m - 1, -1, -1):\n            T[i][j] = T[i + 1][j + 1] + 1 if same(A[i], B[j]) else max(T[i + 1][j], T[i][j + 1])\n    ops = []\n    i = j = 0\n    while i < n or j < m:\n        if i < n and j < m and same(A[i], B[j]):\n            ops.append((' ', A[i])); i += 1; j += 1\n        elif i < n and (j >= m or T[i + 1][j] >= T[i][j + 1]):\n            ops.append(('-', A[i])); i += 1\n        else:\n            ops.append(('+', B[j])); j += 1\n    out = []\n    for tag, (text, nl) in ops:\n        out.append(tag + text)\n        if not nl:\n            out.append('\\\\ No newline at end of file')\n    return out\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only1'], ['+only1', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nold', 'k\\nnew'], [' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    2: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only2'], ['+only2', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nold', 'k\\nk\\nnew'], [' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    3: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only3'], ['+only3', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nold', 'k\\nk\\nk\\nnew'], [' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    4: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only4'], ['+only4', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nk\\nold', 'k\\nk\\nk\\nk\\nnew'], [' k', ' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n    5: [('newline added at end of file', ['a\\nb', 'a\\nb\\n'], [' a', '-b', '\\\\ No newline at end of file', '+b']), ('newline removed at end of file', ['a\\nb\\n', 'a\\nb'], [' a', '-b', '+b', '\\\\ No newline at end of file']), ('unchanged last line without newline', ['x\\ny', 'X\\ny'], ['-x', '+X', ' y', '\\\\ No newline at end of file']), ('both terminated', ['p\\nq\\n', 'p\\nr\\n'], [' p', '-q', '+r']), ('empty to one unterminated line', ['', 'only5'], ['+only5', '\\\\ No newline at end of file']), ('last line changed and unterminated', ['k\\nk\\nk\\nk\\nk\\nold', 'k\\nk\\nk\\nk\\nk\\nnew'], [' k', ' k', ' k', ' k', ' k', '-old', '\\\\ No newline at end of file', '+new', '\\\\ No newline at end of file']), ('trailing blank line', ['a\\n\\n', 'a\\n'], [' a', '-']), ('identical texts', ['s\\nt\\n', 's\\nt\\n'], [' s', ' t'])],\n}[N]\nfor label, args, expected in cases:\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, bounded teaching model of one diff, patch or merge rule with stipulated conventions; it is not a production diff or version-control implementation and makes no claim of conformance to any specific tool. 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-text-diff-merge-eof-newline-diff-token-equality","generated_at":"2026-09-29T14:49:07.184148+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Unified diffs must show a change that only adds or removes the final newline, and mark which side lacks it.","repair":"Two tokens are equal only when both text and terminator flag match.","root_cause":"Token equality compares only line text, ignoring the terminator flag.","sha256":"10cde0ef0d3618e7379cc5492ffd5210f52a286dd34b74ddad30636e5bfbdb9c","title":"End-of-file newline diff: lines differing only in the final newline compare equal · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":38.264,"exit_code":1,"observations":[{"actual":[" a","-b","\\ No newline at end of file","+b"],"check":"newline added at end of file","expected":[" a","-b","\\ No newline at end of file","+b"],"passed":true},{"actual":[" a"," b"],"check":"newline removed at end of file","expected":[" a","-b","+b","\\ No newline at end of file"],"passed":false},{"actual":["-x","+X"," y","\\ No newline at end of file"],"check":"unchanged last line without newline","expected":["-x","+X"," y","\\ No newline at end of file"],"passed":true},{"actual":[" p","-q","+r"],"check":"both terminated","expected":[" p","-q","+r"],"passed":true},{"actual":["+only1","\\ No newline at end of file"],"check":"empty to one unterminated line","expected":["+only1","\\ No newline at end of file"],"passed":true},{"actual":[" k","-old","\\ No newline at end of file","+new","\\ No newline at end of file"],"check":"last line changed and unterminated","expected":[" k","-old","\\ No newline at end of file","+new","\\ No newline at end of file"],"passed":true},{"actual":[" a","-"],"check":"trailing blank line","expected":[" a","-"],"passed":true},{"actual":[" s"," t"],"check":"identical texts","expected":[" s"," t"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"newline added at end of file\", \"actual\": [\" a\", \"-b\", \"\\\\ No newline at end of file\", \"+b\"], \"expected\": [\" a\", \"-b\", \"\\\\ No newline at end of file\", \"+b\"], \"passed\": true}, {\"check\": \"newline removed at end of file\", \"actual\": [\" a\", \" b\"], \"expected\": [\" a\", \"-b\", \"+b\", \"\\\\ No newline at end of file\"], \"passed\": false}, {\"check\": \"unchanged last line without newline\", \"actual\": [\"-x\", \"+X\", \" y\", \"\\\\ No newline at end of file\"], \"expected\": [\"-x\", \"+X\", \" y\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"both terminated\", \"actual\": [\" p\", \"-q\", \"+r\"], \"expected\": [\" p\", \"-q\", \"+r\"], \"passed\": true}, {\"check\": \"empty to one unterminated line\", \"actual\": [\"+only1\", \"\\\\ No newline at end of file\"], \"expected\": [\"+only1\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"last line changed and unterminated\", \"actual\": [\" k\", \"-old\", \"\\\\ No newline at end of file\", \"+new\", \"\\\\ No newline at end of file\"], \"expected\": [\" k\", \"-old\", \"\\\\ No newline at end of file\", \"+new\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"trailing blank line\", \"actual\": [\" a\", \"-\"], \"expected\": [\" a\", \"-\"], \"passed\": true}, {\"check\": \"identical texts\", \"actual\": [\" s\", \" t\"], \"expected\": [\" s\", \" t\"], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":43.518,"exit_code":1,"observations":[{"actual":[" a"," b","\\ No newline at end of file"],"check":"newline added at end of file","expected":[" a","-b","\\ No newline at end of file","+b"],"passed":false},{"actual":[" a"," b"],"check":"newline removed at end of file","expected":[" a","-b","+b","\\ No newline at end of file"],"passed":false},{"actual":["-x","+X"," y","\\ No newline at end of file"],"check":"unchanged last line without newline","expected":["-x","+X"," y","\\ No newline at end of file"],"passed":true},{"actual":[" p","-q","+r"],"check":"both terminated","expected":[" p","-q","+r"],"passed":true},{"actual":["+only1","\\ No newline at end of file"],"check":"empty to one unterminated line","expected":["+only1","\\ No newline at end of file"],"passed":true},{"actual":[" k","-old","\\ No newline at end of file","+new","\\ No newline at end of file"],"check":"last line changed and unterminated","expected":[" k","-old","\\ No newline at end of file","+new","\\ No newline at end of file"],"passed":true},{"actual":[" a","-"],"check":"trailing blank line","expected":[" a","-"],"passed":true},{"actual":[" s"," t"],"check":"identical texts","expected":[" s"," t"],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"newline added at end of file\", \"actual\": [\" a\", \" b\", \"\\\\ No newline at end of file\"], \"expected\": [\" a\", \"-b\", \"\\\\ No newline at end of file\", \"+b\"], \"passed\": false}, {\"check\": \"newline removed at end of file\", \"actual\": [\" a\", \" b\"], \"expected\": [\" a\", \"-b\", \"+b\", \"\\\\ No newline at end of file\"], \"passed\": false}, {\"check\": \"unchanged last line without newline\", \"actual\": [\"-x\", \"+X\", \" y\", \"\\\\ No newline at end of file\"], \"expected\": [\"-x\", \"+X\", \" y\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"both terminated\", \"actual\": [\" p\", \"-q\", \"+r\"], \"expected\": [\" p\", \"-q\", \"+r\"], \"passed\": true}, {\"check\": \"empty to one unterminated line\", \"actual\": [\"+only1\", \"\\\\ No newline at end of file\"], \"expected\": [\"+only1\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"last line changed and unterminated\", \"actual\": [\" k\", \"-old\", \"\\\\ No newline at end of file\", \"+new\", \"\\\\ No newline at end of file\"], \"expected\": [\" k\", \"-old\", \"\\\\ No newline at end of file\", \"+new\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"trailing blank line\", \"actual\": [\" a\", \"-\"], \"expected\": [\" a\", \"-\"], \"passed\": true}, {\"check\": \"identical texts\", \"actual\": [\" s\", \" t\"], \"expected\": [\" s\", \" t\"], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.508,"exit_code":0,"observations":[{"actual":[" a","-b","\\ No newline at end of file","+b"],"check":"newline added at end of file","expected":[" a","-b","\\ No newline at end of file","+b"],"passed":true},{"actual":[" a","-b","+b","\\ No newline at end of file"],"check":"newline removed at end of file","expected":[" a","-b","+b","\\ No newline at end of file"],"passed":true},{"actual":["-x","+X"," y","\\ No newline at end of file"],"check":"unchanged last line without newline","expected":["-x","+X"," y","\\ No newline at end of file"],"passed":true},{"actual":[" p","-q","+r"],"check":"both terminated","expected":[" p","-q","+r"],"passed":true},{"actual":["+only1","\\ No newline at end of file"],"check":"empty to one unterminated line","expected":["+only1","\\ No newline at end of file"],"passed":true},{"actual":[" k","-old","\\ No newline at end of file","+new","\\ No newline at end of file"],"check":"last line changed and unterminated","expected":[" k","-old","\\ No newline at end of file","+new","\\ No newline at end of file"],"passed":true},{"actual":[" a","-"],"check":"trailing blank line","expected":[" a","-"],"passed":true},{"actual":[" s"," t"],"check":"identical texts","expected":[" s"," t"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"newline added at end of file\", \"actual\": [\" a\", \"-b\", \"\\\\ No newline at end of file\", \"+b\"], \"expected\": [\" a\", \"-b\", \"\\\\ No newline at end of file\", \"+b\"], \"passed\": true}, {\"check\": \"newline removed at end of file\", \"actual\": [\" a\", \"-b\", \"+b\", \"\\\\ No newline at end of file\"], \"expected\": [\" a\", \"-b\", \"+b\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"unchanged last line without newline\", \"actual\": [\"-x\", \"+X\", \" y\", \"\\\\ No newline at end of file\"], \"expected\": [\"-x\", \"+X\", \" y\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"both terminated\", \"actual\": [\" p\", \"-q\", \"+r\"], \"expected\": [\" p\", \"-q\", \"+r\"], \"passed\": true}, {\"check\": \"empty to one unterminated line\", \"actual\": [\"+only1\", \"\\\\ No newline at end of file\"], \"expected\": [\"+only1\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"last line changed and unterminated\", \"actual\": [\" k\", \"-old\", \"\\\\ No newline at end of file\", \"+new\", \"\\\\ No newline at end of file\"], \"expected\": [\" k\", \"-old\", \"\\\\ No newline at end of file\", \"+new\", \"\\\\ No newline at end of file\"], \"passed\": true}, {\"check\": \"trailing blank line\", \"actual\": [\" a\", \"-\"], \"expected\": [\" a\", \"-\"], \"passed\": true}, {\"check\": \"identical texts\", \"actual\": [\" s\", \" t\"], \"expected\": [\" s\", \" t\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}