Skip to content

Commit 803764a

Browse files
objectstack-fleet[bot]os-steveclaude
authored
docs(pm-dispatch, os-dev): a user-visible UX defect is class (a) — filed like a functional one when it reproduces on a public surface with a named fix site (#22000)
Fixes #21992 Clause-②: no ## What changes Three governed files under `.claude/` state the same boundary for their three readers: a **user-visible UX defect is class (a)**, on equal footing with a functional defect, when it reproduces stably on a public surface, names its fix site, and its expected-vs-actual does not rest on taste; pure taste, redesign / new-feature proposals (→ ②) and performance observations with no user-visible cost are not cards. The ruling's three properties are the card's; the wording is tightened to the ratchet's 120-byte line cap. Model tier (derived, not recalled): `node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack .claude/agents/os-dev.md` prints "Model tier — MANDATORY … — clause ① (2026-08-20 narrowing): the dev-agent definition is protocol semantics". Tier S (every path under `.claude/**`): this PR stays draft until the owning seat's contract-tier review of record. ### Lines added (byte widths measured against the 120-byte cap) | file | inserted after (at `origin/main` 6befe19) | line added | bytes | |---|---|---|---| | `references/filing-gate.md` | `:12`, the ① line | `- ① 含用户可见的体验缺陷,与功能缺陷同等:界面上稳定复现、落点具名、预期不凭审美。` | 119 | | `references/filing-gate.md` | the line above | `- ⛔ 不是卡:纯审美偏好、重设计与新功能提议(走 ②)、无用户可见代价的性能观察。` | 112 | | `references/filing-gate.md` | the ⛔ line above — closing the ① group (moved there in `2a241332`; the (b) 判例 line at `:15` is deleted by PR #21999 and is no longer this line's anchor) | `- 判例:仪表盘刷新按钮独占一行、首屏白占约 120px ⇒ 立;「配色换个好看的」⇒ 不立。` | 115 | | `references/triage-duties.md` | `:43`, the (a) boundary line | `- (a) 不分功能与体验:能用但用户可见地错(截断、遮挡、白占首屏、误导文案)也是 (a)。` | 115 | | `.claude/agents/os-dev.md` | `:42`, the (a)/(b) line | ` - (a) 含用户可见的体验缺陷(截断、遮挡、白占首屏、误导文案),须复现且落点具名。` | 114 | **Deviation from the card's draft, declared.** The card drafted four filing-gate lines (+4). The stand-alone forms line (「体验缺陷形态:截断、遮挡、白占首屏、文案与页面矛盾、删除不点名对象、显示原始值」, 120 bytes) is not added here: the forms travel in the triage-duties and os-dev parentheticals, and the 判例 line carries the ruling's concrete case. Reason: filing-gate holds exactly three deletable lines whose rule survives elsewhere (table below); a fourth added line would have needed a ceiling raise in `scripts/pm/check-skill-line-ratchet.mjs`, a file the dispatch fenced off. The three ruled properties stand in every file; no re-wrap bought a line. Mechanism probes the dispatch asked for: folding the ⛔ line into the existing 「⛔ 不是卡」 line at `:20` measures 130 bytes, and folding the triage line into `:43` measures 130 bytes — both over the cap, so both stay separate lines as drafted; os-dev `:42` (113 bytes) is untouched and the new line sits under it as a sub-item. ### Lines deleted, with each rule's surviving home | file:line (at 6befe19) | deleted line | surviving home | |---|---|---| | `filing-gate.md:30` | `收到 429 或次级限流 ⇒ 该席本 fire 停写,并把停写记在座位贴上。` | `SKILL.md:93` 「429 即停写」(全体座位的不变量) + `triage-duties.md:117` 「限流/重试类运维细节只进座位贴和触发器」 | | `filing-gate.md:31` | `关单 ⛔ 永不由脚本循环连发:须维护者确认的分组,且逐笔之间留间隔。` | `filing-gate.md:28` (维护者确认的十张一组, kept) + `SKILL.md:93` 「节奏 ≥3 秒/笔、每账号每小时 ≤40 笔」 + `AGENTS.md` "Every GitHub write leaves through `scripts/pm/`" (write-pace.mjs serialises and spaces every write verb; close-cards owns its writes) | | `filing-gate.md:32` | `用户类写绑作者:封号则其卡与评论按作者 404,故一个 fire 的首写回读 user.type。` | `platform-readings.md:133` 「类只认每次写回读的 user.login/user.type」(every write — a superset of the first write) + `:135` 「封号隐藏其全部评论…」 + `:166–171` (停用销毁其名下 PR、卡与评论). The consequence line `:33` 「读到 User ⇒ 记座位贴、本 fire ⛔ 不立新卡…」 stays. | | `triage-duties.md:84` | `标签/assignee 写恒经 scripts/pm/label-write.mjs(四步、回读);⛔ 永不 MCP issue_write(锁 1 已拒)。` | `rest-channel.md:44` (⛔ 永不 MCP issue_write(锁 1 已拒)) + `SKILL.md:92` 「内容写只走 REST 代理,⛔ 无 MCP 写」 + `execution-duties.md:59` + `AGENTS.md` write-gate paragraph (label-write owns its writes) + `os-dev.md:304` (the four steps) | | `os-dev.md:203` | `⛔ 永不 git stash;替代拼写(wip commit / patch)、机制与 hook 住每会话注入的 CLAUDE.md。` | `AGENTS.md` Multi-agent working discipline (the `git stash` paragraph, `guard-shared-stash.sh`, the replacements block) — the file os-dev.md declares binding at its line 7; `SKILL.md:31`; `os-dev.md:201` still names the stash stack as shared | ### line_budget | file | before → after | ceiling | headroom | ceiling action | |---|---|---|---|---| | `references/filing-gate.md` | 58 → 58 (+3 / −3) | 58 | 0 | none | | `references/triage-duties.md` | 120 → 120 (+1 / −1) | 120 | 0 | none | | `.claude/agents/os-dev.md` | 402 → 402 (+1 / −1) | 402 | 0 | none | No ceiling raised, no `scripts/**` touched; the fallback ruling quote the card names for a raise was therefore not spent. ### Sibling in flight — region overlap, recorded `claude/issue-21929-judge-responsibility-before-dispatch` at `8cdefa6c` (its card #21929 remains open and is not addressed here) also edits filing-gate.md and triage-duties.md. Its hunks: filing-gate adds one 定级判据 line (its declared region) and **deletes `filing-gate.md:15`, the (b) 判例 line — outside its declared region, and formerly the anchor of this PR's 判例 line; since `2a241332` the two PRs' hunks are two lines apart, and a read-only `git merge-tree` of `2a241332` × `8cdefa6c` is conflict-free (tree `032fb524`; filing-gate 58 / triage-duties 120 after stacking). `origin/main` has not moved (still `6befe19c`), so there was nothing to merge before opening. Whichever lands second resolves the adjacent hunk by stacking both intents — their deletion of the (b) 判例 line and this PR's UX 判例 line — and re-runs `check:pm-skill-ratchet`; after stacking, filing-gate stays at 58. ## Verification Head `2a241332` (the second commit moved one line inside filing-gate.md; the report comment 6018992259 carries the gate run on this head — the first run below was on `8014e8ba`). Every command below ran on this tree with the exit code captured before any pipe. The derived families came from `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` with no paths (21 derived); `--ran` reconciled 21 of 21 run, 0 unrun; the dispatch named three more (`pm-expected-skips`, `pm-governed-prose`, `skill-frame-freshness`), also run. - `pnpm check:pm-skill-ratchet` :: exit 0 — filing-gate 58/58, triage-duties 120/120, os-dev 402/402, headroom 0; no prose line over 120 bytes. - `pnpm check:pm-skill-id-lint` :: exit 0 — 34 files clean. `pnpm check:agent-model-declared` :: exit 0 — os-dev.md → opus. `pnpm check:nul-bytes` :: exit 0. - `node scripts/check-closing-keyword-parity.mjs` :: 0 and `--self-test` :: 0 · `node scripts/check-comment-mask-corpus.mjs` :: 0 · `node scripts/pm/check-governed-queue-guard.mjs --self-test` :: 0 · `node scripts/pm/check-harness-current.mjs --self-test` :: 0 · `pnpm check:pm-governed-merges` :: 0 · `pnpm check:pm-expected-skips` :: 0 · `pnpm check:pm-governed-prose` :: 0 · `pnpm check:agent-test-spelling` :: 0 · `pnpm check:commit-card-trailers` :: 0 · `pnpm check:doc-authoring` :: 0 · `pnpm check:gitlink-declared` :: 0 · `pnpm check:watch-hint-literal` :: 0 · `pnpm check:refd-timer-probe` :: 0 · `pnpm check:skill-frame-sync` :: 0 · `pnpm check:skill-frame-freshness` :: 0 · `pnpm check:cross-package-test-inputs` :: 0 · `pnpm check:driver-memory-census` :: 0 · `pnpm check:pm-half-states` :: 0 (4912 self-test cases). - `pnpm --filter @objectstack/lint run check:doc-formula-expressions` :: exit 3 on the first run, PREREQUISITE NOT MET (formula/lint not built — nothing measured); then `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2` under `scripts/pm/os-verify-lock.sh` (VERDICT command-exit 0), and the rerun :: exit 0 (58 self-test cases; 22 examples clean). The diff touches no package, so the dependency-closure build (①) is empty and no package test (②) is owed. Changeset: none — `.claude/**` publishes nothing; `skip-changeset` is requested through `label-write`. ## Acceptance notes - The sibling branch's deletion of `filing-gate.md:15` falls outside the region its claim declared (〈定级判据〉). Noted for the owning seat, not filed; `carrier:` the reviewer of the #21929 PR. - A dispatch-internal tension, resolved without choosing a side: the card's fallback (raise the file's ceiling with the ruling quoted) lives in `scripts/pm/check-skill-line-ratchet.mjs`, which the dispatch's file fence excludes. Paying every added line by deletion made the fallback unnecessary; if the owning seat wants the forms line too, that is one more filing-gate line and a 58→59 raise citing 「同意,立卡起草这条规则」. ## 维护者速读(草稿) **改了什么**:三份内部协议文件(立卡门、分诊职责、开发代理定义)各加一条:用户看得见的体验缺陷(截断、遮挡、首屏白占、误导文案)与功能缺陷同等,属于可立卡的 (a) 类;仍须在公开界面稳定复现、落点具名、预期与实际不凭审美;纯审美偏好、重设计/新功能提议、无用户可见代价的性能观察不是卡。立卡门另加一条判例:仪表盘刷新按钮独占一行、首屏白占约 120px ⇒ 立;「配色换个好看的」⇒ 不立。 **为什么改**:维护者裁决(照抄不译):「仪表盘空白 很严重啊,这种为什么不处理,是不是标准有问题?这么明显的用户体验相关的为题」「同意,立卡起草这条规则」。此前三处类定义都没说体验缺陷算不算 (a),席位读窄了,七个真实体验缺陷一度未立卡。 **风险与代价(含回滚)**:三文件行数不变(58 / 120 / 402),没抬任何上限;每加一行就删一行,被删的五行其规则都在别处仍然成立(上表逐条点名归宿),删掉的只是重复的指针。风险在于席位可能把「体验缺陷算卡」读宽 —— 第二、三条就是围栏。回滚即 revert 本 PR 的一个 commit。兄弟 PR(#21929 在飞)也动了其中两份文件,后落地的一方合一次 main 并重跑行数门禁。 **席位意见**: **你要做的**:本 PR 全在 `.claude/**`(Tier S),由席位达档复核后入队落地,无需你亲手合并。若你希望「体验缺陷形态」的完整清单(截断、遮挡、白占首屏、文案与页面矛盾、删除不点名对象、显示原始值)也进立卡门,那是多一行并抬 filing-gate 上限 58→59,请一句话告知。 Implemented by the `os-dev` subagent of `session_0181E4ZeZmWyknawnauxD2CE` (branch `claude/issue-21992-ux-defects-are-class-a`); the three body corrections named in report comment 6018992259 (head, the 判例 row's anchor, the sibling-overlap sentence) were written by the seat in that session. --------- Co-authored-by: os-dev <steve@objectstack.ai> Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1bc6ca1 commit 803764a

3 files changed

Lines changed: 5 additions & 5 deletions

File tree

‎.claude/agents/os-dev.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ model: opus
4040
- 回退他人的操作(尤其 ready 翻转)永不轮到你;把意外写进 `summary`。
4141
3. **范围 = 这张 issue,别无其它。** 顺路发现 ⛔ 不在本 PR 修,只有三类立卡且不打标签:
4242
- (a) 可复现缺陷(复现或失败探针具名);(b) 违背已声明契约(引契约原文,带 `Seam:` 行);
43+
- (a) 含用户可见的体验缺陷(截断、遮挡、白占首屏、误导文案),须复现且落点具名。
4344
- `Seam: spec:<键或符号> → runtime:<调用点> | renderer:<组件>`,无消费者写 `consumer: none`。
4445
- (c) 让 AI 写出运行时拒收或静默丢弃的元数据的陷阱;三类内 ⛔ 不因看着小揣着不报。
4546
- 三类同欠 `reach:`:公开入口(HTTP/界面/`os validate`/保存)一次实测错误,或具名真实生产者。
@@ -200,7 +201,6 @@ model: opus
200201
- `git worktree` 只隔离工作树与 HEAD;`.git/` 下其余一切全 worktree 共享。
201202
- 共享的含 refs(含 `refs/remotes/*`)、stash 栈、config、hooks;配方不点名共享态才 worktree-safe。
202203
- 失效同签名:操作看着本地、报成功,唯一症状是 `git status` 里出现他人文件。
203-
- ⛔ 永不 `git stash`;替代拼写(wip commit / patch)、机制与 hook 住每会话注入的 CLAUDE.md。
204204
- `git reset --soft origin/main` 会把你分支点之后他人已合并的文件整批 stage 成你的。
205205
- 起点在哪的 reset/diff/log/rebase 一律锚基本规则 1 记录的 `"$BASE"`。
206206
- `log -S/--follow/blame` 判日期或先后前,先 `git rev-parse --is-shallow-repository`,true 就加深申报。

‎.claude/skills/pm-dispatch/references/filing-gate.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
1111
- 立卡只为四类,正文首行写立卡门类别 ①–④;⛔ 其余一律不立卡,不论它叫什么。
1212
- ① 有具名落点或复现的产品缺陷,即 `pm:queue` 的定义;其内的 `finding` 限三类且带 `reach:`。
13+
- ① 含用户可见的体验缺陷,与功能缺陷同等:界面上稳定复现、落点具名、预期不凭审美。
14+
- ⛔ 不是卡:纯审美偏好、重设计与新功能提议(走 ②)、无用户可见代价的性能观察。
15+
- 判例:仪表盘刷新按钮独占一行、首屏白占约 120px ⇒ 立;「配色换个好看的」⇒ 不立。
1316
- `reach:` 二选一:公开入口(HTTP/界面/`os validate`/保存)实测一次错误结果;或具名真实生产者。
1417
- 三种例外照立,要点首条「先测可达性」:可能泄露数据;发版固化的错误文字;维护者直派。
1518
- ② 只有维护者能做的决定,落卡即带「维护者速读」与四棱块。
@@ -26,9 +29,6 @@
2629
- 配额:一席每 fire 至多立三张;sweep 超出的折进一张带清单的卡,或折进座位贴。
2730
- 分诊席的存量清理仍走维护者确认的十张一组,⛔ 不因本门改批量。
2831
- 十张一组只备下一组:当前组未经维护者确认 ⛔ 不预备再下一组、不提前展开全部批次。
29-
- 收到 429 或次级限流 ⇒ 该席本 fire 停写,并把停写记在座位贴上。
30-
- 关单 ⛔ 永不由脚本循环连发:须维护者确认的分组,且逐笔之间留间隔。
31-
- 用户类写绑作者:封号则其卡与评论按作者 404,故一个 fire 的首写回读 `user.type`。
3232
- 读到 `User` ⇒ 记座位贴、本 fire ⛔ 不立新卡;认领仍靠 assignee,署名仍是文本的 session ID。
3333

3434
## 定级判据(北极星「优先级」的执行说明)

‎.claude/skills/pm-dispatch/references/triage-duties.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
- `finding` = 三类内待定级:(a) 可复现缺陷(复现或失败探针);(b) 违背已声明契约(引契约文);
4242
- (c) AI 写元数据会被运行时拒收或静默丢弃的陷阱;其余进 PR `## Acceptance notes`,⛔ 不立卡。
4343
- (a) 的分界是不完整 vs 错误,不是文档 vs 代码:示例照抄即失败是 (a),漏列成员不是。
44+
- (a) 不分功能与体验:能用但用户可见地错(截断、遮挡、白占首屏、误导文案)也是 (a)。
4445
- 门禁头注、self-test 文案与 `check-*` 处方句 ⛔ 非已声明契约;(b) 须用户或已发布包读得到。
4546
- (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储的视图配置是。
4647
- 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内;记为边界,⛔ 不扩类。
@@ -81,7 +82,6 @@
8182
- 三类内再过时前提检查,三选一:晋级 / 关闭 not planned / hold;判级只在此轮,不在立单时。
8283
- ⛔ 写入前对每张卡现读当前状态;任何列表快照读数一律作废。
8384
- ⛔ 带 `pm:dispatched` / assignee / 任何 open 或 merged PR 引用的卡,一律不动。
84-
- 标签/assignee 写恒经 `scripts/pm/label-write.mjs`(四步、回读);⛔ 永不 MCP `issue_write`(锁 1 已拒)。
8585
- 车道席可附证据/前提重验,⛔ 不定级不改标;skills 车道 finding 由该席自分诊,全仓轮跳过。
8686
- 域分批与 sweep 打包晋级五条照用;每批约定与积压告警见 `references/dispatch-runbook.md`。
8787
- `pm:retriage` 每 fire 先答异议评论所求,答后同笔摘标;须维护者答的进收件箱,标照摘。

0 commit comments

Comments
 (0)