A link could only be removed through the menu of its port, and the
line itself took no input. A transition of a state machine could only
be deleted in the list of the inspector. Now the line is the handle,
in a behavior's graph and between states alike.
- A click on a line selects that link and draws a halo behind it. A
press counts within 6 screen pixels of the line, and where two cross
the one drawn last wins.
- Ctrl-click or Shift-click adds a link or takes it away. The rubber
band takes every line it crosses, into the same selection as the
nodes and boxes it caught.
- Delete or Backspace removes what is picked as one undo step. A
right-click on a line offers Hide link and Delete link.
- The inspector shows a picked link: the node and port at each end and
the type it carries, with Hide link and Delete link below. For
several it says how many.
- The arrow of a transition is picked the same way, on its name too.
Delete or a right-click with Delete transition removes it.
- The menu of a port is unchanged, Disconnect included, as answered in
the issue.
- editor/graph/edgeHit.ts holds the hit test as pure functions, and
editor/inspector/edgeSection.ts builds the section. The selection
has a new kind edge, and node and annotation carry edgeIds.
Decided here:
- A hidden link has no line and is never picked this way, also while
it is shown on loan. Its mark at the port stays its handle.
- The menu of a line speaks about the whole selection, like the menu
of a box. With nodes or boxes held alongside it reads Delete N
items.
- Hiding picked links lets go of them, since no line is left.
- A link wins over the box it crosses, and a mark wins over a link.
- A transition has no Hide entry.
- With nodes or boxes in the selection the inspector keeps showing
the node or box, not the link.
Tests:
- Gate: 201 files, 2982 tests (2967 + 15), exit 0
- e2e, full run: 1635 checks passed (1629 + 6), exit 0
- Smokes: 24 / 19 / 21, exit 0
- The full run was done for exactly this state.
- 15 unit tests in tests/editor/edge-selection.test.ts
- Six e2e checks with a real mouse, block 6z-xi in module 06 and 26e7
in module 26
- 12 unit counter-probes all fail tests, run on stein2
- Three browser counter-probes fail, the build went through each
time: no hit on the line, no halo, a band that skips lines
- Screenshots of a picked link and a picked transition looked at
before the last build, none after it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Searching a list with For each needs the test result wired back into
break on the left of the loop node. The wires then run across the node
and the graph reads badly. Find … Match keeps the whole search flowing
left to right, while the test in between stays a free graph.
- Find takes exec and list and offers item and index. It sets them to
each element in turn and has no exec output of its own.
- Match reads its bool input match once per element. The first true
value continues at found with item and index of the hit. No hit or an
empty list continues at not found with an empty item and index -1.
- The pair is derived from the wiring and stored nowhere. A Match
belongs to the Find whose item or index its test is built from. Copy,
paste and undo therefore need no extra code (findBlock.ts).
- An unpaired Find or Match, two Matches on one Find and a Match fed
by two Finds show a warning on the node. At run time the flow ends at
an unpaired Find and the console says so.
- Adding Find from the palette places its Match 480 px to the right in
the same undo step.
- The graph draws a quiet frame behind Find, Match and the nodes of the
test. Literals feeding the test from outside stay outside the frame.
- The test consists of data nodes only, like the break of For each.
Tests:
- ./check.sh: 184 files, 2694 tests, CHECK EXIT 0
- e2e GM_STEPS=1-6: ALL PASSED, 272 checks
- New find-match.test.ts with 12 tests, 2 catalog cases, e2e 6z-v
with 3 checks using a real mouse.
- Counter-checks: ignoring the test fails 4 unit tests, no ambiguity
check fails 2, framing everything fails 1. In the browser, no frame
and no Match from the palette each fail their check.
- Check total in README: 1517.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
debugHook.ts had grown to 1097 lines of unrelated test hooks. They
now live in seven files under src/editor/debug/, grouped by topic.
debugHook.ts only assembles them and is down to 86 lines.
- The shape of window.__gm is unchanged for tools/. Measured in the
browser before and after: 120 top-level keys and 313 leaves with
their arity, byte-identical JSON.
- The Text import is explicit in the helpers. Without it the name
fell back to the DOM type and instanceof would never have matched.
Findings:
- The comment for vectorArt sat above pixelArt. It is back in place.
- An orphaned duplicate comment on assetRow is gone.
Tests:
- ./check.sh: 145 files, 2192 tests, CHECK EXIT 0 (unchanged)
- e2e 1-16,37,39-43,47,48: ALL PASSED, 734 checks
- The shape probe turns red against a deliberately misnested hook.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>