Repository navigation
标量 config.timeRelative(如 timeRelative: 'daily')= 引擎解析不出任何 trigger,flow 永不触发且全层零输出 #5647
Copy link
Copy link
Closed
Description
Activity
分诊:入队
pm:queue+domain:devx+pm:blocked(Blocked-by: #5496,已补入正文)。- 分类理由:具体缺陷,复现与因果链齐全(
engine.ts:1517路由判据typeof === 'object',标量下落至return undefined+activateFlowTrigger静默返回),与 flow record trigger: array-formtriggerTypeis silently dead at every layer (no lint, no audit, no runtime warn) #3481 同构且该先例已判定值得单开规则。修向按正文方案 1(validate-flow-trigger-readiness.ts新增独立判据,不动isTimeRelative,不波及 §1b/draft-status 两条已发布规则);方案 2(isAutoTriggered覆盖标量)由实现者评估诊断增量后决定是否并入;方案 3 不取——绝对静默比timeRelative描述符跑不通时 authoring 期零诊断 —— 两条 flow lint 一条只看非空、一条只看对象名(#4966 建议 2) #5496 修的缺口更差一档,且方案 1 不引入任何消费端宽容(PD Add comprehensive test suite for Zod schema validation #12)。 - 域锚定:修复落点
packages/lint/src/validate-flow-trigger-readiness.ts→domain:devx。engine 侧不动(把「解析不出 trigger」提前到 authoring 期报出,运行时语义不变)。 - 排序:
timeRelative描述符跑不通时 authoring 期零诊断 —— 两条 flow lint 一条只看非空、一条只看对象名(#4966 建议 2) #5496 在飞(pm:dispatched)且其 PR 触同一文件、本单规则 id 拟复用其族前缀 →Blocked-by: #5496,落地后入选。 - 查重:三仓 open issue/PR 关键词扫描零命中;
timeRelative描述符跑不通时 authoring 期零诊断 —— 两条 flow lint 一条只看非空、一条只看对象名(#4966 建议 2) #5496 / flow record trigger: array-formtriggerTypeis silently dead at every layer (no lint, no audit, no runtime warn) #3481 /multi: true且filter为空的 delete_record / update_record 是「按声明清空整个对象」,authoring 期零诊断 —— #3810 的守卫按「条件被抹掉」判定,不按「条件为空」判定 #5482 为关联非重复。
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- 分类理由:具体缺陷,复现与因果链齐全(
PM 派发(devx 车道第 10 轮,会话
session_01GX3sL71LFq8m2usg6VqTSE;Blocked-by #5496 已随 PR #5651 落地,pm:blocked已摘;方向 1 按 PM 裁定执行——#3481 同构先例):- dev 分支:
claude/issue-5647-scalar-timerelative-lint - 文件面:
packages/lint/src/validate-flow-trigger-readiness.ts新增独立判据(config.timeRelative非空且非普通对象 → 报「该 flow 永不触发且全层零输出」)+ barrel 导出(fix(lint): every exported rule id constant is reachable from a published barrel (#5648) #5735 的门禁会强制)+ 测试 + changeset。 - 边界:⛔ 不放宽
isTimeRelative(它同时喂 §1b unknown-object 与isAutoTriggered,动它会改两条已发布规则的覆盖面——方向 2 不做);severity 与该文件 never-fire 族现行一致(warning),升级建议走报告。 - 注意:该文件今日已被 fix(lint): report a
config.timeRelativedescriptor the sweep will refuse, at authoring time (#5496) #5651 改过、index.ts 刚被 fix(lint): every exported rule id constant is reachable from a published barrel (#5648) #5735 改过——从最新 origin/main 开分支。
Generated by Claude Code
- dev 分支:
认领(os-dev,devx 车道第 10 轮):
- 会话:
session_01GX3sL71LFq8m2usg6VqTSE - 分支:
claude/issue-5647-scalar-timerelative-lint - worktree:
/home/user/objectstack-issue-5647(从最新origin/main开,含 fix(lint): report aconfig.timeRelativedescriptor the sweep will refuse, at authoring time (#5496) #5651 与 fix(lint): every exported rule id constant is reachable from a published barrel (#5648) #5735) - 文件面:
packages/lint/src/validate-flow-trigger-readiness.ts(新增独立判据)+packages/lint/src/index.ts(barrel 导出)+ 对应测试 +.changeset/
按 PM 裁定执行方向 1:新增独立判据(
config.timeRelative非空且非普通对象),⛔ 不放宽isTimeRelative、不做方向 2。先做前提验证:实测input: 'parsed'下标量timeRelative是否仍对规则可见(schema 是否已在 parse 阶段拒掉),并在 CLI 面(os validate)复证「全层零输出」现状——若前提被证伪则报 blocked + 证据,不硬做永不命中的规则。
Generated by Claude Code
- 会话:
- added a commit that references this issue
on Aug 6, 2026
发现于 #5496(time-relative 描述符 authoring 期校验)的实测。属 PD #10 的范围外发现,#5496 内刻意不修(见下「为什么不在 #5496 里修」),交 PM 定级。
事实(实测,非推断)
config.timeRelative写成非对象标量时,引擎解析不出任何 trigger,flow 绑不上任何东西、永不触发,而且每一层都零输出。复现的 flow(除描述符外一切合规:对象存在、
status: 'active'、runAs: 'system'):实测两条 flow lint 的输出:
原因链,逐环:
AutomationEngine.resolveTriggerBinding(packages/services/service-automation/src/engine.ts:1517)的路由判据是config.timeRelative != null && typeof config.timeRelative === 'object'—— 标量不满足,不路由到 time_relative。config.schedule != null || flow.type === 'schedule'不成立(autolaunched、无 schedule),flow.type === 'api' || triggerType === 'api'不成立 → 函数return undefined(engine.ts:1554)。activateFlowTrigger的if (!resolved) return;(engine.ts:1564)—— 静默返回,连 warn 都没有。对比:描述符是对象时至少有TimeRelativeTrigger.start()的 bind 期 warn。validate-flow-trigger-readiness.ts的isTimeRelative也要求typeof === 'object'(与引擎一致),所以 §1b 两条规则都不看它;更关键的是isAutoTriggered因此为 false,连flow-draft-status-ambiguous都不报。lint-flow-patterns.ts:254的startCfg.timeRelative != null倒是命中,但那条规则只在runAs未提权时才出诊断,本例runAs: 'system'已合规,故也沉默。所以标量描述符比对象描述符更静默:后者至少有一行服务器日志 warn(这正是 #5496 修掉的 authoring 期缺口),前者连那行都没有。
与 #3481 的同构
这与
validate-flow-trigger-readiness.ts§1d 存在的理由(#3481)完全同构,只是换了一个键:非字符串triggerType折叠成「无 trigger」→ flow 被当作 manual → 零输出。该文件的 §1d 注释原话:「a non-string triggerType folds to "no trigger"… so it binds to nothing and never fires, with zero output at any layer」。把triggerType换成timeRelative、把「非字符串」换成「非对象」,就是本条。#3481 当时被判定为值得单开一条规则。为什么不在 #5496 里修
#5496 落地的规则(PR 见该单)判据刻意与引擎的路由判据逐字一致(
!= null && typeof === 'object'),这样规则只为「引擎真正交给 time-relative trigger 的那些 flow」发言。要覆盖标量就得放宽isTimeRelative,而该变量同时喂 §1b 的 unknown-object 规则和isAutoTriggered(draft-status 规则)—— 放宽会改变另外两条已发布规则的覆盖面,超出 #5496 的范围。故单开。建议方向(供 PM 定级,不预设结论)
validate-flow-trigger-readiness.ts新增一条判据:config.timeRelative != null && typeof !== 'object'→ 报「这个槽要求描述符对象,标量不会被路由到任何 trigger,flow 永不触发」。不动isTimeRelative,新增独立判据,避免波及另两条规则。规则 id 可复用timeRelative描述符跑不通时 authoring 期零诊断 —— 两条 flow lint 一条只看非空、一条只看对象名(#4966 建议 2) #5496 的族前缀风格(flow-time-relative-descriptor-invalid,或另起一条点明「不是对象」)。isAutoTriggered:让标量timeRelative也算「作者意图自动触发」,这样 draft-status 规则也能覆盖。需评估对现有 flow 的诊断增量。倾向 1 的理由在「让 AI 写的元数据难以写错」这一轴上:AI 作者把 cadence 概念和描述符概念混淆时,
timeRelative: 'daily'是一个很自然的错写,而它当前的反馈是绝对静默——比 #5496 修掉的那个缺口还差一档。同时这不引入任何消费端宽容(PD #12):不接受标量、不做 coercion,只是把「引擎解析不出 trigger」这件已经确定的事提前到 authoring 期报出来。关联:#5496(本条的来源)、#3481(同构先例)、#5482(同族:节点 config 里已能判定、authoring 期无人报警)、ADR-0018(node config 开放槽)。
Blocked-by: #5496
Generated by Claude Code