Skip to content

pm-ratchet: cap ceilinged lines at 120 bytes, re-wrap the legacy corpus, re-pin the map - #11948

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-11106-ratchet-line-length
Aug 25, 2026
Merged

pm-ratchet: cap ceilinged lines at 120 bytes, re-wrap the legacy corpus, re-pin the map#11948
hotlong merged 1 commit into
mainfrom
claude/issue-11106-ratchet-line-length

Conversation

@claude

@claude claude Bot commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Fixes #11106

The line ratchet counts lines while its own docblock states it is pricing a per-session token read — and tokens track bytes. The card measured the gap: one PR grew references/platform-readings.md 16,953 → 22,559 bytes (+33%) at a flat 134/134 line count, green on every run, with no ceiling raised and nothing in the gate able to see it.

Maintainer ruling 2026-08-23 (option B), recorded verbatim and untranslated in comment 5386683155:

「10950 不考虑存量,其他接受你的建议」

Ruled: a max-line-length rule (~≤120 bytes/line) on the ceilinged files, a one-off re-wrap of the existing long lines, and the ratchet-table sync — not a parallel byte/token ratchet (A), not a disclaimer-only docblock edit (C). The rider from the analysis — measure the other ceilinged files' byte drift in the same pass — is at the bottom of this body.

