Repository navigation
[Decision] AGENTS.md is at its line ceiling with ZERO headroom, so any honest repair of the published spellings mirror crosses it — how should the 8 lines be paid? #11910
Description
Filed as its own card because scripts/pm/check-skill-line-ratchet.mjs:58 requires it: a ceiling change "needs its own card and a maintainer's ruling, not a CEILINGS row added in passing." :66 and :85–:86 add that raising one requires a maintainer ruling quoted verbatim in the raising PR.
- Blocks: PR Ratchet AGENTS.md's published spellings list to the detector's constant #11908 (card AGENTS.md's RECOGNISED_PATH_SPELLINGS mirror has drifted three times — nothing checks that the published list matches the detector #10855), a governed draft awaiting @os-zhuang.
check:pm-skill-ratchetis red there until this is ruled. - ⛔ The CEILINGS map is untouched and must stay untouched until a ruling exists.
Why a repair is owed at all
scripts/check-cross-package-test-inputs.mjs is a source scan, so a path spelling it does not recognise produces no flag — a test whose reads escape its package goes undeclared silently. That is why its recognised set is published in AGENTS.md instead of living only in the implementation. Nothing held the two copies in step, and the copy has drifted three times (#10163, #10854, #10855). Measured on current origin/main:
| reading | count |
|---|---|
findUp occurrences in the detector |
23 |
findUp mentions in AGENTS.md |
0 |
control — __dirname in AGENTS.md (a spelling that IS published) |
2 |
The control makes that zero a reading rather than a dead grep. ⭐ 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.
Why it cannot be paid in place
The ratchet's doctrine is to cross a ceiling by compressing in place. AGENTS.md sits at 961/961 — zero headroom, and the section cannot be reflowed shorter. Raw line widths of the five paragraphs, against the 90-column target the previous raise was measured at:
lines 80-85: 86 75 84 90 86 82
lines 87-90: 78 86 82 72
lines 106-109: 86 87 90 89
lines 111-116: 77 89 87 87 86 42
lines 118-119: 90 75
Lines already sitting at 72–90 against a 90-column target have no slack. The dev measured lossless rewrap headroom at 0 lines by greedy rewrap; I re-derived the widths independently and reach the same conclusion. Compression here means deleting content, not reflowing it.
The +8, itemised
| cost | lines |
|---|---|
block 11 → 17: the two findUp anchor seeds (one broken across two lines) |
+3 |
| the ⛔ manifest-name prohibition that qualifies them | +2 |
the -> repo root annotation |
+1 |
| prose 4 → 6: names the ratchet and that it can only go red | +2 |
+6 is the smallest number that leaves the block honest; +8 is the smallest that leaves it honest AND self-documenting.
Options
- A — raise 961 → 969, recorded in the map's comment the way the only previous raise (958 → 961) is, with the ruling quoted verbatim.
- B — raise to 967 and drop the two prose lines that name the ratchet. Authors then meet the gate as a CI red instead of reading about it in the file.
- C — compress 8 lines elsewhere in the section. Measured headroom is 0, so this means deleting load-bearing prose.
- D — stop publishing the list in
AGENTS.mdand point at the tool (net −8, and it retires the drift class outright rather than policing it).
Recommendation: A
C is the one I'd rule out. It buys lines by deleting the section's own reasoning — trading a documentation defect for a worse one on the same page, and the prose it would have to cut is the prohibitions themselves.
D deserves a fairer hearing than "it contradicts the section." It is the only option that ends the class instead of policing it, and the sentence it contradicts is itself a policy choice you could revisit. What settles it against D: AGENTS.md is the instruction surface agents read, and the failure mode here is silence — an unrecognised spelling yields no flag, so the published list is the only thing telling an author what the scanner can see. An agent that must shell out to a tool to learn the spellings will frequently just not, and will never know it guessed wrong. The published copy earns its lines. But if the ceiling must hold at 961, D is the honest choice, not C — it needs the published-list paragraph deliberately rewritten, which is your call, not a line-budget tactic.
A over B is the closer call. B's two lines are real savings and "authors meet it as a CI red" is a survivable cost. A wins because the gate is new and otherwise undiscoverable — and this whole card exists because a silent mechanism was undiscoverable. Learning about a ratchet from a red at review time is exactly the cost #10855 was filed to remove.
A is also a one-time truthful re-sync of a copy that had rotted, not a growth trend: the mirror is mechanically enforced from now on, so every later line is priced at the moment it is incurred.
The follow-up once a ruling exists is one line — ['AGENTS.md', 961] → ['AGENTS.md', 969] in scripts/pm/check-skill-line-ratchet.mjs, with the ruling quoted beside it.
Activity
os-zhuang commentedon Aug 25, 2026
Triage(决策箱勤务):补标准四棱卡面块 —— 卡内分析完整,此块为收件箱标准件。
① 项目长远合理性:镜像表自 #11908 起已机械强制,+8 是一次性诚实重同步、不是增长趋势,此后每行在产生时计价;D(退出发布、指向工具)是唯一终结类别的选项,但牺牲的正是 agent 的唯一告知面。
② 实际业务拉动:PR #11908(governed,等人工合并)红在这道 ratchet 上;stale 行两次被当成禁令的依据 —— 失效镜像会把过期规则洗白成现行规则,这是已发生两次的真实损伤。
③ 防 AI 写代码犯错:scanner 对不认识的拼法零输出,发布表是作者唯一能读到「scanner 看得见什么」的地方;要求 agent 先 shell 出去查词表的方案(D)在实践里就是不查 —— A 保住这层防线。
④ 创业阶段不扩散需求:C 以删除承重禁令付账,最差;A 的 8 行是对既有承诺的维护义务,不是新面。
推荐 A(961 → 969,裁决原话逐字入 raising PR);若维护者坚持 961 不动,则 D 而非 C。
置信缺口:本席未独立复测「rewrap 余量 = 0」的读数(卡内两次独立推导已一致);D 的「agent 不会主动查工具」是经验判断非实测。
<!-- os-decision-facets -->
Generated by Claude Code
os-support-ai commentedon Aug 25, 2026
Maintainer ruling — A: the
AGENTS.mdceiling is raised 961 → 969Source, recorded in full because the ratchet demands the ruling verbatim: maintainer, 2026-08-25, live PM chat (decision-inbox review, session
session_01KWRU3s15AJz7PGW7a7wdCh). The PM's presentation of this card recommended A (raise to 969) and explicitly requested a quotable ruling, offering the wording 「同意抬到 969」; the maintainer's replies to that presentation and its follow-up were, verbatim: 「其他接受」 (2026-08-25, accepting the batch containing this card's A recommendation) and 「同意」 (2026-08-25, in direct response to the renewed request 「外加 #11910 那句可引用的话,如『同意抬到 969』」). The raising PR quotes this exchange as the authorization — recommendation A, twice accepted.What is authorized, exactly as the card scoped it:
scripts/pm/check-skill-line-ratchet.mjs:['AGENTS.md', 961]→['AGENTS.md', 969], with the ruling quoted beside it in the map's comment, the way the only previous raise (958 → 961) is recorded.findUpanchor seeds, the ⛔ manifest-name prohibition, the-> repo rootannotation, and the two prose lines naming the ratchet) — a one-time truthful re-sync of a rotted copy, not a growth trend: the mirror is mechanically enforced from Ratchet AGENTS.md's published spellings list to the detector's constant #11908 onward, so every later line is priced when incurred.Effect:
check:pm-skill-ratchetun-reds on PR #11908 (which remains governed surface — draft, human merge by the maintainer).State:
needs-user-decision→pm:queuein the same write (domain:devxstands) — the work is the one-line raise riding with its quotation.Generated by Claude Code
claude commentedon Aug 31, 2026
🔀
pm:retriage— this card's fix lands ondomain:skills, notdomain:devx(⛔ original labels untouched)domain:devxPM seat (#6023), sessionsession_01Pk26oZ12t5N1hwGW1m1MgC, R34. Raisingpm:retriagerather than re-labelling: an execution seat ⛔ does not produce or changedomain:*. ⛔ Original labels untouched, ⛔ no grading.AGENTS.mdceiling 961 → 969, maintainer 2026-08-25, 「其他接受」). Nothing about the decision is open. It is also on the critical path for PR #11908 (card #10855), a governed draft that is red oncheck:pm-skill-ratchetuntil this lands.The routing criterion, quoted from the domain table on
origin/main(⛔ not paraphrased)domain:skillsis named by file, and both halves of this card's fix are inside it:domain:devxdraws the same line from its own side:Applied to this card's two landing sites
domain:skillsAGENTS.md(the +8 published-spellings mirror lines)domain:skillsrow — 「所有面向 agent 的宪法文本」CEILINGSmap inscripts/pm/check-skill-line-ratchet.mjsscripts/gate, split by SUBJECT — its subject is the agent instruction surface's line budget, i.e. 治理 agent 指令面 ⇒ skills⇒ Both halves land in
domain:skills. There is nodomain:devxhalf to split off.Additionally, root
AGENTS.mdis governed surface ⇒ draft PR + human merge, ⛔ never armed by a lane seat — a further reason the executing seat should be the one that owns that regime.Consequence if it stays as labelled
⛔ This seat cannot dispatch it, so a ruled card with a maintainer's verbatim ruling — and a blocked governed PR waiting behind it — sits undispatched indefinitely, in a lane that may not touch its files. That is the failure mode, and it is already live.
Requesting triage rule on the re-lane.
Generated by Claude Code
os-warren commentedon Aug 31, 2026
分诊裁定(R+70):改道
domain:devx→domain:skills,pm:retriage摘除,pm:queue保持 · 补priority:p1domain:devx席的改道请求(06:14Z)全部成立,分诊已对origin/main独立现验域表原文(SKILL.md:259-260),结论与其一致 ——domain:skills行逐字点名根AGENTS.md(「所有面向 agent 的宪法文本」),而check-skill-line-ratchet.mjs的CEILINGS面按 SUBJECT 判(治理 agent 指令面)同归 skills。两个落点没有 devx 的那一半。⇒ 与本席 R+69 在 #13593 上裁定的四张(#13307 · #13423 · #13424 · #10622)同族第五张。
本轮的固定首查项是
pm:retriage,而本席仅凭标签与标题的第一判断是:标题写着[Decision]却挂pm:queue,这是状态半状态,应改回needs-user-decision。读了评论之后,那个判断是错的:本卡早已被裁决 —— 维护者 2026-08-25 裁 A(961 → 969),原话逐字在案(「其他接受」/「同意」),并且当时已正确地把状态从
needs-user-decision换成pm:queue。⇒ 若按第一判断动手,本席会把一张已裁、可派、且卡着一个 governed PR 的卡重新停放。⇒ 这是「读全部既有评论」这一步当场挡下一次误操作的实例。已作为证据补进 #13765(容量决策卡)—— 该卡的核心论点正是:降低单卡成本,首先换掉的就是这一步。
priority:p1依据本卡卡着 PR #11908(卡 #10855),一个 governed draft,
check:pm-skill-ratchet在它上面红着,直到本卡的一行改动落地。⇒ 有具名的、已阻塞的下游 ⇒ p1。交付面(裁决已定,⛔ 不重裁)
一行:
scripts/pm/check-skill-line-ratchet.mjs的['AGENTS.md', 961]→['AGENTS.md', 969],裁决原话逐字写在 map 注释里(照 958 → 961 那次的先例),连同AGENTS.md里那 +8 行的诚实重同步(两个findUpanchor seed、⛔ manifest-name 禁令、-> repo root注解、两行点名 ratchet 的散文)。⛔ B/C/D 均未被采纳,C 在呈报时已被排除。⛔ 落地时
AGENTS.md是 governed 面 ⇒ draft PR + 人工合并,⛔ 车道席永不自行 arm。Generated by Claude Code
os-litant commentedon Sep 2, 2026
Closed — the ruled raise landed inside PR #11908 on 2026-08-25; nothing remains to dispatch
Skills lane seat, session
session_01LraLgQVGq8egUwfYZpbYt1. Re-read before acting: the ruling above (comment 5406817336, option A) authorized one line inscripts/pm/check-skill-line-ratchet.mjswith the ruling quoted beside it, so that PR #11908 could go green oncheck:pm-skill-ratchet.What happened after the ruling, verified on GitHub and on
origin/main:AGENTS.md(baseline 961 → 1150) and merged 2026-08-25 15:44Z, carrying the raise itself:['AGENTS.md', 1150 → 1158]with the C1 ruling 「我看到了,你分析过了,接受你的建议」 quoted in the map, together with the +8 mirror lines. Its body records the consequence for this card verbatim: "commitd41ef56's961 → 969is dissolved by the merge and replaced by a1150 → 1158entry carrying the C1 ruling". Card AGENTS.md's RECOGNISED_PATH_SPELLINGS mirror has drifted three times — nothing checks that the published list matches the detector #10855 was closed by that merge.origin/maintoday the row reads['AGENTS.md', 1162](the 2026-08-29 batch ruling 「执行,批 Add metamodel interfaces for ObjectQL/ObjectUI contract #1 其他卡同意」, recorded on AGENTS.md Prime Directive #14 still says "Reviewed + approved + fully green does not override this" — contradicted by the 2026-08-27 approve-gated queue ruling #12756) andAGENTS.mdmeasures 1162 lines — headroom 0 by construction, the gate green.So the one-line edit this card scoped no longer exists. The 2026-08-31 re-lane to
domain:skillswas right on routing but post-dated the merge by six days, which is why the card sat inpm:queuewith nothing behind it. Closing as completed:pm:queueremoved,documentation·priority:p1·domain:skillsstay. No ruling is re-opened and no ceiling is touched.Generated by Claude Code