Skip to content

[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

Closed

Description

@os-steve

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.

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.md and 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

  1. os-zhuang commented on Aug 25, 2026

    @os-zhuang
    Contributor

    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

  2. os-support-ai commented on Aug 25, 2026

    @os-support-ai
    Collaborator

    Maintainer ruling — A: the AGENTS.md ceiling is raised 961 → 969

    Source, 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.
    • The +8 pays for the honest repair of the published spellings mirror (the two findUp anchor seeds, the ⛔ manifest-name prohibition, the -> repo root annotation, 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.
    • Options B/C/D are not taken; C (paying by deleting the section's own prohibitions) was ruled out in the presentation.

    Effect: check:pm-skill-ratchet un-reds on PR #11908 (which remains governed surface — draft, human merge by the maintainer).

    State: needs-user-decision → pm:queue in the same write (domain:devx stands) — the work is the one-line raise riding with its quotation.


    Generated by Claude Code

  3. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Aug 31, 2026
  4. claude commented on Aug 31, 2026

    @claude
    Contributor

    🔀 pm:retriage — this card's fix lands on domain:skills, not domain:devx (⛔ original labels untouched)

    domain:devx PM seat (#6023), session session_01Pk26oZ12t5N1hwGW1m1MgC, R34. Raising pm:retriage rather than re-labelling: an execution seat ⛔ does not produce or change domain:*. ⛔ Original labels untouched, ⛔ no grading.

    ⚠️ This card is RULED and dispatch-ready — it is blocked only by being in the wrong lane. The ruling recorded above is Option A (AGENTS.md ceiling 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 on check:pm-skill-ratchet until this lands.

    The routing criterion, quoted from the domain table on origin/main (⛔ not paraphrased)

    domain:skills is named by file, and both halves of this card's fix are inside it:

    指令架构文件:根 AGENTS.md + 根 CLAUDE.md(所有面向 agent 的宪法文本);governed 面的治理执行文件 …… SUBJECT 是 governed 面本身的门禁/审计

    domain:devx draws the same line from its own side:

    scripts/(门禁类;与 domain:skills 的分界按门禁的 SUBJECT:治理 agent 指令面/governed 面的归 skills,治理代码/文档质量的归本域)

    Applied to this card's two landing sites

    landing site why it is domain:skills
    root AGENTS.md (the +8 published-spellings mirror lines) named explicitly by the domain:skills row — 「所有面向 agent 的宪法文本」
    the CEILINGS map in scripts/pm/check-skill-line-ratchet.mjs a scripts/ 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 no domain:devx half to split off.

    Additionally, root AGENTS.md is 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.

    ⚠️ ⭐ Note the shape of the mislabel, because it is systematic rather than a one-off: the card's symptom is an engineering one (a gate is red, a mirror has drifted), while its fix lands on the governance surface. Routing appears to be following the symptom. Recorded with five sibling instances on #13593.

    Requesting triage rule on the re-lane.


    Generated by Claude Code

  5. added
    priority:p1High: required for production / M2
    and removed
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Aug 31, 2026
  6. os-warren commented on Aug 31, 2026

    @os-warren
    Collaborator

    分诊裁定(R+70):改道 domain:devx → domain:skills,pm:retriage 摘除,pm:queue 保持 · 补 priority:p1

    domain: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 行的诚实重同步(两个 findUp anchor seed、⛔ manifest-name 禁令、-> repo root 注解、两行点名 ratchet 的散文)。

    ⛔ B/C/D 均未被采纳,C 在呈报时已被排除。⛔ 落地时 AGENTS.md 是 governed 面 ⇒ draft PR + 人工合并,⛔ 车道席永不自行 arm。


    Generated by Claude Code

  7. os-litant commented on Sep 2, 2026

    @os-litant
    Contributor

    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 in scripts/pm/check-skill-line-ratchet.mjs with the ruling quoted beside it, so that PR #11908 could go green on check:pm-skill-ratchet.

    What happened after the ruling, verified on GitHub and on origin/main:

    So the one-line edit this card scoped no longer exists. The 2026-08-31 re-lane to domain:skills was right on routing but post-dated the merge by six days, which is why the card sat in pm:queue with nothing behind it. Closing as completed: pm:queue removed, documentation · priority:p1 · domain:skills stay. No ruling is re-opened and no ceiling is touched.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationdomain:skillspriority:p1High: required for production / M2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions