Skip to content

v0.28.1 — a label keeps off the bend points you placed; Early MMO leaves the Templates menu - #355

Merged
MerciHanrim merged 7 commits into
mainfrom
fix/label-avoids-own-bends
Oct 14, 2026
Merged

MerciHanrim merged 7 commits into
mainfrom
fix/label-avoids-own-bends

Conversation

@MerciHanrim

@MerciHanrim MerciHanrim commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

v0.28.1 — a label keeps off the bend points you placed; Early MMO leaves the Templates menu

Two changes in one patch release (Lumi, 2026-10-14). Seven commits, each verified as it was done: four of product, release and tests, then two test-only fixes and one CHANGELOG sentence after the full run (section 4). The investigation and the measurements are in share notes 50 and 52.

1. A label keeps off its own stored bend points (678d0d7)

placeLabelOn (src/store/routeMap.ts, docs/edge-routing.md §ER14.3), option A of note 50.

  • The first two placement passes (clear of nodes, labels and other lines; then clear of nodes and labels) now also keep a routed label off a 16 px square (BEND_LABEL_BOX: the 12 px marker plus 2 px) on each of the connection's own STORED bend points. The last-resort passes ignore them, so a line with no slot clear of its bends still has its label, possibly over one: the overlap is avoided where a slot allows, not ruled out.
  • The rule reads stored data only, never the selection: a selection, a deselection or a zoom does not by itself move a label.
  • Not changed: the router, the fan grouping of ports, Curved and Straight labels.

Measured on the screen (note 50's browser probe, unchanged: every connection of the bundled examples, bends added to one at a time, the RENDERED label box against the RENDERED bend markers): a label touching one of its own markers went from 101 to 7 of 718 (23 / 202 → 1, 49 / 262 → 6, 29 / 254 → 0 by where the bends are placed). Most of the 7 left are short lines with bends close together.

Other connections: labels are placed in order and lines rerouted around labels, so a label moving off a bend can move another one. Same measurement, every label and routed line recorded with main's and with this code: another label moved in 18 of 934 cases and another line changed in 20 (Gacha, Early MMO and the playback choreography; none in the other examples). The fix measured twice differs in 0 of 934 rows. In one Early MMO case (e_hunt_xpe) a neighbour now runs along another line for 880 px and its label sits on that line: worse. A node search over 3 000 generated small diagrams flagged candidates; the two smallest, opened in the browser, did not reproduce the regression (seed 1030: no change; seed 1069: only the bent connection's own label moved, off its bend). That is a result for those two cases, not for small diagrams in general; on it Lumi recorded the MMO case as a limit of the stress fixture (next section) and lifted the release hold.

The commit message of 678d0d7 says a connection without stored bends places its label as before: true of its own placement rule, not of the whole drawing (the 18 cases above); cab6c67 says so, the message was not rewritten.

2. Early MMO leaves the Templates menu (3b7f96a)

Hanrim and Lumi: Early MMO serves as a stress case, not as a user's starting point, so it leaves the user Templates and stays as developer material; an MMO-only change does not block a release.

  • The minimal change Lumi approved: the entry stays in TEMPLATES with a new menu: false; the desktop Templates menu and the phone's More → Templates list MENU_TEMPLATES (src/model/templates.ts, Templates.tsx, MobileMoreMenu.tsx). Its file, fixture, scripts, translations, the official-label locale switch and its tests stay. A document made from it still opens, by Import, autosave or a share link.
  • Tests moved with their purpose kept. One MMO-only assertion was replaced by one that fits Coffee: the menu-framing test no longer expects a zone one pan away (Coffee's Forecast column fits at 1280 × 800); it checks the 0.46 floor, the left-most lever whole and both work zones on screen, and the off-screen-zone check stays on the gacha banner. The menu's first screen and language checks (desktop and phone, the overlay, re-seed and rename, reload, undo, Timeline legend, boot locale, de / fr / es-ES names) now use Coffee or the gacha banner; the menu checks also say MMO is not offered, in EN and KO; MMO's own behaviour and performance (recommended config, edit lock, Timeline series, deterministic run and identities, round trip, the bulk locale-switch geometry, the production locale-switch alignment) open its file through the real file input.
  • The colour-view visual check drops its MMO case: the light and dark baselines and their policy entries, as Lumi decided. Coffee and Gacha stay; no other baseline changed.
  • Docs: the examples table and section, docs/example-mmo-progression.md, docs/mmo-multilingual-layout.md, docs/product-direction.md and docs/diagram-layout.md §DL5.5 say it is no longer in the menu. Past CHANGELOG and release records are unchanged.

3. Release (cab6c67, bf3203f)

  • 0.28.1, .changes/label-avoids-own-bends.json (user-facing), release date 2026-10-14, to be checked on the merge day.
  • Four What's new lines in 18 languages, with Lumi's wording: where there is room the label is placed clear of your bends, and without room an overlap can remain; selecting, deselecting or zooming does not by itself change where a label sits; a moved label can also move another connection's label or line; the Early MMO example is no longer listed under Templates, stays as developer test material, and a document made from it still opens and works as before.
  • CHANGELOG v0.28.1 and README Latest; README's bundled-Templates sentence says four.
  • The translation contract tests pass: evidence of the catalogs' structure and terms, not a review of how the lines read. No native-speaker review was done.

4. After the full run: two test-only fixes and one sentence (5f06586, 549fbb6, e33f39a)

No product code changes after bf3203f.

  • 5f06586 (test): the full run's two failures, descriptive-copy-wrapping.spec.ts Korean 38 → 36 and English 40 → 38 lines. The sweep sums every menu blurb and palette description, so the Early MMO blurb no longer counts. Measured with the spec's contexts and line measure: menu 18 + palette 18 = 36 (ko-KR), 19 + 19 = 38 (en-US); the MMO blurb, put in the Templates menu's own 272 px box, takes 2 lines in each. Only the two pins move; the no-overflow, keep-all and no-mid-word-break assertions stay. My migration had missed this count.
  • 549fbb6 (docs): the v0.28.1 CHANGELOG said the MMO case did not reproduce "on small generated diagrams"; it now says it did not reproduce in the two small diagrams checked in the browser. One sentence.
  • e33f39a (test): the dist run on 549fbb6 failed the production locale-switch check — the second switch timed out. Picking a language leaves Settings open; the test used to open MMO from the Templates menu between the switches, which closed it, and since 3b7f96a it opens the MMO file instead, so the next click closed Settings. The switch now closes Settings after a pick. My migration had not been run on the dist config.

Verification, by head

Head What ran Result
bf3203f Full local e2e, --workers=1 --retries=0 2 188 passed, 2 failed, 10 skipped (50.3 min); the 2 are the descriptive-copy-wrapping line counts fixed in 5f06586, no other failure
bf3203f Unit (vitest, full); tsc; lint; check:i18n, check:i18n-surface, check:template-labels, check:snapshot-policy, check:e2e-shards, check:change-declaration, check:control-bytes, check:isolate-arguments, check:content-direction, check:locale-lists, check:functional-glyphs 3 577 passed, 1 skipped; lint 0 errors; all checks pass
5f06586 descriptive-copy-wrapping.spec.ts (its only project, chromium) 25 passed
549fbb6 dist config 15 passed, 1 failed (the locale-switch check, fixed in e33f39a)
e33f39a that test alone on dist, then the whole dist config, then the pwa config, each run separately 1 passed; dist 16 passed; pwa 19 passed
e33f39a PR CI 10 / 10 (checks, six e2e shards, production bundle, PWA, the e2e gate), and the Cloudflare Pages preview deployed

The full local e2e was not rerun after bf3203f (Lumi: the later changes are test-only and one sentence); PR CI runs everything on the final head. e2e label-bends.spec.ts (2) and unit routeMap.bendLabel.test.ts (4) fail on main and pass here.

Earlier runs, kept apart

  • Full local e2e on cab6c67 (the 0.28.1 preparation, before the MMO menu change and the wording): 2 193 passed, 0 failed, 10 skipped. A record of that head, not the verification of this one.
  • A full local e2e started on 678d0d7 was stopped before it finished; it is not a result.

Separate, later units

React Flow's error 008 after a reversal (note 51: a one-frame gap, dev-only warning) gets its short trial first; then the router's fan key, which groups ports without their face. Neither is in this release.

… points

Share note 50 (option A, Lumi 2026-10-14): a routed label took the first
free slot of its own line clear of nodes, other labels and other lines, but
not of its own bend points, so while the connection was selected its bend
markers could sit under it (measured in the browser on the bundled examples
with bends added: touching 23 / 202, 49 / 262 and 29 / 254 by placement).

`placeLabelOn` (src/store/routeMap.ts) now also keeps the label off a
BEND_LABEL_BOX (16 px: the 12 px marker plus 2 px) square on each STORED
bend point (`waypoints`, collected per edge in the plan), in the first two
passes. The last-resort passes ignore the bends, so a line with no slot clear
of them still has its label: the overlap is avoided where a slot allows, not
ruled out. The rule does not read the selection, so selecting or
deselecting never moves a label; a connection without stored bends places
its label as before. docs/edge-routing.md §ER14.3 says it.

Remeasured in the browser on this code with the same probe and inputs as
note 50: touching 1 / 202, 6 / 262 and 0 / 254 (label centre on a marker
1, 5, 0). The 7 left are labels on the 0.5 slot over their own bend, which
by the code can only come from the last-resort passes (inferred, not
checked one by one).

Tests: unit routeMap.bendLabel.test.ts 4 (it fails on main: the label stays
on the bend); e2e label-bends.spec.ts 2 (the label leaves a bend put under
it; selected, the rendered label box and the bend marker do not meet; the
place holds through select, deselect, zoom, undo / redo and a reopen; it
fails on main). Full vitest 3575 passed, 1 skipped; lint 0 errors; tsc.
No change declaration yet: it comes with the release. The fan key's
missing face and React Flow's error 008 are separate units.
- package.json / package-lock.json 0.28.1; `.changes/label-avoids-own-bends.json`
  (user-facing, `release:0.28.1`), date 2026-10-14, to be checked on the
  merge day.
- What's new 0.28.1, three lines in 18 languages: a label keeps off the bend
  points you placed wherever its line has room, and can still sit on one on
  a short line with close bends (no line promises the overlap is gone); its
  place does not depend on the selection or the zoom; in a dense diagram a
  label moving off a bend can also move a nearby connection's label or line
  (measured: another label moved in 18 of 934 cases, share note 52).
  es-ES = es-419 and pt-BR = pt-PT, written neutrally; French avoids the
  punctuation its spacing rule governs. The locale tests' counts follow
  (catalog 1137, runtime 1359); the e2e release list pins 0.28.1.
- CHANGELOG v0.28.1; README Latest v0.28.1 (v0.28.0 kept as a section, v0.26.0
  moved into the CHANGELOG list).

The previous commit's message says a connection without stored bends places
its label as before: true of ITS placement rule, not of the whole drawing —
another label moved in 18 of 934 measured cases (note 52); not rewritten.

The translation contract tests pass: evidence of the catalogs' structure and
terms, not a review of how the lines read; no native-speaker review.
Tests: locale and release 713; whats-new.spec.ts, descriptive-copy-wrapping
and label-bends.spec.ts 123 passed; full vitest 3575 passed, 1 skipped;
lint 0 errors; tsc; change-declaration and the i18n, ICU, isolate,
control-byte, glyph and locale-list checks pass.
…loper stress fixture

The Early MMO progression entry keeps its place in TEMPLATES with a new
`menu: false` field; the desktop Templates menu and the phone's More ->
Templates sheet list MENU_TEMPLATES, so they no longer offer it. Its file,
fixture, scripts, translations, the official-label locale switch and its
tests stay. A document made from it still opens, by Import, autosave or a
share link.

Tests keep their purpose:
- the menu's first screen and language checks (desktop and phone) moved to
  Coffee and the gacha banner, including the overlay, re-seed, rename,
  reload, undo, Timeline legend and boot-locale cases, and the de / fr /
  es-ES localized Template checks;
- the menu checks now also say MMO is not offered, in EN and KO, desktop
  and phone;
- MMO's own behaviour and performance (recommended config, edit lock,
  Timeline series, deterministic run, identities, round trip, the bulk
  locale-switch geometry, the production locale-switch alignment) are
  tested by opening its file through the real file input;
