Skip to content

lanes: every seat's patrol judgment set gains "read the anchor's own-lane rows first" — six lane job descriptions, one line each #9981

Closed

Description

@os-warren

Maintainer ruling (2026-08-19, PM chat): 「同意你的建议」—— 批准 devx 事故复盘两条提议之二(之一是 H16 dirty 谓词,独立卡)。事故出处:两张卡的 PR 已合并、卡挂 pm:dispatched 达 18h/2h —— H8 早已覆盖、锚 #9857 上机器早已看见,但席位每枪巡检不读锚,人没看见。同类病根维护者此前已点过:「你自己定的工作方式你也会忘」—— 规则必须活在决策点,不靠个人自觉。

Scope — .claude/skills/pm-dispatch/references/lanes/{engine,services,cli,devx,skills,spec}.md(治理面,人合;六文件各有棘轮 ceiling)

每个车道岗位说明的常设承诺(或对应节)加一行,六文件同一措辞,大意:每枪巡检的第一判据是读锚 #9857 本道相关行(H 行点到本道的卡/PR/座位贴),逐行认领或处置,再做其余判据;锚行未处置不得开新派发。(准确措辞由 dev 依各文件现有语域定,六处一致。)

行数付账 —— 本卡的真正约束

六文件 ceiling 均钉在落地行数(headroom 0,shrink-only)。每文件 +1 行必须由同文件内真去重支付,⛔ 禁 re-wrap 凑数;每处砍点在报告中逐行审计幸存之家。若某文件确无可去重,如实上报该文件净超,由维护者在合并时裁(治理面本就人合)。

验收

  • pnpm check:pm-skill-ratchet 全树绿(六 ceiling 不动);governed-prose / frame-sync 按派生集跑。
  • 治理面终态:draft PR + review request os-zhuang(2026-08-19 新机制),⛔ 永不翻 ready/入队/挂 auto-merge,人合。
  • 模型档:clause ① fable-mandatory(references 含在内,--tier 派生)。

