FA-80031 / Typography line breaking / Open access
CJK kinsoku line breaking: small kana strictness · case 01
Small kana and long vowel marks begin lines.
ROOT CAUSE
The prohibited-start set omits small kana and the long vowel mark.
VERIFIED REPAIR
Use the strict set that includes small kana and ー.
Unsuccessful approach: Adding small kana but not ー still lets the long vowel mark start lines.
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 - 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 = [[('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('regression: small kana strictness', ['こあ)ー、あ)っこ、「(あ「けけっ。えかきー文', 8], ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文']), ('regression: small kana strictness', ['()字「文版い字ー「版ーっ「。』組字組けあか「', 8], ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「']), ('regression: small kana strictness', ['語かおい。字ー」きくおあけ『', 6], ['語かおい。', '字ー」きくお', 'あけ『']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['組『「(くお字き「本け、くえ日「。。」(お', 8], ['組『「(くお字き', '「本け、くえ日', '「。。」(お']), ('control layout', ['、』ゃあこけ字文お」かーかー。けきー', 8], ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'])], [('regression: small kana strictness', ['きあ。えーくーゃい', 4], ['きあ。', 'えー', 'くーゃい']), ('regression: small kana strictness', ['本『く、ゃ本かっ', 7], ['本『く、ゃ本', 'かっ']), ('regression: small kana strictness', ['語字、え『えくゃえー』』ーこ組「日『。(', 4], ['語字、え', '『えくゃ', 'え', 'ー』』ー', 'こ組「日', '『。(']), ('regression: small kana strictness', ['けこ。語く「組き語け)おい組文うー', 8], ['けこ。語く「組き', '語け)おい組文', 'うー']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['、け)「文本、語文『こ(字けこ', 5], ['、け)「文', '本、語文', '『こ(字け', 'こ']), ('control layout', ['け(え)けうけ語「組『けーく字え字', 5], ['け(え)け', 'うけ語「組', '『けーく字', 'え字'])], [('regression: small kana strictness', ['日組こ、『っ、ー日ーあ』っ「、き「字っ', 6], ['日組こ、', '『っ、ー日ー', 'あ』っ「、き', '「字っ']), ('regression: small kana strictness', ['えい語く』うっき版うく『)ゃけか', 3], ['えい語', 'く』', 'うっき', '版うく', '『)ゃ', 'けか']), ('regression: small kana strictness', ['()字「文版い字ー「版ーっ「。』組字組けあか「', 8], ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「']), ('regression: small kana strictness', ['版っ』い「)ー)。)', 3], ['版っ』', 'い', '「', ')', 'ー', ')。)']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('control layout', ['っ日本語字こ(く」『、こう文かいえ。。ー', 8], ['っ日本語字こ', '(く」『、こう文', 'かいえ。。ー']), ('control layout', ['語う版っこう『」', 8], ['語う版っこう『」'])], [('regression: small kana strictness', [')文っ語(く」(。いお、『』ー版版', 7], [')文っ語(く」', '(。いお、', '『』ー版版']), ('regression: small kana strictness', ['きあ。えーくーゃい', 4], ['きあ。', 'えー', 'くーゃい']), ('regression: small kana strictness', ['いあ『本く)く。ー', 3], ['いあ', '『本', 'く)', 'く。ー']), ('regression: small kana strictness', ['語字、え『えくゃえー』』ーこ組「日『。(', 4], ['語字、え', '『えくゃ', 'え', 'ー』』ー', 'こ組「日', '『。(']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', [')、えゃ語うかえ「本あこ(字)ーえ字あか版』', 6], [')、えゃ語う', 'かえ「本あこ', '(字)ーえ字', 'あか版』']), ('control layout', ['あ。」あ文(け版。日)語え』', 6], ['あ。」あ文', '(け版。日)', '語え』'])], [('regression: small kana strictness', ['版ー『版かゃき組本字』', 5], ['版ー『版', 'かゃき組本', '字』']), ('regression: small kana strictness', ['(日おあ」『こか、語。)本文っ、文えあゃ。', 5], ['(日おあ」', '『こか、', '語。)本', '文っ、文え', 'あゃ。']), ('regression: small kana strictness', ['文。いいおっけー本。う「ういおくかえ', 7], ['文。いいおっ', 'けー本。う「う', 'いおくかえ']), ('regression: small kana strictness', ['きっ文こ」あ。けけききき「日ー文ーか、い。', 7], ['きっ文こ」あ。', 'けけききき', '「日ー文ーか、', 'い。']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['版っ日けおく、)」版(「', 6], ['版っ日けお', 'く、)」版', '(「']), ('control layout', ['こあく。(く版「うえけ。。。え', 8], ['こあく。(く版', '「うえけ。。。え'])]]
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 |
|---|---|---|---|
| small kana prohibited at line start | ['日本語か', 'っこいい'] | ['日本語', 'かっこい', 'い'] | Failed |
| regression: small kana strictness | ['こあ)ー、あ)っ', 'こ、「(あ「けけ', 'っ。えかきー文'] | ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文'] | Failed |
| regression: small kana strictness | ['()字「文版い字', 'ー「版ーっ「。』', '組字組けあか「'] | ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「'] | Failed |
| regression: small kana strictness | ['語かおい。字', 'ー」きくおあ', 'け『'] | ['語かおい。', '字ー」きくお', 'あけ『'] | Failed |
| period hangs past the measure | ['日本語文。', '字組版'] | ['日本語文。', '字組版'] | Passed |
| period followed by bracket cannot hang | ['日本語', '文。」字', '組'] | ['日本語', '文。」字', '組'] | Passed |
| control layout | ['組『「(くお字き', '「本け、くえ日', '「。。」(お'] | ['組『「(くお字き', '「本け、くえ日', '「。。」(お'] | Passed |
| control layout | ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'] | ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'] | Passed |
SHA-256 / 796dd40e40d7bae1e8bf653d6a5d902f55121d573929b04d63ae8bda4065dfb6
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 - 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 = [[('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('regression: small kana strictness', ['こあ)ー、あ)っこ、「(あ「けけっ。えかきー文', 8], ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文']), ('regression: small kana strictness', ['()字「文版い字ー「版ーっ「。』組字組けあか「', 8], ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「']), ('regression: small kana strictness', ['語かおい。字ー」きくおあけ『', 6], ['語かおい。', '字ー」きくお', 'あけ『']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['組『「(くお字き「本け、くえ日「。。」(お', 8], ['組『「(くお字き', '「本け、くえ日', '「。。」(お']), ('control layout', ['、』ゃあこけ字文お」かーかー。けきー', 8], ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'])], [('regression: small kana strictness', ['きあ。えーくーゃい', 4], ['きあ。', 'えー', 'くーゃい']), ('regression: small kana strictness', ['本『く、ゃ本かっ', 7], ['本『く、ゃ本', 'かっ']), ('regression: small kana strictness', ['語字、え『えくゃえー』』ーこ組「日『。(', 4], ['語字、え', '『えくゃ', 'え', 'ー』』ー', 'こ組「日', '『。(']), ('regression: small kana strictness', ['けこ。語く「組き語け)おい組文うー', 8], ['けこ。語く「組き', '語け)おい組文', 'うー']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['、け)「文本、語文『こ(字けこ', 5], ['、け)「文', '本、語文', '『こ(字け', 'こ']), ('control layout', ['け(え)けうけ語「組『けーく字え字', 5], ['け(え)け', 'うけ語「組', '『けーく字', 'え字'])], [('regression: small kana strictness', ['日組こ、『っ、ー日ーあ』っ「、き「字っ', 6], ['日組こ、', '『っ、ー日ー', 'あ』っ「、き', '「字っ']), ('regression: small kana strictness', ['えい語く』うっき版うく『)ゃけか', 3], ['えい語', 'く』', 'うっき', '版うく', '『)ゃ', 'けか']), ('regression: small kana strictness', ['()字「文版い字ー「版ーっ「。』組字組けあか「', 8], ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「']), ('regression: small kana strictness', ['版っ』い「)ー)。)', 3], ['版っ』', 'い', '「', ')', 'ー', ')。)']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('control layout', ['っ日本語字こ(く」『、こう文かいえ。。ー', 8], ['っ日本語字こ', '(く」『、こう文', 'かいえ。。ー']), ('control layout', ['語う版っこう『」', 8], ['語う版っこう『」'])], [('regression: small kana strictness', [')文っ語(く」(。いお、『』ー版版', 7], [')文っ語(く」', '(。いお、', '『』ー版版']), ('regression: small kana strictness', ['きあ。えーくーゃい', 4], ['きあ。', 'えー', 'くーゃい']), ('regression: small kana strictness', ['いあ『本く)く。ー', 3], ['いあ', '『本', 'く)', 'く。ー']), ('regression: small kana strictness', ['語字、え『えくゃえー』』ーこ組「日『。(', 4], ['語字、え', '『えくゃ', 'え', 'ー』』ー', 'こ組「日', '『。(']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', [')、えゃ語うかえ「本あこ(字)ーえ字あか版』', 6], [')、えゃ語う', 'かえ「本あこ', '(字)ーえ字', 'あか版』']), ('control layout', ['あ。」あ文(け版。日)語え』', 6], ['あ。」あ文', '(け版。日)', '語え』'])], [('regression: small kana strictness', ['版ー『版かゃき組本字』', 5], ['版ー『版', 'かゃき組本', '字』']), ('regression: small kana strictness', ['(日おあ」『こか、語。)本文っ、文えあゃ。', 5], ['(日おあ」', '『こか、', '語。)本', '文っ、文え', 'あゃ。']), ('regression: small kana strictness', ['文。いいおっけー本。う「ういおくかえ', 7], ['文。いいおっ', 'けー本。う「う', 'いおくかえ']), ('regression: small kana strictness', ['きっ文こ」あ。けけききき「日ー文ーか、い。', 7], ['きっ文こ」あ。', 'けけききき', '「日ー文ーか、', 'い。']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['版っ日けおく、)」版(「', 6], ['版っ日けお', 'く、)」版', '(「']), ('control layout', ['こあく。(く版「うえけ。。。え', 8], ['こあく。(く版', '「うえけ。。。え'])]]
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 |
|---|---|---|---|
| small kana prohibited at line start | ['日本語', 'かっこい', 'い'] | ['日本語', 'かっこい', 'い'] | Passed |
| regression: small kana strictness | ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文'] | ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文'] | Passed |
| regression: small kana strictness | ['()字「文版い字', 'ー「版ーっ「。』', '組字組けあか「'] | ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「'] | Failed |
| regression: small kana strictness | ['語かおい。字', 'ー」きくおあ', 'け『'] | ['語かおい。', '字ー」きくお', 'あけ『'] | Failed |
| period hangs past the measure | ['日本語文。', '字組版'] | ['日本語文。', '字組版'] | Passed |
| period followed by bracket cannot hang | ['日本語', '文。」字', '組'] | ['日本語', '文。」字', '組'] | Passed |
| control layout | ['組『「(くお字き', '「本け、くえ日', '「。。」(お'] | ['組『「(くお字き', '「本け、くえ日', '「。。」(お'] | Passed |
| control layout | ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'] | ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'] | Passed |
SHA-256 / e46b1263e4cfef294270740103b6089c098e95afaa73ce7b21f7db90757c5f0a
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 = [[('small kana prohibited at line start', ['日本語かっこいい', 4], ['日本語', 'かっこい', 'い']), ('regression: small kana strictness', ['こあ)ー、あ)っこ、「(あ「けけっ。えかきー文', 8], ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文']), ('regression: small kana strictness', ['()字「文版い字ー「版ーっ「。』組字組けあか「', 8], ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「']), ('regression: small kana strictness', ['語かおい。字ー」きくおあけ『', 6], ['語かおい。', '字ー」きくお', 'あけ『']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['組『「(くお字き「本け、くえ日「。。」(お', 8], ['組『「(くお字き', '「本け、くえ日', '「。。」(お']), ('control layout', ['、』ゃあこけ字文お」かーかー。けきー', 8], ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'])], [('regression: small kana strictness', ['きあ。えーくーゃい', 4], ['きあ。', 'えー', 'くーゃい']), ('regression: small kana strictness', ['本『く、ゃ本かっ', 7], ['本『く、ゃ本', 'かっ']), ('regression: small kana strictness', ['語字、え『えくゃえー』』ーこ組「日『。(', 4], ['語字、え', '『えくゃ', 'え', 'ー』』ー', 'こ組「日', '『。(']), ('regression: small kana strictness', ['けこ。語く「組き語け)おい組文うー', 8], ['けこ。語く「組き', '語け)おい組文', 'うー']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('control layout', ['、け)「文本、語文『こ(字けこ', 5], ['、け)「文', '本、語文', '『こ(字け', 'こ']), ('control layout', ['け(え)けうけ語「組『けーく字え字', 5], ['け(え)け', 'うけ語「組', '『けーく字', 'え字'])], [('regression: small kana strictness', ['日組こ、『っ、ー日ーあ』っ「、き「字っ', 6], ['日組こ、', '『っ、ー日ー', 'あ』っ「、き', '「字っ']), ('regression: small kana strictness', ['えい語く』うっき版うく『)ゃけか', 3], ['えい語', 'く』', 'うっき', '版うく', '『)ゃ', 'けか']), ('regression: small kana strictness', ['()字「文版い字ー「版ーっ「。』組字組けあか「', 8], ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「']), ('regression: small kana strictness', ['版っ』い「)ー)。)', 3], ['版っ』', 'い', '「', ')', 'ー', ')。)']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('closing bracket pushes out', ['日本語文」字組版', 4], ['日本語', '文」字組', '版']), ('control layout', ['っ日本語字こ(く」『、こう文かいえ。。ー', 8], ['っ日本語字こ', '(く」『、こう文', 'かいえ。。ー']), ('control layout', ['語う版っこう『」', 8], ['語う版っこう『」'])], [('regression: small kana strictness', [')文っ語(く」(。いお、『』ー版版', 7], [')文っ語(く」', '(。いお、', '『』ー版版']), ('regression: small kana strictness', ['きあ。えーくーゃい', 4], ['きあ。', 'えー', 'くーゃい']), ('regression: small kana strictness', ['いあ『本く)く。ー', 3], ['いあ', '『本', 'く)', 'く。ー']), ('regression: small kana strictness', ['語字、え『えくゃえー』』ーこ組「日『。(', 4], ['語字、え', '『えくゃ', 'え', 'ー』』ー', 'こ組「日', '『。(']), ('period followed by bracket cannot hang', ['日本語文。」字組', 4], ['日本語', '文。」字', '組']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('control layout', [')、えゃ語うかえ「本あこ(字)ーえ字あか版』', 6], [')、えゃ語う', 'かえ「本あこ', '(字)ーえ字', 'あか版』']), ('control layout', ['あ。」あ文(け版。日)語え』', 6], ['あ。」あ文', '(け版。日)', '語え』'])], [('regression: small kana strictness', ['版ー『版かゃき組本字』', 5], ['版ー『版', 'かゃき組本', '字』']), ('regression: small kana strictness', ['(日おあ」『こか、語。)本文っ、文えあゃ。', 5], ['(日おあ」', '『こか、', '語。)本', '文っ、文え', 'あゃ。']), ('regression: small kana strictness', ['文。いいおっけー本。う「ういおくかえ', 7], ['文。いいおっ', 'けー本。う「う', 'いおくかえ']), ('regression: small kana strictness', ['きっ文こ」あ。けけききき「日ー文ーか、い。', 7], ['きっ文こ」あ。', 'けけききき', '「日ー文ーか、', 'い。']), ('opening bracket at line end', ['日本語「文字」組版', 4], ['日本語', '「文字」', '組版']), ('period hangs past the measure', ['日本語文。字組版', 4], ['日本語文。', '字組版']), ('control layout', ['版っ日けおく、)」版(「', 6], ['版っ日けお', 'く、)」版', '(「']), ('control layout', ['こあく。(く版「うえけ。。。え', 8], ['こあく。(く版', '「うえけ。。。え'])]]
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 |
|---|---|---|---|
| small kana prohibited at line start | ['日本語', 'かっこい', 'い'] | ['日本語', 'かっこい', 'い'] | Passed |
| regression: small kana strictness | ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文'] | ['こあ)ー、あ)っ', 'こ、「(あ「け', 'けっ。えかきー文'] | Passed |
| regression: small kana strictness | ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「'] | ['()字「文版い', '字ー「版ーっ', '「。』組字組けあ', 'か「'] | Passed |
| regression: small kana strictness | ['語かおい。', '字ー」きくお', 'あけ『'] | ['語かおい。', '字ー」きくお', 'あけ『'] | Passed |
| period hangs past the measure | ['日本語文。', '字組版'] | ['日本語文。', '字組版'] | Passed |
| period followed by bracket cannot hang | ['日本語', '文。」字', '組'] | ['日本語', '文。」字', '組'] | Passed |
| control layout | ['組『「(くお字き', '「本け、くえ日', '「。。」(お'] | ['組『「(くお字き', '「本け、くえ日', '「。。」(お'] | Passed |
| control layout | ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'] | ['、』ゃあこけ字文', 'お」かーかー。け', 'きー'] | Passed |
SHA-256 / 4eb0c7c77bcf45d88133849ced98e0149246f76cf285e90a24e4cfc3973f22de
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.209444+00:00.
Case digest / c4fd46d0ed60b2b2765c5021067fc260191d30f11df7d410209b9e69829d366e