Filed unassigned from the #3917 implementation (PR retiring the ActionCondition{ expression, then, else } branch shape). Not fixed there — the card, the 2026-08-09 ruling and the dispatch fence all name exactly two teaching sites; this is a third, discovered by a repo-wide sweep. Recording it rather than widening the fenced PR.
The site
content/docs/guide/schema-overview.md:84, inside the "Advanced Actions" shape excerpt:
constaction: ActionSchema={type: 'action',actionType: 'ajax',api: '/api/submit',chain: [...],condition: {expression: '${...}',then: {...}},// ← line 84onSuccess: {...},tracking: {...}};Line 311 of the same page (- ✅ Conditional execution with the condition property) stays true — condition survives as a predicate gate; only the { expression, then } spelling is retired.
Why it matters after #3917
Before #3917 this line taught a shape that was accepted by the zod schema and then silently ignored at runtime. After #3917 it teaches a shape ActionSchemarefuses (invalid_union on condition), while the two ruled teaching sites now describe the live vocabulary — condition is a gate; a branch is separate actions with mutually exclusive conditions. The page is the "Schema Overview" entry point, so it is a likely first read.
Why no gate catches it
The block is a declared fragment — the page carries <!-- doc-snippet: fragment — a shape excerpt: chain, condition, onSuccessandtrackingare written as literal[...]/{...} ellipses … --> immediately above it, so scripts/check-doc-snippet-types.mjs counts it in coverage but never compiles it. That declaration is correct on its own terms (the block is full of [...] / {...} ellipses and cannot compile), which is exactly why the stale key spelling inside it survives every gate. Measured on 24d653d5e with the #3917 change in the tree: node scripts/check-doc-snippet-types.mjs → Semantic phase: 135 of 135 block(s) judged, 0 failed, exit 0, with this line untouched.
Scope of the sweep that found it
Repo-wide, --include=*.md --include=*.mdx, excluding node_modules and CHANGELOGs: the only pages writing then: under a condition were core/enhanced-actions.mdx (fixed in #3917), api/schema-reference.md (fixed in #3917) and this one. content/docs/utilities/runner.mdx matched the same grep on prose ("…expressions, then looking the component type up…") and is a false positive.
Fix
One line, plus a look at whether the fragment marker's reason text should still name condition: write the excerpt's condition as the predicate (condition: '${...}'). Same edit shape as the two sites #3917 already rewrote.
Related: #3917 (the ruling and the two fenced teaching sites), #5174 (the doc-snippet ledger workstream that owns this page's coverage).
Filed unassigned from the #3917 implementation (PR retiring the
ActionCondition{ expression, then, else }branch shape). Not fixed there — the card, the 2026-08-09 ruling and the dispatch fence all name exactly two teaching sites; this is a third, discovered by a repo-wide sweep. Recording it rather than widening the fenced PR.The site
content/docs/guide/schema-overview.md:84, inside the "Advanced Actions" shape excerpt:Line 311 of the same page (
- ✅ Conditional execution with theconditionproperty) stays true —conditionsurvives as a predicate gate; only the{ expression, then }spelling is retired.Why it matters after #3917
Before #3917 this line taught a shape that was accepted by the zod schema and then silently ignored at runtime. After #3917 it teaches a shape
ActionSchemarefuses (invalid_uniononcondition), while the two ruled teaching sites now describe the live vocabulary —conditionis a gate; a branch is separate actions with mutually exclusiveconditions. The page is the "Schema Overview" entry point, so it is a likely first read.Why no gate catches it
The block is a declared fragment — the page carries
<!-- doc-snippet: fragment — a shape excerpt:chain,condition,onSuccessandtrackingare written as literal[...]/{...}ellipses … -->immediately above it, soscripts/check-doc-snippet-types.mjscounts it in coverage but never compiles it. That declaration is correct on its own terms (the block is full of[...]/{...}ellipses and cannot compile), which is exactly why the stale key spelling inside it survives every gate. Measured on24d653d5ewith the #3917 change in the tree:node scripts/check-doc-snippet-types.mjs→Semantic phase: 135 of 135 block(s) judged, 0 failed, exit 0, with this line untouched.Scope of the sweep that found it
Repo-wide,
--include=*.md --include=*.mdx, excludingnode_modulesandCHANGELOGs: the only pages writingthen:under aconditionwerecore/enhanced-actions.mdx(fixed in #3917),api/schema-reference.md(fixed in #3917) and this one.content/docs/utilities/runner.mdxmatched the same grep on prose ("…expressions, then looking the component type up…") and is a false positive.Fix
One line, plus a look at whether the fragment marker's reason text should still name
condition: write the excerpt'sconditionas the predicate (condition: '${...}'). Same edit shape as the two sites #3917 already rewrote.Related: #3917 (the ruling and the two fenced teaching sites), #5174 (the doc-snippet ledger workstream that owns this page's coverage).