FA-80016 / Typography line breaking / Open access
CJK kinsoku line breaking: push-out chain · case 01
A run of two prohibited characters still starts the next line.
ROOT CAUSE
The push-out step moves back only one character instead of looping.
VERIFIED REPAIR
Keep moving characters while the next line would start with a prohibited character.
Unsuccessful approach: Checking the previous character instead of the next one pushes out the wrong run.
Case contract
Input [text of full-width characters, line length L]. Lines take L characters. If the next character is a hanging comma/period (、。,.) and is not itself followed by a line-start-prohibited character, it hangs on the line (burasage). Otherwise move characters to the next line while the next line would start with a prohibited character (、。,.)」』!?ー and small kana), then while the line would end with an opening bracket; a line keeps at least one character. Return the lines.
Why this case matters
Line breaking decides where paragraphs wrap on screen and in print; a wrong decision point shifts every following line.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
text, L = x
NO_START = '、。,.)」』!?ーぁぃぅぇぉっゃゅょ'
NO_END = '(「『'
HANG = '、。,.'
lines = []
pos = 0
n = len(text)
while pos < n:
end = pos + L
if end >= n:
lines.append(text[pos:])
break
if text[end] in HANG and (end + 1 >= n or text[end + 1] not in NO_START):
end += 1
else:
if end > pos + 1 and text[end] in NO_START:
end -= 1
while end > pos + 1 and text[end - 1] in NO_END:
end -= 1
lines.append(text[pos:end])
pos = end
return lines
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: push-out chain', ['、本おう)こきかえ文日おいーゃ。(け', 7], ['、本おう)こき', 'かえ文日お', 'いーゃ。(け']), ('regression: push-out chain', ['文ーう文おっ日いあうあ)いゃ)』日『字', 5], ['文ーう文', 'おっ日いあ', 'うあ)', 'いゃ)』日', '『字']), ('partial-repair probe', ['字う『、え組こ、文、ーえ」、』語う。', 8], ['字う『、え組こ、', '文、ーえ」、』語', 'う。']), ('partial-repair probe', ['本』。。くゃ(か『「', 6], ['本』。。くゃ', '(か『「']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['あっけあ『(き版', 4], ['あっけあ', '『(き版']), ('control layout', ['語あ』文か(おく本」', 6], ['語あ』文か', '(おく本」'])], [('regression: push-out chain', ['ゃ『くかこけう」字(く、っ『語ゃ組', 6], ['ゃ『くかこけ', 'う」字', '(く、っ', '『語ゃ組']), ('regression: push-out chain', ['けけーうけゃ)(っ』』)ゃっ組)お', 4], ['けけーう', 'けゃ)', '(', 'っ', '』', '』)ゃっ', '組)お']), ('partial-repair probe', ['か語組ゃっうこうくきくゃ日', 5], ['か語組ゃっ', 'うこうくき', 'くゃ日']), ('partial-repair probe', ['お。)語うきき文』く「日本本組『ゃ文日', 4], ['お。)語', 'うきき', '文』く', '「日本本', '組『ゃ文', '日']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['文字くい「「いおい字こく字っーー、かお本', 6], ['文字くい', '「「いおい字', 'こく字っーー、', 'かお本']), ('control layout', ['お語)日版』「か文え日日こ(ー(お', 7], ['お語)日版』', '「か文え日日こ', '(ー(お'])], [('regression: push-out chain', ['い。()。けう組。き文文日文文えっ、』あ』字組本', 6], ['い。()。け', 'う組。き文文', '日文文', 'えっ、』あ』', '字組本']), ('regression: push-out chain', ['う版あう。、っ』、)「字。あかか、『。いおきゃ', 4], ['う版あ', 'う', '。', '、', 'っ』、)', '「字。あ', 'かか、『。', 'いおきゃ']), ('partial-repair probe', ['こあ)ー、あ)っこ、「(あ「けけっ。えかきー文', 8], ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文']), ('partial-repair probe', ['。け』かあ『組け』、字', 8], ['。け』かあ『組', 'け』、字']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['お語)日版』「か文え日日こ(ー(お', 7], ['お語)日版』', '「か文え日日こ', '(ー(お']), ('control layout', ['日うああ版字お日。日お日', 4], ['日うああ', '版字お日。', '日お日'])], [('regression: push-out chain', ['」』こ)「。きゃ」語文うう『', 4], ['」』こ)', '「。', 'きゃ」語', '文うう『']), ('regression: push-out chain', ['語け本日ゃ」)「字、字字', 5], ['語け本', '日ゃ」)', '「字、字字']), ('regression: push-out chain', ['(ゃえい。く、ああ(おあ)「文)(か語ゃ。ーけき', 3], ['(ゃえ', 'い。く、', 'ああ', '(お', 'あ)', '「文)', '(か', '語', 'ゃ。ー', 'けき']), ('partial-repair probe', ['()本)『組こ日本)版、(かけ本', 3], ['()', '本)', '『組こ', '日本)', '版、', '(かけ', '本']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('control layout', ['ー』版)本うかえお日', 8], ['ー』版)本うかえ', 'お日']), ('control layout', ['こう)あ、く。日語', 8], ['こう)あ、く。日', '語'])], [('regression: push-out chain', ['(『あ(日字(字「い語。字『うく版文ーゃーあ', 7], ['(『あ(日字', '(字「い語。字', '『うく版', '文ーゃーあ']), ('regression: push-out chain', ['こっ(『おあゃお字」。。組うう組、こえけ)語', 5], ['こっ(『お', 'あゃお', '字」。。組', 'うう組、こ', 'えけ)語']), ('regression: push-out chain', ['、けゃ語え語字「か語く文(、字)っ。おか、ー', 7], ['、けゃ語え語字', '「か語く文(、', '字)っ。お', 'か、ー']), ('partial-repair probe', ['かあ語、本ゃっけ」', 8], ['かあ語、本ゃっ', 'け」']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', ['け本こ日ゃき、こう」版(', 8], ['け本こ日ゃき、こ', 'う」版(']), ('control layout', ['日」』版、。字文うえこ日', 5], ['日」』版、。', '字文うえこ', '日'])]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: push-out chain | ['、本おう)こき', 'かえ文日おい', 'ーゃ。(け'] | ['、本おう)こき', 'かえ文日お', 'いーゃ。(け'] | Failed |
| regression: push-out chain | ['文ーう文', 'おっ日いあ', 'うあ)い', 'ゃ)』日', '『字'] | ['文ーう文', 'おっ日いあ', 'うあ)', 'いゃ)』日', '『字'] | Failed |
| partial-repair probe | ['字う『、え組こ、', '文、ーえ」、』語', 'う。'] | ['字う『、え組こ、', '文、ーえ」、』語', 'う。'] | Passed |
| partial-repair probe | ['本』。。くゃ', '(か『「'] | ['本』。。くゃ', '(か『「'] | Passed |
| closing bracket pushes out | ['日本語', '文」字組', '版'] | ['日本語', '文」字組', '版'] | Passed |
| period followed by bracket cannot hang | ['日本語', '文。」字', '組'] | ['日本語', '文。」字', '組'] | Passed |
| control layout | ['あっけあ', '『(き版'] | ['あっけあ', '『(き版'] | Passed |
| control layout | ['語あ』文か', '(おく本」'] | ['語あ』文か', '(おく本」'] | Passed |
SHA-256 / 965c68a6cf2820abb116838466ad9fc6cbe6478289ee44f611313cd4983f858e
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
text, L = x
NO_START = '、。,.)」』!?ーぁぃぅぇぉっゃゅょ'
NO_END = '(「『'
HANG = '、。,.'
lines = []
pos = 0
n = len(text)
while pos < n:
end = pos + L
if end >= n:
lines.append(text[pos:])
break
if text[end] in HANG and (end + 1 >= n or text[end + 1] not in NO_START):
end += 1
else:
while end > pos + 1 and text[end - 1] in NO_START:
end -= 1
while end > pos + 1 and text[end - 1] in NO_END:
end -= 1
lines.append(text[pos:end])
pos = end
return lines
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: push-out chain', ['、本おう)こきかえ文日おいーゃ。(け', 7], ['、本おう)こき', 'かえ文日お', 'いーゃ。(け']), ('regression: push-out chain', ['文ーう文おっ日いあうあ)いゃ)』日『字', 5], ['文ーう文', 'おっ日いあ', 'うあ)', 'いゃ)』日', '『字']), ('partial-repair probe', ['字う『、え組こ、文、ーえ」、』語う。', 8], ['字う『、え組こ、', '文、ーえ」、』語', 'う。']), ('partial-repair probe', ['本』。。くゃ(か『「', 6], ['本』。。くゃ', '(か『「']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['あっけあ『(き版', 4], ['あっけあ', '『(き版']), ('control layout', ['語あ』文か(おく本」', 6], ['語あ』文か', '(おく本」'])], [('regression: push-out chain', ['ゃ『くかこけう」字(く、っ『語ゃ組', 6], ['ゃ『くかこけ', 'う」字', '(く、っ', '『語ゃ組']), ('regression: push-out chain', ['けけーうけゃ)(っ』』)ゃっ組)お', 4], ['けけーう', 'けゃ)', '(', 'っ', '』', '』)ゃっ', '組)お']), ('partial-repair probe', ['か語組ゃっうこうくきくゃ日', 5], ['か語組ゃっ', 'うこうくき', 'くゃ日']), ('partial-repair probe', ['お。)語うきき文』く「日本本組『ゃ文日', 4], ['お。)語', 'うきき', '文』く', '「日本本', '組『ゃ文', '日']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['文字くい「「いおい字こく字っーー、かお本', 6], ['文字くい', '「「いおい字', 'こく字っーー、', 'かお本']), ('control layout', ['お語)日版』「か文え日日こ(ー(お', 7], ['お語)日版』', '「か文え日日こ', '(ー(お'])], [('regression: push-out chain', ['い。()。けう組。き文文日文文えっ、』あ』字組本', 6], ['い。()。け', 'う組。き文文', '日文文', 'えっ、』あ』', '字組本']), ('regression: push-out chain', ['う版あう。、っ』、)「字。あかか、『。いおきゃ', 4], ['う版あ', 'う', '。', '、', 'っ』、)', '「字。あ', 'かか、『。', 'いおきゃ']), ('partial-repair probe', ['こあ)ー、あ)っこ、「(あ「けけっ。えかきー文', 8], ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文']), ('partial-repair probe', ['。け』かあ『組け』、字', 8], ['。け』かあ『組', 'け』、字']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['お語)日版』「か文え日日こ(ー(お', 7], ['お語)日版』', '「か文え日日こ', '(ー(お']), ('control layout', ['日うああ版字お日。日お日', 4], ['日うああ', '版字お日。', '日お日'])], [('regression: push-out chain', ['」』こ)「。きゃ」語文うう『', 4], ['」』こ)', '「。', 'きゃ」語', '文うう『']), ('regression: push-out chain', ['語け本日ゃ」)「字、字字', 5], ['語け本', '日ゃ」)', '「字、字字']), ('regression: push-out chain', ['(ゃえい。く、ああ(おあ)「文)(か語ゃ。ーけき', 3], ['(ゃえ', 'い。く、', 'ああ', '(お', 'あ)', '「文)', '(か', '語', 'ゃ。ー', 'けき']), ('partial-repair probe', ['()本)『組こ日本)版、(かけ本', 3], ['()', '本)', '『組こ', '日本)', '版、', '(かけ', '本']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('control layout', ['ー』版)本うかえお日', 8], ['ー』版)本うかえ', 'お日']), ('control layout', ['こう)あ、く。日語', 8], ['こう)あ、く。日', '語'])], [('regression: push-out chain', ['(『あ(日字(字「い語。字『うく版文ーゃーあ', 7], ['(『あ(日字', '(字「い語。字', '『うく版', '文ーゃーあ']), ('regression: push-out chain', ['こっ(『おあゃお字」。。組うう組、こえけ)語', 5], ['こっ(『お', 'あゃお', '字」。。組', 'うう組、こ', 'えけ)語']), ('regression: push-out chain', ['、けゃ語え語字「か語く文(、字)っ。おか、ー', 7], ['、けゃ語え語字', '「か語く文(、', '字)っ。お', 'か、ー']), ('partial-repair probe', ['かあ語、本ゃっけ」', 8], ['かあ語、本ゃっ', 'け」']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', ['け本こ日ゃき、こう」版(', 8], ['け本こ日ゃき、こ', 'う」版(']), ('control layout', ['日」』版、。字文うえこ日', 5], ['日」』版、。', '字文うえこ', '日'])]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: push-out chain | ['、本おう)こき', 'かえ文日おい', 'ーゃ。(け'] | ['、本おう)こき', 'かえ文日お', 'いーゃ。(け'] | Failed |
| regression: push-out chain | ['文ーう文お', 'っ日いあう', 'あ)い', 'ゃ)』日', '『字'] | ['文ーう文', 'おっ日いあ', 'うあ)', 'いゃ)』日', '『字'] | Failed |
| partial-repair probe | ['字う『、え組こ', '、文、ーえ', '」、』語う。'] | ['字う『、え組こ、', '文、ーえ」、』語', 'う。'] | Failed |
| partial-repair probe | ['本』。。く', 'ゃ(か『「'] | ['本』。。くゃ', '(か『「'] | Failed |
| closing bracket pushes out | ['日本語文', '」字組版'] | ['日本語', '文」字組', '版'] | Failed |
| period followed by bracket cannot hang | ['日本語文', '。」字組'] | ['日本語', '文。」字', '組'] | Failed |
| control layout | ['あっけあ', '『(き版'] | ['あっけあ', '『(き版'] | Passed |
| control layout | ['語あ』文か', '(おく本」'] | ['語あ』文か', '(おく本」'] | Passed |
SHA-256 / 310e181a42ed22e686ec71523b6adfccdfd589292d6a7fb75a9aede1b271361c
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(x):
text, L = x
NO_START = '、。,.)」』!?ーぁぃぅぇぉっゃゅょ'
NO_END = '(「『'
HANG = '、。,.'
lines = []
pos = 0
n = len(text)
while pos < n:
end = pos + L
if end >= n:
lines.append(text[pos:])
break
if text[end] in HANG and (end + 1 >= n or text[end + 1] not in NO_START):
end += 1
else:
while end > pos + 1 and text[end] in NO_START:
end -= 1
while end > pos + 1 and text[end - 1] in NO_END:
end -= 1
lines.append(text[pos:end])
pos = end
return lines
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('regression: push-out chain', ['、本おう)こきかえ文日おいーゃ。(け', 7], ['、本おう)こき', 'かえ文日お', 'いーゃ。(け']), ('regression: push-out chain', ['文ーう文おっ日いあうあ)いゃ)』日『字', 5], ['文ーう文', 'おっ日いあ', 'うあ)', 'いゃ)』日', '『字']), ('partial-repair probe', ['字う『、え組こ、文、ーえ」、』語う。', 8], ['字う『、え組こ、', '文、ーえ」、』語', 'う。']), ('partial-repair probe', ['本』。。くゃ(か『「', 6], ['本』。。くゃ', '(か『「']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['あっけあ『(き版', 4], ['あっけあ', '『(き版']), ('control layout', ['語あ』文か(おく本」', 6], ['語あ』文か', '(おく本」'])], [('regression: push-out chain', ['ゃ『くかこけう」字(く、っ『語ゃ組', 6], ['ゃ『くかこけ', 'う」字', '(く、っ', '『語ゃ組']), ('regression: push-out chain', ['けけーうけゃ)(っ』』)ゃっ組)お', 4], ['けけーう', 'けゃ)', '(', 'っ', '』', '』)ゃっ', '組)お']), ('partial-repair probe', ['か語組ゃっうこうくきくゃ日', 5], ['か語組ゃっ', 'うこうくき', 'くゃ日']), ('partial-repair probe', ['お。)語うきき文』く「日本本組『ゃ文日', 4], ['お。)語', 'うきき', '文』く', '「日本本', '組『ゃ文', '日']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['文字くい「「いおい字こく字っーー、かお本', 6], ['文字くい', '「「いおい字', 'こく字っーー、', 'かお本']), ('control layout', ['お語)日版』「か文え日日こ(ー(お', 7], ['お語)日版』', '「か文え日日こ', '(ー(お'])], [('regression: push-out chain', ['い。()。けう組。き文文日文文えっ、』あ』字組本', 6], ['い。()。け', 'う組。き文文', '日文文', 'えっ、』あ』', '字組本']), ('regression: push-out chain', ['う版あう。、っ』、)「字。あかか、『。いおきゃ', 4], ['う版あ', 'う', '。', '、', 'っ』、)', '「字。あ', 'かか、『。', 'いおきゃ']), ('partial-repair probe', ['こあ)ー、あ)っこ、「(あ「けけっ。えかきー文', 8], ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文']), ('partial-repair probe', ['。け』かあ『組け』、字', 8], ['。け』かあ『組', 'け』、字']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['お語)日版』「か文え日日こ(ー(お', 7], ['お語)日版』', '「か文え日日こ', '(ー(お']), ('control layout', ['日うああ版字お日。日お日', 4], ['日うああ', '版字お日。', '日お日'])], [('regression: push-out chain', ['」』こ)「。きゃ」語文うう『', 4], ['」』こ)', '「。', 'きゃ」語', '文うう『']), ('regression: push-out chain', ['語け本日ゃ」)「字、字字', 5], ['語け本', '日ゃ」)', '「字、字字']), ('regression: push-out chain', ['(ゃえい。く、ああ(おあ)「文)(か語ゃ。ーけき', 3], ['(ゃえ', 'い。く、', 'ああ', '(お', 'あ)', '「文)', '(か', '語', 'ゃ。ー', 'けき']), ('partial-repair probe', ['()本)『組こ日本)版、(かけ本', 3], ['()', '本)', '『組こ', '日本)', '版、', '(かけ', '本']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('control layout', ['ー』版)本うかえお日', 8], ['ー』版)本うかえ', 'お日']), ('control layout', ['こう)あ、く。日語', 8], ['こう)あ、く。日', '語'])], [('regression: push-out chain', ['(『あ(日字(字「い語。字『うく版文ーゃーあ', 7], ['(『あ(日字', '(字「い語。字', '『うく版', '文ーゃーあ']), ('regression: push-out chain', ['こっ(『おあゃお字」。。組うう組、こえけ)語', 5], ['こっ(『お', 'あゃお', '字」。。組', 'うう組、こ', 'えけ)語']), ('regression: push-out chain', ['、けゃ語え語字「か語く文(、字)っ。おか、ー', 7], ['、けゃ語え語字', '「か語く文(、', '字)っ。お', 'か、ー']), ('partial-repair probe', ['かあ語、本ゃっけ」', 8], ['かあ語、本ゃっ', 'け」']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', ['け本こ日ゃき、こう」版(', 8], ['け本こ日ゃき、こ', 'う」版(']), ('control layout', ['日」』版、。字文うえこ日', 5], ['日」』版、。', '字文うえこ', '日'])]]
for label, args, expected in fixtures[N - 1]:
check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| regression: push-out chain | ['、本おう)こき', 'かえ文日お', 'いーゃ。(け'] | ['、本おう)こき', 'かえ文日お', 'いーゃ。(け'] | Passed |
| regression: push-out chain | ['文ーう文', 'おっ日いあ', 'うあ)', 'いゃ)』日', '『字'] | ['文ーう文', 'おっ日いあ', 'うあ)', 'いゃ)』日', '『字'] | Passed |
| partial-repair probe | ['字う『、え組こ、', '文、ーえ」、』語', 'う。'] | ['字う『、え組こ、', '文、ーえ」、』語', 'う。'] | Passed |
| partial-repair probe | ['本』。。くゃ', '(か『「'] | ['本』。。くゃ', '(か『「'] | Passed |
| closing bracket pushes out | ['日本語', '文」字組', '版'] | ['日本語', '文」字組', '版'] | Passed |
| period followed by bracket cannot hang | ['日本語', '文。」字', '組'] | ['日本語', '文。」字', '組'] | Passed |
| control layout | ['あっけあ', '『(き版'] | ['あっけあ', '『(き版'] | Passed |
| control layout | ['語あ』文か', '(おく本」'] | ['語あ』文か', '(おく本」'] | Passed |
SHA-256 / f3bf45f9ac7273e966603d40fb41a530770df9f391615b89847442bca6ba2ac8
Verification & scope
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.
Observations recorded using Python 3.12.14 at 2026-09-29T14:49:49.904607+00:00.
Case digest / f5c6d54b70ed7c9b0e03ef56a19452b36a24c3c8421fdd940ae6e9a63da03e57