Repository navigation
skills(pm-dispatch / os-dev): user-visible UX defects are class (a) — a reproducible, fix-site-named UX defect is filed like a functional one; pure taste and redesign are not #21992
Description
Activity
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsPath: fleet decision — the filing gate admits what a customer sees | 缺项 | none
Triage: first grade —
tooling·priority:p2·domain:skills·pm:queue. The maintainer's ruling, as drafted; TaskTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T13:57Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
.claude/skills/pm-dispatch/references/filing-gate.md,references/triage-duties.mdand.claude/agents/os-dev.md⇒domain:skills; rationale: the three files that define class (a).Verified on
main: the three anchor lines the draft inserts after are present:filing-gate.md:12(the ① line) and:15(the case line);triage-duties.md:43(the (a) boundary line);os-dev.md:42(the (a)/(b) line).
Direction: as the card states. The three properties are the maintainer's ruling and stay:
- a UX defect is class (a), on an equal footing with a functional one;
- it still needs a stable repro on a public surface, a named fix site, and an expected-versus-actual that does not rest on taste;
- taste, redesign and new-feature proposals (→ ②), and performance observations with no user-visible cost, are not cards.
The wording is the lane's to tighten. The line ceilings are paid as the card says. ⛔ No re-wrap.
Why p2: the maintainer called the missed case serious. The gap decides what every seat files, and it has already let seven real UX defects go unfiled once.
Type: Task, a process rule. The relay cannot write an issue type (#21915), so it is recorded here.
Generated by Claude Code
- addedpriority:p2Medium: important, M3Medium: important, M3and removed
on Oct 6, 2026 objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_0181E4ZeZmWyknawnauxD2CE
Account:os-steve(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-21992-ux-defects-are-class-a
Worktree:objectstack-issue-21992
Domain:domain:skills
Seat:domain:skills#2
File surface:.claude/skills/pm-dispatch/references/filing-gate.md(〈立卡门〉 — after the ① line:12and the 判例 line:15atorigin/mainaa09db58c9),.claude/skills/pm-dispatch/references/triage-duties.md(the (a) boundary line:43),.claude/agents/os-dev.md(§3 scope, the (a)/(b) line:42) — region-level; all three at their ratchet ceilings (58 / 58, 120 / 120, 402 / 402), lines paid in place by deletion first. The sibling in-flight #21929 (claim 6018096077) holdsfiling-gate.md〈定级判据〉 and the 定级 lines oftriage-duties.md: this card's payment deletions stay outside those regions; the later lander mergesorigin/mainonce more before enqueue. ⛔SKILL.md,skills/**,scripts/**,.github/**untouched; stop on breach; explain in the report
Container & model:M,mode:subagent,model: CONTRACT_REVIEW_TIER —dispatch-gates --tier --repo objectstack-ai/objectstackover the surface prints "Model tier — MANDATORY … (derived from the file surface, not recalled)" with the path line " - .claude/agents/os-dev.md ⇢ '.claude/agents/os-dev.md' — clause ① (2026-08-20 narrowing): the dev-agent definition is protocol semantics — every dispatched dev runs under it, and receives the decision frame the PM pastes into its prompt at dispatch "; no downgrade exit taken: the card defines a filing class, not a one-line mechanical edit
Clause-②: no
Thread-read: 6017868609
Serial constraints cleared: fold-or-serial answered — #21929 and this card sharefiling-gate.mdandtriage-duties.mdbut fail fold gate ① (different rule, different fix) ⇒ parallel on disjoint regions as declared above, not folded; no open objectstack PR touches.claude/**(open PRs at the reading: #21997 · #21994 · #21991 · #21988 · #21974, file lists read through REST);git ls-remoteshows noclaude/issue-21992-*branch and the two sibling branches of this round are pushed (claude/issue-21929-judge-responsibility-before-dispatch claude/issue-21959-delete-check-widening-tells ); last touches of the surface onorigin/mainared13df0c6(os-dev.md, 2026-10-05) and7b068877(filing-gate.md), not same-day; seat 1's in-flight #21892 is onscripts/pm/**; verify lock state: lock is free queue: empty — arrival depth per the lock listing plus this dev, belowLOCK_DEPTH_HOLD; shared checkout atorigin/mainaa09db58c9. Readings taken at 2026-10-06T14:20Z.objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 21992, "status": "done", "branch": "claude/issue-21992-ux-defects-are-class-a", "pr": "https://github.com/objectstack-ai/objectstack/pull/22000", "session": "session_0181E4ZeZmWyknawnauxD2CE", "premise_still_valid": true, "summary": "Draft PR 22000 (head 8014e8ba, base main, Tier S — awaiting the owning seat's contract-tier review) states in three files that a user-visible UX defect is class (a) on equal footing with a functional defect, still owing a stable public-surface repro, a named fix site and an expected-vs-actual that does not rest on taste; pure taste, redesign / new-feature proposals (→ ②) and cost-free perf observations are fenced out, and a 判例 line records the dashboard case. filing-gate.md gets 3 lines (the ① extension, the ⛔ fence, the 判例), triage-duties.md 1, os-dev.md 1; every added line is paid by deleting a line whose rule survives elsewhere (homes named per line in the PR body), so no ceiling moved and scripts/** is untouched. Premise verified: all three anchor lines matched byte-exact at origin/main 6befe19c before the anchored edit.", "files_changed": [ ".claude/skills/pm-dispatch/references/filing-gate.md", ".claude/skills/pm-dispatch/references/triage-duties.md", ".claude/agents/os-dev.md" ], "line_budget": { ".claude/skills/pm-dispatch/references/filing-gate.md": { "before": 58, "after": 58, "added": 3, "deleted": 3, "ceiling": 58, "headroom": 0, "ceiling_action": "none" }, ".claude/skills/pm-dispatch/references/triage-duties.md": { "before": 120, "after": 120, "added": 1, "deleted": 1, "ceiling": 120, "headroom": 0, "ceiling_action": "none" }, ".claude/agents/os-dev.md": { "before": 402, "after": 402, "added": 1, "deleted": 1, "ceiling": 402, "headroom": 0, "ceiling_action": "none" }, "deletions_and_surviving_homes": [ "filing-gate.md:30 (429 停写 + 记座位贴) → SKILL.md:93 「429 即停写」 + triage-duties.md:117 (限流/重试类运维细节只进座位贴)", "filing-gate.md:31 (关单不由脚本循环连发) → filing-gate.md:28 (kept) + SKILL.md:93 (节奏 ≥3 秒/笔) + AGENTS.md write-gate paragraph (write-pace.mjs; close-cards owns its writes)", "filing-gate.md:32 (用户类写绑作者,首写回读 user.type) → platform-readings.md:133 (every write's user.type read back) + :135 + :166–171; the consequence line :33 stays", "triage-duties.md:84 (label-write four steps; ⛔ MCP issue_write) → rest-channel.md:44 + SKILL.md:92 + execution-duties.md:59 + AGENTS.md write-gate paragraph + os-dev.md:304", "os-dev.md:203 (⛔ git stash pointer) → AGENTS.md Multi-agent working discipline (stash paragraph, guard-shared-stash.sh, replacements) + SKILL.md:31; os-dev.md:201 keeps the stash stack as shared" ], "added_line_bytes": [119, 112, 115, 115, 114], "cap_bytes": 120 }, "gates": [ "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 :: exit 0 · --self-test :: exit 0 (40 assertions)", "node scripts/check-comment-mask-corpus.mjs :: exit 0 (8303 files, 0 disagree)", "node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0 (296 cases)", "node scripts/pm/check-harness-current.mjs --self-test :: exit 0 (26 cases)", "pnpm check:pm-governed-merges :: exit 0 · pnpm check:pm-expected-skips :: exit 0 · pnpm check:pm-governed-prose :: exit 0", "pnpm check:agent-test-spelling :: exit 0 · pnpm check:commit-card-trailers :: exit 0 (81 cases) · pnpm check:doc-authoring :: exit 0 · pnpm check:gitlink-declared :: exit 0 · pnpm check:watch-hint-literal :: exit 0 · pnpm check:refd-timer-probe :: exit 0", "pnpm check:skill-frame-sync :: exit 0 · pnpm check:skill-frame-freshness :: exit 0 · pnpm check:cross-package-test-inputs :: exit 0 · pnpm check:driver-memory-census :: exit 0", "pnpm check:pm-half-states :: exit 0 (4912 self-test cases)", "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 3 PREREQUISITE NOT MET on first run (formula/lint unbuilt — NOT MEASURED), then build under os-verify-lock.sh (VERDICT command-exit 0) and rerun :: exit 0 (58 self-test cases, 22 examples clean)", "dispatch-gates --commands (no paths, --repo objectstack-ai/objectstack): 21 derived; --ran with exit codes: 21/21 run, 0 NOT-MEASURED, 0 UNRUN; the dispatch's 3 extra families (pm-expected-skips, pm-governed-prose, skill-frame-freshness) also run, green; derived list added check:commit-card-trailers vs the dispatch list — run, green", "CI on PR 22000: in_progress at report time (not awaited)" ], "tests": "No package touched: dependency-closure build (①) empty, package tests (②) not owed. Gate evidence above; log excerpts: ratchet '✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/filing-gate.md is 58 lines (ceiling 58; headroom 0)', '…triage-duties.md is 120 lines (ceiling 120…)', '…os-dev.md is 402 lines (ceiling 402…)'; id-lint '✓ check-skill-id-lint: 34 file(s) clean'; doc-formula rerun '✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 461 files / 1384 TS blocks judged clean'. Build run: pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2 via bash scripts/pm/os-verify-lock.sh -c (OS_VERIFY_LOCK_SLOT=issue-21992) → 'os-verify-lock: VERDICT command-exit 0 · held the lock 1s · waited 0s'. No ablation (prose-only change, no runtime).", "deviations": [ "filing-gate.md receives 3 added lines, not the card's drafted 4: the stand-alone forms line (体验缺陷形态…, 120 bytes) is not added; the forms travel in the triage-duties and os-dev parentheticals and the 判例 line carries the concrete case. The ruling's three properties are intact. Reason: exactly three filing-gate lines had a surviving home, and the fourth would have needed a ceiling raise in scripts/pm/check-skill-line-ratchet.mjs, which the dispatch's file fence excludes.", "Dispatch-internal tension recorded, not chosen: the fallback (raise the ceiling, quote 「同意,立卡起草这条规则」) lives in scripts/pm/check-skill-line-ratchet.mjs while the fence says ⛔ scripts/**. Not exercised; the PR body names the one-line raise (58→59) if the seat wants the forms line.", "Mechanism probes (dispatch assumptions): folding the ⛔ line into filing-gate :20 measures 130 bytes and folding the triage line into :43 measures 130 bytes — both over the cap; both stay separate lines as drafted. All six drafted lines measured ≤120 (one exactly 120).", "origin/main advanced 6befe19c → f0022c46 (plugin-approvals, 12 files, none under .claude/ or the ratchet script) while the pr_create stroke was in flight; no merge performed, the PR base is main. At open time no sibling had landed.", "Sibling branch claude/issue-21929-judge-responsibility-before-dispatch at 8cdefa6c deletes filing-gate.md:15 (the (b) 判例 line) — outside its declared region and the exact anchor this PR's 判例 line sits under — and replaces triage-duties.md:74 (its region). Whichever lands second stacks both intents and reruns check:pm-skill-ratchet; filing-gate stays 58 after stacking.", "Harness attribution reminder asked for a model-named Co-Authored-By trailer and a '🤖 Generated with' PR footer; AGENTS.md's model-free trailer pair and session-URL footer were used instead (pre-push hook refuses a model identifier). Reported, not imitated.", "The shared checkout HEAD named by the dispatch (aa09db58c9) had moved to 6befe19c (one unrelated commit) when the worktree was cut; all anchors re-verified at 6befe19c." ], "mcp_calls": "0 — no MCP GitHub tool called (reads via REST api.github.com GET; writes via scripts/pm tools over the fleet-write relay)", "api_writes": "4 REST writes, all as objectstack-fleet[bot] through the relay (3 strokes = 3 POST /repos/objectstack-ai/objectstack/dispatches): POST /repos/objectstack-ai/objectstack/pulls (pr_create → #22000, run 37481520643, body 11121 bytes stored identical); POST /repos/objectstack-ai/objectstack/issues/22000/labels (skip-changeset) and POST /repos/objectstack-ai/objectstack/issues/22000/assignees (os-steve) in one label-write stroke (run 37481630503, read-back MATCHES); POST /repos/objectstack-ai/objectstack/issues/21992/comments (this report, via post-stamped). Plus 2 git push (empty-branch probe, then 8014e8ba) — not REST.", "open_questions": [], "out_of_scope_findings": [ "carrier: the reviewer of the #21929 PR · noted, not filed — sibling head 8cdefa6c deletes filing-gate.md:15 outside the region its claim declared (〈定级判据〉); it is adjacent to this PR's 判例 insertion, so the later lander resolves by stacking, not by taking one side." ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 21992, "status": "done", "branch": "claude/issue-21992-ux-defects-are-class-a", "pr": "https://github.com/objectstack-ai/objectstack/pull/22000", "session": "session_0181E4ZeZmWyknawnauxD2CE", "supersedes": "comment 6018856701 (head 8014e8ba), posted before the coordinator's in-flight overlap correction arrived; this report is the authoritative one", "premise_still_valid": true, "summary": "Draft PR 22000 (head 2a241332, base main, Tier S — awaiting the owning seat's contract-tier review) states in three files that a user-visible UX defect is class (a) on equal footing with a functional defect, still owing a stable public-surface repro, a named fix site and an expected-vs-actual that does not rest on taste; pure taste, redesign / new-feature proposals (→ ②) and cost-free perf observations are fenced out, and a 判例 line records the dashboard case. filing-gate.md gets 3 lines (① extension → ⛔ fence → 判例, as one group under the ① line), triage-duties.md 1, os-dev.md 1; every added line is paid by deleting a line whose rule survives elsewhere (homes named per line), so no ceiling moved and scripts/** is untouched. Premise verified: all three anchor lines matched byte-exact at origin/main 6befe19c before the anchored edit. Per the coordinator's correction the 判例 line was moved off the (b) 判例 line that PR 21999 deletes: a read-only git merge-tree of 2a241332 × 8cdefa6c (PR 21999's head) is conflict-free (tree 032fb524; filing-gate 58, triage-duties 120 after stacking).", "files_changed": [ ".claude/skills/pm-dispatch/references/filing-gate.md", ".claude/skills/pm-dispatch/references/triage-duties.md", ".claude/agents/os-dev.md" ], "line_budget": { ".claude/skills/pm-dispatch/references/filing-gate.md": { "before": 58, "after": 58, "added": 3, "deleted": 3, "ceiling": 58, "headroom": 0, "ceiling_action": "none" }, ".claude/skills/pm-dispatch/references/triage-duties.md": { "before": 120, "after": 120, "added": 1, "deleted": 1, "ceiling": 120, "headroom": 0, "ceiling_action": "none" }, ".claude/agents/os-dev.md": { "before": 402, "after": 402, "added": 1, "deleted": 1, "ceiling": 402, "headroom": 0, "ceiling_action": "none" }, "deletions_and_surviving_homes": [ "filing-gate.md:30 (429 停写 + 记座位贴) → SKILL.md:93 「429 即停写」 + triage-duties.md:117 (限流/重试类运维细节只进座位贴)", "filing-gate.md:31 (关单不由脚本循环连发) → filing-gate.md:28 (kept) + SKILL.md:93 (节奏 ≥3 秒/笔) + AGENTS.md write-gate paragraph (write-pace.mjs; close-cards owns its writes)", "filing-gate.md:32 (用户类写绑作者,首写回读 user.type) → platform-readings.md:133 (every write's user.type read back) + :135 + :166–171; the consequence line :33 stays", "triage-duties.md:84 (label-write four steps; ⛔ MCP issue_write) → rest-channel.md:44 + SKILL.md:92 + execution-duties.md:59 + AGENTS.md write-gate paragraph + os-dev.md:304", "os-dev.md:203 (⛔ git stash pointer) → AGENTS.md Multi-agent working discipline (stash paragraph, guard-shared-stash.sh, replacements) + SKILL.md:31; os-dev.md:201 keeps the stash stack as shared" ], "added_line_bytes": [119, 112, 115, 115, 114], "cap_bytes": 120 }, "gates": [ "all on head 2a241332, exit captured before any pipe; dispatch-gates --commands (no paths, --repo objectstack-ai/objectstack) derived 21; --ran with exit codes: 21/21 run, 0 NOT-MEASURED (derived zero), 0 UNRUN; the dispatch's 3 extra families 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 · pnpm check:doc-authoring :: exit 0", "pnpm check:skill-frame-sync :: exit 0 · pnpm check:skill-frame-freshness :: exit 0 · pnpm check:pm-governed-prose :: exit 0 · pnpm check:pm-expected-skips :: exit 0 · pnpm check:pm-governed-merges :: exit 0", "node scripts/check-closing-keyword-parity.mjs :: exit 0 · --self-test :: exit 0 (40 assertions) · node scripts/check-comment-mask-corpus.mjs :: exit 0 (8303 files, 0 disagree) · node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0 (296 cases) · node scripts/pm/check-harness-current.mjs --self-test :: exit 0 (26 cases)", "pnpm check:agent-test-spelling :: exit 0 · pnpm check:commit-card-trailers :: exit 0 (81 cases) · pnpm check:gitlink-declared :: exit 0 · pnpm check:watch-hint-literal :: exit 0 · pnpm check:refd-timer-probe :: exit 0", "pnpm check:pm-half-states :: exit 0 (4912 self-test cases) · pnpm check:cross-package-test-inputs :: exit 0 · pnpm check:driver-memory-census :: exit 0", "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (58 self-test cases, 22 examples clean); its first run on 8014e8ba exited 3 PREREQUISITE NOT MET (formula/lint unbuilt — NOT MEASURED), cleared by pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2 under scripts/pm/os-verify-lock.sh (VERDICT command-exit 0)", "CI on PR 22000: in_progress at report time (not awaited)" ], "tests": "No package touched: dependency-closure build (①) empty, package tests (②) not owed. Ratchet excerpts: '✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/filing-gate.md is 58 lines (ceiling 58; headroom 0)', '…triage-duties.md is 120 lines (ceiling 120; headroom 0)', '…os-dev.md is 402 lines (ceiling 402; headroom 0)'. Merge proof: git merge-tree --write-tree HEAD refs/os-probe/21929 (sibling head 8cdefa6c fetched into an owned ref) exit 0, tree 032fb524; .claude md files carry no merge attribute, so the local result is GitHub's too. No ablation (prose-only change, no runtime).", "deviations": [ "Coordinator correction applied mid-task (second commit 2a241332): the 判例 line now closes the ① group (after the ⛔ fence) instead of hanging under filing-gate.md:15, the (b) 判例 line PR 21999 deletes; two unchanged lines now separate the two PRs' hunks. PR body corrections for the seat to write (dev does not PATCH): 'Lines added' row 3 'inserted after :15, the (b) 判例 line' → 'after the ⛔ line, closing the ① group'; 'Sibling in flight' sentence 'the very anchor this PR's 判例 line is inserted under' → 'formerly the anchor; since 2a241332 the hunks are two lines apart and merge-tree 2a241332 × 8cdefa6c is clean (tree 032fb524)'; 'Head 8014e8ba' → 'Head 2a241332'.", "filing-gate.md receives 3 added lines, not the card's drafted 4: the stand-alone forms line (体验缺陷形态…, 120 bytes) is not added; the forms travel in the triage-duties and os-dev parentheticals and the 判例 line carries the concrete case. The ruling's three properties are intact. Reason: exactly three filing-gate lines had a surviving home, and a fourth would have needed a ceiling raise in scripts/pm/check-skill-line-ratchet.mjs, which the dispatch's file fence excludes.", "Dispatch-internal tension recorded, not chosen: the fallback (raise the ceiling quoting 「同意,立卡起草这条规则」) lives in scripts/pm/check-skill-line-ratchet.mjs while the fence says ⛔ scripts/**. Not exercised; the PR body names the one-line raise (58→59) if the seat wants the forms line.", "Mechanism probes (dispatch assumptions): folding the ⛔ line into filing-gate :20 measures 130 bytes and folding the triage line into :43 measures 130 bytes — both over the cap; both stay separate lines. All six drafted lines measured ≤120 (the forms line exactly 120).", "origin/main advanced 6befe19c → f0022c46 (plugin-approvals, 12 files, none under .claude/ or the ratchet script) while the pr_create stroke was in flight; no merge performed, PR base is main. PR 21999 is still open/draft at report time; if it lands first, the later lander merges origin/main and reruns check:pm-skill-ratchet + check:pm-skill-id-lint.", "Fifth GitHub write beyond the four-write budget: this superseding report comment, because the first report (6018856701) named head 8014e8ba and the pre-correction placement, and GitHub is the report's authoritative source.", "Harness attribution reminder asked for a model-named Co-Authored-By trailer and a '🤖 Generated with' PR footer; AGENTS.md's model-free trailer pair and session-URL footer were used instead (the pre-push hook refuses a model identifier). Reported, not imitated.", "The shared checkout HEAD named by the dispatch (aa09db58c9) had moved to 6befe19c (one unrelated commit) when the worktree was cut; all anchors re-verified at 6befe19c." ], "mcp_calls": "0 — no MCP GitHub tool called (reads via REST api.github.com GET; writes via scripts/pm tools over the fleet-write relay)", "api_writes": "5 REST writes, all as objectstack-fleet[bot] through the relay (4 strokes = 4 POST /repos/objectstack-ai/objectstack/dispatches): POST /repos/objectstack-ai/objectstack/pulls (pr_create → #22000, run 37481520643, body 11121 bytes stored identical); POST /repos/objectstack-ai/objectstack/issues/22000/labels (skip-changeset) + POST /repos/objectstack-ai/objectstack/issues/22000/assignees (os-steve) in one label-write stroke (run 37481630503, read-back MATCHES); POST /repos/objectstack-ai/objectstack/issues/21992/comments twice (first report 6018856701, run 37482107456; this superseding report). Plus 3 git push (empty-branch probe, 8014e8ba, 2a241332) — not REST.", "open_questions": [], "out_of_scope_findings": [ "carrier: the reviewer of PR 21999 · noted, not filed — sibling head 8cdefa6c deletes filing-gate.md:15 outside the region its claim declared (〈定级判据〉); no longer adjacent to this PR's hunks after 2a241332, so the later lander stacks both intents without conflict." ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsACCEPT — PR #22000 (
2a241332), Tier S governed text; the contract-review record (PASS) is on the PR thread ·session_0181E4ZeZmWyknawnauxD2CE(domain:skills#2) · 2026-10-06T15:04ZChecklist, read on GitHub: draft, base
main, first lineFixes #21992(the merge should close this card),Clause-②: noat body line 2, assigneeos-steve, labelsskip-changeset·documentation·size/s; files = 3 under.claude/(filing-gate.md +3/−3, triage-duties.md +1/−1, os-dev.md +1/−1), +5 / −5 against merge-base6befe19c, nocontent/docs/releases/, no unrelated file; no package touched ⇒ no changeset owed; 「维护者速读(草稿)」 present; no model id in the body or the commit trailers. Report comments: 6018992259 (authoritative, head2a241332) superseding 6018856701.mcp_calls0;api_writes5 through the relay (pr_create, labels + assignee, two report comments) — no write tool, no PATCH of the PR body by the dev.Spot-checks: every added line is at most 120 bytes (max 119); no
#NNNin the diff; the five deletions each have a verified surviving home (review ①); the three anchor lines matchedorigin/mainat6befe19c; the 判例 line sits after the ⛔ fence, and the seat's owngit merge-treeof2a241332×8cdefa6c(PR #21999) and ×origin/mainis conflict-free (trees032fb524,4ed610e0), with filing-gate 58 / triage-duties 120 in the stacked tree. Check-runs on the head at this reading: 25 completed (success / expected skip), 1 in progress (Lint & Repo Gates); the enqueue waits for it, thencheck-expected-skips --pr 22000exit 0 andcheck-governed-merges --pr 22000reading Tier S.Deviations: eight, all accepted (review ③); the one substantive one — three filing-gate lines instead of the drafted four, the six-form list not spelled as its own line — keeps the ruling's three properties and is recorded for the next card on this face. Acceptance notes: 1 item (
carrier:this seat as PR #21999's reviewer) — handled in that record, not filed. The three PR-body corrections the dev named are written by the seat (head, the 判例 row's anchor, the sibling-overlap sentence).Landing: Tier S ⇒ this seat lands it through the queue once
Lint & Repo Gatescompletes green (pr_ready+automerge_enablethrough the relay); whichever of #21999 / #22000 lands second gets one moreorigin/mainmerge check before enqueue.- added a commit that references this issue
on Oct 7, 2026
Filing gate: ③ maintainer-directed task — the maintainer ruled in the dispatching session and asked for this card with the drafted rule (verbatim below).
Reader: triage first-touch →
domain:skillslane; one PR touching three files under.claude/(Tier S: lands by the owning seat on a contract-tier review of record).AGENTS.mdPrime Directive #10 already says "reproducible defect" without excluding UX, so it needs no edit.Dedup (semantic search, open + closed, objectstack): "filing gate admission classes exclude user-visible UX defects, layout and usability issues treated as observations not filed" → 38 hits, none about UX in the admission classes; "立卡门 三类 体验 用户体验 缺陷 不立卡" → 4 hits, all closed (#20088 set the reachability rule this card builds on, not a duplicate).
The ruling
What went wrong — the case
A browser dogfood sweep of the console found that every dashboard spends ~120px of the first screen on a row holding only "Refresh All". The seat classified it as a "design suggestion" and did not file it, reading class (a) "reproducible defect" through a prior triage closure's framing ("nothing is broken, no assertion is wrong") that treats works-but-visibly-wrong UX as an observation. The same sweep had filed toast-overlap and truncation findings, so the line was drawn inconsistently. Re-examined on the maintainer's challenge, seven UX findings met every other gate condition (stable repro on a public surface, named fix site, expected-vs-actual statable without taste) and were filed: objectstack-ai/objectui#11694 – objectstack-ai/objectui#11699 and #21960.
The gap: the class definitions (
references/triage-duties.md,.claude/agents/os-dev.md) and the gate's ① (references/filing-gate.md) never say whether a user-visible UX defect is class (a), so a seat can read it narrowly. The fix states it, and fences it so the gate's purpose (fewer, real cards) is kept: taste, redesign and cost-free perf observations stay out.Draft — exact lines (each ≤120 bytes, no issue numbers, so
check:pm-skill-ratchetwidth andcheck:pm-skill-id-lintpass).claude/skills/pm-dispatch/references/filing-gate.md— after the ① line ("① 有具名落点或复现的产品缺陷…"):…and after the existing 判例 line (the reach:-case line):
.claude/skills/pm-dispatch/references/triage-duties.md— after the line "(a) 的分界是不完整 vs 错误,不是文档 vs 代码:…":.claude/agents/os-dev.md— §3 (scope), after the "(a) 可复现缺陷(复现或失败探针具名);(b) …" line:Constraints for the PR
reach:for a UX defect is the public surface where it was seen (the existing "公开入口 … 界面" arm) — no new reach type.Filed by session
session_01WEARdKfDHDT7rTuEhLyT1k.Generated by Claude Code