sylla-wizard: one wizard, in two dimensions again master
There were three sylla-wizards. The queue build on main (797 lines) had the take queue, lazy per-take assets, findRepo portability, autosave and the set-fixes export. A single-take editor that grew in parallel on neo (525 lines, never committed, now rescue/neo-syllawizard-diverged-20260910) had the thing the queue build had lost: a syllable as a box in two dimensions. And pop/imab/bin/syllawizard.mjs, the JS one, still edits bands today. The queue build kept fLo/fHi in the Rect struct and wrote them to every export, but hardcoded them to 0...1 at all three construction sites with no UI to touch them. That is not a dormant field, it is a destructive one: reopening a take overwrote whatever band was on disk. The two files for take 7311159624588070175 say it plainly — boundaries-drawn carries 0.12...0.9 from @jeffrey's hand, processed-boundaries carries 0...1 for the same twenty syllables. Merged forward, keeping every queue-build feature: - Grip replaces BoxDrag: nine grab points (body, four edges, four corners) with a 7px tolerance and cursor feedback via a tracking area, so an edge drag moves one boundary and a corner moves two. - freqAt/specY/frameOf give the vertical axis back. Eight visible handles on the selection plus a from→to · span · band% readout, so a drag reads as a measurement. - 100-step undo on ⌘Z, with a plain click popping its own history entry. The queue build autosaves every adjustment; without undo there was no way back from a slip. - Loop the selection with L, enforced in the 60fps tick — the same 300ms over and over until the consonant is inside the box. - Return auditions the syllable, option+arrow nudges by 10ms (50 with shift), tab walks the syllables. - seed() reads the band that is on disk instead of flattening it, and recoverBands() fills a flat band from boundaries-drawn keyed on label#wi rather than index, because the tools disagree about ordering. All 20 syllables of that take recover, with no key collisions. Downstream still reads only fromMs/toMs (vocalset.mjs, lyrictrack.mjs, setscroll.py), so the band is an authoring aid — it is now drawn, edited and preserved rather than invented, which is what it would take for anything to depend on it later. Builds clean. Not exercised at runtime here: neo has no ~/.cache/ac/imab/takes assets, so the window has not been opened on a real take since the merge.