composeStacks step 2 (mergeObjects) iterates stack.objects with no shape guard, so an input that bypassed the strict defineStack parse and carries a non-array objects raises a bare TypeError — code: undefined, status: undefined, outside the ADR-0112 refusal envelope this file's own discipline requires.
这是同一族缺陷,只是早一步
PR #18212 的返工刚刚为 permissions / data 关掉了完全相同的形状:step 3b 的两个收集器现在按 step 3 的方式跳过非数组并经 warnMalformedCollectionKey 出声。mergeObjects 是同一个函数里更早的一步,没有跟着关。
证据
实现者在 0c21631cd 的构建产物上探过:objects 传 map、传 number,两种都得 TypeError: stack.objects is not iterable。
PM 独立复核,结论一致:
$ git show origin/main:packages/spec/src/stack.zod.ts # 读 mergeObjects 函数体
mergeObjects 体内 Array.isArray: 0
mergeObjects 体内 warnMalformed: 0
⚠️ 这不是 #18212 引入的。 PM 核过:git diff origin/main...0c21631cd -- packages/spec/src/stack.zod.ts 对 mergeObjects 零处命中,该函数在那个 diff 里一个字节没动。它在 origin/main 上就是这样。
#18212 的派发范围被明确锁死在契约复核提出的三条欠改上,而那张 PR 的范围已经移动过一次(从「实现修复」变成「返工」)。就地扩面是错的处置。实现者报告了它而没有动手,⛔ 这一点判断正确。
Ask
按 step 3 与 step 3b 现在的既有形状,给 mergeObjects 的 stack.objects 迭代加同样的守卫:非数组跳过并经 warnMalformedCollectionKey 出声,非对象条目跳过。加 fixture,并先证明未加守卫时它红再证明加上后绿。
⚠️ 一个值得先判的问题,⛔ 不要默认答案:mergeObjects 跳过一个畸形 objects 之后,该 stack 在组合产物里就一个对象都不贡献。这与 permissions / data 的情形不同 —— 那两个只影响校验,而这个影响产物内容。所以「跳过并警告」是否真的是这里的正解,还是应当大声拒绝(带信封),需要判断后再动手。
查重
按 REST 列表端点加本地 grep,覆盖最近 500 条 issue 含 closed(/search/* 被出口代理按设计拒绝),关键词 mergeObjects、stack.objects is not iterable、bare TypeError,零命中。
Back-link:#18202 · #18212
Generated by Claude Code
composeStacksstep 2 (mergeObjects) iteratesstack.objectswith no shape guard, so an input that bypassed the strictdefineStackparse and carries a non-arrayobjectsraises a bareTypeError—code: undefined,status: undefined, outside the ADR-0112 refusal envelope this file's own discipline requires.这是同一族缺陷,只是早一步
PR #18212 的返工刚刚为
permissions/data关掉了完全相同的形状:step 3b 的两个收集器现在按 step 3 的方式跳过非数组并经warnMalformedCollectionKey出声。mergeObjects是同一个函数里更早的一步,没有跟着关。证据
实现者在
0c21631cd的构建产物上探过:objects传 map、传 number,两种都得TypeError: stack.objects is not iterable。PM 独立复核,结论一致:
git diff origin/main...0c21631cd -- packages/spec/src/stack.zod.ts对mergeObjects零处命中,该函数在那个 diff 里一个字节没动。它在origin/main上就是这样。为什么不在 #18212 里顺手修
#18212 的派发范围被明确锁死在契约复核提出的三条欠改上,而那张 PR 的范围已经移动过一次(从「实现修复」变成「返工」)。就地扩面是错的处置。实现者报告了它而没有动手,⛔ 这一点判断正确。
Ask
按 step 3 与 step 3b 现在的既有形状,给
mergeObjects的stack.objects迭代加同样的守卫:非数组跳过并经warnMalformedCollectionKey出声,非对象条目跳过。加 fixture,并先证明未加守卫时它红再证明加上后绿。mergeObjects跳过一个畸形objects之后,该 stack 在组合产物里就一个对象都不贡献。这与permissions/data的情形不同 —— 那两个只影响校验,而这个影响产物内容。所以「跳过并警告」是否真的是这里的正解,还是应当大声拒绝(带信封),需要判断后再动手。查重
按 REST 列表端点加本地 grep,覆盖最近 500 条 issue 含 closed(
/search/*被出口代理按设计拒绝),关键词mergeObjects、stack.objects is not iterable、bare TypeError,零命中。Back-link:#18202 · #18212
Generated by Claude Code