Skip to content

workflow: the drawer's Edit plane draws the parallel frame and wires from the old 168x72 card size, so the frame is clipped and wires cross cards #1693

Closed

Description

@HugoXK

Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.

Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: aa5f58ca1a89429ba0f03f9922dce163
Branch: dev/3-wrapped-frame-wires
Base: dcaae9b
At: 2026-10-29T13:13:24Z

What happens

In the drawer's Edit plane (wf-canvas[data-fit="drawer"]), a 3+ way parallel step is laid out by flowLayout into rows whose cards are sized node.w × node.h — 98×96 at panel width 364 — but the parallel frame and the wires still use the fixed 168×72 card metrics.

  • Frame: parallelFrameStyle (plugins/workflow/client.js:652-664, called at :1170-1177) derives left/top/width/height from NODE_W and node.y + NODE_H, never from node.w/node.h. With a 3-way step at panel 364 (cards 98×96, centres 72/182/292) it returns a frame spanning x = −22..386; the drawer canvas clips it (overflow:hidden, :2202), so both uprights are cut off. The same graph in the fitted plane (old 168-wide boxes) gets a frame of 2..362, inside the panel.
  • Frame bottom: at 96px cards the frame's bottom edge lands at y=318 while the cards reach 352, so the dashed bottom edge runs 34px under the cards (10px at the 72px fallback — the same arithmetic, just enlarged by the lay-out).
  • Wires: the laid-out plane draws with wirePath(from, to, 0) (:1158-1163, one fold at the midpoint of the two rows). On the 6-way fixture that puts the horizontal segment through cards on 8 of 13 edges — c>r4 at y=258 through r1/r2, c>r6 through r2/r3, r1>d at y=385 through r4/r5, r3>d through r5/r6. The same graph in the fitted plane has 0 crossings. flowWires (:820-824) already documents exactly this: a straight run across a band cuts through another line's cards, which is why the Read-only plane routes around them.

This was merged with #1683 / PR #1683, whose overlap work only moved the cards; the frame and wire geometry were not part of that change.

Reproduction

  • Probe: tmp/audit-1029y/probe-frame.mjs (exit 1, frame and wire numbers above) and its control tmp/audit-1029y/probe-before1683.mjs (fitted plane: frame 2..362, 0 crossings).
  • In the UI: open any workflow with a 3+ way parallel step in the drawer → Edit tab → panel width 364 (3-, 4- and 6-way graphs).

Expected

  • The parallel frame encloses every card of the layer and stays inside the panel, for both the 96px and the 72px card height.
  • No wire crosses a card in the laid-out plane (6-way fixture: 13 edges, 0 card crossings).
  • The fitted plane and the Read-only plane draw exactly what they draw today.

Scope

  • plugins/workflow/client.js and its test only:
    • parallelFrameStyle uses node.w ?? NODE_W and node.h ?? NODE_H.
    • The laid-out plane draws its wires from the boxes/bands flowLayout already computes, through flowWires; the fitted plane keeps wirePath.
  • Numbering/positions must come from the one place that computes them (no second copy of the row geometry).
  • Not this issue: dragging a card in the laid-out plane committing panel coordinates into the stored graph — that is workflow: a drag in the drawer's laid-out Edit plane commits panel coordinates into the stored graph, so the node also moves on the Settings canvas #1686. Same file, so the two branches coordinate: rebase whichever lands second.
  • verify green with ARCH_DOCS_BASE=<base>; patches/** untouched (no core/ change).

Acceptance

(a) frame left ≥ 0 and right ≤ panel width on the 3-way panel-364 fixture, and it encloses every card box.
(b) the same holds at card height 72 and 96.
(c) 6-way fixture: 0 edges draw their horizontal segment through a card box (port and mini-button areas included, not only card centres).

Reading of (c) after the fix, recorded here so the reviewer and the branch agree: the drawn geometry makes "mini-button area" impossible to clear together with (e). The mini-button box overhangs the card top by 8px and the port dot by 5px, while FLOW_WRAP_GAP is 12px, so any horizontal segment running through the wrap gap lands in one of the two boxes; the 8px overhang is exactly the routing the Read-only plane draws, which (e) freezes byte-identical. The acceptance is therefore card box + out-port dot = 0 crossings; the mini-button box is documented in the test and the PR body (wires render beneath the cards, the buttons stay clickable). Clearing it would need a larger wrap gap — a change to flowLayout, which would move the Read-only plane and break (e).
(d) #1683's six byte-identity fixtures and plugins/workflow/test/client.test.js:1145-1171 are unchanged and still pass.
(e) Read-only plane unchanged: flowWires paths on the existing fixtures are byte-identical.
(f) TZ=UTC ARCH_DOCS_BASE=<base> npm run verify exit 0, red-first test for (a)–(c) on the pre-fix source.

Activity

  1. HugoXK commented on Oct 29, 2026

    @HugoXK
    ContributorAuthor

    Release

    Written-by: FlyBot Lead
    Released: aa5f58ca1a89429ba0f03f9922dce163
    Reason: merged as d98d98e (#1697); issue closed completed
    At: 2026-10-29T14:32:34Z

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions