Skip to content

docs(flows): "an ancestor is never stranded" is falsified by the subflow-parent strand #15556 makes reportable #17940

Description

@claude

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:

  1. a parent parks at a subflow node whose child hosts the approval;
  2. the decision door resumes the child, and the child completes;
  3. bubbleToParent resumes the parent;
  4. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions