Repository navigation
[Deferred by ruling] Unify flow field-expression assignment onto the CEL engine — the B half of the #11060 ruling, awaiting maintainer appetite #11182
Description
Activity
on-hold 日频判据轮命中(分诊席,session
session_01Kktexqp6uVuFMztvvTMf3V,2026-08-24):Restart-when: closed #11060已成立(#11060 于 2026-08-23T16:38Z 关闭,方案 A 六函数表已落地)。按卡内自带指令,回决策箱做 appetite 裁决,⛔ 不入队。一句话问题:流程表达式现在有两套词汇 —— 条件槽会说 35 个函数的 CEL,赋值槽只会说 6 个函数的模板方言。要不要把赋值槽迁到 CEL 上,一套词汇管到底;什么时候迁。
选项 × 真实代价:
- A. 现在排:先立
{var}模板兼容面的测量卡(存量 flow 里谁在用什么拼法),测完迁移。代价:services 车道立即吃下一个 M/L 级工程;quote 流程的燃眉之急已被六函数表解了,业务催逼不在了。 - B. 挂 v18 列车:
target:v18+ 继续 hold,v18 窗口开时随批进(与 ADR-0087 破坏窗同车)。代价:两套词汇再共存一个 major —— 但六函数表语义即 CEL 镜像,漂移风险有限。 - C. 无限期 hold:需要新的可点火 Restart-when,否则违反 hold 出口纪律。
四棱:① 长远:一套方言是明确终态,B 只定时点不改方向。② 业务拉动:实测拉动(hotcrm#1206)已被 A 方案六函数表满足 —— 今天没有新的燃眉。③ 防 AI:两套词汇并存期,AI 在赋值槽写 CEL 函数会被拒 —— 但拒绝是响亮的(#11060 A 的形状),不是静默错。④ 创业:不为无新拉动的迁移现在扩工程面。
推荐 B(挂 v18 列车);回退 A。置信缺口:
{var}方言在树外存量 flow 的真实使用面未测(这正是迁移成本的主变量);若维护者裁 A,第一步就是把它测出来。回「A」/「B」即可。裁后执行:B ⇒ 挂target:v18+pm:on-hold,Restart-when 改「v18 开发窗开启(首个 v18 changeset-major 上 main)」;A ⇒ 立测量卡入 services 队列,本卡 Blocked-by 指向它。
Generated by Claude Code
- A. 现在排:先立
Maintainer ruling recorded — appetite: ride the v18 train
Provenance: maintainer, 2026-08-24, live PM chat, batch acceptance, verbatim: 「四维分析一致的,接手你的建议。」 The triage facets block recommending the v18-train option is adopted.
Ruled: the CEL unification (one dialect, one function set for flow assignment expressions) is chartered for the v18 train, not now. The 6-function bridge (#11060 option A, landed) remains the supported state for v17.x; the
{var}template dialect's compatibility surface gets measured as the first step when this restarts.State:
needs-user-decision→pm:on-holdin the same stroke.
Restart-when: the v18 release train opens — machine criterion: a v18 prerelease marker exists (.changeset/pre.jsonentering v18 pre mode onorigin/main, or a publishedv18.*tag family), the same criteria the daily hold scan already tests; the v18 direction tracker #11509 leavingpm:on-holdalso qualifies.
Generated by Claude Code
objectstack-fleet commented
on Sep 23, 2026 ContributorMore actions维护者裁定:当前版本就优先处理,统一为 CEL —— 不再等 v18。
pm:on-hold→pm:queue·priority:p1分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T09:20Z。维护者 2026-09-23 在分诊会话里逐张复核pm:on-hold卡,对第五组的回复原文:「10164 不考虑旧的;11182 当前版本就优先处理,统一为cel;其他同意」。 本卡对应的那一句是:「11182 当前版本就优先处理,统一为cel」。这条裁定改了什么
- 时点:2026-08-24T09:50Z 的裁定(
5393513608)把统一 CEL 挂在 v18 列车上。⇒ 今天改判:在当前 17.x 线上做,并且优先做。 - 方向不变:流程的赋值表达式统一到 CEL 引擎上,只保留一套方言、一套函数表,声明的就是兑现的。Flow field expressions can call no function but
NOW()/TODAY()— every other identifier is rewritten tonull, so a computed money value can never be rounded to its field's declaredscale#11060 选项 A 的 6 函数表(语义本来就对齐 CEL)是桥,统一之后它就不再是另一套方言。 - 级别:维护者原话是「优先处理」⇒
priority:p1。
给接手车道的范围说明
- 第一步仍然是测量(沿用 08-24 裁定的第一步):
{var}模板方言今天被谁用、用的是什么写法 —— 本仓的 flow、examples/、HotCRM(hotcrm#1206 是当初实测的业务拉动)。 ⚠️ 兼容性要显式决定,⛔ 不能静默:已有的{var}赋值表达式,是自动转换(ADR-0087 conversion)还是响亮拒绝并给出处方,由测量结果决定。如果需要打破已有写法,在 PR 里写清楚,需要的话回来问一句 ——⛔ 不要在代码里悄悄选一种。- 错误的写法必须被响亮拒绝(Flow field expressions can call no function but
NOW()/TODAY()— every other identifier is rewritten tonull, so a computed money value can never be rounded to its field's declaredscale#11060 A 的形状),⛔ 不能掉进宽容的默认值。
路由保持
domain:services。如果 CEL 引擎那一侧(packages/formula)需要改动,拆一张子卡给对应车道,⛔ 不要跨出范围。⛔ 本席不认领、不派发。
Generated by Claude Code
- 时点:2026-08-24T09:50Z 的裁定(
- addedpriority:p1High: required for production / M2High: required for production / M2and removed
on Sep 23, 2026 8 remaining items
- added and removed
on Sep 24, 2026 objectstack-fleet commented
on Sep 27, 2026 ContributorMore actionsClaim: PM loop round 1 — member of the #19938 joint dispatch (ruling B)
Session:session_01CiCTczDo7tGhafXjf61dUJ
Account:os-sales(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-19938-fields-value-slot
Worktree:objectstack-issue-19938
Domain:domain:services(claimed bydomain:specseat 4 on the maintainer's ruling below)
Seat:domain:spec#4(seat post #18917)
Ruling-ref: 5816929495
File surface: this card's engine half only, on the #19938 branch:packages/services/service-automation/src/builtin/crud-nodes.ts(evaluate a CEL value envelope increate_record/update_recordfields.*, as the assignment executor does forassignments.*), the value-envelope refusal wording inservice-automation/src/engine.ts,builtin/logic-nodes.tscomments,builtin/config-expression-ledger.test.ts,builtin/template.ts(ruling D point 2:round(x * 100) / 100is integer division in CEL — say so and prescribe/ 100.0), and the author-time lint hint inpackages/lint/src/validate-expressions.ts. The full joint surface is theClaim:on #19938 (5852841056). ⛔ Notskills/objectstack-automation/SKILL.md(Tier H; its own draft per ruling D point 2). (stop on breach; explain in the report)
Container & model:M/L,mode:subagent,model: default judgment tier, one dev for both halves
Clause-②: no
Thread-read: 5805777944
Serial constraints cleared: read at 2026-09-27T05:59Z. The joint census is on #19938's dispatch. No open PR touchespackages/services/service-automation/**orvalidate-expressions.ts; draft PR #20170 touches only the front matter ofcontent/docs/automation/flows.mdx.Why the spec seat holds a
domain:servicescard. The maintainer answered Q1 on #19938 with B (triage record5816929495, maintainer verbatim 「19938 同意」): this card's engine commit and #19938's spec commit land on ONE branch in ONE PR, spec first, closing both cards together. That record states the ruling is the authorisation for the services-lane step.Blocked-by: objectstack-ai/objectstack#19938in the body is dissolved by the fold, because both halves ship in the same merge. State:pm:blocked→pm:dispatchedin this stroke. Ruling D (5805777944) still governs this card's content: A now;{var}keeps its 17.x meaning; a lint hint (warning) nudges toward the envelope; C and the lossless part of B ride the v18 carrier #19939.objectstack-fleet commented
on Sep 27, 2026 ContributorMore actionsdomain:specseat 4 (session_01CiCTczDo7tGhafXjf61dUJ), 2026-09-27T13:39Z: this card's engine half lands with #19938's spec half in PR #20205, per the maintainer's Q1 = B (5816929495on #19938). The review of record is the ACCEPT5856348996on #19938. At-tier records:5854753486(PASS on the whole change) and5856341116(delta PASS at the landing head56f77479e). The PR is ready with auto-merge armed, and this card closes on the merge through itsFixes #11182line.objectstack-fleet commented
on Sep 27, 2026 ContributorMore actionsLanded — PR #20205 →
e46218674b(2026-09-27T15:52Z)domain:specseat 4 (session_01CiCTczDo7tGhafXjf61dUJ). PR #20205 merged through the merge queue on 2026-09-27T15:47:38Z, and both #19938 and #11182 closedcompletedthrough itsFixeslines. The readings that confirm the landing:e46218674bhas one parent (2bcd5cfeb7), is an ancestor oforigin/main, and the queue branch for the PR is gone.- Its
git patch-id --stableequals the reviewed diff's (9f9b9f52b952on both; delta record5857140844at68123f428, the third at-tier record on this change after5854753486and5856341116). - By content:
FlowValueSlotSchemaappears in 5 files underpackages/spec/src/automation/at the merge, and in 0 on the parent.
The path to it: the PR was dequeued once on a
dropped-refinements.baseline.jsonconflict, and two patch rounds re-mergedmainand recounted the ledger. Every non-generated file stayed byte-identical to the reviewed change.pm:dispatchedand the assignee come off both cards in the same act.Downstream: #19961 (the next card on
flow-node-expression-paths.ts) and #20168 (onschemaless-node-config.zod.ts) were serial behind this landing and are now takeable.skills/objectstack-automation/SKILL.md:236(/ 100) stays with its own Tier H draft under ruling D point 2.- added a commit that references this issue
on Sep 28, 2026 - added 3 commits that reference this issue
on Oct 9, 2026
Ruled: 5805777944 · letter D · 2026-09-24T01:26Z
Blocked-by: #19938
Filed by the triage seat as the ruled follow-up of #11060 (maintainer 2026-08-23, live PM chat, verbatim: 「其他同意你的意见」— adopting "A now + B follow-up on hold pending appetite").
What this card is
#11060's ruled option A ships the six-function table (
round/floor/ceil/abs/min/max, semantics mirrored from CEL) to unblock the quote flow. That is deliberately a bridge: it leaves the platform with TWO expression vocabularies — condition slots speak CEL (35 functions), assignment slots speak the template dialect (6). This card holds the end-state question: migrate assignment expressions onto the CEL engine so there is one dialect, one function set, declared = enforced.Why it is on hold rather than queued
The migration cost is real and unmeasured — the
{var}template dialect's compatibility surface across existing flows was the recorded confidence gap in #11060's analysis. Scheduling it is an appetite call the maintainer explicitly deferred.(retired line, batch #218 item 1 D: Restart-when closed #11060 — fired on 2026-09-23)
(When A lands and #11060 closes, the unlock scan returns this card to the decision inbox for an appetite ruling — with A's landed shape and the by-then-measurable
{var}dependency surface as inputs. ⛔ Do not implement from this card without that second ruling.)Refs: #11060 (ruling + analysis) · hotcrm#1206 (the measured business pull).