You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This card carries the one sub-question left open by #15429's ruling (issuecomment-5793803317, maintainer 「跟主流对齐」). #15429 keeps the engine traversal, the os migrate meta conversion, the lint hint and the pin rewrite. #19867 / PR #20162 carry the spec key. Filed by the domain:services seat (#6021, session_01TEah6PeJGjxJfbHaySJjLQ) on the spec seat's hand-off: #15429 comments 5852506105 (item 2) and 5852576993 (item 1). ⛔ Not a claim.
Background
The ruling makes an edge-branched decision (no config.conditions) exclusive by default. Taking every true edge must be declared with mode: 'inclusive'.
The spec seat's contract review (5852563897, relayed in 5852576993): if a release ships PR #20162 as it stands and this combination is refused later, that refusal is a narrowing of a published accept set (Clause-②: no (narrowing) plus an ADR-0087 disposition). Decided before the next Version Packages release, it costs neither. ⛔ This seat does not ask for the release to be held; the release stays the maintainer's.
Governing text
AGENTS.md Prime Directive chore: version packages #10: 「never advertise or demo a capability the runtime doesn't actually deliver (declared ≠ enforced)」.
Prior-ruling search on origin/main84880f9224: git grep -n -iE 'mode.*inclusive|inclusive gateway' -- AGENTS.md docs/adr packages/spec/src → 0 hits (the key is not on main yet). Positive control: exclusive gateway → 1 hit. No ADR decides this combination.
Nothing parses DecisionConfigSchema when a flow is registered, so a schema-only refusal is not yet an authoring-time refusal. Re-check: git grep -n "DecisionConfigSchema\|SCHEMALESS_NODE_CONFIG_SCHEMAS" origin/main -- 'packages/**/*.ts' ':!**/*.test.ts' ':!packages/spec/**' → 3 hits on 84880f9224, all in packages/metadata-protocol/src/reference-sites.ts (a reference walk, not a parse). Control: the schema file itself → 4. Radius: TypeScript under packages/ by these two names. A parse reached through another name is outside it. The spec seat independently reports the config as export-only (5852506105).
Zero authored uses today: mode is not on main, so no flow can carry it.
Question
When a decision node declares a conditions list andmode, what does the platform do?
Options
option
what happens
what an author sees
A — refuse
The schema refines DecisionConfigSchema: mode together with a non-empty conditions list is refused, with a prescription (drop mode, or move the branches onto edges). The reader #15429 adds applies the same parse at registration.
A loud error on save / validate that names the fix.
B — give it a meaning
mode: 'inclusive' on a conditions list runs every entry that holds (n8n Switch's "send to all matching outputs").
A second branching semantics to learn; engine and migration work beyond the ruling.
Dedupe: semantic search in this repository (closed included) for decision node mode inclusive declared alongside config.conditions refuse or inert → 6 hits (#19867, #15429, #17493, #17322, #14288, #7545). None is a card on this combination.
Ruled: 5856786357 · letter A · 2026-09-27T14:49Z
This card carries the one sub-question left open by #15429's ruling (
issuecomment-5793803317, maintainer 「跟主流对齐」). #15429 keeps the engine traversal, theos migrate metaconversion, the lint hint and the pin rewrite. #19867 / PR #20162 carry the spec key. Filed by thedomain:servicesseat (#6021,session_01TEah6PeJGjxJfbHaySJjLQ) on the spec seat's hand-off: #15429 comments5852506105(item 2) and5852576993(item 1). ⛔ Not a claim.Background
config.conditions) exclusive by default. Taking every true edge must be declared withmode: 'inclusive'.conditionslist is already first-match by label (logic-nodes.ts, the A decision node has three declared ways to route a branch and two of them do nothing — app-crm's convert-lead guard runs both branches #4414 repair). The ruling does not say whatmodemeans on that shape, and neither does its migration: the migration only touches decisions with noconditions.5fbb7ed86a, open, not merged) declaresmode: z.enum(['exclusive','inclusive']).optional()besideconditionsin onestrictObject, with no refinement between them. So{ conditions: [...], mode: 'inclusive' }parses, and its.describe()says 「A conditions list is first-match on its own」: the key would be accepted and ignored.Why it cannot wait
The spec seat's contract review (
5852563897, relayed in5852576993): if a release ships PR #20162 as it stands and this combination is refused later, that refusal is a narrowing of a published accept set (Clause-②: no (narrowing)plus an ADR-0087 disposition). Decided before the next Version Packages release, it costs neither. ⛔ This seat does not ask for the release to be held; the release stays the maintainer's.Governing text
AGENTS.mdPrime Directive chore: version packages #10: 「never advertise or demo a capability the runtime doesn't actually deliver (declared ≠ enforced)」.AGENTS.mdPrime Directive Add comprehensive test suite for Zod schema validation #12: fix the metadata and 「reject it at authoring/publish (validation / lint) so the error surfaces loudly」.config.conditionstakes EVERY out-edge whose condition holds, in parallel — nothing enforces or warns that intended-exclusive edges partition #15429 ruling5793803317, items 1–2 (edge-branched decisions only).origin/main84880f9224:git grep -n -iE 'mode.*inclusive|inclusive gateway' -- AGENTS.md docs/adr packages/spec/src→ 0 hits (the key is not on main yet). Positive control:exclusive gateway→ 1 hit. No ADR decides this combination.Premises, each with its re-check
modebesideconditions. Re-check: readDecisionConfigSchemainpackages/spec/src/automation/schemaless-node-config.zod.tsat the PR's head (or onmainonce merged) for a refinement naming both keys. At5fbb7ed86a: none.DecisionConfigSchemawhen a flow is registered, so a schema-only refusal is not yet an authoring-time refusal. Re-check:git grep -n "DecisionConfigSchema\|SCHEMALESS_NODE_CONFIG_SCHEMAS" origin/main -- 'packages/**/*.ts' ':!**/*.test.ts' ':!packages/spec/**'→ 3 hits on84880f9224, all inpackages/metadata-protocol/src/reference-sites.ts(a reference walk, not a parse). Control: the schema file itself → 4. Radius: TypeScript underpackages/by these two names. A parse reached through another name is outside it. The spec seat independently reports the config as export-only (5852506105).modeis not onmain, so no flow can carry it.Question
When a decision node declares a
conditionslist andmode, what does the platform do?Options
DecisionConfigSchema:modetogether with a non-emptyconditionslist is refused, with a prescription (dropmode, or move the branches onto edges). The reader #15429 adds applies the same parse at registration.mode: 'inclusive'on a conditions list runs every entry that holds (n8n Switch's "send to all matching outputs").mode: 'inclusive'looks like it works and silently does nothing.四维分析(业务立场)
mode只属于按连线分支的判断节点」一句话说清。日后真有需求要 B,从 A 放开是放宽(minor、不破坏);从 C 收回是收窄(破坏性、要 ADR-0087 处置)。主流平台里 BPMN 把排他与包容做成两种不同网关,Salesforce Decision 永远第一个命中;n8n Switch 有"全部命中"开关,但那是有人用才加的。mode还没进main,没有任何流程写过它;hotcrm#1555 那次事故是按连线分支的判断节点,不是条件列表。⇒ 没有拉动就不该有 B。conditions+mode: 'inclusive'以为会全走,运行时静默只走一条,与 hotcrm#1555 同类的"声明与执行不一致"。A 在保存时响亮拒绝并给出改法;B 多一套语义、多一个出错面。Prior rulings read:
mode.*inclusive|inclusive gateway→ 0 hits (controlexclusive gateway→ 1); ADR none; thread: #154295793803317,5852506105,5852576993.推荐 A(回退项:B,仅当出现实测拉动)。只看①选 A;②③④ 是否翻转:否。
置信缺口:本席未读 objectui 设计器表单是否会在条件列表节点上展示
mode(协调卡 objectui#10750 已存在);也未测第三方宿主是否绕过注册路径直接执行判断节点。Execution per answer
packages/spec(spec lane). The cheapest landing is inside PR feat(spec): DecisionConfigSchema declares an optional mode: 'exclusive' | 'inclusive' (contract half of the #15429 ruling) #20162 before it merges (the spec seat decides); otherwise a separate spec change ahead of A decision node with no declaredconfig.conditionstakes EVERY out-edge whose condition holds, in parallel — nothing enforces or warns that intended-exclusive edges partition #15429, landed before the next release. The parse at registration comes with the reader A decision node with no declaredconfig.conditionstakes EVERY out-edge whose condition holds, in parallel — nothing enforces or warns that intended-exclusive edges partition #15429 adds (this lane), and the refusal code and prescription join the acceptance list of A decision node with no declaredconfig.conditionstakes EVERY out-edge whose condition holds, in parallel — nothing enforces or warns that intended-exclusive edges partition #15429.config.conditionstakes EVERY out-edge whose condition holds, in parallel — nothing enforces or warns that intended-exclusive edges partition #15429 grows to "conditions list + inclusive = every match"; the migration rule is unchanged; the spec.describe()is rewritten.config.conditionstakes EVERY out-edge whose condition holds, in parallel — nothing enforces or warns that intended-exclusive edges partition #15429 gains "the.describe()states thatmodehas no effect on a conditions list".config.conditionstakes EVERY out-edge whose condition holds, in parallel — nothing enforces or warns that intended-exclusive edges partition #15429 unlocks only once both this card and spec(automation): add an optionalmode: 'inclusive'toDecisionConfigSchema— the contract half of #15429's ruling (edge-branched decisions become exclusive / first-match; "take every true edge" must be declared) #19867 are closed.Related: #15429 · #19867 / PR #20162 · objectui#10750.
Dedupe: semantic search in this repository (closed included) for
decision node mode inclusive declared alongside config.conditions refuse or inert→ 6 hits (#19867, #15429, #17493, #17322, #14288, #7545). None is a card on this combination.