{"abstract":"A deletion-only change says \"0 insertions(+)\".","category":"Text diff and three-way merge","checks":10,"contract":"Files are [path, added, removed], with None counts for binary files. Each text file prints \"path | total +++---\"; when the largest total exceeds width, both counts scale by width/max with floor, but a non-zero count keeps at least one mark. Binary files print \"path | Bin\". The summary counts files and, when non-zero, insertions and deletions with singular/plural wording.","evaluation_group":"w2-text-diff-merge-diffstat-histogram","failed_approach":"Also printing the clause when there are no deletions still reports zero insertions for binary-only changes.","family":"w2-text-diff-merge-diffstat-histogram-zero-part-omission","id":"FA-75536","implementations":{"attempt":{"sha256":"e259545f3cbe31334483f5a68c63827a57231eff9ae7883af612ae0e92cad121","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(files, width):\n    mx = max([f[1] + f[2] for f in files if f[1] is not None] + [0])\n    lines = []\n    ins = dels = changed = 0\n    for path, add, rem in files:\n        changed += 1\n        if add is None:\n            lines.append('%s | Bin' % path)\n            continue\n        ins += add\n        dels += rem\n        if mx > width:\n            pa = add * width // mx\n            pr = rem * width // mx\n            if add and not pa:\n                pa = 1\n            if rem and not pr:\n                pr = 1\n        else:\n            pa, pr = add, rem\n        lines.append('%s | %d %s' % (path, add + rem, '+' * pa + '-' * pr))\n    summary = '%d file%s changed' % (changed, '' if changed == 1 else 's')\n    if ins or not dels:\n        summary += ', %d insertion%s(+)' % (ins, '' if ins == 1 else 's')\n    if dels:\n        summary += ', %d deletion%s(-)' % (dels, '' if dels == 1 else 's')\n    lines.append(summary)\n    return lines\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 5]], 40], ['gone | 5 -----', '1 file changed, 5 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 10, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 10 ++', '2 files changed, 40 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 1, 1]], 5], ['p | 1 +', 'q | 1 -', 'r | 2 +-', '3 files changed, 2 insertions(+), 2 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img1.png', None, None]], 40], ['img1.png | Bin', '1 file changed'])],\n    2: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 6]], 40], ['gone | 6 ------', '1 file changed, 6 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 20, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 20 +++++', '2 files changed, 50 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 2, 2]], 5], ['p | 1 +', 'q | 1 -', 'r | 4 ++--', '3 files changed, 3 insertions(+), 3 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img2.png', None, None]], 40], ['img2.png | Bin', '1 file changed'])],\n    3: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 7]], 40], ['gone | 7 -------', '1 file changed, 7 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 30, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 30 +++++++', '2 files changed, 60 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 3, 3]], 5], ['p | 1 +', 'q | 1 -', 'r | 6 ++--', '3 files changed, 4 insertions(+), 4 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img3.png', None, None]], 40], ['img3.png | Bin', '1 file changed'])],\n    4: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 8]], 40], ['gone | 8 --------', '1 file changed, 8 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 40, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 40 ++++++++++', '2 files changed, 70 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 4, 4]], 5], ['p | 1 +', 'q | 1 -', 'r | 8 ++--', '3 files changed, 5 insertions(+), 5 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img4.png', None, None]], 40], ['img4.png | Bin', '1 file changed'])],\n    5: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 9]], 40], ['gone | 9 ---------', '1 file changed, 9 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 50, 0]], 10], ['f1 | 40 ++++++--', 'f2 | 50 ++++++++++', '2 files changed, 80 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 5, 5]], 5], ['p | 1 +', 'q | 1 -', 'r | 10 ++--', '3 files changed, 6 insertions(+), 6 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img5.png', None, None]], 40], ['img5.png | Bin', '1 file changed'])],\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":"00fb0adf103d3eee918880ccd655cb16cd7ccf7dc18c1d6db389ee1e26c79d15","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(files, width):\n    mx = max([f[1] + f[2] for f in files if f[1] is not None] + [0])\n    lines = []\n    ins = dels = changed = 0\n    for path, add, rem in files:\n        changed += 1\n        if add is None:\n            lines.append('%s | Bin' % path)\n            continue\n        ins += add\n        dels += rem\n        if mx > width:\n            pa = add * width // mx\n            pr = rem * width // mx\n            if add and not pa:\n                pa = 1\n            if rem and not pr:\n                pr = 1\n        else:\n            pa, pr = add, rem\n        lines.append('%s | %d %s' % (path, add + rem, '+' * pa + '-' * pr))\n    summary = '%d file%s changed' % (changed, '' if changed == 1 else 's')\n    if True:\n        summary += ', %d insertion%s(+)' % (ins, '' if ins == 1 else 's')\n    if dels:\n        summary += ', %d deletion%s(-)' % (dels, '' if dels == 1 else 's')\n    lines.append(summary)\n    return lines\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 5]], 40], ['gone | 5 -----', '1 file changed, 5 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 10, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 10 ++', '2 files changed, 40 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 1, 1]], 5], ['p | 1 +', 'q | 1 -', 'r | 2 +-', '3 files changed, 2 insertions(+), 2 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img1.png', None, None]], 40], ['img1.png | Bin', '1 file changed'])],\n    2: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 6]], 40], ['gone | 6 ------', '1 file changed, 6 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 20, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 20 +++++', '2 files changed, 50 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 2, 2]], 5], ['p | 1 +', 'q | 1 -', 'r | 4 ++--', '3 files changed, 3 insertions(+), 3 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img2.png', None, None]], 40], ['img2.png | Bin', '1 file changed'])],\n    3: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 7]], 40], ['gone | 7 -------', '1 file changed, 7 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 30, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 30 +++++++', '2 files changed, 60 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 3, 3]], 5], ['p | 1 +', 'q | 1 -', 'r | 6 ++--', '3 files changed, 4 insertions(+), 4 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img3.png', None, None]], 40], ['img3.png | Bin', '1 file changed'])],\n    4: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 8]], 40], ['gone | 8 --------', '1 file changed, 8 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 40, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 40 ++++++++++', '2 files changed, 70 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 4, 4]], 5], ['p | 1 +', 'q | 1 -', 'r | 8 ++--', '3 files changed, 5 insertions(+), 5 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img4.png', None, None]], 40], ['img4.png | Bin', '1 file changed'])],\n    5: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 9]], 40], ['gone | 9 ---------', '1 file changed, 9 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 50, 0]], 10], ['f1 | 40 ++++++--', 'f2 | 50 ++++++++++', '2 files changed, 80 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 5, 5]], 5], ['p | 1 +', 'q | 1 -', 'r | 10 ++--', '3 files changed, 6 insertions(+), 6 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img5.png', None, None]], 40], ['img5.png | Bin', '1 file changed'])],\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":"cc4e38e4974d95ba0eb5d04a1640bdc1140232fe488f8ebe72b7c0e091d098b7","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(files, width):\n    mx = max([f[1] + f[2] for f in files if f[1] is not None] + [0])\n    lines = []\n    ins = dels = changed = 0\n    for path, add, rem in files:\n        changed += 1\n        if add is None:\n            lines.append('%s | Bin' % path)\n            continue\n        ins += add\n        dels += rem\n        if mx > width:\n            pa = add * width // mx\n            pr = rem * width // mx\n            if add and not pa:\n                pa = 1\n            if rem and not pr:\n                pr = 1\n        else:\n            pa, pr = add, rem\n        lines.append('%s | %d %s' % (path, add + rem, '+' * pa + '-' * pr))\n    summary = '%d file%s changed' % (changed, '' if changed == 1 else 's')\n    if ins:\n        summary += ', %d insertion%s(+)' % (ins, '' if ins == 1 else 's')\n    if dels:\n        summary += ', %d deletion%s(-)' % (dels, '' if dels == 1 else 's')\n    lines.append(summary)\n    return lines\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = {\n    1: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 5]], 40], ['gone | 5 -----', '1 file changed, 5 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 10, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 10 ++', '2 files changed, 40 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 1, 1]], 5], ['p | 1 +', 'q | 1 -', 'r | 2 +-', '3 files changed, 2 insertions(+), 2 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img1.png', None, None]], 40], ['img1.png | Bin', '1 file changed'])],\n    2: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 6]], 40], ['gone | 6 ------', '1 file changed, 6 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 20, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 20 +++++', '2 files changed, 50 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 2, 2]], 5], ['p | 1 +', 'q | 1 -', 'r | 4 ++--', '3 files changed, 3 insertions(+), 3 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img2.png', None, None]], 40], ['img2.png | Bin', '1 file changed'])],\n    3: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 7]], 40], ['gone | 7 -------', '1 file changed, 7 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 30, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 30 +++++++', '2 files changed, 60 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 3, 3]], 5], ['p | 1 +', 'q | 1 -', 'r | 6 ++--', '3 files changed, 4 insertions(+), 4 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img3.png', None, None]], 40], ['img3.png | Bin', '1 file changed'])],\n    4: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 8]], 40], ['gone | 8 --------', '1 file changed, 8 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 40, 0]], 10], ['f1 | 40 +++++++--', 'f2 | 40 ++++++++++', '2 files changed, 70 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 4, 4]], 5], ['p | 1 +', 'q | 1 -', 'r | 8 ++--', '3 files changed, 5 insertions(+), 5 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img4.png', None, None]], 40], ['img4.png | Bin', '1 file changed'])],\n    5: [('small changes without scaling', [[['a.txt', 3, 1]], 40], ['a.txt | 4 +++-', '1 file changed, 3 insertions(+), 1 deletion(-)']), ('scaled bar keeps small counts visible', [[['big.c', 200, 0], ['tiny.c', 1, 1]], 20], ['big.c | 200 ++++++++++++++++++++', 'tiny.c | 2 +-', '2 files changed, 201 insertions(+), 1 deletion(-)']), ('binary file', [[['logo.png', None, None], ['x', 2, 0]], 40], ['logo.png | Bin', 'x | 2 ++', '2 files changed, 2 insertions(+)']), ('single insertion grammar', [[['one', 1, 0]], 40], ['one | 1 +', '1 file changed, 1 insertion(+)']), ('only deletions', [[['gone', 0, 9]], 40], ['gone | 9 ---------', '1 file changed, 9 deletions(-)']), ('scale uses the largest file', [[['f1', 30, 10], ['f2', 50, 0]], 10], ['f1 | 40 ++++++--', 'f2 | 50 ++++++++++', '2 files changed, 80 insertions(+), 10 deletions(-)']), ('several files', [[['p', 1, 0], ['q', 0, 1], ['r', 5, 5]], 5], ['p | 1 +', 'q | 1 -', 'r | 10 ++--', '3 files changed, 6 insertions(+), 6 deletions(-)']), ('unscaled wide change', [[['w', 12, 3]], 15], ['w | 15 ++++++++++++---', '1 file changed, 12 insertions(+), 3 deletions(-)']), ('floor not rounding when scaling', [[['r', 7, 0], ['s', 20, 0]], 10], ['r | 7 +++', 's | 20 ++++++++++', '2 files changed, 27 insertions(+)']), ('binary-only change', [[['img5.png', None, None]], 40], ['img5.png | Bin', '1 file changed'])],\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-diffstat-histogram-zero-part-omission","generated_at":"2026-09-29T14:49:07.434775+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Diffstat output is how reviewers size a change; scaling and pluralization rules are easy to get subtly wrong.","repair":"Append the insertion clause only when insertions are non-zero.","root_cause":"The insertion clause is appended regardless of the count.","sha256":"6aa8cd82a2637088f313bb051ee563e86c33abf21b3cd2546a387d5d60a71f73","title":"Diffstat histogram: zero insertions are still reported · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":42.57,"exit_code":1,"observations":[{"actual":["a.txt | 4 +++-","1 file changed, 3 insertions(+), 1 deletion(-)"],"check":"small changes without scaling","expected":["a.txt | 4 +++-","1 file changed, 3 insertions(+), 1 deletion(-)"],"passed":true},{"actual":["big.c | 200 ++++++++++++++++++++","tiny.c | 2 +-","2 files changed, 201 insertions(+), 1 deletion(-)"],"check":"scaled bar keeps small counts visible","expected":["big.c | 200 ++++++++++++++++++++","tiny.c | 2 +-","2 files changed, 201 insertions(+), 1 deletion(-)"],"passed":true},{"actual":["logo.png | Bin","x | 2 ++","2 files changed, 2 insertions(+)"],"check":"binary file","expected":["logo.png | Bin","x | 2 ++","2 files changed, 2 insertions(+)"],"passed":true},{"actual":["one | 1 +","1 file changed, 1 insertion(+)"],"check":"single insertion grammar","expected":["one | 1 +","1 file changed, 1 insertion(+)"],"passed":true},{"actual":["gone | 5 -----","1 file changed, 5 deletions(-)"],"check":"only deletions","expected":["gone | 5 -----","1 file changed, 5 deletions(-)"],"passed":true},{"actual":["f1 | 40 +++++++--","f2 | 10 ++","2 files changed, 40 insertions(+), 10 deletions(-)"],"check":"scale uses the largest file","expected":["f1 | 40 +++++++--","f2 | 10 ++","2 files changed, 40 insertions(+), 10 deletions(-)"],"passed":true},{"actual":["p | 1 +","q | 1 -","r | 2 +-","3 files changed, 2 insertions(+), 2 deletions(-)"],"check":"several files","expected":["p | 1 +","q | 1 -","r | 2 +-","3 files changed, 2 insertions(+), 2 deletions(-)"],"passed":true},{"actual":["w | 15 ++++++++++++---","1 file changed, 12 insertions(+), 3 deletions(-)"],"check":"unscaled wide change","expected":["w | 15 ++++++++++++---","1 file changed, 12 insertions(+), 3 deletions(-)"],"passed":true},{"actual":["r | 7 +++","s | 20 ++++++++++","2 files changed, 27 insertions(+)"],"check":"floor not rounding when scaling","expected":["r | 7 +++","s | 20 ++++++++++","2 files changed, 27 insertions(+)"],"passed":true},{"actual":["img1.png | Bin","1 file changed, 0 insertions(+)"],"check":"binary-only change","expected":["img1.png | Bin","1 file changed"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"small changes without scaling\", \"actual\": [\"a.txt | 4 +++-\", \"1 file changed, 3 insertions(+), 1 deletion(-)\"], \"expected\": [\"a.txt | 4 +++-\", \"1 file changed, 3 insertions(+), 1 deletion(-)\"], \"passed\": true}, {\"check\": \"scaled bar keeps small counts visible\", \"actual\": [\"big.c | 200 ++++++++++++++++++++\", \"tiny.c | 2 +-\", \"2 files changed, 201 insertions(+), 1 deletion(-)\"], \"expected\": [\"big.c | 200 ++++++++++++++++++++\", \"tiny.c | 2 +-\", \"2 files changed, 201 insertions(+), 1 deletion(-)\"], \"passed\": true}, {\"check\": \"binary file\", \"actual\": [\"logo.png | Bin\", \"x | 2 ++\", \"2 files changed, 2 insertions(+)\"], \"expected\": [\"logo.png | Bin\", \"x | 2 ++\", \"2 files changed, 2 insertions(+)\"], \"passed\": true}, {\"check\": \"single insertion grammar\", \"actual\": [\"one | 1 +\", \"1 file changed, 1 insertion(+)\"], \"expected\": [\"one | 1 +\", \"1 file changed, 1 insertion(+)\"], \"passed\": true}, {\"check\": \"only deletions\", \"actual\": [\"gone | 5 -----\", \"1 file changed, 5 deletions(-)\"], \"expected\": [\"gone | 5 -----\", \"1 file changed, 5 deletions(-)\"], \"passed\": true}, {\"check\": \"scale uses the largest file\", \"actual\": [\"f1 | 40 +++++++--\", \"f2 | 10 ++\", \"2 files changed, 40 insertions(+), 10 deletions(-)\"], \"expected\": [\"f1 | 40 +++++++--\", \"f2 | 10 ++\", \"2 files changed, 40 insertions(+), 10 deletions(-)\"], \"passed\": true}, {\"check\": \"several files\", \"actual\": [\"p | 1 +\", \"q | 1 -\", \"r | 2 +-\", \"3 files changed, 2 insertions(+), 2 deletions(-)\"], \"expected\": [\"p | 1 +\", \"q | 1 -\", \"r | 2 +-\", \"3 files changed, 2 insertions(+), 2 deletions(-)\"], \"passed\": true}, {\"check\": \"unscaled wide change\", \"actual\": [\"w | 15 ++++++++++++---\", \"1 file changed, 12 insertions(+), 3 deletions(-)\"], \"expected\": [\"w | 15 ++++++++++++---\", \"1 file changed, 12 insertions(+), 3 deletions(-)\"], \"passed\": true}, {\"check\": \"floor not rounding when scaling\", \"actual\": [\"r | 7 +++\", \"s | 20 ++++++++++\", \"2 files changed, 27 insertions(+)\"], \"expected\": [\"r | 7 +++\", \"s | 20 ++++++++++\", \"2 files changed, 27 insertions(+)\"], \"passed\": true}, {\"check\": \"binary-only change\", \"actual\": [\"img1.png | Bin\", \"1 file changed, 0 insertions(+)\"], \"expected\": [\"img1.png | Bin\", \"1 file changed\"], \"passed\": false}], \"passed\": false}\n"},"broken":{"elapsed_ms":42.067,"exit_code":1,"observations":[{"actual":["a.txt | 4 +++-","1 file changed, 3 insertions(+), 1 deletion(-)"],"check":"small changes without scaling","expected":["a.txt | 4 +++-","1 file changed, 3 insertions(+), 1 deletion(-)"],"passed":true},{"actual":["big.c | 200 ++++++++++++++++++++","tiny.c | 2 +-","2 files changed, 201 insertions(+), 1 deletion(-)"],"check":"scaled bar keeps small counts visible","expected":["big.c | 200 ++++++++++++++++++++","tiny.c | 2 +-","2 files changed, 201 insertions(+), 1 deletion(-)"],"passed":true},{"actual":["logo.png | Bin","x | 2 ++","2 files changed, 2 insertions(+)"],"check":"binary file","expected":["logo.png | Bin","x | 2 ++","2 files changed, 2 insertions(+)"],"passed":true},{"actual":["one | 1 +","1 file changed, 1 insertion(+)"],"check":"single insertion grammar","expected":["one | 1 +","1 file changed, 1 insertion(+)"],"passed":true},{"actual":["gone | 5 -----","1 file changed, 0 insertions(+), 5 deletions(-)"],"check":"only deletions","expected":["gone | 5 -----","1 file changed, 5 deletions(-)"],"passed":false},{"actual":["f1 | 40 +++++++--","f2 | 10 ++","2 files changed, 40 insertions(+), 10 deletions(-)"],"check":"scale uses the largest file","expected":["f1 | 40 +++++++--","f2 | 10 ++","2 files changed, 40 insertions(+), 10 deletions(-)"],"passed":true},{"actual":["p | 1 +","q | 1 -","r | 2 +-","3 files changed, 2 insertions(+), 2 deletions(-)"],"check":"several files","expected":["p | 1 +","q | 1 -","r | 2 +-","3 files changed, 2 insertions(+), 2 deletions(-)"],"passed":true},{"actual":["w | 15 ++++++++++++---","1 file changed, 12 insertions(+), 3 deletions(-)"],"check":"unscaled wide change","expected":["w | 15 ++++++++++++---","1 file changed, 12 insertions(+), 3 deletions(-)"],"passed":true},{"actual":["r | 7 +++","s | 20 ++++++++++","2 files changed, 27 insertions(+)"],"check":"floor not rounding when scaling","expected":["r | 7 +++","s | 20 ++++++++++","2 files changed, 27 insertions(+)"],"passed":true},{"actual":["img1.png | Bin","1 file changed, 0 insertions(+)"],"check":"binary-only change","expected":["img1.png | Bin","1 file changed"],"passed":false}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"small changes without scaling\", \"actual\": [\"a.txt | 4 +++-\", \"1 file changed, 3 insertions(+), 1 deletion(-)\"], \"expected\": [\"a.txt | 4 +++-\", \"1 file changed, 3 insertions(+), 1 deletion(-)\"], \"passed\": true}, {\"check\": \"scaled bar keeps small counts visible\", \"actual\": [\"big.c | 200 ++++++++++++++++++++\", \"tiny.c | 2 +-\", \"2 files changed, 201 insertions(+), 1 deletion(-)\"], \"expected\": [\"big.c | 200 ++++++++++++++++++++\", \"tiny.c | 2 +-\", \"2 files changed, 201 insertions(+), 1 deletion(-)\"], \"passed\": true}, {\"check\": \"binary file\", \"actual\": [\"logo.png | Bin\", \"x | 2 ++\", \"2 files changed, 2 insertions(+)\"], \"expected\": [\"logo.png | Bin\", \"x | 2 ++\", \"2 files changed, 2 insertions(+)\"], \"passed\": true}, {\"check\": \"single insertion grammar\", \"actual\": [\"one | 1 +\", \"1 file changed, 1 insertion(+)\"], \"expected\": [\"one | 1 +\", \"1 file changed, 1 insertion(+)\"], \"passed\": true}, {\"check\": \"only deletions\", \"actual\": [\"gone | 5 -----\", \"1 file changed, 0 insertions(+), 5 deletions(-)\"], \"expected\": [\"gone | 5 -----\", \"1 file changed, 5 deletions(-)\"], \"passed\": false}, {\"check\": \"scale uses the largest file\", \"actual\": [\"f1 | 40 +++++++--\", \"f2 | 10 ++\", \"2 files changed, 40 insertions(+), 10 deletions(-)\"], \"expected\": [\"f1 | 40 +++++++--\", \"f2 | 10 ++\", \"2 files changed, 40 insertions(+), 10 deletions(-)\"], \"passed\": true}, {\"check\": \"several files\", \"actual\": [\"p | 1 +\", \"q | 1 -\", \"r | 2 +-\", \"3 files changed, 2 insertions(+), 2 deletions(-)\"], \"expected\": [\"p | 1 +\", \"q | 1 -\", \"r | 2 +-\", \"3 files changed, 2 insertions(+), 2 deletions(-)\"], \"passed\": true}, {\"check\": \"unscaled wide change\", \"actual\": [\"w | 15 ++++++++++++---\", \"1 file changed, 12 insertions(+), 3 deletions(-)\"], \"expected\": [\"w | 15 ++++++++++++---\", \"1 file changed, 12 insertions(+), 3 deletions(-)\"], \"passed\": true}, {\"check\": \"floor not rounding when scaling\", \"actual\": [\"r | 7 +++\", \"s | 20 ++++++++++\", \"2 files changed, 27 insertions(+)\"], \"expected\": [\"r | 7 +++\", \"s | 20 ++++++++++\", \"2 files changed, 27 insertions(+)\"], \"passed\": true}, {\"check\": \"binary-only change\", \"actual\": [\"img1.png | Bin\", \"1 file changed, 0 insertions(+)\"], \"expected\": [\"img1.png | Bin\", \"1 file changed\"], \"passed\": false}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.144,"exit_code":0,"observations":[{"actual":["a.txt | 4 +++-","1 file changed, 3 insertions(+), 1 deletion(-)"],"check":"small changes without scaling","expected":["a.txt | 4 +++-","1 file changed, 3 insertions(+), 1 deletion(-)"],"passed":true},{"actual":["big.c | 200 ++++++++++++++++++++","tiny.c | 2 +-","2 files changed, 201 insertions(+), 1 deletion(-)"],"check":"scaled bar keeps small counts visible","expected":["big.c | 200 ++++++++++++++++++++","tiny.c | 2 +-","2 files changed, 201 insertions(+), 1 deletion(-)"],"passed":true},{"actual":["logo.png | Bin","x | 2 ++","2 files changed, 2 insertions(+)"],"check":"binary file","expected":["logo.png | Bin","x | 2 ++","2 files changed, 2 insertions(+)"],"passed":true},{"actual":["one | 1 +","1 file changed, 1 insertion(+)"],"check":"single insertion grammar","expected":["one | 1 +","1 file changed, 1 insertion(+)"],"passed":true},{"actual":["gone | 5 -----","1 file changed, 5 deletions(-)"],"check":"only deletions","expected":["gone | 5 -----","1 file changed, 5 deletions(-)"],"passed":true},{"actual":["f1 | 40 +++++++--","f2 | 10 ++","2 files changed, 40 insertions(+), 10 deletions(-)"],"check":"scale uses the largest file","expected":["f1 | 40 +++++++--","f2 | 10 ++","2 files changed, 40 insertions(+), 10 deletions(-)"],"passed":true},{"actual":["p | 1 +","q | 1 -","r | 2 +-","3 files changed, 2 insertions(+), 2 deletions(-)"],"check":"several files","expected":["p | 1 +","q | 1 -","r | 2 +-","3 files changed, 2 insertions(+), 2 deletions(-)"],"passed":true},{"actual":["w | 15 ++++++++++++---","1 file changed, 12 insertions(+), 3 deletions(-)"],"check":"unscaled wide change","expected":["w | 15 ++++++++++++---","1 file changed, 12 insertions(+), 3 deletions(-)"],"passed":true},{"actual":["r | 7 +++","s | 20 ++++++++++","2 files changed, 27 insertions(+)"],"check":"floor not rounding when scaling","expected":["r | 7 +++","s | 20 ++++++++++","2 files changed, 27 insertions(+)"],"passed":true},{"actual":["img1.png | Bin","1 file changed"],"check":"binary-only change","expected":["img1.png | Bin","1 file changed"],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"small changes without scaling\", \"actual\": [\"a.txt | 4 +++-\", \"1 file changed, 3 insertions(+), 1 deletion(-)\"], \"expected\": [\"a.txt | 4 +++-\", \"1 file changed, 3 insertions(+), 1 deletion(-)\"], \"passed\": true}, {\"check\": \"scaled bar keeps small counts visible\", \"actual\": [\"big.c | 200 ++++++++++++++++++++\", \"tiny.c | 2 +-\", \"2 files changed, 201 insertions(+), 1 deletion(-)\"], \"expected\": [\"big.c | 200 ++++++++++++++++++++\", \"tiny.c | 2 +-\", \"2 files changed, 201 insertions(+), 1 deletion(-)\"], \"passed\": true}, {\"check\": \"binary file\", \"actual\": [\"logo.png | Bin\", \"x | 2 ++\", \"2 files changed, 2 insertions(+)\"], \"expected\": [\"logo.png | Bin\", \"x | 2 ++\", \"2 files changed, 2 insertions(+)\"], \"passed\": true}, {\"check\": \"single insertion grammar\", \"actual\": [\"one | 1 +\", \"1 file changed, 1 insertion(+)\"], \"expected\": [\"one | 1 +\", \"1 file changed, 1 insertion(+)\"], \"passed\": true}, {\"check\": \"only deletions\", \"actual\": [\"gone | 5 -----\", \"1 file changed, 5 deletions(-)\"], \"expected\": [\"gone | 5 -----\", \"1 file changed, 5 deletions(-)\"], \"passed\": true}, {\"check\": \"scale uses the largest file\", \"actual\": [\"f1 | 40 +++++++--\", \"f2 | 10 ++\", \"2 files changed, 40 insertions(+), 10 deletions(-)\"], \"expected\": [\"f1 | 40 +++++++--\", \"f2 | 10 ++\", \"2 files changed, 40 insertions(+), 10 deletions(-)\"], \"passed\": true}, {\"check\": \"several files\", \"actual\": [\"p | 1 +\", \"q | 1 -\", \"r | 2 +-\", \"3 files changed, 2 insertions(+), 2 deletions(-)\"], \"expected\": [\"p | 1 +\", \"q | 1 -\", \"r | 2 +-\", \"3 files changed, 2 insertions(+), 2 deletions(-)\"], \"passed\": true}, {\"check\": \"unscaled wide change\", \"actual\": [\"w | 15 ++++++++++++---\", \"1 file changed, 12 insertions(+), 3 deletions(-)\"], \"expected\": [\"w | 15 ++++++++++++---\", \"1 file changed, 12 insertions(+), 3 deletions(-)\"], \"passed\": true}, {\"check\": \"floor not rounding when scaling\", \"actual\": [\"r | 7 +++\", \"s | 20 ++++++++++\", \"2 files changed, 27 insertions(+)\"], \"expected\": [\"r | 7 +++\", \"s | 20 ++++++++++\", \"2 files changed, 27 insertions(+)\"], \"passed\": true}, {\"check\": \"binary-only change\", \"actual\": [\"img1.png | Bin\", \"1 file changed\"], \"expected\": [\"img1.png | Bin\", \"1 file changed\"], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}