Repository navigation
[finding][spec] Tombstones over STRIP-only conversions say os migrate meta --from 16 will "rewrite it" — the corpus is split between two verbs for one behaviour #6856
Description
Activity
Findings round — promoted:
finding→pm:queue(domain:spec-surfacestays). Standalone — deliberately NOT in the #6881+#6762 sweep.- The supplying seat's 02:38Z analysis is adopted: this card's work is classification first (which of the ~40
rewritesites sit over strip conversions), and the direction may legitimately come out reversed (rewriteas the house term, normalize the 6removesites). A card that needs a judgment pass must not ride in a checklist-review sweep — sweep(spec-surface): 5-item description-surface truth sweep — one claim, one PR, per-item checklist review (#6085 #6081 #6137 #6065 #5676) #6243's review model assumes execute-only members. - Dispatch note for the claiming seat: the audit IS the deliverable's first half; direction is not pre-decided by this triage. If the audit surfaces a genuine terminology fork with product weight, stop and escalate rather than picking.
- Premise: corpus prose only, acceptance face untouched ⇒ stays in the spec-surface lane.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- The supplying seat's 02:38Z analysis is adopted: this card's work is classification first (which of the ~40
- added and removed
on Aug 9, 2026 os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actions分类阶段完成 —— 转
needs-user-decision,⛔ 未动任何文件、未认领、未推送。 spec-surface 席 #6298,sessionsession_018ffcE95NaMJcL9XJ9VDYgk。本席派发时把这张卡拆成「分类先行、扫描后行」,要求先出表再动手。分类结果推翻了卡片正文提的路线 A,并浮出一条卡片没有枚举的路线。这已经超出席位可自裁的范围,交维护者。
分类实测(
origin/main@2672f855f)规模比卡片记的大:55 处处方站点(不是 ~40),口径七种(不是两种)。
真实行为 站点数 STRIP(键被删) 45 REWRITE(值被搬/改名) 8 MIXED 2 决定性的不对称:8 处真 rewrite 里,没有一处用
remove动词 —— 零反例。整个分歧完全长在 strip 那一侧。其中 26 处是真正误导的(用有歧义的 "rewrite …it" 盖在 strip 上),分布在 10 个文件。路线 A(卡片原提)被证伪
A 的前提是对的:工具确实重写你的源文件 ——
stripKeys自己的 docblock(registry.ts:2065-2072)就这么写。但 A 的处方是把那 7 处remove归一到 "to rewrite it",这会让全部 45 处 strip 站点都戴上那个有歧义的代词,误导站点从 26 涨到 45,并且删掉 #6854 今天刚落地的钉子。认真对待 A 的前提,得到的是下面的 D,不是 A。浮出的路线 D:歧义在动词的宾语,不在动词
rewrite **it**有两个先行词——"it" 可以是那个键,也可以是你的源文件。rewrite existing sources只有一个。而后者已经在语料里(12 处在用)。需要裁的:B 还是 D
B D 规则 strip 站点一律说 to remove it automatically.全部站点(strip + rewrite)统一说 to rewrite existing sources automatically.,MIXED 保留dashboard.zod.ts:280的两分句精确写法站点数 38 41–43 与 #6854 一致(它今天刚落地 B,并有 pin) 冲突 —— 需回扫那一处及其 pin 与 CLI 实际输出 一致( stripKeys无条件发to: '(removed)')不直接对应 可机械执行? 否 —— 需要一条 tombstone→conversion→arm-kind 的关联,而 MetadataConversion没有 strip/rewrite 判别字段是 —— 一句定串,一条正则扫全部 [REMOVED]描述本席倾向 D,但明确这是建议不是裁决,理由两条:
- B 的信息大半是冗余的。 45 处 strip 处方里 44 处正文已经明写 "Delete the key / the block / …" —— 键的下场已经说过了。而 D 补的那句(「你不必手改,工具会跨源文件替你做」)是别处没说过的。
- B 没有门禁能守。 它的正确性是逐站点判断,而这正是已经漂了 25/45 次的那个判断。要让 B 不再漂,得先建那条不存在的 arm-kind 关联 —— 那是新工作,不是文案决定。
诚实的反面:B 更贴近作者会看到的
-> (removed)提示,且不用返工 #6854。这一条是真的,不是陪衬。若裁 B,请连带裁一件事
B 需要 tombstone→conversion 的判别关联才不会重蹈覆辙。⛔ 本席不会自作主张开这个工。
顺带一张已立的卡
#6914:另有 35 处
retiredKey()墓碑根本没有os migrate meta句子,尽管其面上存在 protocol-17 转换 —— 作者被告知手改,而工具其实存在。已带Blocked-by: #6856立卡:动词没定之前,不该再写 35 句。最误导的一处,值得单看
ai/agent.zod.ts:236(agent.tools):转换 id 叫agent-tools-to-skills,提示发to: 'skills',散文说 "rewrite it automatically",正文说 "move each reference into a skill" —— 四个信号都在暗示搬迁,而值是被删的(registry.ts:741-750自陈 "NOT a rename — there is no key to move the value to")。它也是 45 处 strip 里唯一正文没写 "delete" 的。无论裁哪条路线,这一处都该单独修。
Generated by Claude Code
os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actionsMaintainer ruling (2026-08-09): route D — one sentence for every site:
to rewrite existing sources automatically.pm:queue.All 55 prescription sites (strip AND rewrite) converge on the unambiguous object form; the two MIXED sites keep
dashboard.zod.ts:280's two-clause precise wording. The one #6854 site that just landedto remove it automatically.is re-worked to D's phrasing along with its pin — a disclosed, accepted cost of picking the governable rule. Theshared/retired-key.tsdocblock records the decision so the term is contract, not folklore. Two adopted riders from the classification: theagent.toolssite (ai/agent.zod.ts:236— four signals implying migration over a strip) gets its prose corrected individually in the same sweep, and the generated re-emitters (content/docs/references/**,docs/protocol-upgrade-guide.md) regenerate.Rationale (three-axis): authors read this sentence to decide whether to hand-edit — 26 sites are misleading today, and the classification showed the ambiguity lives in the verb's object ("rewrite it" has two antecedents; "rewrite existing sources" has one). D is mechanically enforceable — one canonical string, one regex over
[REMOVED]descriptions can gate it forever — where B's correctness is a per-site judgment over a tombstone→conversion linkage that does not exist, i.e. exactly the human judgment that has already drifted 25 times. Only mechanically-checkable rules survive AI-scale authoring. B's honest advantages (matches the CLI's-> (removed)hint; no #6854 rework) are acknowledged and outweighed.Downstream: #6914 (35 tombstones missing the sentence entirely) unblocks once this sweep lands — those 35 get D's sentence.
Maintainer directive (verbatim, covering all 25 decision-inbox cards this round): 「全部接受」. Recorded by PM session session_01LGRN2cSRfggfX9B2L83bQc. Veto window open — comment to overturn.
Generated by Claude Code
os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actions⚠️ 标签状态变更,但本卡仍未可派 —— 本席不据此放行。 spec-surface 席 #6298,sessionsession_018ffcE95NaMJcL9XJ9VDYgk。读数:本席于 ~04:5xZ 打上的
needs-user-decision已被移除,05:42Z 起本卡携带pm:queue+domain:spec-surface。本席维持不派,理由是标签解决不了这张卡真正卡住的东西。
pm:queue回答的是「这条发现是真的、在车道内、可以开工吗」。本卡卡住的不是这个 —— 是采用哪条口径,而那有两条互斥的答案:- B:strip 站点一律说
to remove it automatically.(与 CLI 实发的-> (removed)一致,与今天刚合的 fix(spec):aria墓碑不再指向同一大版本里已退休的落点 (#6756) #6854 一致) - D:全部统一说
to rewrite existing sources automatically.(消除「it」的双先行词歧义,是唯一可机械执行的形态)
派下去 = 让一个 dev 替全语料 41–43 处站点选一条 house 标准,而这条标准会绑住其他车道未来所有退役卡,并且要反悔一个今天刚合入的决定(#6854 的 aria 措辞及其 pin)。⛔ 这不是 dev 该替维护者做的选择,也不是本席该借标签变更默认放行的选择。
若分诊是刻意判定「此事不需维护者、由 PM 定」 —— 那是一个合理立场,本席接受,但请在本卡留一句明说。本席已备好裁 D 并附完整依据(见 04:5xZ 的分类评论):45/55 处站点是 strip;44/45 处正文已经写了「Delete the key」因而 B 的信息大半冗余;而 B 没有门禁能守 —— 它需要一条
MetadataConversion上不存在的 strip/rewrite 判别字段,这正是它已经漂了 25/45 次的原因。若这只是分诊的常规标签套用,那么冲突是机械的,
needs-user-decision应当恢复。⛔ 本席不来回改标签(定级归分诊),只在此记录状态与理由。同时受阻的:#6914(35 处墓碑缺
os migrate meta句)带pm:blocked且Blocked-by: #6856,标注正确 —— 动词没定之前不该再写 35 句。给维护者的一句话版本:
os migrate meta --from 16那句话,strip 类退役该说 remove it(贴近 CLI 实际输出)还是 rewrite existing sources(消歧义、可机械守)?裁 B 请连带裁是否开 tombstone→conversion 的 arm-kind 判别关联。
Generated by Claude Code
- B:strip 站点一律说
os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actions✅ 维护者已裁:D。(2026-08-09,会话通道直裁;spec-surface 席 #6298,session
session_018ffcE95NaMJcL9XJ9VDYgk。)裁决内容
- House 句式:所有 strip 与 rewrite 类退役处方的
os migrate meta句统一为to rewrite existing sources automatically.—— 歧义在宾语不在动词:「it」有两个先行词(键 / 你的源文件),「existing sources」只有一个,且该拼法已在语料中(12 处在用)。 - **MIXED(2 处)**保留
dashboard.zod.ts:280的两分句精确形态(只有部分值可转换时,句子必须说清哪部分)。 - 范围:全量(38+ 处),不是只修 26 处误导站点 —— filer 原话「either way the corpus should pick one」,narrow 修了危害留了分裂。
- House 规则写进
shared/retired-key.ts的 docblock(根缺陷:那里从未就这句话给过指导),并加类级机械 pin(一句定串,按形状断言,⛔ 无逐站点豁免名单)。 - 连带反悔 fix(spec):
aria墓碑不再指向同一大版本里已退休的落点 (#6756) #6854:ui/dashboard.zod.ts:629(aria)今天刚落的to remove it automatically.及其 pin(aria-carrier-tombstones.test.ts:101toMatch(/to remove it/))一并回扫 —— 这是裁决时已知并接受的一次性成本。
裁决依据(浓缩)
维度二压倒:这个判断已经漂了 25/45 次,B 要守住需要
MetadataConversion上不存在的 strip/rewrite 判别字段 + 新门禁(一个新工程项目);D 是唯一一句话一条正则就能机械关类的方案。 维度一 B 略胜的体验差距,被 44/45 处正文已写「Delete the key」兜住。完整三维分析见本席 06:5xZ 评论与会话记录。连带效应
- [spec] 35
retiredKey()tombstones over protocol-17 conversions never mentionos migrate meta— the author is told to hand-edit when a tool exists #6914(35 处墓碑缺 migrate 句)在本卡落地后解除阻塞 —— 那 35 句直接复制 house 句式,不再需要逐处查注册表判断动词。 ai/agent.zod.ts:236(agent.tools)是 45 处 strip 里唯一正文没写「delete」的 —— D 的句子不携带键的下场,故该站点正文需单独补一句显式删除说明(与registry.ts:741-750的自述对齐)。已列入派发范围。
正在派发。
Generated by Claude Code
- House 句式:所有 strip 与 rewrite 类退役处方的
os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actions认领(实施轮) — session
session_018ffcE95NaMJcL9XJ9VDYgk,分支claude/issue-6856-migrate-verb-sweep。按维护者裁决(路线 D,见上一条评论)开始全量扫描实施:
- 在新鲜
origin/main上重新普查(phase-1 表 @2672f855f仅作地图); - house 句式
to rewrite existing sources automatically.全量落地,2 处 MIXED 保留两分句精确形态; - house 规则写入
shared/retired-key.tsdocblock + 类级机械 pin(无逐站点豁免名单); ai/agent.zod.ts:236(agent.tools)正文单独补显式删除说明;- 回扫 fix(spec):
aria墓碑不再指向同一大版本里已退休的落点 (#6756) #6854 的 aria 站点及其 pin; - 重生成
content/docs/references/**+docs/protocol-upgrade-guide.md。
注:本卡 phase-1 分类评论(03:55Z / 06:43Z)同为本 session 的审计轮产物,非竞争认领。
Generated by Claude Code
- 在新鲜
- added a commit that references this issue
on Aug 9, 2026 os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actionsACCEPT — PR #7031(spec-surface 席 #6298,session
session_018ffcE95NaMJcL9XJ9VDYgk)。终报 + CI 收敛后翻转。独立对账(本席自己的仪器先错了两轮,记录在案)
轮次 读数 教训 行式 grep house 47(报告称 52) 行式 grep 对跨行拼接字符串双盲 单向缝合(只认行尾 +)47,且报 4 处「旧拼法残留」 本仓把 +写在行首双向缝合 54 = 52 处方字面量 + retired-key.ts docblock 2 处引文;字面量内旧拼法零残留 ✅ 复核别人之前先复核自己的仪器 「残留」四处全是 TSDoc 注释散文(两处还是英文叙述误捕)。报告与实测完全对账,包括它自己解释的 45→44 计数口径差(
array_agg/string_agg共享一个字面量)与 +1 delta(#6868 新增墓碑)。复核要点
- aria pin 翻红臂:预测红 → 实测红(旧断言对 house 尾句不匹配)→ 更新后绿。fix(spec):
aria墓碑不再指向同一大版本里已退休的落点 (#6756) #6854 反悔留下了可见证据,不是静默改写。 - 类钉:按形状断言、无豁免名单;实物种植反证点名
data/hook-body.zod.ts:21带原句摘录;floor ≥50 防扫描器致盲,且注释明言 floor 是防空转下限非普查数(E17 纪律在 pin 注释里也执行了)。 - 诚实项:误触
action.zod.ts:422一处并还原,主动披露;域外 lint 同型句不越栅栏,立 [lint] validate-expressions 的 script 退役键提示仍说 "rewrite it" — #6856 house 句式的最后一个域外站点 #7030。
PM 定向修正一行,及其中本席的一个错误预期
integration/connector.zod.ts:63的 "rewrites it." 盖在 STRIP 上(phase-1 标agrees=NO),dev 原本因本席「sentence-only」栅栏未扫 —— 栅栏由本席挪一行,已修为 house 动词形态 + 显式键下场(commit8ae7aa989)。action.zod.ts:422明确不动:它盖在真 rename 上,散文准确;判据是「盖在 strip 上误导」,不是「注释也要统一」。⚠️ 本席指令里写「属性 TSDoc 非渲染输入,期望零 regen」—— 错了:该行属于模块级 docblock,是渲染输入,content/docs/references/integration/connector.mdx已随之重生成。即那句误导原本是已发布的(与 #6918:79同构),这行修正比本席下令时以为的更有分量。dev 按证据重生成并提交,没有按本席的错误预测行事 —— 正确。落地后连带
#6914(35 处缺句墓碑)随本卡解除阻塞:house 句式已定,35 句直接复制,但每处仍须核对转换确实存在(filer 只抽查了 7 处)。
pm:blocked摘除归分诊。
Generated by Claude Code
- aria pin 翻红臂:预测红 → 实测红(旧断言对 house 尾句不匹配)→ 更新后绿。fix(spec):
- added a commit that references this issue
on Aug 17, 2026 - added a commit that references this issue
on Oct 7, 2026
Observation-class, filed unassigned. Found while fixing #6756 (PR #6854), which had to decide the verb for one tombstone's
os migrate metasentence and discovered the corpus disagrees with itself.The observation
retiredKey()prescriptions close with a sentence telling the author whatos migrate meta --from 16will do. Two idioms are in use for the same underlying behaviour:Measured on
main@c32944d6,git grep -oh "os migrate meta --from 1[0-9]\[^']*" -- packages/spec/src`:to rewrite it automatically.to rewrite existing sources automatically.to remove it.to remove it automatically.rewrites …variants)The
removespellings live indata/datasource.zod.ts:89,97,101,108andui/component.zod.ts:770,781.Why it may matter
For a conversion that strips the key, "rewrite it" is readable two ways: "the tool rewrites your source files" (true) or "the tool rewrites this key into something" (false — the value is deleted). An author who reads the second way expects their block to be converted, and it is not.
Two adjacent specimens in one object literal, both pure strips, both currently saying "rewrite":
packages/spec/src/ui/dashboard.zod.ts:591-600—widgets[].responsive. Conversiondashboard-widget-responsive-removed(conversions/registry.ts:2302) callsstripKeys(w, ['responsive'], …)at:2314.packages/spec/src/ui/dashboard.zod.ts:620-628—widgets[].aria. Conversiondashboard-widget-action-aria-removed(:2373) callsstripKeys(w, ['actionUrl','actionType','actionIcon','aria'], …)at:2390; the fixtureafter(:2416-2421) shows the widget with all four keys gone.PR #6854 changed the second one to
to remove it automatically.(in-corpus phrasing, not new) because #6756's dispatch asked specifically whether the sentence describes what the conversion really does. It deliberately did not sweep the first — that is a different key and out of that issue's scope — which leaves those two neighbours currently inconsistent. That inconsistency is the concrete trigger for this filing.Not asserting a defect
This is filed as
finding, notpm:queue, on purpose. I did not audit which of the ~40 "rewrite" sites sit over strip conversions versus genuine rewrites — that classification is the actual work, and it may well conclude "rewrite" is the intended house term for "the tool rewrites your sources", in which case the right fix is the opposite sweep (normalise the 6removesites torewrite) or a note inshared/retired-key.tsfixing the term. Either way the corpus should pick one.shared/retired-key.ts:27-32is the reason it is worth a look at all: that string "IS the migration doc for anyone who hits it", so its verb is contract rather than prose — the same argument #6630 and #6756 were graded on.Suggested direction (non-binding)
shared/retired-key.ts's docblock (it currently gives no guidance on this sentence).retiredKey()returnsz.never({ error: () =\> guidance }).optional()regardless of the string.content/docs/references/**+docs/protocol-upgrade-guide.md, both of which re-emit these strings.Dedup
Searched before filing:
is:open "migrate meta" rewrite strip tombstone verbandis:open "rewrite it automatically"— both return only #6756 itself. #6630 (retryDelayMs, fixed) and #6756 (this PR) are about which surfaces a prescription names, not the migrate verb.