Graded pm:queue, S(skills 座,own-lane,session ae0d8bd1-5667-5f58-8ff8-fa22ec154325)。热文件:lanes/*.md 空闲;与在飞 #9976(SKILL.md 本体)不同文件,可并发。

Activity

  1. self-assigned this
    on Aug 19, 2026
  2. added
    pm:queueReady for the PM dispatch loop
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Aug 19, 2026
  3. os-warren commented on Aug 19, 2026

    @os-warren
    CollaboratorAuthor

    Claim: session ae0d8bd1-5667-5f58-8ff8-fa22ec154325 · branch claude/issue-9981-lanes-read-anchor

    折叠检查:references/lanes/*.md 空闲;与在飞 #9976(SKILL.md 本体)同治理树不同文件,可并发。模型档:clause ① fable-mandatory(references 含在内)。治理面终态:draft + review request os-zhuang,人合。


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 19, 2026
  5. os-warren commented on Aug 19, 2026

    @os-warren
    CollaboratorAuthor
    {
      "issue": 9981,
      "status": "done",
      "branch": "claude/issue-9981-lanes-read-anchor",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/9988",
      "premise_still_valid": true,
      "summary": "All six lane job descriptions gain one identically-worded first bullet in 常设承诺: 每轮巡检第一判据 = read the half-state patrol anchor's own-lane H rows (cards/PRs/seat post), claim/act per row before other judgments; unhandled anchor rows block new dispatches. The anchor is named as 半状态巡查锚 + half-state-patrol.yml (its ANCHOR_ISSUE names the pinned issue) instead of a literal issue number because check:pm-skill-id-lint mechanically rejects 3+-digit IDs across the whole pm-dispatch surface, lanes included — the card's literal anchor-number phrasing would have turned that gate red. Each +1 line paid by genuine dedup in the same file; ceilings map untouched; draft PR, review requested from os-zhuang, human-merge-only.",
      "line_counts": {
        "engine.md": { "before": 41, "after": 41, "ceiling": 41 },
        "services.md": { "before": 31, "after": 31, "ceiling": 31 },
        "cli.md": { "before": 37, "after": 36, "ceiling": 37 },
        "devx.md": { "before": 38, "after": 38, "ceiling": 38 },
        "skills.md": { "before": 36, "after": 36, "ceiling": 36 },
        "spec.md": { "before": 44, "after": 44, "ceiling": 44 }
      },
      "added_line_exact_wording": "- **每轮巡检第一判据**:先读半状态巡查锚(`half-state-patrol.yml` 置顶 issue)点名本道卡/PR/座位贴的 H 行,逐行认领或处置,再做其余判据;锚行未处置 ⛔ 不开新派发。",
      "payment_audit": [
        "engine.md: cut header parentheticals (范围/常设承诺/席内判断) and (当前 PM、继承台账、热文件串行队) plus 三车道…而成 filler — survivors: the file's own three section headings (same file); seat-post-protocol.md four-segment enumeration 当前 PM | 继承台账 | 热文件串行队 | 说明; SKILL.md 域车道表 engine row carries the merger ruling verbatim, and the three merged lane names stay in the header.",
        "services.md: cut (2026-08-19 并入) from the 身份侧 bullet — literal duplication of the same file's header 本车道 2026-08-19 并入原 identity 车道的四个插件, and of SKILL.md 域车道表 services row.",
        "cli.md: cut the git ls-remote gh-readonly-queue command and the 入队瞬间滞后 caveat — both survive verbatim in platform-readings.md 队列成员资格与 auto-merge (the lag as 队列满载时 PR 已入队而分支尚未建出); replaced by a pointer, keeping cli-only detail (entry-name shape, parent-sha queue order, ref 出队后滞留). Net -2 then +1, headroom 1.",
        "devx.md: cut two clauses of the 边界 bullet — SUBJECT 是 governed 面本身的门禁/审计除外(归 skills) and 与 spec 相交的三面按「是否围着 spec 契约转」切分 — both survive verbatim in SKILL.md 域车道表 devx row; compressed to one pointer (SUBJECT 例外与 spec 三面切分在 SKILL.md 域车道表).",
        "skills.md: cut 判定命令 node scripts/pm/check-governed-merges.mjs --test 带路径 from the 范围 bullet — survivors: same file's 常设承诺 bullet (flip/arm 前跑 check-governed-merges --test, now carrying the 带路径 detail) and SKILL.md 域车道表 skills row + tools index naming the full path.",
        "spec.md: cut (那是状态,不是岗位说明) — restates the same file's header 现值状态恒在座位贴,⛔ 不迁入本文件 and seat-post-protocol.md 范围与常设承诺是岗位说明,版本化在 lanes/; plus grammar particle 的 for width. No re-wrap without a named removal in any file."
      ],
      "tests": "All at 41e742528 (final commit; no later pushes). dispatch-gates.mjs (no args) derived 6 families, exit codes captured before any pipe. check:pm-skill-ratchet EXIT=0, verdict lines: lanes/engine.md is 41 lines (ceiling 41; headroom 0); services 31/31; cli 36/37 headroom 1; devx 38/38; skills 36/36; spec 44/44. check:pm-skill-id-lint EXIT=0: 15 file(s) clean (pattern /#[0-9]{3,}/g). check:doc-authoring EXIT=0: 377 files clean. check:pm-governed-merges EXIT=0: 77 assertions. check:skill-frame-sync EXIT=0: 4 copies structurally isomorphic across 3 files. check:doc-formula-expressions EXIT=0: 22 record-scoped formula example(s) across 402 files / 1413 TS blocks judged clean (first run failed on unbuilt @objectstack/formula dist — fresh-worktree artifact, green after building the lint dependency closure). Reverse verification, direction predicted in writing: +1 line to skills.md at ceiling => ratchet red naming the file (EXIT=1: lanes/skills.md is 37 lines; the ratchet ceiling is 36); restored byte-identical from committed state (sha256 f54ab092...9723 equal before/after), green again EXIT=0.",
      "labels_read_back": "pull_request_read get on PR 9988 after write: [documentation, skip-changeset] — union write survived alongside the bot's documentation label. (issue_read get_labels refuses PR numbers, as the dispatch warned.)",
      "files_changed": [
        ".claude/skills/pm-dispatch/references/lanes/engine.md",
        ".claude/skills/pm-dispatch/references/lanes/services.md",
        ".claude/skills/pm-dispatch/references/lanes/cli.md",
        ".claude/skills/pm-dispatch/references/lanes/devx.md",
        ".claude/skills/pm-dispatch/references/lanes/skills.md",
        ".claude/skills/pm-dispatch/references/lanes/spec.md"
      ],
      "open_questions": [
        {
          "question": "The card's 大意 says the anchor is named by its issue number, but check:pm-skill-id-lint mechanically rejects any 3+-digit #ID across the pm-dispatch surface including lanes/. I resolved the conflict in favor of the gate by naming the anchor structurally (半状态巡查锚 + half-state-patrol.yml, whose ANCHOR_ISSUE constant carries the number). Acceptable, or should the id-lint gain a waiver for live coordination anchors?",
          "options": ["A Keep structural naming — the workflow file is the stable dereference and the gate stays untouched", "B Add an id-lint allowlist entry for the anchor number — makes the lane line one hop shorter but weakens a mechanical gate for a number that can change if the anchor is ever re-pinned"],
          "recommendation": "A, because the gate's ruling (issue-ID dereference costs more than it returns) is exactly why the anchor number should live in one machine-read constant, not six prose files."
        },
        {
          "question": "The added line is one 160-display-column physical line against the files' ~80-column wrap convention — deliberate, because the ratchet counts physical lines and the card budgets exactly +1 per file. Wrap it to two lines at merge time only if a second paid cut per file is rulable.",
          "options": ["A Keep the single long line (as landed)", "B Wrap to two lines and pay one more dedup line per file"],
          "recommendation": "A; the budget math is the card's own constraint and the line is a bullet, not flowed prose."
        }
      ],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  6. os-warren commented on Aug 19, 2026

    @os-warren
    CollaboratorAuthor

    ACCEPT — PR #9988 复核通过(治理面:PR 保持 draft、review request os-zhuang 已挂、等维护者合并)。

    复核记录(session ae0d8bd1-5667-5f58-8ff8-fa22ec154325,契约复审档 fable):

    • 亲取 diff:六文件 常设承诺 首条同一措辞逐字一致 ✓;每文件 +1 由真去重支付,砍点逐条核过幸存之家(engine 头部压缩→节标题/座位贴协议自身;services「并入」括号→同文件头部;cli 队列读法→platform-readings 同条目;devx SUBJECT/spec 切分→SKILL.md 域车道表;skills「带路径」→下移至 flip/arm 承诺行,细节反而更靠近使用点;spec 括号→自身头部)—— 无 re-wrap,cli 净余 1 行 ✓。CEILINGS 映射未动 ✓。
    • Open question ① 裁 A(结构化命名锚,不写字面 issue 号):id-lint 的裁决理由(issue 号解引用成本高于回报)恰好论证了锚号应活在 ANCHOR_ISSUE 一处机器常量里而不是六份散文里 —— 与卡意图零冲突,偏差接受。
    • Open question ② 裁 A(单物理行):棘轮数物理行,卡的预算就是 +1;换行要再付六刀,不值。维护者合并时可见,如有异议人合即否。
    • 反向验证(skills.md 顶 ceiling +1 → 棘轮红点名;恢复 sha256 逐字节一致)✓;id-lint / frame-sync / governed-merges 自测判定行逐字 ✓。

    落地后:六车道任何新上任 PM 从岗位说明第一条继承「先读锚」—— devx 事故「机器看见、人没看见」的那半正式闭环。


    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:seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions