Filed by the domain:services execution seat while reviewing PR #17908 (card #15556) against its Docs Drift Check advisory. ⛔ Unlabelled on purpose — domain:* and priority are triage's.
⛔ Deliberately NOT fixed inside PR #17908. That file is not in #17908's diff (5 files, none under content/), so the edit would be genuine widening of a PR whose current job is to go green on a base merge. The Docs Drift Check's own instruction for a page that is actually wrong is to file rather than edit in place.
The falsified sentence
content/docs/automation/flows.mdx, in the subflow-chain repair paragraph (around :975 on 41479de9a):
Re-arming an ancestor is all the verb does — an ancestor is never stranded, because resuming it is not what moves it.
Both halves — the claim and the reason it gives — are falsified by the behaviour PR #17908 makes reportable.
Why
The paragraph's setting is the CHILD strands: its resume consumed the pause, a downstream node threw, and each ancestor's consumed pause is recorded so restore-suspension can re-arm the chain. In that setting the sentence is true — the ancestors are waiting, not stranded.
But #15556's composition is the other one, and it is now a shipped, reported state:
- a parent parks at a
subflow node whose child hosts the approval;
- the decision door resumes the child, and the child completes;
bubbleToParent resumes the parent;
- the parent's own downstream node throws.
⇒ the parent consumed its suspension and lands on the engine's 'stranded' exit — terminal, repairable only by an operator's restoreConsumedSuspension. PR #17908's own vocabulary says so in as many words: the new SubflowParentStrand interface documents runId as "The run that is actually stranded — the PARENT, never the child that just completed."
⇒ an ancestor can be stranded. And the stated reason fails too: a bubble is what moves the parent, so "resuming it is not what moves it" is exactly backwards for this path.
What a fix needs to say
Not a deletion — the sentence is right about the case it was written for, and that case still exists. It needs to distinguish the two:
⚠️ Whoever takes this should re-read the surrounding paragraph as a whole rather than patching the one clause — the sentences before it about "no run is stranded as resumable-forever" are scoped to a child that fails terminally after the pause, which is a third case again, and the three need to read as three.
✅ The two other advised pages were checked and are FINE — measured, not assumed
The same advisory listed content/docs/api/client-sdk.mdx and content/docs/automation/approvals.mdx. Both were read at 41479de9a:
⇒ ⛔ no card is owed for those two. Recorded here so the next reader does not re-derive it.
⚠️ Dedup bound — stated because it is not complete
This seat's GitHub access is repository-scoped and the issue search endpoint is refused in this session, so no keyword sweep for an existing card naming this file was possible. ⇒ duplicate status is NOT MEASURED, ⛔ not "no duplicate exists". Closing this as a duplicate if one is found costs nothing.
Refs
#15556 / PR #17908 (the change that falsifies it) · the Docs Drift Check advisory on that PR, computed on merge tree 0861e20b78bd192d6d41de5f60ae89351a917e9a · #17939 (the other successor from this family, on the duration-less timer wait)
Generated by Claude Code
Filed by the
domain:servicesexecution seat while reviewing PR #17908 (card #15556) against its Docs Drift Check advisory. ⛔ Unlabelled on purpose —domain:*and priority are triage's.⛔ Deliberately NOT fixed inside PR #17908. That file is not in #17908's diff (5 files, none under
content/), so the edit would be genuine widening of a PR whose current job is to go green on a base merge. The Docs Drift Check's own instruction for a page that is actually wrong is to file rather than edit in place.The falsified sentence
content/docs/automation/flows.mdx, in the subflow-chain repair paragraph (around:975on41479de9a):Both halves — the claim and the reason it gives — are falsified by the behaviour PR #17908 makes reportable.
Why
The paragraph's setting is the CHILD strands: its resume consumed the pause, a downstream node threw, and each ancestor's consumed pause is recorded so
restore-suspensioncan re-arm the chain. In that setting the sentence is true — the ancestors are waiting, not stranded.But #15556's composition is the other one, and it is now a shipped, reported state:
subflownode whose child hosts theapproval;bubbleToParentresumes the parent;⇒ the parent consumed its suspension and lands on the engine's
'stranded'exit — terminal, repairable only by an operator'srestoreConsumedSuspension. PR #17908's own vocabulary says so in as many words: the newSubflowParentStrandinterface documentsrunIdas "The run that is actually stranded — the PARENT, never the child that just completed."⇒ an ancestor can be stranded. And the stated reason fails too: a bubble is what moves the parent, so "resuming it is not what moves it" is exactly backwards for this path.
What a fix needs to say
Not a deletion — the sentence is right about the case it was written for, and that case still exists. It needs to distinguish the two:
'stranded'exit, and as of service-automation: a subflow'sbubbleToParentfailure is swallowed, so an approval decision answers 200resumed: truewhile the run behind it is stranded — #13807's three-outcome shape, one level up #15556 an approvaldecide()reports it onresumeFailure({ code: 'RESUME_FAILED', runId: '<parent>', status: 'stranded', repairable: true }).✅ The two other advised pages were checked and are FINE — measured, not assumed
The same advisory listed
content/docs/api/client-sdk.mdxandcontent/docs/automation/approvals.mdx. Both were read at41479de9a:400 FLOW_FAILEDandResumeFailureDetailsSchema— a different surface from the approval decision door's success answer that fix(automation): tell approval decide() callers when a subflow parent strands #17908 changes;packages/specand no REST change);approvals.mdx's only nearby claim is theerrorHandling.retrycallout, which this change does not touch.⇒ ⛔ no card is owed for those two. Recorded here so the next reader does not re-derive it.
This seat's GitHub access is repository-scoped and the issue search endpoint is refused in this session, so no keyword sweep for an existing card naming this file was possible. ⇒ duplicate status is NOT MEASURED, ⛔ not "no duplicate exists". Closing this as a duplicate if one is found costs nothing.
Refs
#15556 / PR #17908 (the change that falsifies it) · the Docs Drift Check advisory on that PR, computed on merge tree
0861e20b78bd192d6d41de5f60ae89351a917e9a· #17939 (the other successor from this family, on the duration-less timer wait)Generated by Claude Code