Repository navigation
Description
Measured while landing the os-dev.md verification pack (#11539 / #11648 / #11419 / #11463 / #11923). Filed unassigned, observation class — ⛔ not fixed in that PR, which is scoped to five named amendments and only surfaced this while paying its ratchet cost by re-flowing prose.
The defect
The corpus wraps CJK prose by inserting a newline. That is correct and the ratchet's own header explains why: a segment break between two wide characters is removed by the CSS segment-break transformation, so it renders as nothing.
But a break placed directly after an ASCII comma / semicolon / colon is not between two wide characters. , is U+002C, and this corpus uses ASCII punctuation throughout (measured on .claude/agents/os-dev.md at origin/main: 197 ASCII commas after a Han character, 0 fullwidth U+FF0C). A soft break there renders as an ordinary space.
So the source
…prompt 的沉默是常
态,
不是许可:
renders as …prompt 的沉默是常态, 不是许可: — with a space the author never wrote, mid-sentence, in Chinese prose that has no spaces anywhere else.
Scale, measured across the line-ratcheted corpus
Counting soft breaks that sit immediately after an ASCII , ; : where the preceding character is Han and the next non-whitespace character is Han:
| count | file |
|---|---|
| 14 | .claude/skills/pm-dispatch/SKILL.md |
| 7 | .claude/skills/pm-dispatch/references/platform-readings.md |
| 5 | .claude/skills/spec-property-retirement/SKILL.md |
| 3 | .claude/skills/pm-dispatch/references/dispatch-runbook.md |
| 3 | .claude/skills/pm-dispatch/references/decision-analysis.md |
| 2 | .claude/skills/pm-dispatch/references/release-aftercare.md |
| 2 | .claude/skills/pm-dispatch/references/lanes/devx.md |
| 2 | .claude/agents/os-dev.md |
| 1 each | review-checklist.md, landing-operations.md, seat-post-protocol.md, lanes/cli.md, +3 more |
| 45 | total, across 15 ratcheted files |
Why it is worth recording rather than shrugging at
⭐ And it is self-concealing under re-wrap: re-flowing such a paragraph and re-wrapping it faithfully must preserve the space (it is what the text renders as), so the space migrates from a line break into a literal ", " in the source. It looks like the re-wrap introduced it. It did not — it only made an existing render visible. Anyone auditing a future re-wrap by eye will reach the wrong conclusion here, which is why the mechanism is written down.
Not asserted
- ⛔ Not a claim that the
wrapLinealgorithm is wrong. It only ever moves whitespace and it is correct on its own terms; the question is whether a break after ASCII punctuation should be offered at all in CJK prose, which is a judgement about house typography, not a bug in the wrapper. - ⛔ Not a claim about how many of the 45 predate [finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 versus were introduced by it. The one-off re-wrap re-flowed 555 legacy over-long lines, so it is the likely source, but this seat did not audit the pre-[finding] The pm-skill ratchet counts LINES while its header prices a per-session token read — a green 134/134 run grew platform-readings.md ~33% in bytes #11106 revisions and the fix does not depend on the answer.
- ⛔ No proposal about how to close it. The obvious candidates (add ASCII
,;:toNO_BREAK_AFTERso the wrapper stops offering the break; or a one-off pass closing the 45) have costs — the first re-wraps the corpus again and moves every ceiling, the second is manual and rots. That is a maintainer/skills-seat call, and a wrong guess here is a corpus-wide diff.
Dedup
Enumerated all 380 open issues via the repo-scoped REST list endpoint (5 pages, 408 open items incl. PRs) and filtered titles on re-?wrap|wrapping|空格|stray space|标点|punctuation|comma|soft ?break|行宽|line-length|120 → 9 hits, none of them this. The nearest neighbour is #11947 (133 lines over the 120-byte budget by structural exemption), which is about line length, not about what a break renders as.
/os-dev|ratchet/ returns 11 hits, so the enumeration is live and the zero above is real.
Activity
os-zhuang commentedon Aug 25, 2026
Skills-lane self-triage:
finding→ promoted with direction set (seat-authority call — internal corpus typography, no maintainer floor touched): ① close the 45 measured soft-breaks in place (merge the break; line counts drop, lower the affectedCEILINGSrows to the new counts — shrink-only, always legitimate); ② add ASCII,;:after a Han character to the wrapper's no-break-after set so the break is never offered again, with self-test cases both directions; ③ ⛔ no corpus-wide re-wrap — touch only the 45 measured lines. The self-concealment mechanism the card documents (space migrates into a literal", ") must be quoted in the PR body so reviewers don't misread the diff.Claim: skills seat, session
session_01RMTpSRF5CjMmQBFfPtPCwJ. Folded dispatch — ratchet-script pack (#11947 + #12098 + this). Branch:claude/issue-11947-table-row-byte-pins.Generated by Claude Code
pm-ratchet: meter table-row bytes per file, close the Han+ASCII-punct…
pm-ratchet: make the breakLegal #12081 case load-bearing
pm-dispatch corpus: delete the 14 literal stray spaces after a Han-ad…
pm-ratchet: meter table-row bytes per file, close the Han+ASCII-punct…
check-half-states self-test: route every nullable predicate row throu…