Repository navigation
Description
⏱️ 本卡所有读数取自同一动作:2026-09-17T19:10Z。逐条本席第一手实测;dev 交上来的版本里有一处群体判据是错的,本卡按实测改正后再记。
一句话
scripts/check-adr-anchors.mjs 只在紧挨编号、同一行的 token 恰为 objectui / object-ui / cloud 时才把引用当作跨仓豁免。⇒ 本仓已在用的三种拼法都不豁免:post-cloud ADR-NNNN、反引号包起来的 `objectstack-ai/cloud` ADR-NNNN、以及限定词被折行的写法。它们今天全绿,只是因为这些编号碰巧在本仓也有同号 ADR —— 而那正是卡 #18685 要修的那种「解析到一篇真实但无关的文档」。
实测:本席自己对真门禁跑的三个探针
⏱️ 下面这块读于 2026-09-17T19:10Z。
在 PR #18754 的 head(edcbcda254)工作树上,逐个把一行探针写进 ai-service.ts 再跑真门禁:
cloud ADR-9911 -> exit 0 豁免
post-cloud ADR-9912 -> exit 1 ⛔ 不豁免 ← 正是 PR #18754 落的那种拼法
ADR-9915(裸) -> exit 1 ⛔ 正确拒绝
探针用的是**本仓没有同号**的 9911/9912/9915 ⇒ 排除「碰巧有本地同号」这个混杂因素。
还原后 `git diff` 对该文件 0 行 ⇒ 探针没留痕。
⇒ 结论不是「门禁坏了」,是门禁的豁免面比本仓的散文惯例窄,而差集里的写法正被当作合规在用。
⭐ 本席对 dev 那条理由的改正:群体判据反了
dev 的建议(把 post-cloud 加进 CROSS_REPO_QUALIFIERS)理由是「散文形式已经是本仓既有惯例」。实测不支持这句话:
⏱️ 下面这块读于 2026-09-17T19:10Z。
origin/main 上:
`post-cloud ADR` 1 处 (.changeset/15937-confirmed-blueprint-identity-protocol.md)
`cloud ADR-`(豁免形) 212 处
⇒ 占压倒多数的恰恰是门禁认的那一种,post-cloud 是 213 里的 1。
⭐ 而 PR #18754 对齐的那个「兄弟行」,它自己也不豁免
⏱️ 下面这块读于 2026-09-17T19:10Z。
packages/spec/src/contracts/ai-service.ts(PR #18754 head)
:627 ... (cloud, post-cloud ADR-0025). ← 本次改成的行,同行限定词,⛔ 不豁免
:634 ... (cloud, post-cloud ← 兄弟行,限定词停在行尾
:635 * ADR-0025) — the same provenance ... ← 编号在下一行 ⇒ 限定词被折断,⛔ 也不豁免
⇒ 「与兄弟行保持一致」在这里等于与一条本身不合门禁的行保持一致。post-cloud 确实把读者指向 cloud),⛔ 但这条账要记在明处。
建议的修法(⛔ 非裁定)
- A —— 把
post-cloud纳入限定词,并让解析容忍尾随反引号/粗体标记与折行。⚠️ 理由不是「已是惯例」(见上),而是:折行是 Prettier/编辑器会自然产生的,一条 PD-13 正确的引用不该因为换行位置而变红。 - B —— 改惯例:每处 cloud 引用都把裸
cloudtoken 紧挨编号。⚠️ 代价是要改现存的散文写法,并且(cloud, cloud ADR-0025)读起来重复。 - C —— 两者都不动,接受「豁免面窄于散文惯例」。
⚠️ 代价是:第一个在本仓没有同号的 cloud 编号会让一条 PD-13 正确的引用把门禁变红,而那时的现场看起来像是引用写错了。
⭐ 本席倾向 A,但理由要换成上面那条;⛔ 合不合算由维护者定。
⭐ 门禁自己的自测为什么没发现
scripts/check-adr-anchors.mjs 的自测只演练了不带反引号、不折行的那一种拼法 ⇒ 差集里的三种从未被测过。⇒ 无论取 A 还是 B,都该把这三种形状钉进自测,⛔ 否则下次照样漏。
查重(MCP search_issues,含 closed)
- [finding] The repo never resolved whether the pre-repo
ADR-0081iscloud ADR-0081— and ADR-0105 cites both spellings in one document #9072(closed)是近邻:「本仓从未裁定ADR-0081是不是cloud ADR-0081」—— 那是某个编号归属未定,本卡是解析器的限定词面,不同缺陷。 - [Decision] Where does a decision that governs OPEN code live? — cloud (private) ADRs are cited from this public repo in 60 files with a qualifier and ~110 more times bare, squatting on unrelated local numbers (0024 · 0071 · 0081); mirror them here, or qualify only #14496(closed,协调节点)+ AGENTS.md: record the ADR-registry rule — a decision lives where the code it governs lives; cloud records are cited as
cloud ADR-NNNN, never bare; a cloud decision whose mechanism half governs open code gets a local ADR with Provenance (the 0079 shape) #14509(closed,把 PD 13 写进 AGENTS.md)是本规则的出处。⇒ 规则立了,解析器的面没跟上,⛔ 无孪生。
出处
domain:spec seat 2(座位贴 #18549)复核 PR #18754 / 卡 #18685 时,dev 在 out_of_scope_findings 里交出来的。本席重跑了全部三个探针、改正了它的群体判据,并补了「兄弟行自己也不豁免」这一条。
维护者速读(由分诊席入箱时补写;⛔ 不含裁定)
一句话问题:我们有一道门禁,专门防止「文档里写了一个编号,读者顺着它落到错的仓的文档」。今天它只认一种很窄的写法;凡是换行换在不巧的位置、或者用了另一个同样把读者指向正确仓的说法,它就把一条本来正确的引用判红 —— 而现场看起来像是作者写错了编号。
选项 × 真实代价
| 选项 | 做什么 | 客户可感知的后果 |
|---|---|---|
| A 放宽门禁的识别面 | 把 post-cloud 纳入限定词,并让解析容忍尾随反引号/粗体标记与折行 |
作者按自然写法(含被编辑器折行的那种)引用外仓编号不再被误判;代价是这道门以后拒得少一点,需要一条反向 pin 证明它仍然拒得住真正的裸编号 |
| B 改散文惯例 | 要求每处外仓引用都把裸 cloud token 紧挨编号写 |
门禁不动;代价是要改现存写法,且 (cloud, cloud ADR-0025) 读起来重复,并且这条义务由人每次记住 |
| C 两者都不动 | 接受「豁免面窄于散文惯例」 | 今天没有成本;但第一个在本仓没有同号的外仓编号会把门禁变红,而那时的现场看起来像引用写错了 —— 下一个人很可能去「修」一条本来正确的引用 |
业务含义直译:A = 把「读者会不会走错门」这件事交给机器判,并接受机器判得宽一点;B = 机器不动,让每个写文档的人多记一条规矩;C = 先不动,把一个已知的假红留给下一个撞上的人。
四轴从业务立场
- ① 长远合理性:A 让门禁的判据与它自己的目的(读者被指向正确的仓)对齐 ⇒ 特例减少;B 是让散文迁就解析器的形状 —— 契约迁就实现;C 保留一处已知的错报面。
- ② 今天谁撞上:实测 1 / 213(
post-cloud ADR在origin/main上 1 处,门禁认的cloud ADR-形 212 处)⇒ 拉动非零但很小,故 ⛔ 不按「零拉动默认 defer」处理,但也⛔ 不能说这是普遍误报。 - ③ 防 AI 犯错(出错时谁看到什么):C 最坏 —— 门禁红了,而红的原因看起来是「编号写错了」,于是下一个人去改一条正确的引用;A 之后门禁拒得更准;B 之后写法统一,但要靠人每次记住。
- ④ 创业阶段不扩散:C 不新增义务但留一个陷阱;B 把义务推给每一个写散文的人,永久、靠人执行;A 把义务一次性放进解析器,靠机器执行。按「每个已声明的键都是永久义务」,A 是把一条要人记住的约定换成机器判定。
推荐 + 回退 + 置信缺口:荐 A。⛔ 排除 B 的依据是章程而非偏好 —— 「契约迁就实现⛔ 不作推荐」。回退 C(若判定放宽识别面确属门禁削弱且不愿承担,C 至少不引入新义务;代价是 ③ 那条陷阱留着)。
置信缺口:⛔ 未量到 cloud / objectui 侧将来会新增多少条本仓无同号的外仓引用(即 C 的陷阱多久触发一次);⛔ 未量 A 的放宽会不会让某些真正的裸编号被误豁免 —— 这一格正是「算不算门禁削弱」争议的实质。
自检:只看①选 A;②③④ 是否翻转:否(② 拉动小但非零,③④ 与 ① 同向)。
⭐ 真正要裁的那一句:本卡要的不是 A/B/C 哪个更好看,而是 —— 放宽 check-adr-anchors 的豁免面,算不算 SKILL.md:391 所列的「门禁削弱(降阈/删必查/抬上限/跳测)」。两种读法都成立(「放宽 = 削弱」 vs 「今天被拒的那些引用本来就正确,A 是在修误报」),而没有任何席位能替维护者在这两种读法之间选。
裁后执行段(让维护者只裁方向,⛔ 不背执行)
- 裁 A ⇒ 一张 dev 卡改
scripts/check-adr-anchors.mjs的限定词集合与解析(容忍尾随反引号/粗体、容忍折行),必带一条反向 pin:一个真正的裸编号(本仓无同号)仍须 exit 1 —— 那条 pin 是把「放宽」与「削弱」分开的唯一机器证据;并补门禁自测(卡面已点名:自测只演练了不带反引号、不折行的那一种拼法)。 - 裁 B ⇒ 一张 dev 卡把现存外仓引用改成裸
cloud紧挨编号,并把该惯例写进受管散文;⛔ 不动门禁。 - 裁 C ⇒ 关本卡
not_planned,并在门禁的拒收文案里写一句「若你引用的是外仓编号,请按<受支持拼法>写」,让那条假红至少能自解释。
前提 re-check 命令(裁决前或执行前任一方可自行重跑,⛔ 不必信任何一方的读数)
node scripts/check-adr-anchors.mjs # 现状
git grep -c "post-cloud ADR" origin/main # 差集里的写法有多少
git grep -c "cloud ADR-" origin/main # 门禁认的写法有多少(亮控)
os-decision-facets
① 项目长远合理性:A 让门禁的判据与其目的(读者被指向正确的仓)对齐、特例减少;B 是契约迁就实现;C 保留一处已知错报面。
② 实际业务拉动:实测 1 / 213(post-cloud ADR 1 处 vs 门禁认的 cloud ADR- 212 处)⇒ 非零但很小,故⛔ 不按零拉动 defer,也⛔ 不可称为普遍误报。
③ 防 AI 犯错:C 最坏 —— 红的现场看起来像「编号写错」,下一个人会去修一条正确的引用;A 之后拒得更准;B 靠人每次记住。
④ 创业阶段不扩散:A 把一条要人记住的约定换成机器判定(一次性);B 把永久义务推给每个写散文的人;C 不新增义务但留陷阱。
Prior rulings read: cloud,objectui,post-cloud,adr-nnnn,check-adr-anchors → 24 hits; ADR-0076 D12, ADR-0131 D13, ADR-0006 D2, ADR-0067 D6, ADR-0068 D1, ADR-0068 D2, ADR-0068 D4, ADR-0070 D2, ADR-0070 D5, ADR-0076 D7(AGENTS.md PD-13 只要求「留下编号并上锚」,对限定词拼法亦无一字)
推荐 A;自检「只看①选 A;②③④ 是否翻转:否」。
置信缺口:⛔ 未量外仓将来新增多少条本仓无同号的引用;⛔ 未量 A 的放宽会否让真正的裸编号被误豁免 —— 后者正是「算不算门禁削弱」的实质,须由裁后执行段里那条反向 pin 关闭。
末句一字问:A / B / C?
本块由分诊席入箱同笔追写于正文尾部,依据见同卡分诊答复评论。立卡席的原文一字未改;⛔ 本块不含裁定,推荐是 decision-analysis.md 要求的必填项而非结论。
Generated by Claude Code
Activity
os-try-charles commentedon Sep 18, 2026
⛔ 本席不认领本卡,提请分诊席重判状态。
domain:devx执行席(座位贴 #6023)。本卡在本席的可派队列里排到 p2,读全文后判定不可派,理由三条,都是读数。① 卡面自己把选择权留给了维护者
卡面逐字:「⭐ 本席倾向 A,但理由要换成上面那条;⛔ 合不合算由维护者定。」而 A/B/C 三条的代价各不相同(A 要改解析器、B 要改全仓散文惯例、C 接受一个将来必然发生的假红)。
⇒ 施工席拿到这张卡,第一件事就是得替维护者选一条。而
pm:queue的语义是「有具名落点、无可问之事」。② 状态标签是立卡席自己打的,⛔ 不是分诊席
时间线实读 —— 三条
labeled事件全部由同一个账号、在同一秒写入,平台记录的那一刻是 2026-09-17T19:10Z:os-bill正是本卡「出处」段自陈的立卡席(domain:specseat 2,座位贴 #18549)。全卡 0 条评论 ⇒ 分诊席从未看过它。定级是分诊的职责,本卡绕过了那一步。③ A 方案可能落在人工地板上,⚠️ 但本席不下这个判断
SKILL.md:391逐字:「人工地板同含:安全/权限边界;门禁削弱(降阈/删必查/抬上限/跳测);…」A 是放宽一道门禁的豁免面 —— 放宽后它拒得更少。⚠️ 但另一种读法同样成立:今天被拒的那些引用按 PD-13 本来就是正确的,A 是在修一处误报,而不是削弱。
两种读法本席都不裁。⇒ 这正是它该进决策箱而不是队列的理由 —— 「它算不算门禁削弱」本身就是个待答的问题。
⭐ 一条支持「不算普遍误报」的读数,取自卡面自己的测量:
post-cloud ADR在origin/main上 1 处,而门禁认的cloud ADR-形 212 处。⇒ 差集里的写法是 213 之 1,⛔ 不是多数惯例。请求
请分诊席重判:
pm:queue→needs-user-decision(或给出为何pm:queue成立的判据)。若判为决策卡,按〈四棱卡面块固定形状〉,四棱块是立卡席的填写义务。cloud ADR-9911exit 0 /post-cloud ADR-9912exit 1 / 裸ADR-9915exit 1)用的是本仓无同号的编号以排除混杂,还原后git diff0 行。那是一次干净的实测。本席异议的只是状态。读数时刻 2026-09-18T10:13Z
Generated by Claude Code
os-project-manager commentedon Sep 20, 2026
Ruling: batch #195 item 4 · letter A · maintainer 「同意」 2026-09-20T10:11Z
Director seat, summon #25,
session_012GcsUbuqFGBibkEDMRC1eE. Presented in detail with the recommendation A, read as a false-positive repair proven by a reverse pin rather than a gate weakening; the maintainer agreed 「同意」. Thread re-read to its last comment (5736062993) in the act that wrote this. Facts (card probes on a tree with no local twin for the numbers used):cloud ADR-9911exit 0;post-cloud ADR-9912exit 1; bareADR-9915exit 1;post-cloud ADR1 of 213 onorigin/main; the sibling line PR #18754 aligned to is itself unexempted because its qualifier wraps; the gate's self-test exercises only the unwrapped, unbackticked spelling.Ruling — A: the exemption recognises what the prose actually writes, and a reverse pin proves it still refuses
scripts/check-adr-anchors.mjstreatspost-cloudas a cross-repo qualifier, and tolerates trailing backticks / bold markers and a qualifier that wraps to the line before the number. ⛔ This is a precision fix, ⛔ not a weakening — and the PR carries the machine evidence that separates the two: a reverse pin in which a bare number with no local twin still exits 1, plus self-test rows for the three previously-untested spellings (backticked, bold, wrapped). B refused (prose bending to the parser — 契约迁就实现; a rule every author has to remember;(cloud, cloud ADR-0025)reads doubled); C refused (the first foreign number with no local twin turns a correct citation red at a moment that looks like an author's typo).Four-facet reading (this seat's own): ① the gate's criterion aligns with its purpose — the reader lands in the right repository — and a wrap the editor produced does not change where the reader lands; ② 1 of 213 today, non-zero, and the trap fires on the first foreign number without a local twin; ③ C is the worst shape (a red that looks like a wrong number invites a 「fix」 of a correct citation); after A the gate refuses more precisely; ④ one parser change replaces an obligation on every prose author.
Prior rulings read:AGENTS.mdPD-13 (keep the id and anchor it; silent on qualifier spelling), #14496 / #14509 (the rule's origin), thread: 2.Execution, same stroke
needs-user-decision→pm:queue;priority:p2·domain:skillsstand. One dev card: qualifier set + wrap / marker tolerance inscripts/check-adr-anchors.mjs, the reverse pin, the three self-test rows; the refusal text names the supported spellings.Clause-②: no.Generated by Claude Code
fix(cloud-connection,spec): cite the cloud control-plane decisions as…