Skip to content

Commit f3d0159

Browse files
hotlongclaude
andcommitted
docs(pm-dispatch): 记录两条维护者已批元判据 + 决策卡前提刷新纪律 (#6140)
维护者 2026-08-07 决策箱第 2 轮拍板的三项,落到 PM 技能的 step 8 升级判据族与决策卡 流程段;两份文本各随本文件语种(内部件中文条款,发布件按 #5451 route B 泛化为英文、 不带本仓 issue 号、不出现 role 一词)。 - .claude/skills/pm-dispatch/SKILL.md - step 8「第三档」之后新增中文条款块「两条元判据 —— 一整族近似单默认不进决策箱」: ① 静默丢弃的声明默认并入既有拒收集(#5714 → #5931 白占一个槽位),⚠️ #5739/#5918 边界与本条同段陈述 —— 继承的是裁决连同它的理由,母单理由被实测为分支特有时不适用; ② 一个操作两个实现,默认治理侧(权限闸/同意/去重/审计)胜出,另一侧改绑并删除 (cloud#896 / cloud#1147 三问 / #4636 的 B 选项同形)。 - 升级流程编号表新增第 1 条「先刷新卡片的前提 —— 落卡与复升级都适用」,原 1/2/3 顺延为 2/3/4(cloud#1148 的卡在写下前 ~50 分钟即失效;cloud#812 带三条过时前提)。 - skills/objectstack-pm-dispatch/SKILL.md:同一 step 8 面存在对应结构,按 route B 加 泛化版 —— 两条 named non-escalation class + 流程表第 1 条前提刷新,机制化描述取代 仓内 issue 号。 ⛔ 未触碰三轴决策框架:check:skill-frame-sync 改前改后输出**逐字节相同** (4 copies / 3 axes / binding sentence present in all 4 / 4 count mentions agree), check:skill-frame-freshness 亦绿。纯文档改动,不发布任何包,故无 changeset。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BDmDsu2575gDxeMCxXhDE3
1 parent e4a03d2 commit f3d0159

2 files changed

Lines changed: 73 additions & 6 deletions

File tree

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,10 +1818,41 @@ dev 用五项检查验证了它,其中一条是**反向证据**:`spec/src/api/an
18181818
第 3 条最容易被省掉,而省掉它就退化成最坏形态:前提不成立时 dev 自行改选,那正是**无人
18191819
裁决**的状态,且没有任何读数会显示它发生过。
18201820

1821+
**两条元判据 —— 一整族近似单默认不进决策箱(维护者 2026-08-07 决策箱第 2 轮拍板)。**
1822+
上面的「不升级四类」说的是**单张单**自带裁决;这两条说的是**一族形状相同的单**不必逐张
1823+
问 —— 族里第一张已经裁过,后来的默认继承那条裁决。重复立卡不是谨慎,是拿维护者的时间
1824+
买同一个答案。
1825+
1826+
- **静默丢弃的声明,默认并入既有拒收集。** 适用判据:一个**已声明的键**在组件的某一支上
1827+
被**静默忽略**,而更早的裁决已把同一个键在**兄弟支**上定成**响亮的编写期错误**。此时
1828+
新支**默认并入既有拒收集** —— 复用母单的裁决直接入队派发,⛔ 不为它另开决策箱槽位;
1829+
只有两支之间存在**真实语义差异**时才重开。出处:#5714 把 `pool`-on-sqlite 裁成编写期
1830+
错误之后,#5931(`memory` 支)仍占了一个槽位,而它只是那条裁决的一词之差的外延;同族
1831+
重复整周都在发生。⚠️ **边界必须与本条同段读,否则这条捷径会被用过头**:继承的是**裁决
1832+
连同它的理由**,不是「拒收」两个字 —— 母单的理由**被实测为分支特有**时本条不适用。
1833+
#5739(维度侧)的理由是「拒收会连带拒掉今天已经能跑的查询」,该理由在**度量面上被
1834+
证伪**,所以 #5918 另裁一次是对的。判法固定:把母单的理由拿到新支上复核一遍,理由不
1835+
成立就回正常升级路径,别让「同一个键」这个表面相似度替你做判断。
1836+
- **一个操作两个实现,默认治理侧胜出。** 适用判据:同一个操作存在两处实现,且两处行为
1837+
不一致。**带治理的那一侧**(权限闸、用户同意、去重、审计留痕)是**默认幸存者**,另一侧
1838+
**改绑到它并删除** —— 不是两侧对齐,也不是保留双写。反向裁只在**产品语义明确要求**时
1839+
成立,且必须把那条语义写进裁决正文,而不是默认成立后再补理由。出处:cloud#896
1840+
(hostname)即此形定案;cloud#1147 的三个待答问题(重装 = UPSERT、卸载 = 软停用、外部
1841+
词表 = manifest id)按本条全部落在治理侧;objectstack#4636 的 B 选项是同一形状。留着
1842+
未治理的那一侧等于给权限闸留一条旁路,而「声明即强制」要堵的正是那条旁路。
1843+
18211844
Whenever a dev returns `needs_decision` that passes the bar above, an issue
18221845
is too vague to dispatch, or rework has failed twice:
18231846

1824-
1. **Default: the decision lives ON the issue it belongs to — never a new
1847+
1. **先刷新卡片的前提 —— 落卡与复升级都适用。** 决策卡写下的每条前提(某个在飞
1848+
PR 还没合、某能力还不存在、某文件还是那个形状)都是**有保质期的读数**:main
1849+
一天 ~18 合并,跨仓事实按小时变。落卡**之前**、以及把一张旧卡重新推到维护者
1850+
面前**之前**,逐条复核一遍,失效的就地改写或撤卡 —— **隔夜没动过的卡,默认按
1851+
「前提未经验证」处理,不是按「还在等答复」处理。** 出处是决策箱第 2 轮的实测:
1852+
cloud#1148 的 A/B 卡在**写下前 ~50 分钟**就已失效(它等的那个上游 PR 已经合了),
1853+
cloud#812 一张卡带三条过时前提。前提过期的卡比没有卡更贵 —— 维护者会照着一个
1854+
不存在的世界做裁决,而卡面上没有任何读数会显示这件事发生过。
1855+
2. **Default: the decision lives ON the issue it belongs to — never a new
18251856
issue.** Post the analysis as a comment on that issue, add the
18261857
`needs-user-decision` label, drop it from the active queue. The label is
18271858
the maintainer's inbox (filter `label:needs-user-decision` shows
@@ -1832,7 +1863,7 @@ is too vague to dispatch, or rework has failed twice:
18321863
when the decision has no natural anchor — it spans several issues (file
18331864
one, link it from each rather than duplicating the analysis) or arose
18341865
with no issue of its own.
1835-
2. The analysis, wherever it lands (English, per the language policy):
1866+
3. The analysis, wherever it lands (English, per the language policy):
18361867
background / the concrete question / options / your recommendation /
18371868
related issues, PRs, branches。**每个方案必须沿三条固定评估轴
18381869
分析,这是决策分析的核心原则,不是可选项:**
@@ -1858,7 +1889,7 @@ is too vague to dispatch, or rework has failed twice:
18581889
绝不让 AI 能声明一个运行时不兑现的能力。
18591890
推荐意见必须基于这三条轴给出理由;三轴冲突时如实呈现权衡,交维护者
18601891
拍板。
1861-
3. If the session is interactive, additionally raise it via `AskUserQuestion`;
1892+
4. If the session is interactive, additionally raise it via `AskUserQuestion`;
18621893
the labeled issue remains the durable record either way. **Never** answer
18631894
a product/architecture question on the maintainer's behalf.
18641895

‎skills/objectstack-pm-dispatch/SKILL.md‎

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -439,24 +439,60 @@ Named non-escalation classes — act immediately:
439439
- **Sequencing and dependency ordering** between technical tasks.
440440
- **Verification strategy** — what regression pass a risky-but-decided change
441441
needs. That is scoping the work, not deciding it.
442+
- **A declaration silently dropped on a new arm, when a sibling arm already has
443+
a ruling.** When a declared key is silently ignored on one arm of a component
444+
and an earlier ruling already made that same key a **loud authoring error** on
445+
a sibling arm, the new arm **joins the existing rejection set by default** —
446+
reuse that ruling, queue it, dispatch it; do not spend a fresh decision on a
447+
one-word extension of an answer you already have. Only a genuine **semantic
448+
difference between the arms** reopens the question. **State the boundary in the
449+
same breath as the default, or the shortcut gets over-applied:** what carries
450+
over is the ruling **together with its rationale**, never the verdict alone.
451+
When the original rationale was measured to be arm-specific — it held on the
452+
face it was ruled on and is disproved on the new one, as a "refusing this would
453+
reject usage that already works" argument does the moment the new arm has no
454+
such working usage — the default does not apply and the new arm earns its own
455+
decision. The test is mechanical: re-check the original rationale against the
456+
new arm *before* reusing the verdict. Sharing a key name is not sharing a
457+
reason.
458+
- **Two implementations of one operation.** When one operation has two
459+
implementations and they disagree, the side that already carries the
460+
**governance** — authorization gates, user consent, de-duplication, audit
461+
trail — is the **default survivor**; the other is rebound onto it and deleted.
462+
Not reconciled, not kept as a second writer. The ungoverned side wins only
463+
when **product semantics explicitly demand** it, and that semantic goes into
464+
the decision text rather than being supplied afterwards as justification.
465+
Keeping both implementations keeps a path around the gates — exactly what
466+
`declared = enforced` exists to close.
442467
- A developer agent's `needs_decision` that, on review, falls into the classes
443468
above: answer it yourself with the decision and rationale; do not relay it
444469
upward.
445470

446471
When something *does* pass the bar:
447472

448-
1. **The decision lives ON the issue it belongs to — never a new issue.** Post
473+
1. **Refresh the card's premises first — before writing it, and again before
474+
re-escalating it.** Every premise a decision card states (an in-flight change
475+
has not landed, a capability does not exist yet, a file still has this shape)
476+
is a **reading with a shelf life**: an active main branch takes on the order
477+
of a dozen or more merges a day, and cross-repository facts move on an hourly
478+
scale. Re-check every premise immediately before posting the card — and again
479+
before pushing an older card back in front of the maintainer — then rewrite or
480+
withdraw whatever no longer holds. **A card that sat overnight untouched is a
481+
card whose premises are unverified, not merely a card that is waiting.** An
482+
expired premise is worse than no card: the maintainer rules on a world that no
483+
longer exists, and nothing on the card shows that this happened.
484+
2. **The decision lives ON the issue it belongs to — never a new issue.** Post
449485
the analysis as a comment there, add `needs-user-decision`, drop the issue
450486
from the active queue. The label is the maintainer's inbox (filter
451487
`label:needs-user-decision`); when they answer, the label comes off and the
452488
issue re-enters the queue. File a **separate** issue (titled
453489
`[Decision] <one line saying what must be decided>`, same label) ONLY when
454490
the decision has no natural anchor — it spans several issues, or arose with
455491
no issue of its own.
456-
2. Write the analysis with: background, the precise question, the options, your
492+
3. Write the analysis with: background, the precise question, the options, your
457493
recommendation, and the related issues / PRs / branches — **and analyze
458494
every option on the three fixed axes below.**
459-
3. If the session is interactive, additionally ask the maintainer directly; the
495+
4. If the session is interactive, additionally ask the maintainer directly; the
460496
labeled issue remains the durable record either way. **Never** answer a
461497
product or architecture question on the maintainer's behalf.
462498

0 commit comments

Comments
 (0)