Skip to content

feat(ui): for_each entries drawn inset in the flow view - #130

Merged
dkackman merged 3 commits into
developfrom
ui/for-each-member-chips
Sep 13, 2026
Merged

dkackman merged 3 commits into
developfrom
ui/for-each-member-chips

Conversation

@dkackman

Copy link
Copy Markdown
Owner

A list-driven step (for_each) showed as one box on the job page's flow view while its members ran one by one in the Progress list. The group box now grows and renders one inset chip per entry:

  • chips named as the workflow wrote them (entry name, else index - _entry_keys's rule), with the engine's group@entry name on hover
  • a chip greens as its step_end arrives; the running one pulses amber
  • the group box keeps its existing rule (amber while any member runs, green only when all are done); arrows and fan-in labels still attach to the group box
  • members are read from the definition - a literal for_each list, or a variable: resolved against variables, which the realized workflow carries with the run's actual list folded in (dw/realize.py) - so historical jobs show their members too, with no server change; a list that cannot be read statically shows a muted for_each stand-in
  • column layout is height-aware so a tall box no longer overlaps the node beneath it

One bug the TDD loop caught on the way: between one entry finishing and the next starting, activeMember still reported the just-ended member and its chip stayed amber - it now reports nothing in that gap.

Test evidence

  • vitest 214/214 (36 new across flow/runstate/FlowView/JobPage)
  • svelte-check 0 errors, eslint clean, npm run build exit 0
  • throwaway e2e against a real server and a fast-failing for_each job: job page screenshotted with the chips rendering, then the spec deleted

🤖 Generated with Claude Code

dkackman and others added 3 commits September 13, 2026 17:15
A list-driven step showed as one box on the job page's flow view while
its members ran one by one in the Progress list. The group box now grows
and renders one inset chip per entry, beneath the header the ordinary
box's three lines occupy: chips named as the workflow wrote them (an
entry's name, else its index - _entry_keys' rule) with the engine's
group@entry name on hover, a chip greening as its step_end arrives and
the running one pulsing amber. The group box keeps its existing
all-members-done rule, and the arrows and fan-in labels still attach to
it as a whole; column layout is height-aware so a tall box no longer
overlaps the node beneath it.

The member list is read from the definition - a literal for_each list,
or a variable: reference resolved against variables, which the realized
workflow carries with the run's actual list folded in (dw/realize.py) -
so historical jobs show their members too, with no server change. A
list that cannot be read statically shows a muted for_each stand-in.
Between one entry finishing and the next starting, activeMember now
reports nothing: the run is on neither, and a chip still amber there
would lie about progress.

Co-Authored-By: Claude <noreply@anthropic.com>
@dkackman
dkackman merged commit 67df9af into develop Sep 13, 2026
9 checks passed
@dkackman
dkackman deleted the ui/for-each-member-chips branch September 13, 2026 22:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant