From 6bf205cb804492d1aa2fe1da9cf064f0d21fd1d2 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 02:48:31 +0000 Subject: [PATCH] fix(spec): the two step-18 flow-binding D3 entries name only a text-slot hole and a CEL expression as the reads to rename The replacement text of flow-binding-name-dollar-refused and flow-binding-variable-dollar-name-refused still listed "a single-brace token in a value position" among the reads of a renamed variable. No protocol-18 value position reads a flow variable through a single-brace token: a value slot is a CEL value envelope or a literal, and a token there is refused. The generated upgrade guide and spec-changes.json project this text. Text only; a spec patch changeset carries the FROM -> TO sentence. Claude-Session: https://claude.ai/code/session_01BRQ9Mp1yH7R1az6MaUM18H Co-authored-by: Claude --- .../23338-flow-binding-d3-replacement-reads.md | 17 +++++++++++++++++ .../18.flow-binding-name-dollar-refused.ts | 2 +- ...flow-binding-variable-dollar-name-refused.ts | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 .changeset/23338-flow-binding-d3-replacement-reads.md diff --git a/.changeset/23338-flow-binding-d3-replacement-reads.md b/.changeset/23338-flow-binding-d3-replacement-reads.md new file mode 100644 index 00000000000..16160bfd2d0 --- /dev/null +++ b/.changeset/23338-flow-binding-d3-replacement-reads.md @@ -0,0 +1,17 @@ +--- +'@objectstack/spec': patch +--- + +fix(spec): the two step-18 flow-binding D3 entries name only the reads a renamed variable has on protocol 18, a text-slot hole and a CEL expression + +Clause-②: no + +The `replacement` text of two ADR-0087 D3 semantic entries, `flow-binding-name-dollar-refused` and `flow-binding-variable-dollar-name-refused`, listed three ways a flow reads the old variable name, for the author to rename. Protocol 18 has only the first two. The protocol upgrade guide and `spec-changes.json` are generated from these entries, so they now say what the two entries' release notes already say. + +| FROM | TO | +|:--|:--| +| Rename every read of the old name with it — a text-slot hole, a CEL expression, a single-brace token in a value position | Rename every read of the old name with it — a text-slot hole, a CEL expression | + +No protocol-18 value position reads a flow variable through a single-brace `{…}` token. A value slot takes a CEL value envelope or a literal, and a `{…}` token there is refused. The one `{…}` string a value slot hands on is a CRUD `filter` operand's whole-string query placeholder (`{current_user_id}`, `{today}`): the query engine reads it, and it names no flow variable. A text slot reads `{{ }}` holes. + +Text only. No schema, door, conversion or entry id changes, and each entry keeps its `fromVersion`, `toVersion` and every other field. diff --git a/packages/spec/src/migrations/entries/semantic/18.flow-binding-name-dollar-refused.ts b/packages/spec/src/migrations/entries/semantic/18.flow-binding-name-dollar-refused.ts index 74fd67e41b9..548cdf45852 100644 --- a/packages/spec/src/migrations/entries/semantic/18.flow-binding-name-dollar-refused.ts +++ b/packages/spec/src/migrations/entries/semantic/18.flow-binding-name-dollar-refused.ts @@ -32,7 +32,7 @@ export const entry: SemanticMigration = { 'the same name without the dollar sign, read as a hole over that name: iteratorVariable: \'row\' read as ' + '{{ row.name }}, idVariable: \'account_id\' read as {{ account_id }}, a declared variable or an assignment ' + 'target named total read as {{ total }}. Rename every read of the old name with it — a text-slot hole, a ' - + 'CEL expression, a single-brace token in a value position', + + 'CEL expression', reason: 'The dollar-named variables are the flow engine\'s own: it binds $record, $runId, $flowName, $flowLabel and ' + '$error, a flat-graph loop binds $loopItems and $loopIndex, and a resume signal may not write any dollar ' diff --git a/packages/spec/src/migrations/entries/semantic/18.flow-binding-variable-dollar-name-refused.ts b/packages/spec/src/migrations/entries/semantic/18.flow-binding-variable-dollar-name-refused.ts index b94c54e37d7..eee4c6d8f9e 100644 --- a/packages/spec/src/migrations/entries/semantic/18.flow-binding-variable-dollar-name-refused.ts +++ b/packages/spec/src/migrations/entries/semantic/18.flow-binding-variable-dollar-name-refused.ts @@ -25,7 +25,7 @@ export const entry: SemanticMigration = { 'the same name without the dollar sign, read as a hole over that name: errorVariable: \'caught\' read as ' + '{{ caught.message }}, outputVariable: \'lead\' read as {{ lead.name }}. A try_catch may instead drop ' + 'errorVariable and read the engine\'s default, {{ $error.message }}. Rename every read of the old name ' - + 'with it — a text-slot hole, a CEL expression, a single-brace token in a value position', + + 'with it — a text-slot hole, a CEL expression', reason: 'The dollar-named variables are the flow engine\'s own: it binds $record, $runId, $flowName, $flowLabel and ' + '$error, a flat-graph loop binds $loopItems and $loopIndex, and a resume signal may not write any dollar '