Repository navigation
Description
Filing gate: ③ a pm-rule clarification named by the maintainer, quoted verbatim below.
Reader: domain:skills seat 2 (#19287, vacant at filing; the next holder), one PR of skill text only under .claude/skills/pm-dispatch/** (SKILL.md 〈升级与决策〉 and/or references/triage-duties.md), at the governed register's tier for that path and at the ceiling model per the maintainer's standing rule for skills cards.
Dedupe (gh api search/issues, 2026-11-03 00:36Z): open domain:skills cards = 31, none about name approval or the escalation clause; open issues containing 「升级与决策」 = 8 (seat posts and unrelated feature cards); open issues containing 「否决窗口」/"veto window" = 14, same set plus seat posts. Nearest closed neighbours: #19940 (which landings must reach the maintainer; it kept the pending-release-note correction as a human gate) and #23934 (「卡先于弹窗」). Neither covers a new public name. 0 duplicates.
The order
Warren, 2026-11-03, project thread 「Decide pending spec name approvals」, verbatim and untranslated:
按照 skills 这个需要批准吗 (00:08:26Z, on six spec PRs whose only open item was his approval of a new key or export name)
是技能有问题吗?是否应该立卡更新skills? (00:33:18Z)
and his two decision-card answers in the same thread:
以后新键名/导出名还送你批吗? → 只有真分歧才送 (00:32:19Z; the option read: 先例定不了、备选名真分歧时才开 fable 决策线程;其余席位自定。这就是技能原文的标准。)
立一张 skills 卡补这句澄清吗? → 立,我来立 (00:35:04Z)
What the rules say today, and what happened
SKILL.md〈升级与决策〉: 「只在至少一条成立时升级:选项在产品语义或公开契约形状上真实分歧且既有规范定不了」 … 「其余归 PM 裁量:派发与排序,维护者否决窗口而非许可门」.references/triage-duties.mdline 42: 「needs-user-decision= 设计卡、feature/契约形状提案、需要 appetite 的多周程序」.- Neither line says what a NEW KEY NAME on an already-ruled protocol card is. Triage read "a new public key" as a 契约形状提案 and wrote, on every
Metadata-protocol: addedcard it audited on 2026-11-02, that the new authorable name "waits for the maintainer's approval before merge" and that the PR body must quote that approval (audits 6583861409 on spec(automation): a flow start input may declare that it is a record id of a named object (#29425 ruling A) #29442, 6587041711 on spec(data): thereferenceNameVisibledescribe namesnameFieldwhere the engine resolves the ADR-0079 display name, lists three of its five name floors, and the served{ id, name, readRefused }value has no named schema #29579; the same clause reached GET /auth/config serves nine features keys the spec does not declare, and nothing pins the feature registry to the schema #29473, spec: ConnectorConnectionState answers the derived OAuth redirect URI (read-only key, name awaits the maintainer) so the Console can show it before an installer registers a client #29574 and spec + runtime: a package export carries no namespace and no dependencies, so a reinstalled .custom pair lands under the wrong namespace without its base edge; declare both on PackageExportManifestSchema and emit them #29617 through the seats' claims). The parent ruling on [Decision] flows and records: may a flow start input declare a record reference (A), and does a non-system create stop choosing the new record's id (C)? #29425 (6580257050) had already said the key's spelling "is the spec card's to set". - Measured cost: six PRs (feat(spec): a flow start input can declare that it is the id of a record of a named object (objectName) #29571, feat(spec): ConnectorConnectionState declares redirectUri, the derived OAuth redirect URI #29618, spec(data): the name-only reference value a refused reader is served has a named schema, and referenceNameVisible says which name it carries #29623, feat(spec): declare the nine served features keys on the auth config response and pin the registry to the schema #29583, fix(spec): read a stored object_extension row as an objectExtensions entry, and list its refused fieldPatches keys #29589, feat(spec,runtime): a package export carries its namespace and dependencies, so a reinstalled .custom pair keeps both (#29617) #29651) sat accepted-but-unqueued on 2026-11-02 evening waiting only for that nod; the maintainer approved all six unchanged at 00:08Z, each name having a repo precedent the seat had already cited (
objectNameon CRUD and START nodes; RFC 6749redirect_uriand the plugin optionconnectorOAuthRedirectUri;FileRefusedValueSchema+metadataRefused: true; the server's owngetPublicConfig()keys;ManifestSchema's ownnamespace/dependencies). One of the six (fix(spec): read a stored object_extension row as an objectExtensions entry, and list its refused fieldPatches keys #29589) was a real human gate for a different reason: the DELIBERATE CORRECTION class ofscripts/check-empty-changeset.mjs(ruling D on finding: random changeset filenames collide silently across parallel agents — a round overwrote a sibling PR'sminorchangeset and every gate stayed green #17712) says "get it confirmed on the PR" and has no second command. That gate is untouched by this card.
Rule to write (the one point, nothing else)
A new key, accepted value or export name whose spelling repo precedent settles (the same word already used for the same concept in the spec, the producer or the standard the key implements) is the seat's call: the seat names the precedent in the PR body and lands under the maintainer's veto window, with no approval line and no needs-user-decision. It goes to the maintainer only when the candidate names genuinely diverge on product semantics or public contract shape and existing spec cannot settle it, which is the existing 〈升级与决策〉 test. Triage's audit comment does not add an approval gate of its own.
Where it lands
One sentence in SKILL.md 〈升级与决策〉 (if paid under the line ratchet; the file sits at its ceiling) or one clause on references/triage-duties.md line 42 saying that a precedent-settled name is not a 契约形状提案. No change to AGENTS.md, to the DELIBERATE CORRECTION gate, or to the six cards already ruled.
Acceptance
- The text names the precedent test (same word, same concept, in spec / producer / standard), says the seat lands it under the veto window, and says a genuine divergence on semantics or contract shape is the only path to the maintainer, in those words.
- Line ratchet paid line for line; every touched line ≤ 120 bytes; no issue numbers in operative text (id-lint).
- Independent contract review on the PR head before the seat's ACCEPT, per the governed path's tier.
- Round report cites this card's order lines verbatim.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
domain:skills·pm:queue· 2026-11-03T00:52Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 3, 2026
domain:skills#3 · os-support-ai · session_01WGufzhd2Ad9ANGTyAMW7pH
Claim: PM loop round 1 · 2026-11-03T03:25Z
Session:
session_01WGufzeuZW7cui7Lktvjq41(os-dev card thread "Clarify when new key names need approval"; dispatched bysession_01WGufzhd2Ad9ANGTyAMW7pH)Account:
os-support-aiBranch:
claude/project-thread-wvlstxWorktree:
objectstack-issue-29663Domain:
domain:skillsSeat:
domain:skills#3File surface:
.claude/skills/pm-dispatch/SKILL.md〈升级与决策〉 and/or.claude/skills/pm-dispatch/references/triage-duties.md(theneeds-user-decisiondefinition line); no changeset (skip-changeset)Container & model:
S,mode:thread,model: CONTRACT_REVIEW_TIER — dispatch-gates --tier MANDATORY on .claude/skills/pm-dispatch/SKILL.md (clause ①),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6592450627
Premise: holds
Serial constraints cleared: PR #29717 (#29709, another seat) edits one line of
references/execution-duties.md— not in this surface; no in-flight claim onSKILL.mdorreferences/triage-duties.mdobjectstack-fleet commentedon Nov 3, 2026
domain:skills#3 · os-support-ai · session_01WGufzeuZW7cui7Lktvjq41
os-dev-report
Stamp: 2026-11-03T06:23Z
{ "issue": 29663, "status": "done", "branch": "claude/project-thread-wvlstx", "pr": "https://github.com/objectstack-ai/objectstack/pull/29825", "head": "87c5223b80d91f249ef0a202dfedd6cee3124145", "session": "session_01WGufzeuZW7cui7Lktvjq41", "premise_still_valid": true, "summary": "Two lines of rule text under .claude/skills/pm-dispatch/: SKILL.md 〈升级与决策〉 gains 「新键/值/导出名有先例(spec、生产者或标准同词同概念):席位点名先例,否决窗口落地。」 right after the discretion sentence, paid by cutting 「速读六行固定:…」 whose roster lives verbatim in .claude/agents/os-dev.md; references/triage-duties.md gains 「先例已定新键/导出名非契约形状提案;分诊审计 ⛔ 不自加门,唯语义/形状真分歧呈人。」 right after the needs-user-decision definition line. Branch fast-forwarded to origin/main 10e4a774 before the edit; one commit on top.", "line_budget": "SKILL.md 319 → 319 (net 0, ceiling 319, no re-wrap); references/triage-duties.md 96 → 97 (+1); touched lines 114 and 116 bytes; no issue number in operative text", "files_changed": [".claude/skills/pm-dispatch/SKILL.md", ".claude/skills/pm-dispatch/references/triage-duties.md"], "tests": "rule text only; no test file moves", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 10e4a774 + working tree: 22 derived (2 paths). All 22 run, exit codes captured before any pipe, 22 × exit 0 — check:doc-formula-expressions first exit 3 (PREREQUISITE NOT MET, formula/lint not built), rebuilt under os-verify-lock (VERDICT command-exit 0, 113 s) and rerun exit 0. check:pm-skill-ratchet 0, check:pm-skill-id-lint 0, check:pm-governed-prose 0, check:skill-frame-sync 0. dispatch-gates --ran: 22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN. dispatch-gates --tier SKILL.md: MANDATORY claude-fable-5-1 (clause ①). CI check-runs: pending at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "5 — GitHub MCP reads only: issue_read get ×1, issue_read get_comments ×3, pull_request_read get ×1; no write tool", "api_writes": "2 relay writes as objectstack-fleet[bot]: pr_create (#29825, 6272 bytes sent, 6272 stored, identical, labels [skip-changeset], no assignees), comment (this report on #29663). Plus 1 git push of the thread branch.", "writes": "git push x1; relay pr_create x1; relay comment x1", "deviations": [ "Sentence landed in BOTH SKILL.md and references/triage-duties.md (the order allowed either); tier stays as dispatched.", "SKILL.md ratchet paid by cutting the six-line reader roster from the seat-record block; its home is .claude/agents/os-dev.md (verbatim roster), not a references/ file.", "No PR subscription, no assignee and no reviewer request on pr_create (os-dev rule 2; the seat hands over).", "Worktree ../objectstack-issue-29663 kept for a patch round." ], "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 3, 2026
domain:skills#3 · os-support-ai · session_01WGufzhd2Ad9ANGTyAMW7pH
ACCEPT → PR #29825 comment 6597200642 (head
f93dee0d, Tier S; contract review PASS 6597105684 + delta 6597189423). Lands by the seat once every check on that head is green.