Governed surface: .claude/** + AGENTS.md. Draft, human merge. Not ready-flipped, no auto-merge.


1. The rule — 120 bytes, and why that number

scripts/pm/check-skill-line-ratchet.mjs now checks every line of every file in its CEILINGS table against a 120-byte budget, alongside the existing per-file line ceiling.

120 is the corpus's own upper bound, not a new house style. Measured over the 4,028 lines of the pre-change corpus: 34 lines land at exactly 120 bytes, and the two wrap conventions already in use both sit under it — ASCII prose wraps at ≤91 bytes (~88 columns) and CJK prose at ≤120 bytes (50–60 characters, ~100–120 display columns, a CJK character being 3 bytes and 2 columns wide). 120 is the one number both conventions already satisfy, so the rule codifies what the careful authors were doing instead of reflowing the corpus to an invented width. Bytes rather than characters or columns, because bytes is what the header prices.

The exemptions live in the RULE, and there is no allowlist

A length rule that can demand an illegal wrap is worse than no rule — it teaches authors to break a table, split a fence, or wrap a 行锚定 directive whose whole contract is that a grep finds it at a line start. Every exemption is therefore derived from the line's own syntax. There is deliberately no exemption registry and no per-file allowlist: a list of blessed long lines is exactly the ratchet-expanding remedy #8435 keeps out of an author's reach, and it would rot.

class what it exempts why
fence fenced code blocks, fence lines included a wrapped fence is a different program
table markdown table rows a wrapped | row is a different table
heading ATX headings a heading has no continuation line
frontmatter YAML front matter a scalar is not markdown prose
anchored line-anchored Blocked-by: / Restart-when: / Restart-touch: / Unlock-when: 行锚定 — the contract IS that a grep finds it at a line start
blockquote blockquote lines its continuation must repeat >, so wrapping inserts a non-whitespace byte into a quotation
quotation lines inside a MULTI-line 「…」/『…』 verbatim ruling the quote already spans lines as its author broke it; moving the break moves phrases across it
unbreakable lines with no legal break point (bare URL, long path, one long code span) wrapLine returns them unchanged — the gate never demands a wrap it cannot itself produce

Two of those were found by running the re-wrap and reading what broke, not designed up front, and both are declared as judgment calls the reviewer can reverse in one predicate each:

  • blockquote — the re-wrap's content-identity proof went red on three files because a blockquote continuation needs a >. Wrapping would have edited verbatim maintainer rulings. Cost: 10 lines stay long.
  • quotation — an earlier cut split 「我们是一个创业项目,…」 across two lines and turned check-skill-frame-sync's self-test red: a phrase inside a governed quotation stopped being findable on one line. A soft break does not change what a reader sees, but it does change what a matcher sees, and quoted rulings are the text most likely to be matched. Cost: 68 lines stay long.

A quote that fits on one line is not exempt — it is an atom instead, so surrounding prose still wraps around it intact.

What a wrap may move

Only whitespace: a space becomes a newline, or a newline is inserted between two East Asian characters (a segment break there is removed by the CSS segment-break transformation rules, which is why the corpus already wraps CJK prose mid-run). No break is offered at a CJK↔Latin junction without a space, because that one would render as a space. Inline code spans, links, autolinks, URLs and single-line 「…」 quotes are atoms — never broken into. A continuation line is never allowed to begin with a sequence markdown reads as a new block.

Self-test

--self-test goes 26 → 71 cases, with a red/green pair for the rule and for each exemption class — every exemption case carries a RED twin in a non-exempt shape, so a case can only pass by the rule actually discriminating:

✓ check-skill-line-ratchet self-test: 71 cases pass.

2. The legacy re-wrap — 555 lines, zero content changes, proved per file

The re-wrap tool imports classifyLine / wrapLine / advanceState from the gate itself, so the re-wrap and the rule it satisfies cannot disagree. Two equality proofs run per file, and the tool refuses to write a file that fails either:

  1. whitespace-stripped byte identity — every non-whitespace character unchanged, in the same order, so the only thing that changed is whitespace;
  2. inline code-span sequence identity — the whole-file sequence of `…` spans byte-identical, which is what protects every path, every Blocked-by: #N, and check-governed-prose's code-span scan.

3. Per-file arithmetic, ceiling sync, and the equality proof

Counts against origin/main. Every raise is the mechanical consequence of wrapping, and headroom is 0 on every row. landing-operations.md moved the other way (82 → 80, its standing headroom locked in); six files were already within budget on every line and did not move at all.

file lines before → after Δ ceiling bytes longest line B (before → after) equality proof exempt long lines
.claude/skills/pm-dispatch/SKILL.md 666 → 1008 +342 pinned 1008 78376 → 78919 824 → 765 ws-identical + spans-identical quotation×42 table×23 blockquote×4 unbreakable×1
.claude/skills/pm-dispatch/references/dispatch-runbook.md 242 → 274 +32 pinned 274 20480 → 20554 172 → 171 ws-identical + spans-identical quotation×18
.claude/skills/pm-dispatch/references/state-machine.md 43 → 43 +0 pinned 43 3408 119 → 119 untouched
.claude/skills/pm-dispatch/references/contract-review.md 44 → 48 +4 pinned 48 3320 → 3331 132 → 120 ws-identical + spans-identical
.claude/skills/pm-dispatch/references/decision-analysis.md 38 → 48 +10 pinned 48 3072 → 3087 140 → 135 ws-identical + spans-identical quotation×5
.claude/skills/pm-dispatch/references/platform-readings.md 130 → 315 +185 pinned 315 29660 → 30153 1437 → 120 ws-identical + spans-identical
.claude/skills/pm-dispatch/references/rest-channel.md 46 → 87 +41 pinned 87 6718 → 6817 714 → 129 ws-identical + spans-identical unbreakable×1
.claude/skills/pm-dispatch/references/review-checklist.md 82 → 84 +2 pinned 84 7944 → 7949 270 → 119 ws-identical + spans-identical
.claude/skills/pm-dispatch/references/landing-operations.md 80 → 80 +0 lowered to 80 6140 117 → 117 untouched
.claude/skills/pm-dispatch/references/release-aftercare.md 58 → 58 +0 pinned 58 4109 119 → 119 untouched
.claude/skills/pm-dispatch/references/seat-post-protocol.md 101 → 105 +4 pinned 105 9074 → 9086 181 → 119 ws-identical + spans-identical
.claude/skills/pm-dispatch/references/lanes/engine.md 40 → 40 +0 pinned 40 2612 118 → 118 untouched
.claude/skills/pm-dispatch/references/lanes/services.md 30 → 30 +0 pinned 30 1762 115 → 115 untouched
.claude/skills/pm-dispatch/references/lanes/cli.md 35 → 35 +0 pinned 35 2117 120 → 120 untouched
.claude/skills/pm-dispatch/references/lanes/devx.md 37 → 39 +2 pinned 39 2633 → 2639 162 → 119 ws-identical + spans-identical
.claude/skills/pm-dispatch/references/lanes/skills.md 35 → 35 +0 pinned 35 1998 116 → 116 untouched
.claude/skills/pm-dispatch/references/lanes/spec.md 43 → 46 +3 pinned 46 2663 → 2671 184 → 120 ws-identical + spans-identical
.claude/skills/pm-dispatch/references/lanes/hotcrm.md 44 → 57 +13 pinned 57 3800 → 3831 224 → 224 ws-identical + spans-identical blockquote×2 anchored×1 quotation×2
.claude/agents/os-dev.md 405 → 470 +65 pinned 470 35845 → 36017 182 → 170 ws-identical + spans-identical quotation×1 unbreakable×1
.claude/skills/checklist-test/SKILL.md 232 → 238 +6 pinned 238 14965 → 14973 221 → 221 ws-identical + spans-identical table×6
.claude/skills/checklist-author/SKILL.md 61 → 62 +1 pinned 62 3856 → 3860 121 → 119 ws-identical + spans-identical
.claude/skills/dogfood-verification/SKILL.md 155 → 157 +2 pinned 157 10951 → 10965 126 → 125 ws-identical + spans-identical unbreakable×2
.claude/skills/spec-property-retirement/SKILL.md 334 → 337 +3 pinned 337 24452 → 24460 328 → 328 ws-identical + spans-identical table×6 blockquote×1
AGENTS.md 961 → 1149 +188 pinned 1149 82233 → 82864 2092 → 1081 ws-identical + spans-identical blockquote×3 table×11 unbreakable×1
CLAUDE.md 86 → 86 +0 pinned 86 5264 91 → 91 untouched

Totals: 25 files · 555 lines re-wrapped · line delta +903 · bytes 367,452 → 369,586 (+2,134, +0.58% — the inserted newlines and list-continuation indents, which is precisely what "whitespace-only" costs) · all equality proofs pass.

How to read the jumps. The pre-change numbers are not comparable to these. A line that used to hold 400–830 bytes is now three to seven lines holding the same bytes; 666 → 1,008 is not slack, it is the same text measured in a unit that finally means something. Headroom is 0 on every row, and each line is now capped at 120 bytes — which is what makes the count track the token read the header prices.

133 lines remain over budget, all structurally exempt: quotation×68, table×46, blockquote×10, unbreakable×6, fence×2, anchored×1. Table rows are the largest remaining unmetered channel (the five longest surviving lines are all table rows, topping out at 1,081 bytes in AGENTS.md) and are filed as a separate finding — see below.

4. Rider from the ruling: byte drift across the whole ceilinged corpus

"Measure the other ceilinged files' drift in the same pass (it falls out for free)." Bytes at the commit where each ceiling was last set (derived by replaying the gate script's own history and reading each CEILINGS value at each commit) against bytes on origin/main:

file ceiling set ceiling lines then → on main bytes then → on main byte drift the ratchet could not see
…pm-dispatch/references/lanes/hotcrm.md 2026-08-24 44 44 → 44 2982 → 3800 +818 (+27.4%)
…pm-dispatch/references/state-machine.md 2026-08-23 43 43 → 43 3134 → 3408 +274 (+8.7%)
…pm-dispatch/references/dispatch-runbook.md 2026-08-23 242 242 → 242 19442 → 20480 +1038 (+5.3%)
…pm-dispatch/references/review-checklist.md 2026-08-21 82 82 → 82 7670 → 7944 +274 (+3.6%)
AGENTS.md 2026-08-21 961 961 → 961 80901 → 82233 +1332 (+1.6%)
.claude/agents/os-dev.md 2026-08-23 405 405 → 405 35375 → 35845 +470 (+1.3%)
…pm-dispatch/SKILL.md 2026-08-23 666 666 → 666 77695 → 78376 +681 (+0.9%)
…pm-dispatch/references/seat-post-protocol.md 2026-08-21 101 101 → 101 8991 → 9074 +83 (+0.9%)
…pm-dispatch/references/landing-operations.md 2026-08-21 82 82 → 80 6253 → 6140 −113 (−1.8%)
the other 16 files 2026-08-21 → 08-24 flat flat +0 (0.0%)

The answer to the card's open question is yes. Eight files grew in bytes at a perfectly flat line count, one of them by 27.4%, every one of them green on every run — the same silent mechanism the card reported for platform-readings.md, confirmed across the corpus. And the windows are days, not weeks: every ceiling in the map was set between 2026-08-21 and 2026-08-24, which makes +27.4% in that span sharper evidence, not softer. platform-readings.md reads +0% only because its ceiling was re-pinned on 08-24, after the incident this card reports.

Verification

Reverse verification — plant, prove on disk, read the gate's own verdict, restore. The on-disk probe is anchored on the text being changed in both directions, and it earned its keep: the first attempt used a hand-written anchor that was not in the file, the probe reported joined=0 and the run was discarded rather than re-tried until something landed.

leg on-disk probe gate verdict line
0 baseline joined=0 continuation-at-line-start=1 max=115B exit 0 ✓ … services.md is 30 lines (ceiling 30; headroom 0).
1 mutate (join a wrapped pair into one 209B prose line) joined=1 continuation-at-line-start=0 max=209B exit 1 ✗ … services.md has 1 line(s) over the 120-byte budget: L12 (209B).
2 control (the SAME line in an exempt shape — blockquote) blockquoted=1 bare-joined=0 exit 0 ✓ … services.md is 29 lines (ceiling 30; headroom 1).
3 restore joined=0 continuation-at-line-start=1 max=115B exit 0 ✓ … services.md is 30 lines (ceiling 30; headroom 0).

Leg 1 is worth reading twice: on the mutated tree the line ratchet went green with headroom 1 while the new rule went red. Fewer lines, more bytes, old control blind — the drift this card is about, reproduced on demand.

Derived gate unionnode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (no path args; 160 families discovered, 19 matched). All 19 run green, plus check:ratchet-remedy-authority run explicitly. Exit codes captured before any pipe; each line is the gate's own verdict.

gate exit verdict
check:pm-skill-ratchet 0 ✓ check-skill-line-ratchet self-test: 71 cases pass. + 25 file rows, all headroom 0
check:skill-frame-sync 0 ✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files
check:pm-governed-prose 0 ✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces
check:pm-skill-id-lint 0 ✓ check-skill-id-lint: 22 file(s) clean (pattern /#[0-9]{3,}/g).
check:pm-governed-merges 0 ✓ check-governed-merges --self-test: 129 assertions
check:nul-bytes 0 check-nul-bytes: OK (scanned 6650 text file(s) … no raw ASCII control bytes).
check:agent-model-declared 0 ✓ check-agent-model-declared: 1 agent definition(s) … all declare a model
check:agent-test-spelling 0 ✓ check-agent-test-spelling: 0 violations — 364 file(s)
check:doc-authoring 0 ✓ doc authoring guard: 389 files clean
check:docs-audit-scope 0 ✓ release-owned pages are in scope and read-only
check:entry-guard 0 ✓ check:entry-guard: 154 scripts/ file(s)
check:parse-guard 0 ✓ check:parse-guard: 153 scripts/ file(s)
check:pnpm-filter-targets 0 ✓ check:pnpm-filter-targets: 135/168 --filter occurrence(s)
check:required-contexts (×2 spellings) 0 ✓ check-required-contexts: 6 required context name(s) pinned
check:cross-package-test-inputs (×2) 0 OK: 16 package(s) read outside themselves, all declared
check-ci-filter-parity 0 OK: all 96 declared cross-package glob(s) … covered
check:doc-formula-expressions 0 ✓ … 9 @example(s) judged clean across 1001 packages/spec/src files
check:ratchet-remedy-authority 0 OK … 138 scripts swept (scripts/*.{mjs,mts}); 8 mark the expanding remedy ⛔ MAINTAINER-ONLY, 5 turn it down outright, 125 hand out no ratchet-expanding remedy.

Green union run at 117fc0bd, the final commit.

On check:ratchet-remedy-authority. It did not appear in the derivation (consistent with #11935) and it does not reach this script either way: its corpus is scripts/*.{mjs,mts}, non-recursive, and this gate lives in scripts/pm/. Run explicitly regardless, and it neither flags this file nor reports it UNCLASSIFIED — 138 scripts swept, none of them this one. Independently of that: the new failure text offers no registry-expanding remedy to mark. Its remedy is "wrap the line"; the exemptions are structural predicates, not a list, and the message says so in terms (there is no allowlist to add a line to), which is a self-test case. The pre-existing ceiling-raise remedy in the ratchet's other message is untouched by this PR.

ESLint — the repo-wide sweep is CI's run; the local run is a declared narrowing, with all three readings:

  1. Receptacle read from ESLint's own config, not guessed: running ESLint on the changed .md files returns File ignored because no matching configuration was supplied — markdown is outside the population. The only file in this diff ESLint judges is scripts/pm/check-skill-line-ratchet.mjs.
  2. Count read from --format json: 1 file linted, 0 errors, 0 warnings.
  3. Invariance for untouched files: eslint.config.mjs never enables type-aware linting (its own docblock, verbatim: "this repo runs one eslint.config.mjs, which never enables type-aware linting (no parserOptions.project, no typed @typescript-eslint rules) for ANY file, test or not"), so nothing in this diff can move an untouched file's verdict.

Not touched: the published skills/ catalog. This diff is .claude/** + AGENTS.md + scripts/pm/** only, so the published-catalog line-budget clause does not apply and no two-reading report is owed. The gate's header boundary — the published root is deliberately outside the ceiling, and extending it is a policy change needing its own ruling — is unchanged and still pinned by its self-test case.

Changeset: none. .claude/** + scripts/pm/** publish nothing; skip-changeset applied.

Out-of-scope finding filed


Generated by Claude Code

…us, re-pin the map (#11106)

The line ratchet counted LINES while its header prices a per-session token
read; tokens track bytes. Measured: one green 134/134 run grew
platform-readings.md 16,953 -> 22,559 bytes (+33%) with nothing able to see
it. Maintainer ruling 2026-08-23 (option B).

- rule: a max-line-length check (120 bytes) over every CEILINGS file, with
  STRUCTURAL exemptions (fence, table, heading, front matter, line-anchored
  Blocked-by:-family directives, blockquotes, multi-line verbatim ruling
  quotes, and lines with no legal break point) and no allowlist an author can
  add a line to.
- legacy re-wrap: 555 over-long lines re-flowed, content proved byte-identical
  after whitespace normalization and code-span-sequence identical per file.
- ratchet sync: 18 ceilings re-pinned to the post-wrap counts, one lowered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RMTpSRF5CjMmQBFfPtPCwJ
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 25, 2026
@github-actions github-actions Bot added size/xl documentation Improvements or additions to documentation labels Aug 25, 2026
@hotlong
hotlong marked this pull request as ready for review August 25, 2026 03:13
@hotlong
hotlong added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit ef786a5 Aug 25, 2026
32 checks passed
@hotlong
hotlong deleted the claude/issue-11106-ratchet-line-length branch August 25, 2026 03:29
os-trump pushed a commit that referenced this pull request Aug 25, 2026
…ut, 1150 -> 1158

The branch's original raise (961 -> 969) was measured against the pre-#11948
layout and was dissolved by the merge. Re-measured on current main: AGENTS.md
is 1150 there and 1158 with the mirror re-sync applied, so the honest cost is
again +8 -- published block 11 -> 17 lines, prose paragraph 4 -> 6.

The maintainer's option-C1 ruling is quoted verbatim and untranslated beside
the value, per the map's convention.

Gate reads at the new value:
  check-skill-line-ratchet: AGENTS.md is 1158 lines (ceiling 1158; headroom 0).
  check-skill-line-ratchet self-test: 71 cases pass.
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 1, 2026
…nt (objectstack-ai#11908)

* feat(gates): ratchet AGENTS.md's published spellings list to the constant

`scripts/check-cross-package-test-inputs.mjs` is a source scan: a path spelling
it does not know produces no flag, so a test whose reads escape its package goes
undeclared silently. That is why its recognised set is published in AGENTS.md
rather than left in the implementation -- and nothing compared the two copies.

The mirror drifted three times (objectstack-ai#10163, objectstack-ai#10854, and this one). Twice the stale
line was the stated REASON FOR A PROHIBITION, so a rotting mirror does not
merely misinform: it launders an obsolete rule into a live one. And one claim
was already false BEFORE the PR that supposedly staled it, so a lag-only check
would not have caught it either.

Adds `scripts/check-published-list-mirrors.mjs`, which asserts line-for-line
EQUALITY between a declared constant and the block a document publishes:

- equality, not containment -- a comment-only drift is invisible to containment,
  and the comments are where the prohibitions live;
- the block is located by heading + fence, never by line number (this card was
  filed against `AGENTS.md:96-106`; the block sat at `:92-104` three days later);
- every unreadable state REFUSES: renamed heading, duplicate heading, re-tagged
  fence, unterminated fence, empty block, two candidate fences, and a constant
  that is missing, renamed, empty or not a string list;
- it can only ever go RED. AGENTS.md is governed, human-merge-only, so the gate
  never repairs -- it prints the exact block to paste. Stated in its header.

Repairs the published block in the same change: it was short by 13 of the
constant's 24 lines, including the two `findUp` ANCHOR seeds PR objectstack-ai#10852 added,
and the lead-in prose named only two of the three seed kinds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx

* fix(gates): publish the spellings, not the failure box's notes

Two standing rulings on AGENTS.md govern what a mirror may put there, and a
byte-identical copy of the whole constant breaks one of them outright:

- the shrink-only line ceiling (`check-skill-line-ratchet`), and
- "operative text carries lessons self-contained ... numbers go"
  (maintainer ruling 2026-08-12, `check-skill-id-lint`).

The constant is the text of a CLI failure box: spellings (code, each with the
comment that annotates it) plus free-standing NOTE PARAGRAPHS set off by blank
entries, two of which carry issue-ID citations. Publishing all 24 lines put
those citations into the instruction surface and check:pm-skill-id-lint went
red -- the gate meant to keep the document honest would have broken the
document's own prose standard.

So the mirror judges a projection with no judgement in it: an entry is
PUBLISHED unless it is blank, or it is a comment line that no published entry
directly precedes. A comment continuing a spelling travels with that spelling;
a note paragraph standing alone stays in the failure box. Every spelling is
code, so no spelling can hide from it.

24 entries project to 17 published lines, zero issue-ID citations, and the
published block grows 11 -> 17: the two `findUp` anchor seeds, the ⛔ manifest
prohibition that qualifies them, and the `-> repo root` annotation.

A self-test case now pins the citation property against the live constant, so
an issue number added to a spelling line goes red HERE, naming the ruling,
instead of landing in AGENTS.md.

check:pm-skill-id-lint: 22 file(s) clean. check:pm-skill-ratchet is red by 8
lines (969 vs 961) and needs a maintainer ruling -- see the PR body.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx

* chore(ratchet): raise the AGENTS.md ceiling 961 -> 969 per the maintainer ruling

The one-line follow-up PR objectstack-ai#11908's body pre-wrote: the published-spellings
mirror re-sync costs +8 lines, lossless rewrap headroom measured 0, and the
mirror is now mechanically enforced. Maintainer ruling 2026-08-25, verbatim:
「同意,帮我合并,然后继续」 (option A as presented in the PM-chat batch
review; provenance on PR objectstack-ai#11908).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H9StxQgG2DPA26XzZZqnJB

* chore(ratchet): re-measure the AGENTS.md ceiling on the reflowed layout, 1150 -> 1158

The branch's original raise (961 -> 969) was measured against the pre-objectstack-ai#11948
layout and was dissolved by the merge. Re-measured on current main: AGENTS.md
is 1150 there and 1158 with the mirror re-sync applied, so the honest cost is
again +8 -- published block 11 -> 17 lines, prose paragraph 4 -> 6.

The maintainer's option-C1 ruling is quoted verbatim and untranslated beside
the value, per the map's convention.

Gate reads at the new value:
  check-skill-line-ratchet: AGENTS.md is 1158 lines (ceiling 1158; headroom 0).
  check-skill-line-ratchet self-test: 71 cases pass.

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants