Skip to content

[finding] ensure-pm-labels.sh documents a silent 100-char label-description failure mode with no mechanical guard behind it #10099

Closed as duplicate

Description

@os-warren

Observed while implementing #10090 (adding one gh label create line to scripts/pm/ensure-pm-labels.sh).

The script header carries this warning:

⚠️ GitHub hard-caps label descriptions at 100 characters: gh label create / gh label edit get HTTP 422 above that, and the || true (needed for idempotent reruns) swallows the failure — an over-long -d line means the label is NEVER created on a repo where it doesn't exist yet, silently, and a rerun can never repair it. Keep every -d in this file ≤100 characters (measured: a ~145-char description 422'd in live use).

Every property of that paragraph is a measured hazard, and nothing enforces it. The only thing standing between an over-cap -d and a label that is never created on some repo is the author counting characters by hand. It has already been paid once by hand: PR #9322 ("label descriptions ≤100 chars") trimmed the instances that had drifted over.

Live headroom is thin, so this is not theoretical: measuring the current file, repo:objectui is at exactly 100 characters, and five more descriptions sit between 96 and 98. Any editorial touch-up to those lines lands over the cap, 422s, and is swallowed.

Shape of a fix when graded (deliberately not implemented here — it is a new gate, out of scope for the one-line card):

  • a check that parses every -d "..." out of the script and fails above 100 characters. Measured in characters, not bytes: needs:contract-review is currently 97 chars / 101 bytes and lives, so the byte count is not the binding measure — a naive byte-length guard would red on a label GitHub accepts.
  • it belongs to the scripts/** gate family that node scripts/pm/dispatch-gates.mjs already routes for this path.

Verification note from the #10090 run: the check is cheap to run out-of-tree — putting a fake gh on PATH that records label create invocations turns the script into a dry-run listing (48 create calls today) and the description lengths fall straight out of it. The script itself has no dry-run mode, which is the other half of why nothing measures this.

Duplicate check: enumerated all 11 open domain:skills cards; semantic issue search returned zero for this and for its own positive control, so it was not relied on.


Generated by Claude Code

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 20, 2026
  2. os-warren commented on Aug 20, 2026

    @os-warren
    CollaboratorAuthor

    定级 + Claim(skills 座,session ae0d8bd1-5667-5f58-8ff8-fa22ec154325,branch claude/issue-10099-label-desc-cap-gate)。tier 推导无路径强制、条款②不触发 → opus。

    派发注记:新 gate 脚本解析 ensure-pm-labels.sh 里每条 -d "...",>100 字符(⛔ 非字节 —— needs:contract-review 97 字符/101 字节现存活,字节口径会误红 GitHub 实际接受的标签)即失败;挂进 scripts/** 既有 gate 家族(dispatch-gates 已路由该路径,若需声明按 #9978 模式);卡内已给出 fake-gh 干跑法可直接复用为自测法。⚠️ 并行提示:#10098 同轮在飞会往同文件加两行 -d,gate 按通用解析写,不 pin 行数;若你的自测想 pin 当前描述条数,用 ≥ 下界而非精确值,避免与 #10098 合并次序打架。

    四维分析

    • 项目长远合理性:已文档化的静默失败模式无机械守卫 = 知而不设防;补一个便宜的字符数 gate 终结这类漂移。
    • 实际业务拉动:实测余量极薄(repo:objectui 恰 100,另有五条 96–98),任何润色即触雷且被 || true 吞掉。
    • 防 AI 犯错:422 被吞后标签永不创建且 rerun 不可修 —— 正是 agent 最难自察的失败形状。
    • 创业阶段不扩散:单个新脚本 + 一条 package.json 入口,size/s,不改被测文件。

    Generated by Claude Code

  3. self-assigned this
    on Aug 20, 2026
  4. os-warren commented on Aug 20, 2026

    @os-warren
    CollaboratorAuthor

    合并入 #10098 关闭(skills 座,session ae0d8bd1-5667-5f58-8ff8-fa22ec154325):维护者提出小卡合并;本卡与 #10098 同文件族(ensure-pm-labels.sh 词表 + 其描述上限守卫)、同缺陷类(词表脚本漂移/静默失败)、同验证面(fake-gh 干跑),且两卡派发均被限流延迟未出门 —— 合并零成本。全部范围与派发注记已转录至 #10098(2026-08-20 范围合并评论),gate 规格以本卡正文为权威引用。收割时 PR 只写 Fixes #10098,本卡不再单独跟踪。


    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

Labels

domain:skillsDomain lane — seat card indexed by label:pm:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades it

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions