Skip to content

[finding] The #11106 mechanical re-wrap left 45 soft breaks sitting after an ASCII comma between Chinese clauses — each renders as a stray mid-sentence space #12081

Closed

Description

@os-zhuang

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

⚠️ It is invisible in the source and visible in the render — the inverse of the usual reading. Every reviewer reads these files as source, where the break looks like ordinary wrapping; the space only exists for the agent that reads the rendered text. That is the whole population these files are written for.

⭐ 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

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.

⚠️ Positive control, and it is load-bearing: a first pass at this scan returned 5 issues total and 0 control hits — the concatenated-pages JSON was being mis-split, and the zero was an artifact of a dead instrument, not a fact about the backlog. Re-run with each page parsed separately, the control /os-dev|ratchet/ returns 11 hits, so the enumeration is live and the zero above is real.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Aug 25, 2026
  2. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    ContributorAuthor

    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 affected CEILINGS rows 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

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 25, 2026
  4. self-assigned this
    on Aug 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions