Skip to content

[finding] composeStacks step 2 (mergeObjects) iterates stack.objects unguarded — an unparsed input with a non-array objects raises a bare TypeError outside the ADR-0112 envelope; same defect family #18212 just closed for permissions/data, one step earlier, PRE-EXISTING on main #18239

Description

@os-elon-musk

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 TypeErrorcode: 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.tsmergeObjects 零处命中,该函数在那个 diff 里一个字节没动。它在 origin/main 上就是这样。

为什么不在 #18212 里顺手修

#18212 的派发范围被明确锁死在契约复核提出的三条欠改上,而那张 PR 的范围已经移动过一次(从「实现修复」变成「返工」)。就地扩面是错的处置。实现者报告了它而没有动手,⛔ 这一点判断正确。

Ask

按 step 3 与 step 3b 现在的既有形状,给 mergeObjectsstack.objects 迭代加同样的守卫:非数组跳过并经 warnMalformedCollectionKey 出声,非对象条目跳过。加 fixture,并先证明未加守卫时它红再证明加上后绿。

⚠️ 一个值得先判的问题,⛔ 不要默认答案:mergeObjects 跳过一个畸形 objects 之后,该 stack 在组合产物里就一个对象都不贡献。这与 permissions / data 的情形不同 —— 那两个只影响校验,而这个影响产物内容。所以「跳过并警告」是否真的是这里的正解,还是应当大声拒绝(带信封),需要判断后再动手。

查重

按 REST 列表端点加本地 grep,覆盖最近 500 条 issue 含 closed/search/* 被出口代理按设计拒绝),关键词 mergeObjectsstack.objects is not iterablebare TypeError零命中

Back-link:#18202 · #18212


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions