FA-80021 / Typography line breaking / Open access
CJK kinsoku line breaking: line-end prohibition index · case 01
Lines end with an opening bracket.
ROOT CAUSE
The line-end check inspects the first character of the next line instead of the last of this line.
VERIFIED REPAIR
Test text[end - 1] against the line-end prohibited set.
Unsuccessful approach: Looking two characters back misses the bracket in the final slot.
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:
while end > pos + 1 and text[end] in NO_START:
end -= 1
while end > pos + 1 and text[end] 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 = [[('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('regression: line-end prohibition index', ['、「組ー『ここっーかえあくい語『うき組、』。え', 5], ['、「組ー', '『ここっー', 'かえあくい', '語『うき', '組、』。え']), ('partial-repair probe', ['」「、本え』え日字字ゃゃ。き組。こ組う字版(', 3], ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版(']), ('regression: line-end prohibition index', ['いこ組うい)(「く文き語文くっ本『』語お版', 6], ['いこ組うい)', '(「く文き語', '文くっ本『』', '語お版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['あお組い、おっ字こ版、』けあ)', 4], ['あお組い、', 'おっ字こ', '版、』け', 'あ)']), ('control layout', ['日」』版、。字文うえこ日', 5], ['日」』版、。', '字文うえこ', '日'])], [('regression: line-end prohibition index', ['日」(日かくっ(』版き版け本く「』え日、文「(', 5], ['日」(日か', 'くっ(』版', 'き版け本く', '「』え日、', '文「(']), ('regression: line-end prohibition index', ['』(版あけ)う文え版えくく(字「いっえ)本', 5], ['』(版あ', 'け)う文え', '版えくく', '(字「いっ', 'え)本']), ('regression: line-end prohibition index', ['お(おっ文ゃっかうあああっ字(語っ「語文くっあ本', 6], ['お(おっ', '文ゃっかうあ', 'ああっ字', '(語っ「語文', 'くっあ本']), ('regression: line-end prohibition index', ['文((字本)あ版', 3], ['文', '((字', '本)あ', '版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', [')ー』文え文』きく版こああ', 3], [')ー』', '文え', '文』き', 'く版こ', 'ああ']), ('control layout', ['本い」文か』』おこかあっ、。日』', 3], ['本い」', '文', 'か』』', 'おこか', 'あっ、。', '日』'])], [('regression: line-end prohibition index', ['っ)文日くこ版日か『文日こおえ', 3], ['っ)文', '日くこ', '版日か', '『文日', 'こおえ']), ('regression: line-end prohibition index', ['「「字)』(っ』お』く『文組こー版', 7], ['「「字)』', '(っ』お』く', '『文組こー版']), ('regression: line-end prohibition index', ['文」け本「か。「あ組ゃ「。あえ組くかー文本', 5], ['文」け本', '「か。「あ', '組ゃ「。あ', 'え組くかー', '文本']), ('regression: line-end prohibition index', ['こ語え語(こお組う日本文文うく「おか', 8], ['こ語え語(こお組', 'う日本文文うく', '「おか']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', ['え文お文あ本かーゃ『。えけ文', 8], ['え文お文あ本', 'かーゃ『。えけ文']), ('control layout', ['、お『組えっ版字』ゃ版。組う日く」、。', 8], ['、お『組えっ版', '字』ゃ版。組う日', 'く」、。'])], [('regression: line-end prohibition index', ['ーゃゃ文。語語うくか」いか。えあ『か組', 8], ['ーゃゃ文。語語う', 'くか」いか。えあ', '『か組']), ('regression: line-end prohibition index', ['いあ『本く)く。ー', 3], ['いあ', '『本', 'く)', 'く。ー']), ('partial-repair probe', ['く字日本()あ。え。『日、組文', 3], ['く字日', '本()', 'あ。え。', '『日、', '組文']), ('regression: line-end prohibition index', ['版か語文っ」「か』お」。本。け「くうゃ『い本', 6], ['版か語文っ」', '「か』お」。', '本。け「く', 'うゃ『い本']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['」かき、え字版語、組お字', 5], ['」かき、え', '字版語、組', 'お字']), ('control layout', ['「かーき語組語「', 6], ['「かーき語組', '語「'])], [('regression: line-end prohibition index', ['「日う(っ。き「。け日「あ『ーか版文文あ(「', 6], ['「日う(っ。', 'き「。け日', '「あ『ーか版', '文文あ(「']), ('regression: line-end prohibition index', ['語語字けかあ版本『』字くえいき(組版あえ組こ語', 5], ['語語字けか', 'あ版本『』', '字くえいき', '(組版あえ', '組こ語']), ('regression: line-end prohibition index', ['っ「かっ版(ー『う」ー字(語う本ゃゃ本ー。あ』', 8], ['っ「かっ版(ー', '『う」ー字(語う', '本ゃゃ本ー。あ』']), ('regression: line-end prohibition index', ['『か、えあ字『こ日', 7], ['『か、えあ字', '『こ日']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['」)版こあうかくーい版ー文「文き(', 6], ['」)版こあう', 'かくーい版ー', '文「文き(']), ('control layout', ['「かーき語組語「', 6], ['「かーき語組', '語「'])]]
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 |
|---|---|---|---|
| opening bracket at line end | ['日本語「', '文字」組', '版'] | ['日本語', '「文字」', '組版'] | Failed |
| regression: line-end prohibition index | ['、「組ー『', 'ここっーか', 'えあくい', '語『うき', '組、』。え'] | ['、「組ー', '『ここっー', 'かえあくい', '語『うき', '組、』。え'] | Failed |
| partial-repair probe | ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版('] | ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版('] | Passed |
| regression: line-end prohibition index | ['いこ組うい', ')(「く文き', '語文くっ', '本『』語お版'] | ['いこ組うい)', '(「く文き語', '文くっ本『』', '語お版'] | Failed |
| period hangs past the measure | ['日本語文。', '字組版'] | ['日本語文。', '字組版'] | Passed |
| small kana prohibited at line start | ['日本語', 'かっこい', 'い'] | ['日本語', 'かっこい', 'い'] | Passed |
| control layout | ['あお組い、', 'おっ字こ', '版、』け', 'あ)'] | ['あお組い、', 'おっ字こ', '版、』け', 'あ)'] | Passed |
| control layout | ['日」』版、。', '字文うえこ', '日'] | ['日」』版、。', '字文うえこ', '日'] | Passed |
SHA-256 / 6cecf1477914c72a0d92594445234a616b2bacbbdae148f285ea854b319139d8
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] in NO_START:
end -= 1
while end > pos + 1 and text[end - 2] 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 = [[('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('regression: line-end prohibition index', ['、「組ー『ここっーかえあくい語『うき組、』。え', 5], ['、「組ー', '『ここっー', 'かえあくい', '語『うき', '組、』。え']), ('partial-repair probe', ['」「、本え』え日字字ゃゃ。き組。こ組う字版(', 3], ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版(']), ('regression: line-end prohibition index', ['いこ組うい)(「く文き語文くっ本『』語お版', 6], ['いこ組うい)', '(「く文き語', '文くっ本『』', '語お版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['あお組い、おっ字こ版、』けあ)', 4], ['あお組い、', 'おっ字こ', '版、』け', 'あ)']), ('control layout', ['日」』版、。字文うえこ日', 5], ['日」』版、。', '字文うえこ', '日'])], [('regression: line-end prohibition index', ['日」(日かくっ(』版き版け本く「』え日、文「(', 5], ['日」(日か', 'くっ(』版', 'き版け本く', '「』え日、', '文「(']), ('regression: line-end prohibition index', ['』(版あけ)う文え版えくく(字「いっえ)本', 5], ['』(版あ', 'け)う文え', '版えくく', '(字「いっ', 'え)本']), ('regression: line-end prohibition index', ['お(おっ文ゃっかうあああっ字(語っ「語文くっあ本', 6], ['お(おっ', '文ゃっかうあ', 'ああっ字', '(語っ「語文', 'くっあ本']), ('regression: line-end prohibition index', ['文((字本)あ版', 3], ['文', '((字', '本)あ', '版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', [')ー』文え文』きく版こああ', 3], [')ー』', '文え', '文』き', 'く版こ', 'ああ']), ('control layout', ['本い」文か』』おこかあっ、。日』', 3], ['本い」', '文', 'か』』', 'おこか', 'あっ、。', '日』'])], [('regression: line-end prohibition index', ['っ)文日くこ版日か『文日こおえ', 3], ['っ)文', '日くこ', '版日か', '『文日', 'こおえ']), ('regression: line-end prohibition index', ['「「字)』(っ』お』く『文組こー版', 7], ['「「字)』', '(っ』お』く', '『文組こー版']), ('regression: line-end prohibition index', ['文」け本「か。「あ組ゃ「。あえ組くかー文本', 5], ['文」け本', '「か。「あ', '組ゃ「。あ', 'え組くかー', '文本']), ('regression: line-end prohibition index', ['こ語え語(こお組う日本文文うく「おか', 8], ['こ語え語(こお組', 'う日本文文うく', '「おか']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', ['え文お文あ本かーゃ『。えけ文', 8], ['え文お文あ本', 'かーゃ『。えけ文']), ('control layout', ['、お『組えっ版字』ゃ版。組う日く」、。', 8], ['、お『組えっ版', '字』ゃ版。組う日', 'く」、。'])], [('regression: line-end prohibition index', ['ーゃゃ文。語語うくか」いか。えあ『か組', 8], ['ーゃゃ文。語語う', 'くか」いか。えあ', '『か組']), ('regression: line-end prohibition index', ['いあ『本く)く。ー', 3], ['いあ', '『本', 'く)', 'く。ー']), ('partial-repair probe', ['く字日本()あ。え。『日、組文', 3], ['く字日', '本()', 'あ。え。', '『日、', '組文']), ('regression: line-end prohibition index', ['版か語文っ」「か』お」。本。け「くうゃ『い本', 6], ['版か語文っ」', '「か』お」。', '本。け「く', 'うゃ『い本']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['」かき、え字版語、組お字', 5], ['」かき、え', '字版語、組', 'お字']), ('control layout', ['「かーき語組語「', 6], ['「かーき語組', '語「'])], [('regression: line-end prohibition index', ['「日う(っ。き「。け日「あ『ーか版文文あ(「', 6], ['「日う(っ。', 'き「。け日', '「あ『ーか版', '文文あ(「']), ('regression: line-end prohibition index', ['語語字けかあ版本『』字くえいき(組版あえ組こ語', 5], ['語語字けか', 'あ版本『』', '字くえいき', '(組版あえ', '組こ語']), ('regression: line-end prohibition index', ['っ「かっ版(ー『う」ー字(語う本ゃゃ本ー。あ』', 8], ['っ「かっ版(ー', '『う」ー字(語う', '本ゃゃ本ー。あ』']), ('regression: line-end prohibition index', ['『か、えあ字『こ日', 7], ['『か、えあ字', '『こ日']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['」)版こあうかくーい版ー文「文き(', 6], ['」)版こあう', 'かくーい版ー', '文「文き(']), ('control layout', ['「かーき語組語「', 6], ['「かーき語組', '語「'])]]
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 |
|---|---|---|---|
| opening bracket at line end | ['日本語「', '文字」組', '版'] | ['日本語', '「文字」', '組版'] | Failed |
| regression: line-end prohibition index | ['、「組ー『', 'ここっーか', 'えあくい語', '『うき', '組、』。え'] | ['、「組ー', '『ここっー', 'かえあくい', '語『うき', '組、』。え'] | Failed |
| partial-repair probe | ['」「', '、本', 'え』え', '日字', '字ゃゃ。', 'き組。', 'こ組う', '字版('] | ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版('] | Failed |
| regression: line-end prohibition index | ['いこ組うい)', '(「く文き語', '文くっ本『', '』語お版'] | ['いこ組うい)', '(「く文き語', '文くっ本『』', '語お版'] | Failed |
| period hangs past the measure | ['日本語文。', '字組版'] | ['日本語文。', '字組版'] | Passed |
| small kana prohibited at line start | ['日本語', 'かっこい', 'い'] | ['日本語', 'かっこい', 'い'] | Passed |
| control layout | ['あお組い、', 'おっ字こ', '版、』け', 'あ)'] | ['あお組い、', 'おっ字こ', '版、』け', 'あ)'] | Passed |
| control layout | ['日」』版、。', '字文うえこ', '日'] | ['日」』版、。', '字文うえこ', '日'] | Passed |
SHA-256 / c29ec59eecc8b5b2c3bf2db4b011b1f6d0669a696a1a2976ed4f17a7818d2701
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 = [[('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('regression: line-end prohibition index', ['、「組ー『ここっーかえあくい語『うき組、』。え', 5], ['、「組ー', '『ここっー', 'かえあくい', '語『うき', '組、』。え']), ('partial-repair probe', ['」「、本え』え日字字ゃゃ。き組。こ組う字版(', 3], ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版(']), ('regression: line-end prohibition index', ['いこ組うい)(「く文き語文くっ本『』語お版', 6], ['いこ組うい)', '(「く文き語', '文くっ本『』', '語お版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['あお組い、おっ字こ版、』けあ)', 4], ['あお組い、', 'おっ字こ', '版、』け', 'あ)']), ('control layout', ['日」』版、。字文うえこ日', 5], ['日」』版、。', '字文うえこ', '日'])], [('regression: line-end prohibition index', ['日」(日かくっ(』版き版け本く「』え日、文「(', 5], ['日」(日か', 'くっ(』版', 'き版け本く', '「』え日、', '文「(']), ('regression: line-end prohibition index', ['』(版あけ)う文え版えくく(字「いっえ)本', 5], ['』(版あ', 'け)う文え', '版えくく', '(字「いっ', 'え)本']), ('regression: line-end prohibition index', ['お(おっ文ゃっかうあああっ字(語っ「語文くっあ本', 6], ['お(おっ', '文ゃっかうあ', 'ああっ字', '(語っ「語文', 'くっあ本']), ('regression: line-end prohibition index', ['文((字本)あ版', 3], ['文', '((字', '本)あ', '版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', [')ー』文え文』きく版こああ', 3], [')ー』', '文え', '文』き', 'く版こ', 'ああ']), ('control layout', ['本い」文か』』おこかあっ、。日』', 3], ['本い」', '文', 'か』』', 'おこか', 'あっ、。', '日』'])], [('regression: line-end prohibition index', ['っ)文日くこ版日か『文日こおえ', 3], ['っ)文', '日くこ', '版日か', '『文日', 'こおえ']), ('regression: line-end prohibition index', ['「「字)』(っ』お』く『文組こー版', 7], ['「「字)』', '(っ』お』く', '『文組こー版']), ('regression: line-end prohibition index', ['文」け本「か。「あ組ゃ「。あえ組くかー文本', 5], ['文」け本', '「か。「あ', '組ゃ「。あ', 'え組くかー', '文本']), ('regression: line-end prohibition index', ['こ語え語(こお組う日本文文うく「おか', 8], ['こ語え語(こお組', 'う日本文文うく', '「おか']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', ['え文お文あ本かーゃ『。えけ文', 8], ['え文お文あ本', 'かーゃ『。えけ文']), ('control layout', ['、お『組えっ版字』ゃ版。組う日く」、。', 8], ['、お『組えっ版', '字』ゃ版。組う日', 'く」、。'])], [('regression: line-end prohibition index', ['ーゃゃ文。語語うくか」いか。えあ『か組', 8], ['ーゃゃ文。語語う', 'くか」いか。えあ', '『か組']), ('regression: line-end prohibition index', ['いあ『本く)く。ー', 3], ['いあ', '『本', 'く)', 'く。ー']), ('partial-repair probe', ['く字日本()あ。え。『日、組文', 3], ['く字日', '本()', 'あ。え。', '『日、', '組文']), ('regression: line-end prohibition index', ['版か語文っ」「か』お」。本。け「くうゃ『い本', 6], ['版か語文っ」', '「か』お」。', '本。け「く', 'うゃ『い本']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['」かき、え字版語、組お字', 5], ['」かき、え', '字版語、組', 'お字']), ('control layout', ['「かーき語組語「', 6], ['「かーき語組', '語「'])], [('regression: line-end prohibition index', ['「日う(っ。き「。け日「あ『ーか版文文あ(「', 6], ['「日う(っ。', 'き「。け日', '「あ『ーか版', '文文あ(「']), ('regression: line-end prohibition index', ['語語字けかあ版本『』字くえいき(組版あえ組こ語', 5], ['語語字けか', 'あ版本『』', '字くえいき', '(組版あえ', '組こ語']), ('regression: line-end prohibition index', ['っ「かっ版(ー『う」ー字(語う本ゃゃ本ー。あ』', 8], ['っ「かっ版(ー', '『う」ー字(語う', '本ゃゃ本ー。あ』']), ('regression: line-end prohibition index', ['『か、えあ字『こ日', 7], ['『か、えあ字', '『こ日']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('control layout', ['」)版こあうかくーい版ー文「文き(', 6], ['」)版こあう', 'かくーい版ー', '文「文き(']), ('control layout', ['「かーき語組語「', 6], ['「かーき語組', '語「'])]]
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 |
|---|---|---|---|
| opening bracket at line end | ['日本語', '「文字」', '組版'] | ['日本語', '「文字」', '組版'] | Passed |
| regression: line-end prohibition index | ['、「組ー', '『ここっー', 'かえあくい', '語『うき', '組、』。え'] | ['、「組ー', '『ここっー', 'かえあくい', '語『うき', '組、』。え'] | Passed |
| partial-repair probe | ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版('] | ['」「、', '本え』', 'え日字', '字ゃゃ。', 'き組。', 'こ組う', '字版('] | Passed |
| regression: line-end prohibition index | ['いこ組うい)', '(「く文き語', '文くっ本『』', '語お版'] | ['いこ組うい)', '(「く文き語', '文くっ本『』', '語お版'] | Passed |
| period hangs past the measure | ['日本語文。', '字組版'] | ['日本語文。', '字組版'] | Passed |
| small kana prohibited at line start | ['日本語', 'かっこい', 'い'] | ['日本語', 'かっこい', 'い'] | Passed |
| control layout | ['あお組い、', 'おっ字こ', '版、』け', 'あ)'] | ['あお組い、', 'おっ字こ', '版、』け', 'あ)'] | Passed |
| control layout | ['日」』版、。', '字文うえこ', '日'] | ['日」』版、。', '字文うえこ', '日'] | Passed |
SHA-256 / dc556234ea045785978edab57e4679f97d04aac19ed030cdd173aae3fb7990c6
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:50.003543+00:00.
Case digest / 5a76ca6a8b6b42a9aecb4fef78bc5f47a8872828777f6ce7e8c6deb9507df209