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
{{ message }}
Repository navigation
[v18] flow text slots: read ADR-0032 §3's {{ }} delimiter instead of single-brace {token} (notify title/message and the other flow string slots), converting only what renders the same #22110
Filed by the triage seat (objectstack-wide, seat post #6015, session_01AavokzJ5DndAwitDXvKy4U). ⛔ Not a claim. This executes an accepted ADR; it is not a decision card. Under .claude/skills/pm-dispatch/SKILL.md 〈升级与决策〉, the protocol is the baseline: code that disagrees with it is aligned to it, and an option that conflicts with the governing text is not a decision card. Amending §3 instead is the maintainer's to ask for, on its own card.
What disagrees today (read on mainaa71c4d9d1)
Two template delimiters ship side by side:
{{ }}: the formula template engine (packages/formula/src/template-engine.ts:31, HOLE_RE) and the messaging renderer (packages/services/service-messaging/src/template-renderer.ts:40).
{ }: flow node text slots. The flow interpolator reads single-brace tokens (packages/services/service-automation/src/builtin/template.ts:359). The notify node's title / message say so (builtin/notify-node.ts:190). The lint rule flow-double-brace-interpolation flags {{ }} on flow node values (packages/lint/src/lint-flow-patterns.ts:1719: "Double-brace {{ }} is the formula/template-field dialect, not flow node values").
⛔ Not titleFormat: it is deprecated toward nameField (ADR-0079).
Measure first
Enumerate the slots the single-brace interpolator reads, and the sites per slot in this repo and in hotcrm.
Lossless check, per ADR-0087 D2: render each measured site with today's interpolator and with the template engine (null, a number, a date, a nested path, an unknown path). Only spellings that render the same may convert automatically.
Direction
The text slots read {{ }} through the formula template engine (§3: holes are paths plus whitelisted formatters).
An ADR-0087 conversion rewrites {x} → {{ x }} only where step 2 measured it lossless. A spelling that renders differently is refused at registration with its remedy, ⛔ never converted.
The conversion entry lives in packages/spec, so it goes through the spec seat (lanes/services.md:11).
Foreseen follow-up: the objectui Studio editors for these slots insert the v18 spelling. Triage reads that surface and files the objectui card in its next objectui round, keyed on the install face.
Clause-②: yes: a published authoring contract changes on the v18 line.
Dedupe: template delimiter double brace flow text slot v18 · ADR-0032 D3 single brace deleted · notify title {token} {{ }}.
Governing text: ADR-0032 (Accepted) Decision 3, "One delimiter,
{{ }}; single{ }deleted." (docs/adr/0032-unified-expression-layer.md:78).Filed by the triage seat (objectstack-wide, seat post #6015,
session_01AavokzJ5DndAwitDXvKy4U). ⛔ Not a claim. This executes an accepted ADR; it is not a decision card. Under.claude/skills/pm-dispatch/SKILL.md〈升级与决策〉, the protocol is the baseline: code that disagrees with it is aligned to it, and an option that conflicts with the governing text is not a decision card. Amending §3 instead is the maintainer's to ask for, on its own card.What disagrees today (read on
mainaa71c4d9d1){{ }}: the formula template engine (packages/formula/src/template-engine.ts:31,HOLE_RE) and the messaging renderer (packages/services/service-messaging/src/template-renderer.ts:40).{ }: flow node text slots. The flow interpolator reads single-brace tokens (packages/services/service-automation/src/builtin/template.ts:359). The notify node'stitle/messagesay so (builtin/notify-node.ts:190). The lint ruleflow-double-brace-interpolationflags{{ }}on flow node values (packages/lint/src/lint-flow-patterns.ts:1719: "Double-brace{{ }}is the formula/template-field dialect, not flow node values").title/messagearetemplate-typed slots (spec: a notify node's refusedtitle/messageis told to write'{{record.name}}', the spelling the build'sflow-double-brace-interpolationrule then flags on the same node and the notify renderer does not resolve #22081). So the slot names the dialect whose delimiter §3 fixes, and the executor reads the other one.git grep -c(a pattern count, not a parse):main: 69 single-brace{record.…}tokens in 12*.flow.tsfiles, and 0{{;{{.{ }collides with CEL map literals, and an author who meets both dialects mixes them. spec: a notify node's refusedtitle/messageis told to write'{{record.name}}', the spelling the build'sflow-double-brace-interpolationrule then flags on the same node and the notify renderer does not resolve #22081 is that mix: a refusal prescribed{{record.name}}for a slot whose lint flags it.Scope
title/message, and every other flow string slot the single-brace interpolator reads. Enumerate them first.fields.*and assignment values leave the template dialect for CEL on [v18] retire the{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 (maintainer ruling D on [Deferred by ruling] Unify flow field-expression assignment onto the CEL engine — the B half of the #11060 ruling, awaiting maintainer appetite #11182).titleFormat: it is deprecated towardnameField(ADR-0079).Measure first
Direction
{{ }}through the formula template engine (§3: holes are paths plus whitelisted formatters).{x}→{{ x }}only where step 2 measured it lossless. A spelling that renders differently is refused at registration with its remedy, ⛔ never converted.packages/spec, so it goes through the spec seat (lanes/services.md:11).flow-double-brace-interpolationflips: it flags single-brace on these slots. The notify-node description and spec: a notify node's refusedtitle/messageis told to write'{{record.name}}', the spelling the build'sflow-double-brace-interpolationrule then flags on the same node and the notify renderer does not resolve #22081's refusal text prescribe{{ }}.Pins
Hello {{ record.name }}renders the name.Hello {record.name}loads converted (when lossless) and renders the same text.{{ }}pasted into a CEL predicate still fails to parse loudly (§3's last sentence).Sequencing
{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939: both edit the flow interpolation module (builtin/template.ts). Claim after it lands, or declare the overlap.Clause-②: yes: a published authoring contract changes on the v18 line.Dedupe:
template delimiter double brace flow text slot v18·ADR-0032 D3 single brace deleted·notify title {token} {{ }}.