- the colour-view visual check drops the MMO case and its light and dark
  baselines and their policy entries; Coffee and Gacha stay.

Docs: the examples table and section, the MMO design and layout docs, the
product-direction note and diagram-layout DL5.5 say MMO is no longer in
the menu; past CHANGELOG and release records are unchanged.
… room, and the MMO line

Lumi's corrections to the three What's new lines, in 18 languages:
- labelBends: where there is room the label is placed clear of the user's
  bends; where there is not enough room an overlap can remain;
- stable: selecting, deselecting or zooming does not by itself change where
  a label sits;
- nearby: "another connection", not "a nearby connection" (placement is
  global, so a moved label is not limited to its neighbours).

A fourth line, whatsNew.v0281.mmoTemplate: the Early MMO example is no
longer listed under Templates and stays as developer test material; a
document made from it still opens and works as before.

The locale count pins move by one (catalog 1138, runtime 1360); es-419,
th and vi declare the new line's Latin MMO, and vi's Template glossary
count is 4. README (the bundled Templates sentence and Latest) and the
v0.28.1 CHANGELOG entry follow.
…ing the menu

The full local e2e on bf3203f failed two pins in
descriptive-copy-wrapping.spec.ts: the summed line count of every menu
blurb and palette description, Korean 38 -> 36 and English 40 -> 38. The
sweep opens every toolbar menu, so the Early MMO blurb no longer counts.

Measured, not assumed (the spec's contexts and line measure): menu blurbs
18 + palette 18 = 36 in ko-KR, 19 + 19 = 38 in en-US; the MMO blurb, put
in the Templates menu's own 272 px box, takes 2 lines in each. Only the two
pins move; the no-overflow, keep-all and no-mid-word-break assertions stay.
The spec: 25 passed (its only project, chromium).
…rams checked

The v0.28.1 entry said the check "on small generated diagrams" did not
reproduce the Early MMO label case, which reads as a claim about small
diagrams in general. What was shown is narrower: the two smallest flagged
cases, opened in the browser, did not reproduce it (share note 52). One
sentence; nothing else changes.
… switches

The dist run on 549fbb6 failed "a bulk locale switch on the MMO document
keeps edge endpoints aligned": the second language switch timed out
waiting for the language control. Picking a language leaves the Settings
menu open; the test used to open the MMO Template from the Templates menu
between the two switches, which closed Settings, but since 3b7f96a it
opens the MMO file instead, so the next switch's first click closed
Settings (the failure snapshot: the Settings button active, no menu).

switchTo now presses Escape after a pick and waits for the language
control to be hidden. Test only; the test passed alone on the dist config
(1 passed). The migration in 3b7f96a had not been run on the dist config.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying cozy-loop-studio with  Cloudflare Pages  Cloudflare Pages

Latest commit: e33f39a
Status: ✅  Deploy successful!
Preview URL: https://7c7d9933.cozy-loop-studio.pages.dev
Branch Preview URL: https://fix-label-avoids-own-bends.cozy-loop-studio.pages.dev

View logs

@MerciHanrim
MerciHanrim merged commit 4aa3113 into main Oct 14, 2026
11 checks passed
@MerciHanrim
MerciHanrim deleted the fix/label-avoids-own-bends branch October 14, 2026 06:09
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