|
1098 | 1098 | > that is blank after trimming, would validate and register and then fault at |
1099 | 1099 | > run time. Write `{ dialect: 'cel', source: '…' }`. |
1100 | 1100 |
|
| 1101 | + That blockquote is `EVALUATED_EXPRESSION_SOURCE_REQUIRED` as 17.4.0 shipped it, |
| 1102 | + and the parenthetical inside it now reads "(the canonical persisted form)" — |
| 1103 | + the phase clause is gone from the constant and nothing else in the sentence |
| 1104 | + moved. The rule, the slot it reports at and the prescription it carries are |
| 1105 | + unchanged. |
| 1106 | + |
1101 | 1107 | - **`ExpressionSchema` is NOT narrowed.** It is the persistence contract — |
1102 | | - `source` OR `ast` — and its docblock declares that `ast` becomes required in |
1103 | | - build output at phase M9.2. The new export `EvaluatedExpressionSchema` (and |
| 1108 | + `source` OR `ast`. As published, that sentence continued "and its docblock |
| 1109 | + declares that `ast` becomes required in build output at phase M9.2"; the |
| 1110 | + promise is retired — `ast` is accepted as an optional opaque structured |
| 1111 | + value and carries none. The new export `EvaluatedExpressionSchema` (and |
1104 | 1112 | its type `EvaluatedExpression`) is a sibling: the same envelope with `source` |
1105 | 1113 | required and non-blank, spelled once and composed by every evaluated slot, so |
1106 | | - when AST-only evaluation lands the flip is one edit there rather than a |
1107 | | - per-slot unwinding. The rule is worded as "an evaluated slot requires whatever |
1108 | | - the engine can actually evaluate"; what that is today is `source`. |
| 1114 | + if AST-only evaluation is ever chartered the flip is one edit there rather |
| 1115 | + than a per-slot unwinding. (As published that clause read "when AST-only |
| 1116 | + evaluation lands", which carries the same retired promise.) The rule is |
| 1117 | + worded as "an evaluated slot requires whatever the engine can actually |
| 1118 | + evaluate"; what that is today is `source`. |
1109 | 1119 | - **The notion of blank is the engine's own** — `.trim()`, which |
1110 | 1120 | `cel-engine.ts`'s helpers already apply — not a third one beside the shape |
1111 | 1121 | rule's `min(1)` and `validateExpression`'s trim. |
|
1116 | 1126 | grew a rule of its own. |
1117 | 1127 |
|
1118 | 1128 | **What an author does with a refused envelope.** An assignment value that |
1119 | | - carried only `ast` has no evaluable form under M9.1: author its `source`. A |
1120 | | - whitespace-only `source` was never an expression: delete the entry, or write |
1121 | | - the expression. Every envelope with a non-blank `source` is unchanged, and |
1122 | | - nothing is renamed, retired or rewritten — the refusal itself carries the |
1123 | | - prescription. |
| 1129 | + carried only `ast` has no evaluable form: author its `source`. (As published |
| 1130 | + that clause read "no evaluable form under M9.1"; the phase id is retired, the |
| 1131 | + prescription is not.) A whitespace-only `source` was never an expression: |
| 1132 | + delete the entry, or write the expression. Every envelope with a non-blank |
| 1133 | + `source` is unchanged, and nothing is renamed, retired or rewritten — the |
| 1134 | + refusal itself carries the prescription. |
1124 | 1135 |
|
1125 | 1136 | Not touched here: the `predicate` half of the same seam — `evaluateCondition`'s |
1126 | 1137 | silent `false` on an envelope without a `source` — is a behaviour change on a |
1127 | 1138 | live path with its own card, and the edge-condition schema that carries that |
1128 | 1139 | envelope is narrowed in a follow-up once the in-flight change to |
1129 | 1140 | `automation/flow.zod.ts` lands. |
| 1141 | + |
| 1142 | + *Erratum, 2026-09-17 — the M9.1 / M9.2 phase promise this entry restated was retired by the ruling on #17323 (2026-09-12), which found a two-phase roadmap chartered by no ADR: `ast` is an accepted optional structured value with no promise of becoming required. Three passages above are corrected in place; the blockquote is left as shipped and nothing this release published is changed. (Corrected after publication, #17849.)* |
1130 | 1143 | - 68d5dfd: feat(spec): `ExecutionStepMetrics` gains an optional `failures` slot, and `FlowRunSummary.failed` is declared as the fold INCLUDING what a delegating node rolled up from its child (maintainer ruling 2026-09-06 on #15617, spec half) |
1131 | 1144 |
|
1132 | 1145 | Additive. Nothing an author writes is renamed, retired or narrowed; no accept |
|
0 commit comments