{"abstract":"Comments move up after insertions and down after deletions.","category":"Text diff and three-way merge","checks":8,"contract":"Hunks [old_start, old_len, new_start, new_len] use unified conventions (start is the line before when the length is 0) and are sorted. An old line maps to None if it lies in a hunk's old range; otherwise it moves by the sum of new_len - old_len over hunks entirely before it. A zero-length hunk after line s affects lines from s+1 on. Return the mapped line numbers.","evaluation_group":"w2-text-diff-merge-hunk-line-mapping","failed_approach":"Adding only the new length ignores the lines each hunk removed.","family":"w2-text-diff-merge-hunk-line-mapping-shift-sign","id":"FA-75651","implementations":{"attempt":{"sha256":"f50bd65752aa5254fa25509b7ef23dfa8cdbdf39ab3a8acdc8e19f03e6fda104","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(hunks, lines):\n    res = []\n    for ln in lines:\n        shift = 0\n        out = ln\n        for os_, ol, ns, nl in hunks:\n            s = os_ if ol > 0 else os_ + 1\n            if ln < s:\n                break\n            if ln < s + ol:\n                out = None\n                break\n            shift += nl\n        res.append(None if out is None else ln + shift)\n    return res\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 1]], [5, 6, 7]], [5, 7, 8]), ('pure deletion', [[[3, 1, 2, 0]], [2, 3, 3, 4, 10]], [2, None, None, 3, 9]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 1]], [1, 1])],\n    2: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 2]], [5, 6, 7]], [5, 8, 9]), ('pure deletion', [[[3, 2, 2, 0]], [2, 3, 4, 5, 10]], [2, None, None, 3, 8]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 2]], [1, 2])],\n    3: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 3]], [5, 6, 7]], [5, 9, 10]), ('pure deletion', [[[3, 3, 2, 0]], [2, 3, 5, 6, 10]], [2, None, None, 3, 7]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 3]], [1, 3])],\n    4: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 4]], [5, 6, 7]], [5, 10, 11]), ('pure deletion', [[[3, 4, 2, 0]], [2, 3, 6, 7, 10]], [2, None, None, 3, 6]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 4]], [1, 4])],\n    5: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 5]], [5, 6, 7]], [5, 11, 12]), ('pure deletion', [[[3, 5, 2, 0]], [2, 3, 7, 8, 10]], [2, None, None, 3, 5]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 5]], [1, 5])],\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":"f7d79730aa20b472d46b3f209bf0ba5f689ffc315acb75bda25c25a52cf41637","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(hunks, lines):\n    res = []\n    for ln in lines:\n        shift = 0\n        out = ln\n        for os_, ol, ns, nl in hunks:\n            s = os_ if ol > 0 else os_ + 1\n            if ln < s:\n                break\n            if ln < s + ol:\n                out = None\n                break\n            shift += ol - nl\n        res.append(None if out is None else ln + shift)\n    return res\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 1]], [5, 6, 7]], [5, 7, 8]), ('pure deletion', [[[3, 1, 2, 0]], [2, 3, 3, 4, 10]], [2, None, None, 3, 9]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 1]], [1, 1])],\n    2: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 2]], [5, 6, 7]], [5, 8, 9]), ('pure deletion', [[[3, 2, 2, 0]], [2, 3, 4, 5, 10]], [2, None, None, 3, 8]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 2]], [1, 2])],\n    3: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 3]], [5, 6, 7]], [5, 9, 10]), ('pure deletion', [[[3, 3, 2, 0]], [2, 3, 5, 6, 10]], [2, None, None, 3, 7]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 3]], [1, 3])],\n    4: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 4]], [5, 6, 7]], [5, 10, 11]), ('pure deletion', [[[3, 4, 2, 0]], [2, 3, 6, 7, 10]], [2, None, None, 3, 6]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 4]], [1, 4])],\n    5: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 5]], [5, 6, 7]], [5, 11, 12]), ('pure deletion', [[[3, 5, 2, 0]], [2, 3, 7, 8, 10]], [2, None, None, 3, 5]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 5]], [1, 5])],\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":"aab39124f240e0d5b7f21f67c12b75c82c38c65ca3b9144132e6026cc1d781f7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(hunks, lines):\n    res = []\n    for ln in lines:\n        shift = 0\n        out = ln\n        for os_, ol, ns, nl in hunks:\n            s = os_ if ol > 0 else os_ + 1\n            if ln < s:\n                break\n            if ln < s + ol:\n                out = None\n                break\n            shift += nl - ol\n        res.append(None if out is None else ln + shift)\n    return res\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 1]], [5, 6, 7]], [5, 7, 8]), ('pure deletion', [[[3, 1, 2, 0]], [2, 3, 3, 4, 10]], [2, None, None, 3, 9]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 1]], [1, 1])],\n    2: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 2]], [5, 6, 7]], [5, 8, 9]), ('pure deletion', [[[3, 2, 2, 0]], [2, 3, 4, 5, 10]], [2, None, None, 3, 8]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 2]], [1, 2])],\n    3: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 3]], [5, 6, 7]], [5, 9, 10]), ('pure deletion', [[[3, 3, 2, 0]], [2, 3, 5, 6, 10]], [2, None, None, 3, 7]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 3]], [1, 3])],\n    4: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 4]], [5, 6, 7]], [5, 10, 11]), ('pure deletion', [[[3, 4, 2, 0]], [2, 3, 6, 7, 10]], [2, None, None, 3, 6]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 4]], [1, 4])],\n    5: [('lines before and after a replacement', [[[5, 2, 5, 3]], [4, 5, 6, 7, 8]], [4, None, None, 8, 9]), ('pure insertion after line five', [[[5, 0, 6, 5]], [5, 6, 7]], [5, 11, 12]), ('pure deletion', [[[3, 5, 2, 0]], [2, 3, 7, 8, 10]], [2, None, None, 3, 5]), ('insertion at the top of the file', [[[0, 0, 1, 2]], [1, 2]], [3, 4]), ('several hunks accumulate', [[[2, 1, 2, 2], [10, 3, 11, 1], [20, 0, 19, 4]], [1, 2, 3, 9, 10, 13, 20, 21]], [1, None, 4, 10, None, 12, 19, 24]), ('line just after a hunk', [[[7, 2, 7, 5]], [8, 9, 10]], [None, 12, 13]), ('last line of a deletion', [[[4, 3, 3, 0]], [6, 7]], [None, 4]), ('no hunks', [[], [1, 5]], [1, 5])],\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-hunk-line-mapping-shift-sign","generated_at":"2026-09-29T14:49:08.983475+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Review tools re-anchor comments on changed files by mapping old line numbers through the diff.","repair":"Accumulate new_len - old_len for each preceding hunk.","root_cause":"The accumulated shift subtracts the new length from the old length.","sha256":"00a91489a9e79c156ff311b4a0d6f20ef0e84edc17225a417e5633a90c33b965","title":"Line mapping through hunks: the size change is applied with the wrong sign · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.851,"exit_code":1,"observations":[{"actual":[4,null,null,10,11],"check":"lines before and after a replacement","expected":[4,null,null,8,9],"passed":false},{"actual":[5,7,8],"check":"pure insertion after line five","expected":[5,7,8],"passed":true},{"actual":[2,null,null,4,10],"check":"pure deletion","expected":[2,null,null,3,9],"passed":false},{"actual":[3,4],"check":"insertion at the top of the file","expected":[3,4],"passed":true},{"actual":[1,null,5,11,null,16,23,28],"check":"several hunks accumulate","expected":[1,null,4,10,null,12,19,24],"passed":false},{"actual":[null,14,15],"check":"line just after a hunk","expected":[null,12,13],"passed":false},{"actual":[null,7],"check":"last line of a deletion","expected":[null,4],"passed":false},{"actual":[1,1],"check":"no hunks","expected":[1,1],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"lines before and after a replacement\", \"actual\": [4, null, null, 10, 11], \"expected\": [4, null, null, 8, 9], \"passed\": false}, {\"check\": \"pure insertion after line five\", \"actual\": [5, 7, 8], \"expected\": [5, 7, 8], \"passed\": true}, {\"check\": \"pure deletion\", \"actual\": [2, null, null, 4, 10], \"expected\": [2, null, null, 3, 9], \"passed\": false}, {\"check\": \"insertion at the top of the file\", \"actual\": [3, 4], \"expected\": [3, 4], \"passed\": true}, {\"check\": \"several hunks accumulate\", \"actual\": [1, null, 5, 11, null, 16, 23, 28], \"expected\": [1, null, 4, 10, null, 12, 19, 24], \"passed\": false}, {\"check\": \"line just after a hunk\", \"actual\": [null, 14, 15], \"expected\": [null, 12, 13], \"passed\": false}, {\"check\": \"last line of a deletion\", \"actual\": [null, 7], \"expected\": [null, 4], \"passed\": false}, {\"check\": \"no hunks\", \"actual\": [1, 1], \"expected\": [1, 1], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":40.606,"exit_code":1,"observations":[{"actual":[4,null,null,6,7],"check":"lines before and after a replacement","expected":[4,null,null,8,9],"passed":false},{"actual":[5,5,6],"check":"pure insertion after line five","expected":[5,7,8],"passed":false},{"actual":[2,null,null,5,11],"check":"pure deletion","expected":[2,null,null,3,9],"passed":false},{"actual":[-1,0],"check":"insertion at the top of the file","expected":[3,4],"passed":false},{"actual":[1,null,2,8,null,14,21,18],"check":"several hunks accumulate","expected":[1,null,4,10,null,12,19,24],"passed":false},{"actual":[null,6,7],"check":"line just after a hunk","expected":[null,12,13],"passed":false},{"actual":[null,10],"check":"last line of a deletion","expected":[null,4],"passed":false},{"actual":[1,1],"check":"no hunks","expected":[1,1],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"lines before and after a replacement\", \"actual\": [4, null, null, 6, 7], \"expected\": [4, null, null, 8, 9], \"passed\": false}, {\"check\": \"pure insertion after line five\", \"actual\": [5, 5, 6], \"expected\": [5, 7, 8], \"passed\": false}, {\"check\": \"pure deletion\", \"actual\": [2, null, null, 5, 11], \"expected\": [2, null, null, 3, 9], \"passed\": false}, {\"check\": \"insertion at the top of the file\", \"actual\": [-1, 0], \"expected\": [3, 4], \"passed\": false}, {\"check\": \"several hunks accumulate\", \"actual\": [1, null, 2, 8, null, 14, 21, 18], \"expected\": [1, null, 4, 10, null, 12, 19, 24], \"passed\": false}, {\"check\": \"line just after a hunk\", \"actual\": [null, 6, 7], \"expected\": [null, 12, 13], \"passed\": false}, {\"check\": \"last line of a deletion\", \"actual\": [null, 10], \"expected\": [null, 4], \"passed\": false}, {\"check\": \"no hunks\", \"actual\": [1, 1], \"expected\": [1, 1], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":41.064,"exit_code":0,"observations":[{"actual":[4,null,null,8,9],"check":"lines before and after a replacement","expected":[4,null,null,8,9],"passed":true},{"actual":[5,7,8],"check":"pure insertion after line five","expected":[5,7,8],"passed":true},{"actual":[2,null,null,3,9],"check":"pure deletion","expected":[2,null,null,3,9],"passed":true},{"actual":[3,4],"check":"insertion at the top of the file","expected":[3,4],"passed":true},{"actual":[1,null,4,10,null,12,19,24],"check":"several hunks accumulate","expected":[1,null,4,10,null,12,19,24],"passed":true},{"actual":[null,12,13],"check":"line just after a hunk","expected":[null,12,13],"passed":true},{"actual":[null,4],"check":"last line of a deletion","expected":[null,4],"passed":true},{"actual":[1,1],"check":"no hunks","expected":[1,1],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"lines before and after a replacement\", \"actual\": [4, null, null, 8, 9], \"expected\": [4, null, null, 8, 9], \"passed\": true}, {\"check\": \"pure insertion after line five\", \"actual\": [5, 7, 8], \"expected\": [5, 7, 8], \"passed\": true}, {\"check\": \"pure deletion\", \"actual\": [2, null, null, 3, 9], \"expected\": [2, null, null, 3, 9], \"passed\": true}, {\"check\": \"insertion at the top of the file\", \"actual\": [3, 4], \"expected\": [3, 4], \"passed\": true}, {\"check\": \"several hunks accumulate\", \"actual\": [1, null, 4, 10, null, 12, 19, 24], \"expected\": [1, null, 4, 10, null, 12, 19, 24], \"passed\": true}, {\"check\": \"line just after a hunk\", \"actual\": [null, 12, 13], \"expected\": [null, 12, 13], \"passed\": true}, {\"check\": \"last line of a deletion\", \"actual\": [null, 4], \"expected\": [null, 4], \"passed\": true}, {\"check\": \"no hunks\", \"actual\": [1, 1], \"expected\": [1, 1], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}