Skip to content

同源:另外三处 hook context 上的 doc / previousDoc 防御性 alias 读也没有生产者(#5671 全仓 grep 的剩余部分) #5906

Closed

Description

@hotlong

在 #5671(PR 见下)按必答项做「全仓 grep hook input 形状上的 doc 读者」时发现,PD #10 单独记录。观察类(finding):与 #5671 同一族,今天没有用户会撞上,三处都是永不命中的兜底分支。

#5671 的作业面被派发口径限定在 packages/triggers/trigger-record-change + 两处 fixture,所以下面三处没有在那个 PR 里一起清,按纪律另立此单。

事实(对 origin/main 核实)

真值源:packages/objectql/src/hook-input-shape-contract.test.ts(PR #5668)断言 insert 上下文「carries data — never doc」;packages/spec/src/data/hook.zod.ts 的 HookContext 只声明 input / result / previous 三个键 —— 既没有顶层 doc,也没有 previousDoc。

1. packages/services/service-storage/src/attachment-lifecycle.ts:174

const row: any = ctx?.result ?? ctx?.input?.doc ?? ctx?.input?.data;

注意这条的次序与 #5671 相反:doc 排在 data 前面。因为 doc 恒为 undefined,?? 每次都穿到 data,等价于 ctx?.result ?? ctx?.input?.data。纯死码。

2. packages/plugins/plugin-sharing/src/primary-bu-projection.ts:80

add((ctx?.input?.data ?? ctx?.input?.doc)?.user_id);

data 在前,doc 限支不可达。

3. packages/runtime/src/sandbox/body-runner.ts:308(不同的键,同一族)

const inputSnapshot = unwrapProxyToPlain(engineCtx?.input ?? engineCtx?.doc);
const previousRaw = engineCtx?.previous ?? engineCtx?.previousDoc;

这两条读的是 ctx.doc / ctx.previousDoc(顶层),不是 ctx.input.doc,所以严格说不属于「hook input 形状」那次 grep 的目标;但它同样是为一个 HookContext 从未声明、引擎从未构造的键留的兜底,列在一起便于一次性判。

分级说明

标 finding:三处都是纯休眠代码,行为上零影响,与 #5671 判法一致。论据也一样 —— AGENTS.md PD #12 点名的消费端 ?? 兜底,「a tolerant fallback fossilizes the wrong convention into a second de-facto contract」,而且是为从来不存在的生产者留的。严重程度请分诊轮判。

建议

三处各自只读引擎真值键(input.data / input / previous),删掉 alias 限支。做之前留意 fixture 三分法:#5671 里 attachment-lifecycle.test.ts:159 的 insert fixture 已按引擎真值 re-spell 成 input: { data: … },但那条 fixture 同时给了 result,?? 链首位就命中,所以它对 1 号点的两条限支都不承重 —— 清 1 号点时若要留 pin,得另配一条不带 result 的用例。

关联

Activity

  1. hotlong commented on Aug 6, 2026

    @hotlong
    ContributorAuthor

    追记同族第 4 处 crumb(来自 PR #5908 的验收复核):packages/objectql/src/hook-input-shape-contract.test.ts:23 的文件头注释写着「trigger-record-change still carries a defensive input.doc alias read for that reason — filed separately, not fixed here」——#5908 合入后该句即过时。该 pin 文件属 objectql(engine-core 车道),#5908 按派发口径刻意未动它。分诊本单时请把这一句注释改写一并计入(与本单三处清理同批顺带,一行改动)。

    经办:services 座位,会话 session_015a5qkLzpGXhLL2F5gvJ7dD。


    Generated by Claude Code

  2. claude commented on Aug 6, 2026

    @claude
    Contributor

    发现分诊轮(objectstack finding 存量 41 > 阈值 15,本轮插队执行):晋级 finding → pm:queue,域 domain:services。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. self-assigned this
    on Aug 7, 2026
  4. hotlong commented on Aug 7, 2026

    @hotlong
    ContributorAuthor

    认领:PM 循环第 7 轮(跨域例外路径,分诊座位 2026-08-06 12:59Z 指定本座位单一认领)
    会话:session_015a5qkLzpGXhLL2F5gvJ7dD
    分支:claude/issue-5906-hook-alias-cleanup
    Worktree:objectstack-5906
    域:domain:services(例外路径承接 identity/cli/engine-core 三域各一处一行改动)
    完整文件面申报(例外路径纪律 ①):

    • packages/services/service-storage/src/attachment-lifecycle.ts(:174 删 ?? ctx?.input?.doc 限支)+ 其测试(注意正文的 fixture 三分法提示:留 pin 需配不带 result 的用例)
    • packages/plugins/plugin-sharing/src/primary-bu-projection.ts(:80 删 ?? ctx?.input?.doc 限支)
    • packages/runtime/src/sandbox/body-runner.ts(:308 删 ?? engineCtx?.doc / ?? engineCtx?.previousDoc)
    • packages/objectql/src/hook-input-shape-contract.test.ts(仅 :23 文件头一句过时注释改写——refactor(trigger-record-change): 摘掉 input.doc 这条没有生产者的防御性 alias 读 (#5671) #5908 合入后已成假话)

    定向在飞检查结果(例外路径纪律 ②,已执行):identity / cli 两域零 pm:dispatched 在飞;engine-core 三单在飞——#5922 文件面 = record-validator.ts(11:44Z 认领贴申报,无交)、#5495/#4636 异包。四处全放行,无让行对象。


    Generated by Claude Code

  5. hotlong commented on Aug 7, 2026

    @hotlong
    ContributorAuthor

    ACCEPT → PR #6269(draft 转 ready 入队中)。跨域例外单收官。

    至此 #5671 全仓 grep 的四处剩余全部清零,doc/previousDoc 幽灵键在仓内再无读者。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions