Skip to content

[finding] 8 residual #12081-class soft breaks remain in .claude/agents/os-dev.md — each renders as a stray mid-sentence space in the file every dispatched dev reads #12891

Description

@os-litant

Recording only — unassigned. Measured while landing the skip-changeset-at-birth edit
(PR #12890, 2026-08-28), on a tree at 8b02f78c7.

The measurement

check-skill-line-ratchet.mjs refuses to OFFER a break directly after an ASCII , ; :
that follows a Han character (hanAsciiPunctTail), because such a break is not between two
wide characters and so survives the CSS segment-break transformation — it renders as a
space, mid-sentence, in prose that has no spaces anywhere else. That channel was shut at
its source, and the pre-existing breaks were left to be paid down opportunistically, file
by file (the ceiling comment on references/decision-analysis.md records three of them
merging back).

.claude/agents/os-dev.md still carries 8, at lines 15, 32, 87, 99, 245, 356, 361, 454
(post-PR-12890 numbering). Reproduce:

node -e 'const fs=require("node:fs");const HAN=/\p{Script=Han}/u;
const L=fs.readFileSync(".claude/agents/os-dev.md","utf8").split("\n");
const out=[];for(let i=0;i<L.length-1;i++){const t=L[i],a=t[t.length-1],b=t[t.length-2];
if(/[,;:]/.test(a)&&b&&HAN.test(b)&&L[i+1].trim()!=="")out.push(i+1);}
console.log(out.length,out.join(","));'

Why it is worth a row rather than a shrug

The defect is invisible in the source and visible only in the render, which is the inverse
of the usual reading: a reviewer reads this file as source, where the break looks like
ordinary wrapping, while the space exists only for the agent reading the RENDERED text —
and that population is every dispatched dev, once per run. This is the most-read agent
definition in the repo.

Cost, and the one trap in paying it

Cheap but not free: the file sits at 470/470 with headroom 0, so merging a break back
into its paragraph must be re-wrapped canonically and can only shrink or hold the line
count (shrinking lets the ceiling come down with it — always legitimate).

⚠️ The paydown is SELF-CONCEALING under review, and the gate's own docblock says so: a
faithful re-wrap must PRESERVE the rendered space, so it migrates out of the line break and
into a literal ", " in the source, and then looks like the re-wrap introduced a space. It
did not — it only made an existing render visible. The honest fix for prose like
必要不充分: | 实测 is to drop the space entirely (the author never wrote one), which is
what the PR above did for the two breaks inside the passage it re-flowed. Judge each site;
do not batch-convert.

Lineage

The class was found and shut in #12081; the already-literal variant of the same stray space
was recorded in #12265. Neither is open, and neither tracks this file's remaining count —
which is why this is a row rather than a comment on those.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions