Changelog
v0.100.0 — 2026-10-17
Features
- feat(release): publish.sh submits each release to the Microsoft Store, live when it passes (17.87) (3dc75066)
- feat(snap): Drawbridge in the Snap Store, and publish.sh step 4b for both stores (17.88, 17.90) (#50) (f936de84)
- feat(site): /download/ offers the Microsoft Store as the way onto Windows (17.95) (#51) (c932c4fa)
- feat(store): drawbridge.exe, a stable MCP command for a Store install (17.86 step 7) (#48) (24076e28)
- feat(touch): touch and Apple Pencil work in the aisle, with no touch mode (17.83) (#47) (0b562679)
- feat(store): Drawbridge in the Microsoft Store — package, tiles, no updater, and the release step (17.86) (#46) (b61e63a8)
Fixes
- fix(desktop): show the window on a native Wayland desktop (17.93) (#49) (e217f3bd)
Other
- docs(qa): the pre-v0.100.0 directed check — 9/9 on the test server; REG-36 blocked by a monitor-less session (17.96) (b8ecf2e7)
- test(17.82): a view window's font is polled for, not read once after fonts.ready (0c28cdfa)
- docs(tasks): #45 answered and closed; 17.59 done (077aae1a)
- docs(tasks): v0.99.0 released — #45 complete, the MCP round, the feedback-round fixes (50e90222)
v0.99.0 — 2026-10-17
Features
- feat(import): one import, a page per site (17.66); an import keeps a group's members together (17.81) (b097d1a7)
- feat(optical): a DWDM terminal carries its own port map (17.75) (95386d73)
- feat(zones): a zone folds to one tile and keeps its cables (17.77); a big VLAN moves with its site (17.85) (30d5f189)
- feat(site): a /sponsor/ page — the signing budget, sponsor tiers and a public spot (17.84) (3a91c2f6)
- feat(tables): a Channels tab — by pair, or end to end (17.74) (0167d610)
- feat(groups): an Optical shelf — one tile with its channels, the plan read from its cables (17.73) (dc48210e)
- feat(import): zones hold together when an import has cables (17.63) (1efeb0a5)
- feat(import): a laid-out import says when it came out too wide (17.69) (c9b50c87)
- feat(import): a big fan-out folds into a block under its device in every format (17.64) (909bb275)
- feat(inspector): the Cables tab's part line knows a passive end (17.71, 17.72) (f6cfcbaf)
- feat(shapes): DWDM terminal, Mux/Demux and Transponder; a mux port buys no module (17.71) (c6cf9f36)
- feat(inspector): the Cables tab says each cable's type, channel and part (17.72) (882909c5)
- feat(feedback): the form asks which layout the reporter was using (17.51) (b8495198)
Fixes
- fix(text): a shelf's channel chips are a fixed size, on the drift guard's list (17.73) (91767ed1)
- fix(groups): a shelf's Lines are its fibres, and a shelf has no Orientation (17.73) (8f932b4d)
- fix(groups): an optical shelf keeps its members where they stand (17.73) (04c37a46)
- fix(optics): a patch panel end buys no transceiver (17.76) (5b93e8a8)
- fix(dot): a group's name and type survive a DOT round trip; an unnamed collapsed group reads "Group · N" (17.60) (a8f5c7e7)
- fix(dot): a zone inside a zone draws around it; the MCP guide says how to make a zone (17.61, 17.62) (f16796bc)
- fix(canvas): a note moves from wherever it is grabbed (17.55) (6d78d215)
- fix(text): a new text block is typed in the box it becomes (17.54) (aedd0564)
Other
- docs(qa): the pre-v0.99.0 test-server check — 31/31 in Chromium and Firefox (8ec09dff)
- docs(17.86): file the Microsoft Store task — Individual account, the steps, and what closes it (cf151c94)
- test(17.75): SHAPE-38 goes back to Draw in Studio before clicking the λ badge (33d2d9b3)
- docs(17.75): done note, release note, SHAPE-38 (the full run is 385); CLAUDE.md records the optical port-map exception to the per-port decline (f1512043)
- docs(tasks): 17.83 — touch and Apple Pencil work in the aisle, by default, no mode (cbcf852a)
- docs(17.74): done note, release note, TABLE-03 in the coverage map (the full run is 383) (cfbb6d2d)
- docs(tasks): 17.82 — a view window's fonts loaded zero faces once under load (071db0d0)
- docs(tasks): the MCP round's decisions — 17.65 and 17.67 closed, 17.66 to design, 17.77 filed; DOT is the contract (9faac9c1)
- docs(17.73): done note, release note, GRP-09 in the coverage map (the full run is 382); the MCP guide names groupkind=optical (fd1ce5c8)
- docs(tasks): 17.63 done — the user saw the before and after and chose to ship it (8ab5e6c5)
- docs(mcp): the guide names every format the importer reads, port labels, colour, collapse and the CLI (17.68) (4cc550d0)
- docs(qa): coverage citations follow 17.76's optics test (3649d838)
- docs(17.71): done note, release note, SHAPE-37 in the coverage map, the full run is 381; 17.76 asks about a patch panel end (a466db65)
- docs(17.72): done note, release note; CONN-20 cites the new tests (ddc125c3)
- docs(17.60): done note, watchlist row, release note; coverage citations follow its tests (5caae14f)
- docs(17.55): done note, watchlist row and release note (3ecbf192)
- docs(qa): coverage citations follow 17.55's new tests (2f36070e)
- docs(tasks): #45's build tasks are 17.71–17.75 (17.61–17.70 were taken by the MCP feedback round) (8758ab1d)
- docs(tasks): 17.51 and 17.54 done; 17.55, 17.58 and 17.60 decided; #45 becomes 17.61–17.65 (75e692a9)
- test(about): About's Copy carries the layout line too (17.51) (3ea8e88e)
- docs(tasks): MCP feedback from a Hermes agent run becomes 17.61–17.70 (a67439b3)
- docs(qa): 17.54's traceability row and REG-18 check; coverage citations follow the new tests (aa758476)
- docs(tasks): replies sent and issues closed (17.56, 17.59); DOT drops a group's name and type (17.60) (ba946c69)
- docs(feedback): answer reporters through their contact, never on the tracker (17.57); 17.55 looked into (054a8980)
- docs(tasks): feedback round 2026-10-17 — #33–#36, #43–#45 decided (17.51–17.59) (3771fa91)
- docs(tasks): 17.42–17.50 released in v0.98.0 (fcb01d04)
v0.98.0 — 2026-10-17
Features
- feat(files): Open and Save As start in the folder used last time (17.50); a 36px Studio mark (17.49) (8321eb15)
- feat(tables): unnamed devices are told apart, greyed and numbered (17.48); a bigger Studio mark (17.49) (8d0622d8)
- feat(text): Label style sets a text block like a port's or cable's caption (17.45) (7c26b966)
- feat(tables): the table picks what the properties panel picks (17.46) (6f1909c1)
- feat(studio): a view opens as a window or a tab; Role fills its column (17.42.3–17.42.5) (7be684cd)
- feat(desktop): view windows open on the desktop and come back after a restart (17.42 step 7) (d54ddbaf)
- feat(studio): drag a segment off the bar into a window of its own (17.42 step 6) (9a31fdc0)
- feat(studio): a segment's right-click opens its view in a window (17.42 step 5) (cd716ccb)
- feat(studio): Draw opens in a window of its own (17.42 step 4) (fc6fc5c1)
- feat(studio): a view window stays on its page (17.42 step 3) (bd959bc3)
- feat(studio): Checks and Pack open in windows of their own (17.42 step 2) (c7a11efc)
- feat(studio): open Tables in a window of its own (17.42 step 1) (6e2113f3)
Fixes
- fix(views): a view window in Firefox is styled and in the app's fonts on the production server (17.42.6) (5859ef3a)
- fix(canvas): an Arc cable hops where it crosses (17.47) (5cee8a17)
- fix(scripts): a trial's install line names the folder the app is in (17.43); Draw stays in the main window (17.44) (72d95bce)
- fix(canvas): a tunnel hops clear of its casing, and its lock slides off the hop (17.47) (ccd8425d)
- fix(studio): the rest of 17.42.1 and 17.42.2 (caa87d02)
- fix(studio): view windows dress in Firefox; Draw no longer pops out (17.42.1, 17.42.2) (b2356970)
Other
- wip(text): a text block can wear a caption's look (17.45, in progress) (12486812)
- docs(tasks): pack-trial's install line ignores where Drawbridge already lives (17.43) (5769c85f)
- docs(studio): views in windows in the manual and the QA suite (17.42 step 8) (9128791c)
- docs(tasks): 17.42 — settle main-window, cross-page and scope questions (ed45a5a9)
- docs(tasks): 17.42 — agree the shape of view windows with the user (54360e28)
- docs(tasks): 17.36–17.41 released in v0.97.6 (d89ce562)
- docs(tasks): open a view in a window of its own — noted (17.42) (efe1b8a2)
v0.97.6 — 2026-10-15
Features
- feat(canvas): trace from one device, and reset bends keeping the type (17.40, 17.41) (be25f684)
- feat(canvas): a right-click menu on the drawing (17.39) (85538267)
- feat(canvas): a selected tile under another one wears a dotted ring (17.38) (9e2e8f46)
- feat(files): Save as asks the name where the browser can only download (17.36) (1ce53731)
Fixes
- fix(canvas): a paste lands under the pointer, never on anything (17.37) (a065a5ad)
Other
- docs(qa): test-server check of 17.36–17.41 before v0.97.6 (50aa53f5)
- docs(tasks): Save as in Firefox asks for nothing — cause and proposal (17.36) (82cf9d89)
- docs(tasks): 17.34 released in v0.97.5 (b95072a8)
v0.97.5 — 2026-10-14
Features
- feat(studio): start with a blank canvas from the empty page (17.34) (303b7ebc)
Other
- docs(release): notes and test-server QA for 17.34 (3d1e37f3)
- docs(tasks): 17.29–17.33 released in v0.97.4 (c2f4aa3f)
v0.97.4 — 2026-10-14
Fixes
- fix(canvas): endpoint grab, rack delete, group frame delete, rings into groups (17.29–17.33) (41890b58)
Other
- docs(qa): directed QA for 17.29–17.33 on the test server (a3e4d59d)
- docs(tasks): 17.27 and 17.28 released in v0.97.3 (72ca6b14)
v0.97.3 — 2026-10-14
Fixes
- fix(canvas): a text box holds its text; pasted images land screen-sized (17.27, 17.28) (25736471)
Other
- docs(qa): directed QA for 17.27/17.28 on the test server (49c732b2)
- docs(tasks): 17.28 decided, pasted images land screen-sized (supersedes 2.86) (39bfa143)
- docs(tasks): 17.28 pasted screenshots land device-tile sized (verified, by rule 2.86) (81b0ca61)
- docs(tasks): 17.27 a text block's outline follows its text (decided) (cf1aa6be)
- docs(tasks): 17.25 released in v0.97.2; 17.26 tag run billing-blocked too (0b5a816e)
v0.97.2 — 2026-10-13
Features
- feat(canvas): a dragged arrow or line end says where it can fasten (17.25), and a targeted zone rings (17.24) (953ca133)
Other
- docs(tasks): 17.26 hosted CI billing-blocked; v0.97.2 ships with --no-ci-gate by user decision (93cc6dfd)
- docs(qa): directed QA for 17.24/17.25 on the test server (acb5dfee)
- docs(tasks): file 17.24 (zone target ring not drawn) and 17.25 (arrow attach hints, awaiting a pick) (e396cd46)
- docs(tasks): 17.22 released in v0.97.1 (872e61e7)
- ci: hosted CI is the wasm job alone; the Linux e2e it repeated runs in the release gate (17.23) (539c1a20)
v0.97.1 — 2026-10-13
Features
- feat(site): the landing page shows Studio, and the layout gallery is shot in it (17.15) (5922fb24)
Fixes
- fix(canvas): flow arrow and line ends fasten to a zone's edge, like a cable (17.22) (b3c22947)
- fix(install): remove the Drawbridge.app that shadows a fresh install (17.21) (c8ed4cd5)
Other
- docs(release): notes for 17.22 and the directed QA run on the test server (c0de16e4)
- docs(tasks): the site shows Studio, deployed (17.15) (b9a65610)
- docs(tasks): the v0.97.0 tag run is green (17.15) (ec016a80)
- docs(tasks): v0.97.0 released; file 17.20 (the hosted-CI wait is shorter than the run) (8012cde7)
v0.97.0 — 2026-10-11
Features
- feat(studio): Studio is the layout Drawbridge opens in; release notes for v0.97.0 (17.15) (7e3c611f)
- feat(export): the Drawbridge mark beside "Drawbridge" in the PDF band (17.14.31) (492e0a40)
- feat(studio): Preview the pack in the app before saving it (17.14.30) (495d2073)
- feat(studio): the Bubblegum theme — pastel pink, lavender lines, one candy pink (17.16.5) (64622fea)
- feat(studio): the pages strip gets a head — rows or pictures, a + for New page, and how many are below (17.14.28) (1580a874)
- feat(cables): preset lengths by cable type, and copper held to its standard (17.14.22) (b61d0592)
- feat(workspace): minimize a dock to a rail, and View → Minimize all / Restore all (17.14.20) (66f359ac)
- feat(groups): choose which side a stack's cables run on (17.14.19) (f742f46f)
- feat(build): trial builds carry an internal build number (17.14.14) (15409734)
- feat(studio): the Fabric theme — a security console's chrome, one signal red (17.16.4) (65c19888)
- feat(studio): the Swiss theme — white chrome, grey rules, one red (17.16.3) (3575a567)
- feat(studio): the Blueprint theme — paper chrome, white line work on cyanotype (17.16.2) (8faf073f)
- feat(studio): themes — the machinery, and Graphite (17.16.1) (60b9319b)
- feat(checks): Ignore all, and Studio's Checks can be switched off (17.14.9) (1b54c4b3)
- feat(studio): the app menu is a ☰ hamburger, framed and readable (17.14.8) (b7280a60)
- feat(studio): New page opens blank, with the start panels one line away (17.14.7) (655fe60f)
- feat(studio): your own buttons on the tool dock (17.14.5) (272cf704)
- feat(tables): Add cable… types a cable in from the Cables tab (17.14.3) (02367a5e)
- feat(cables): an optional cable length, through the schedule, NetBox and the order list (17.14.2) (9101e6f3)
- feat(studio): the empty page's three doors, and Recent files in both layouts (17.12) (0b49d836)
- feat(studio): the Pack view — the handover pack with choices (17.11) (8f53846a)
- feat(studio): Checks — what is unfinished on the page, each with its fix (17.10) (5483f5a3)
- feat(studio): the Table panel and the Tables view — the page as rows, edits the card's own (17.9) (7d929608)
- feat(studio): Search everything — ⌘K for any command, shape, page, device, cable, group, address or topic (17.8) (a207c487)
- feat(studio): drag a cable into empty space to make its device (17.7) (fe1f2654)
- feat(studio): the device picker — D, type, Enter at the pointer; Shapes is a drawer (17.6) (bede74d2)
- feat(studio): Align leaves ⋯ — it is the several-objects card's Arrange (17.5.1) (8bc9954d)
- feat(inspector): the page card — nothing selected, the Facts panel is the page (17.5) (58d1ca11)
- feat(inspector): several objects — "N devices selected", Arrange first, Network for all (17.4.4.2) (8d865c38)
- feat(inspector): the zone's and the rack's cards — Contents, Units, and no Subnet on a rack (17.4.4.1) (bb5dee5d)
- feat(inspector): a cable's two ends are its card; type and speed appear once (17.4.3.2) (c3714621)
- feat(inspector): the cable's sections and Swap ends (17.4.3.1) (7f566bed)
- feat(inspector): the device card in docs/11's order — header, Network, Details, Placement, toolbar (17.4.2) (91f9a186)
- feat(inspector): Facts, Cables and Look tabs, labels beside fields where there is room (17.4.1) (0f3f17cb)
- feat(studio): Compact — Studio in a window under 1100 px (17.3.4) (84ab5a6c)
- feat(studio): the status whisper — the page in one line, quiet messages in its place (17.3.3) (de518ddc)
- feat(studio): the pages strip — a picture of every page down the side (17.3.2) (b71fa9a7)
- feat(studio): the Studio shell — app bar, tool dock, view cluster, own layout (17.3.1) (1ac5b583)
- feat(studio): Warm slate tokens, the bundled Fira faces, Studio's canvas (17.2) (7c70ae3d)
- feat(studio): the experience switch, Classic by default (17.1) (85d0540f)
Fixes
- fix(workspace): Edit layout no longer widens Classic's bar, so nothing folds into More (17.19) (939b0ef4)
- fix(studio): the menus' moved-in rows hover in the accent like the rest (17.14.29) (005f2033)
- fix(storage): the Storage sheet shows a new connection without being reopened, for every cloud (17.14.26) (4ac11ffa)
- fix(workspace): minimize and restore are one button in the dock's top outer corner (17.14.25) (4da555a0)
- fix(studio): in Fabric the whole left dock is the slate sidebar, Shapes included (17.14.21) (71699dfa)
- fix(blocks): deleting any part of the optics, revisions or flows block takes the whole block (17.14.18) (0d87dadd)
- fix(studio): Layers opens beside ☰ and hangs from it when it outlives it (17.14.17) (e2055ae9)
- fix(studio): dock pins load with Studio only; Theme folds under Preferences (17.14.15, 17.14.16) (4536082d)
- fix(studio): Checks off survives a reload (17.14.13) (6dabea0a)
- fix(build): bring the entry back under its ceiling — Pack and dock pins load on first use (17.14.12) (93865e99)
- fix(inspector): a device's Cables tab is a heading over full-width cards (17.14.11) (cbcd028f)
- fix(studio): View, Quick shapes and Blocks open as submenus of ⋯ (17.14.6) (e97014a8)
- fix(desktop): --smoke runs in a throwaway profile, never the user's (17.14.10) (46f96b25)
- fix(groups): an MC-LAG pair or a stack drags by its outline (17.14.4) (4e0ba54c)
- fix(studio): the gallery and the generator wear Studio's tokens (17.13.13) (ea978237)
- fix: while the layout is edited, the drawing's keys rest too (17.13.12) (35447f0a)
- fix(studio): the empty page's doors keep clear of the tool dock (17.13.11) (301306eb)
- fix(studio): a long document name gives way before the saved state does (17.13.9) (9fd62969)
- fix(studio): Save as… names its chord for the platform (17.13.8) (a0586f4f)
- fix(studio): a refused cloud sign-in is a pop-up, not a whisper (17.13.7) (ac2e961a)
- fix(studio): the floating Shapes drawer ends above the tool dock; 17.13 closes (17.13.6.1) (2ce355e1)
- fix(studio): the doors, the page line and the dock start right of the Shapes drawer (17.13.5, 17.13.6) (9cc62a20)
- fix(studio): the routing pill sits under the page line, and the line stays one line (17.13.4) (8f57239f)
- fix(studio): the page line says what the View hides (17.13.3) (cb8edcac)
- fix(studio): a panel whose trigger is folded away hangs from the menu's button (17.13.2) (edf99dc3)
- fix(studio): the auto-link message's Settings unfolds Preferences (17.13.1) (c7f4c195)
- fix(studio): ⋯ folds the preferences under one row, so it fits 1280 × 800 (17.3.5) (e163110a)
- fix(menus): a short window tightens menu rows, so Classic's app menu fits 1280 × 800 (17.8.1) (6e0a2a41)
- fix(storage): the Storage sheet re-reads the connection as it opens (17.7.1) (2cf68e9a)
Other
- test(collab): the window-close test chooses Classic, since a fresh profile now opens in Studio (17.18) (399e93ed)
- docs(qa): the pre-v0.97.0 test-server run, 24 of 24 (17.15) (ceed98ce)
- docs(manual): every Studio theme pictured, light beside dark (17.16.6) (bd28f8a5)
- docs(tasks): file 17.16.5 — a pink theme, five versions on a canvas first (dcc11679)
- docs(tasks): file 17.14.28 — the pages strip under Shapes (design options first) (aa459477)
- test: a browser test for the lazy highlighter, and the Storage cases wait on conditions (17.14.27) (cef56bc7)
- perf(bundle): DOT parsing and Prism leave the entry's core chunk (17.14.24) (86794d8b)
- docs(tasks): file 17.14.25 — minimize and restore in one place (design options first) (0dd50ce1)
- docs(tasks): file 17.14.24 — win back entry headroom (3,727 B left after gate run 22) (39bb3920)
- test(groups): the stack-side e2e allows for Firefox counting a path's stroke (17.14.23) (0fa82097)
- docs(tasks): file trial requests 17.14.20-17.14.22 (minimize panels, Fabric left dock, cable length presets) (1cc9d4d0)
- docs(tasks): file trial findings 17.14.17-17.14.19 (Layers, optics block, stack cable side) (9664779d)
- docs(tasks): file 17.14.14 — trial builds carry an internal build number (8158bb13)
- docs(studio): file three trial findings (17.14.2-17.14.4) (fedc7c1a)
- docs(studio): the trial runs the desktop app; file the stale offline copy (17.14, 17.14.1) (85b839aa)
- docs(studio): record the trial install on this Mac (17.14) (94f0c1ee)
- docs(studio): record gate run 16 and the handover for the trial (17.14) (bb62ba63)
- test(studio): Studio's Firefox project runs the auto-link, shortcuts and view specs (17.13.14) (8fead938)
- docs(studio): Studio's floor is 1024 px; below it ⋯ stays in reach (17.13.10) (05f68d24)
- docs(qa): the suite learns Studio — a Studio line per scenario that differs, and a dry run (17.13) (f616df8e)
- test(deploy): render-autoscale's tests never read the machine's own memory (17.12.1) (84470d97)
- test(studio): boot waits for Studio's fonts; the ✕ corner test reads a settled box (17.6.2) (3e5ff3f4)
- docs(tasks): file the CLOUD-01 Firefox flake from gate run 9 (17.7.1) (5286fa5a)
- test: pin editor-studio-firefox in project-boundaries (17.6.1) (0405e78a)
- test(e2e): Studio's chrome runs in Firefox — editor-studio-firefox (17.6.1) (719cc8cd)
- docs(tasks): file the Studio-in-Firefox coverage gap from gate run 8 (17.6.1) (b346773e)
- docs(qa): follow the spec line shifts of 17.5.2 in COVERAGE-MAP.md (53a38926)
- test(e2e): read the clipboard with a bound — a stalled Firefox read cost EXP-11 its 30 s (17.5.2) (e70518de)
- docs(tasks): file the EXP-11 Firefox clipboard flake from studio gate run 7 (17.5.2) (ab09e82b)
- docs(tasks): close 17.4.3 and split 17.4.4 into zone/rack and several objects (22050c34)
- docs(tasks): split 17.4, the inspector, into four tasks that each land on their own (bb827e84)
- docs(tasks): split 17.3, the Studio shell, into four tasks that each land on their own (5bc66aea)
- docs(studio): save the design canvas into docs/11-STUDIO and point the handoff at it (2709b20e)
- docs(tasks): Phase 17, the Studio layout: handoff spec and task list (user decision 2026-10-10) (61d8f87c)
- docs(tasks): the gateway routes /api/edit and /api/validate, verified from outside (16.339) (5920ae68)
- docs(tasks): v0.96.4 verified live; the gateway still 404s edit and validate (16.339) (0a7fbe6b)
v0.96.4 — 2026-10-10
Features
- feat(groups): space an MC-LAG pair's and a stack's members freely, and turn them the other way round (16.287) (5fa33a17)
Fixes
- fix(collab): rustls 0.23.45 in the browser collab wasm (16.328) (a18dbfb9)
Other
- docs(qa): test-server run for the collab rustls fix (16.328) (d3665925)
- docs(release): notes for the browser collab rustls fix (e1aa3f5b)
- docs(security): gateway trusts private ranges only, verified (16.331) (960160c2)
- docs(tasks): v0.96.3 verified live; the hosted CI gate outgrew the release (16.337) (5876bb9e)
v0.96.3 — 2026-10-10
Fixes
- fix(security): the pentest's code findings (16.332–16.336) (743f198f)
Other
- docs(release): notes for the pentest fixes (9fc4cd67)
- docs(security): external pentest of the live site, 2026-10-09 — report and tasks 16.329–16.336 (6423f87e)
- docs(security): v0.96.2 shipped and verified against production (6a38c895)
v0.96.2 — 2026-10-09
Fixes
- fix(desktop): a closed stdout is a reader that left, not a crash dialog (16.325) (deca09fc)
- fix(drawio): a custom SVG icon with CSS survives save and reopen (16.323) (6af08a22)
- fix(ci): narrower CI permissions, no persisted checkout credentials, Electron 43.7.9 (16.320) (b5074ed9)
- fix(ci): prove the committed libavoid is its source's build; pin emsdk and native binaries by hash (16.318) (2217d3fe)
- fix(desktop): tighter checks on what the renderer can make the main process open or dial (16.317) (b3f308db)
- fix(oauth): a web page can no longer cancel a desktop sign-in it did not start (16.316) (e106a88a)
- fix(agent): tell the assistant that diagram text is data, in the tools and in every read result (16.315) (73e5fe0f)
- fix(gallery): cap submissions at 40 megapixels and decode them in a box (16.314) (a3ed97cd)
- fix(deploy): GITHUB_FEEDBACK_REPO actually reaches the feedback relay (16.313, partial) (1d851c83)
- fix(relay): clean the feedback issue's title and contact as the gallery does (16.312) (fbed6b44)
- fix(stats): key every logged path on what was served, not how it was spelled (16.311) (5a246888)
- fix(drawio): one decompression budget per file, and no DOCTYPE inside a compressed page (16.310) (7d1fb332)
- fix(api): no internals on the wire, a constant-time token check, no token in the renderer (16.309) (c07edef8)
- fix(api): the render timeout kills the whole process tree (16.308) (963f7fe4)
- fix(stats): count /api/edit and /api/validate, and pin them in the logged paths (16.307) (01d0b177)
- fix(deploy): route /api/edit and /api/validate to the render door (16.307) (d29a4271)
- fix(deploy): harden the site stack's containers like the render stack's (16.306) (c60600d0)
- fix(api): key per-caller quotas on the client Caddy resolves, not on the edge (16.305) (73b05d11)
- fix(api): a render holds its concurrency slot from the moment it is admitted (16.304) (ee5d89e6)
- fix(api): the local door answers only to loopback names, and refuses cross-site requests (16.301) (cdfffa04)
- fix(model): geometry is finite and bounded where every source meets the store (16.300) (4ddfc89f)
- fix(model): the two logo fields obey the image rule (16.299) (621b75f7)
Other
- docs(tasks): the browser collab module ships an affected rustls (16.328) (82216ed7)
- test: two of the 16.308/16.314 tests assumed POSIX (16.327) (96b71638)
- docs(security): remediation status for the 2026-10-09 assessment (307907e2)
- docs(release): v0.96.2 notes and the test-server pass (7d033d4d)
- docs(privacy): the page says the gateway keeps a short request log (16.322) (92b87f03)
- chore(hygiene): scrub the maintainer's network out of the tree, and keep it out (16.321) (9e55bae1)
- docs(tasks): 16.302 needs a design session — record what the deploy key does and the proposed dispatcher (ee1cc589)
- chore(deps): enable Dependabot alerts; hickory-resolver 0.26.2 in the collab wasm lockfile (16.303, file 16.326) (37381e13)
- docs(qa): v0.96.1 after the deploy — production 13/13, relays, artifacts; file 16.325 (EPIPE dialog) (9424335f)
v0.96.1 — 2026-10-09
Fixes
- fix(storage): a late folder listing no longer takes focus from the Save sheet's name field (16.324) (ebe3d162)
- fix(relay): global hourly cap on feedback, /64 buckets for IPv6, a limiter that forgets (16.295) (9665f906)
- fix(relay): refuse cross-site browser submissions (16.294) (c662203b)
- fix(relay): admit feedback before reading its body, as the gallery does (16.293) (dac659b4)
- fix(api): hold the element cap through edit_diagram (16.292) (faed08ac)
- fix(desktop): set Electron fuses on every artifact (16.291, partial) (7e57ff7e)
- fix(relay): nothing a request does can end the relay process (16.290) (af0554dd)
- fix(api): refuse JSON-RPC batches on /mcp — they skipped every per-call gate (16.289) (1abba36e)
- fix(api): make the document-naming step linear — it ran outside the render timeout (16.288) (ba8cde9e)
Other
- docs(qa): the v0.96.1 test-server report records the hosted-CI abort and 16.324 (9e3a5a03)
- docs(release): v0.96.1 notes, the test-server pass, and the new MCP limits in the manual (9ac325fa)
- docs(security): 2026-10-09 source + gateway review — 36 findings filed as 16.288–16.323 (315fba92)
- docs(tasks): 16.287 also covers horizontal/vertical orientation for pairs and stacks (38ef9055)
- docs(tasks): file 16.287 — MC-LAG/stack members stuck at a fixed distance (c0261313)
- docs(tasks): v0.96.0 shipped (16.208) (3ea47ff6)
v0.96.0 — 2026-10-08
Features
- feat(optics): count a Cat6a run on RJ45 SFP modules, and flag both ends (16.203) (08ce93de)
- feat(palette): find Storage by das, jbod and disk shelf (16.196) (a15d2869)
- feat(groups): an MC-LAG pair and a switch stack, with their backend cables (16.206) (174a2a7f)
- feat(shapes): a Desktop and a general Endpoint beside the Laptop (16.194) (b80e92eb)
Fixes
- fix(layers): Firefox leaves the layer name room to fit (16.284); file 16.285, 16.286 (8541959a)
- fix(deps): bump @modelcontextprotocol/sdk to 1.32.1 for the OAuth advisory (fed311df)
- fix: the Bind tooltip names MC-LAG at runtime, and the optics note tells the truth (16.280, 16.281) (12eed2f0)
- fix(inspector): the Aggregate hint fits one line again; MC-LAG lives in the tooltip (16.197) (f61aacce)
- fix(optics): the report's Note column wraps instead of cutting its caveat (16.269) (de523528)
- fix(groups): a folded cable leaves by the side facing its far end (16.212) (5e2aab50)
- fix(clipboard): a pasted cable reattaches only to the device it was copied from (16.211) (79320233)
- fix(export): the HTML viewer's legend switches take MC-LAG outlines and marked paths along (16.210) (64c68737)
- fix(text): a text box's resize minimum follows its own font (16.198) (02478dd2)
- fix(groups): the backend cables follow the devices, and one Type control (16.206) (15631e18)
- fix(clipboard): a copy speaks draw.io, and a paste understands it (16.199) (b64f2a9b)
- fix(publish): the landing-page check downloads, then searches — no more curl | grep -q (16.191) (ab524bb2)
Other
- ci: install Firefox for the hosted e2e job (editor-firefox project, 16.201) (661d8563)
- docs(qa): re-date the v0.96.0 test-server report after 12eed2f0 (daa54bdb)
- docs(qa): the pre-v0.96.0 full run — report and worklogs (16.208) (27f1d148)
- test(gate): a no-op step may read 1s on a whole-second clock (16.279) (c30551ee)
- docs(tasks): findings of the pre-v0.96.0 full run, lanes 01–03 and 05–12 (16.213–16.268) (5e13d0e9)
- docs(qa): re-point the coverage map's citations past the 16.210 and 16.211 tests (8b8f3628)
- docs(tasks): 16.212 done; GRP-06 drives the Auto case, watchlist row (40ba2487)
- docs(tasks): 16.198 done; the full-run figure is 340 with CONN-50 and LABEL-16 (f43d3b49)
- docs(tasks): 16.203 done, with its release note (0cc74a16)
- docs(qa): plan and lane brief for the pre-v0.96.0 full run (16.208) (322bcb63)
- docs(tasks): 16.196 and 16.197 done, with their release notes (fca5470c)
- docs(manual): name MC-LAG where binding is explained (16.197) (413b6dda)
- docs(tasks): decisions on #35 and #36 before the v0.96.0 run (16.196-16.198, 16.203-16.205) (8a7e2772)
- test(autosave): wait for the four-device snapshot before reloading (16.209) (cef3f6f2)
- docs(release): v0.96.0 notes drafted; the full-run and publish handoff (16.208) (73182681)
- docs(tasks): 16.206 done, 16.207 recorded; full-run count 338 (d94dcf12)
- docs(tasks): MC-LAG pair and switch stack as kinds of group — product decision and design (16.206) (2609b605)
- docs(tasks): #30/#31 closed, 16.195 decided, #36 recorded (16.203-16.205) (126d571a)
- test(compat): count draw.io's pasted icons with nothing selected; record 16.199, 16.202 (32c20f9a)
- docs(qa): Desktop/Endpoint and the Firefox project recorded (16.194, 16.201) (9139d696)
- test(e2e): the editor suite runs in Firefox, and passes there (16.201) (cc8cf1f4)
- docs(tasks): #32 not reproduced and closed (16.200); Firefox e2e coverage decided (16.201) (95d75e54)
- docs(tasks): feedback round 2026-10-07 — issues #30-#35 triaged (16.193-16.199) (a6dc6a48)
- docs(tasks): v0.95.0 shipped — marked paths, every check after the deploy green, no site gap at all (fc25f8ac)
v0.95.0 — 2026-10-06
Features
- feat(paths): marked paths — keep a traced way as arrows beside its cables (16.188) (0767445f)
Other
- docs(qa): pre-v0.95.0 test-server pass — marked paths driven on the production image (6768f621)
- docs(tasks): 16.192 — lazy collab containers created in a tracked transaction (suspected for layers and paint order) (b3c2c74e)
- docs(qa): v0.94.20's tag run is green (a6498e9c)
- docs(tasks): v0.94.20 shipped — 16.189 closed, 16.186's gap measured under a second, 16.191 (landing check) (9a8af468)
v0.94.20 — 2026-10-06
Fixes
- fix(deps): proxy-addr 2.0.8 — the shipped audit's critical advisory (16.189) (cc809da7)
- fix(qa): the Part type is a plain string, not a union eslint calls redundant (task 16.118) (951616b3)
- fix(routing): arches that share a hub leave it apart, and nest (task 16.185) (b6adbfa5)
- fix(collab): remove the host's write-only rolling snapshots, and clear the copies they left (task 16.44) (9d4f1e81)
- fix(collab): a probe of an offline saved host no longer holds up Stop sharing (task 16.161) (74a8cf3e)
Other
- docs(tasks): v0.94.20 attempt 2 stopped before the tag; 16.190 (Windows leg outlives an abort) (59b964db)
- docs(release-notes): v0.94.20 — immediate Stop sharing, no hidden copies, smaller exports, tidier arches (0060bf52)
- docs(qa): pre-v0.94.20 test-server pass (558cf397)
- docs(comments): the eleven stranded sites 16.50 handed over, and an empty pending list (ff74c51e)
- docs(tasks): 16.188's four open questions answered by the user (e215c44e)
- docs(tasks): 16.188 — marked paths, as specified with the user (mockups, decisions, open questions) (594a38ea)
- docs(qa): the lane skill's reading list names the scenario file and the plan too (task 16.118) (9082e72e)
- docs(qa): prose about SELECTORS.md itself goes in no part of it (task 16.118) (da640a78)
- docs(qa): a lane reads its own part of SELECTORS.md and its own plan, not all twelve (task 16.118) (d89264dc)
- docs(qa): re-point COVERAGE-MAP citations the 16.50/16.51 merges moved (70603530)
- docs(comments): unstrand 63 JSDoc blocks, correct the stale ones, and guard both (task 16.50) (781b71f0)
- refactor(css): keep the 13 editor-only canvas rules out of every saved file (task 16.51) (73414f83)
- chore(release): the Linux e2e runs in the Linux slot, beside the Windows leg (task 16.36) (fd772bb8)
- refactor: delete three dead helpers outside app/src and make the fourth live (task 16.47) (da225e58)
- docs(qa): re-point four COVERAGE-MAP citations the 16.45 test insertion moved (0871053c)
- refactor(import): one definition of clip, PROBLEM_TEXT_MAX, plural and csvRow — and the accumulators stay separate (task 16.52) (0d351827)
- refactor(storage): remove the never-wired LocalProvider I/O, browsable, the all-true IMPLEMENTED gate and the zero-page open branch (task 16.45) (42b0dfae)
- chore(release): publish.sh prints a clock for every step (task 16.53, item 2) (f3680b51)
- perf(routing): a capped full-quality pass is not re-burned on every reload (task 16.59) (444fbde6)
- build: an
await import()that lazy-loads nothing now fails the build (task 16.49) (bd610dc1) - docs(tasks): v0.94.19 shipped 16.186 under --no-ci-gate during a GitHub Actions incident (0ad49d58)
v0.94.19 — 2026-10-05
Fixes
- fix(deploy): a release no longer takes the whole site down for ~9 s (task 16.186) (f5b3a91a)
Other
- docs(release-notes): v0.94.19 — the site stays up while a release goes live (52d605dc)
v0.94.18 — 2026-10-05
Fixes
- fix(templates): with three or more regions, no tunnel runs through another region's hub (task 16.181) (607e9e59)
- fix(deploy): the render image is never built from an unchecked .deb (task 16.184) (60957dc8)
Other
- docs(release-notes): v0.94.18 — smaller updates, SD-WAN at three and four regions, checked render builds (f6bcaf2e)
- docs(qa): pre-v0.94.18 test-server pass; 16.185 filed (arches ending at one hub converge) (9ccdc9ad)
- perf(build): a release renames the entry and nothing else (task 16.136) (9380d204)
- docs(qa): v0.94.17 verified live; 16.144 closed — the render API is off the LAN (aaed170e)
v0.94.17 — 2026-10-05
Fixes
- fix(deploy): the render edge publishes no port; the site reaches it by name only (task 16.144 step 2) (c9a97ac2)
- fix(deploy): a tag that changes deploy.sh is deployed by the new copy (task 16.183) (094a86f3)
Other
- docs(release-notes): v0.94.17 — the render API only through the site, and deploy.sh runs its new copy (d728643f)
- docs(qa): v0.94.16 verified live; a tag's deploy runs the previous deploy.sh (task 16.183) (d5707919)
v0.94.16 — 2026-10-05
Features
- feat(deploy): give the render door a private network, off the LAN (task 16.144, step 1 of 2) (63d230fb)
Fixes
- fix(release): prune-artifacts reads its pipe to the end, so no SIGPIPE can kill it (task 16.182) (f61cc9c0)
- fix(zones): the title dodge must not touch the three containers that title themselves (task 16.132) (d01ff120)
- fix(bundles): an aggregate leaving a device by opposite faces gets a ring round the device (task 16.141) (75dfdb8e)
- fix(zones): a zone's name slides along its edge off a cable crossing it (task 16.132) (f476c92d)
- fix(optics): every SR optic says 850 nm, so one part is one order line (task 16.179) (225e8d67)
- fix(canvas): a link that offers no circuit fields draws no carrier caption (task 16.178) (1dafb6f5)
- fix(templates): the regional SD-WAN hub tunnels arch instead of stacking on one line (task 16.81, Direct half) (8ba15b02)
Other
- docs(release-notes): v0.94.16 — zone names dodge cables, rings round a device, arched hub tunnels, and the decided fixes (4dc99b9f)
- docs(tasks): 16.132 and 16.141 looked at in the built app; the dragged-oval decision recorded (967352be)
- docs(tasks): 16.144 step 1 verified on real containers — the route goes by name, ACME keeps its gateway (d445acce)
- perf(collab): hold routing while a peer drags, as the local drag does (task 16.22(b)) (99d20a87)
- test(labels): pin the accepted port-name placement on touching, offset tiles (task 16.129) (f492df0d)
- docs(qa): re-point COVERAGE-MAP's scene-render.test.ts citations after 16.178's test (78826e1f)
- docs(tasks): 16.81 closed on the user's decision; the three-region tunnel filed as 16.181 (c7ed1110)
- docs(tasks): the user's decisions on 16.81, 16.129, 16.132, 16.141, 16.144, 16.178, 16.179 and 16.22(b) (ee3eb74b)
- docs(qa): v0.94.15 verified in production — the elk worker under the live CSP, 16.130 closed (2ceb4026)
v0.94.15 — 2026-10-05
Features
- feat(deploy): an edge probe that holds the live gateway to URLS.md, and the host .env kept 600 (tasks 16.174, 16.176) (455f73ad)
Fixes
- fix(release): refuse to start the gate when Playwright cannot launch its pinned browser (task 16.180) (464420cc)
- fix(canvas,labels): VLANs off leaves no gap over the label; a printed label keeps its port (task 16.101) (2faa94b8)
- fix(shapes): a basic shape names itself inside what it draws (task 16.148) (962e618f)
- fix(routing,ui): Direct cables sharing a face are ordered by where they go; a disabled dialog button looks disabled (task 16.101) (e4cfc0e8)
- fix(deps): pin @number0/iroh exactly, and hold it to TOOLCHAIN on every unit run (task 16.112) (ea630919)
- fix(deploy): name /api/gallery in the edge contract, and hold URLS.md to the Caddyfile (task 16.175) (68187dc8)
Other
- docs(release-notes): v0.94.15 — layout off the main thread, faster start, shapes name themselves inside, and the connector notes (41f95019)
- docs(tasks): 16.60 verified on main — no main-thread layout task in the browser, the worker loads over app:// on the desktop (c06d6fac)
- perf(layout): run elk in a module worker, so an import no longer freezes the window (task 16.60) (17beee08)
- docs(tasks): 16.11 and 16.148 verified on main; re-point COVERAGE-MAP after the 16.162 test (40511202)
- perf(templates): a card's map at card scale, and no gallery built unopened (task 16.11) (5bf53575)
- perf(collab): a joiner asks for the document once per answer, not once per peer (task 16.177) (9ecbc5f2)
- test(collab): measure what a fresh join costs — no full copy reaches the peers already in (task 16.162) (8375e03a)
- docs(routing): record the Direct face-slot and pinned-fan decisions (task 16.101) (6c208eb9)
- docs(qa): re-point COVERAGE-MAP's editor.spec.ts citations after 16.163's edit (7b5e41c9)
- test(e2e): CONN-09 deselects with Escape and asserts it, instead of a raw click (task 16.163) (438d6867)
- docs(qa): the gallery works end to end in production — 16.165, 16.175 and 16.176 closed (bc2b05cc)
- docs(tasks): 16.176 — the edge refuses every feedback body over 16 KB, attachments included (62df7564)
v0.94.14 — 2026-10-05
Features
- feat(gallery): a community gallery — visitors submit screenshots, reviewed before anything is published (task 16.165) (c3a371eb)
Other
- docs(release-notes): v0.94.14 opens the community gallery (task 16.165) (4308d7b9)
- docs(qa): v0.94.13 verified in production — Electron 43.7.7 everywhere it ships (task 16.172) (d5f99f5d)
v0.94.13 — 2026-10-05
Fixes
- fix(release): hold node_modules to the lockfile, and make the artifacts say which Electron they carry (task 16.172) (c8cd1fac)
Other
- docs(release-notes): v0.94.13 ships the security updates v0.94.12 announced (task 16.172) (24f70bb7)
- chore(format): leave the generated CHANGELOG to release.sh (task 16.173) (49f50ee1)
v0.94.12 — 2026-10-05
Features
- feat(gate): refuse a high advisory in anything that ships (task 16.167) (8d4e2eb6)
Fixes
- fix(api): an MCP proto argument is refused, not silently dropped by the SDK (task 16.169) (e3989e1a)
- fix(deps): npm audit fix — Electron 43.7.7 and 39 more, all inside their ranges (tasks 16.166, 16.167) (3e8bbf0c)
- fix(api): the API and MCP server accept only what their contract names (task 16.169) (7341d121)
Other
- test(store): the post-Open size check measures in bytes, not percent (task 16.171) (5ad5b90a)
- test(deploy): the 2 MB bundle checks get a real budget (task 16.170) (e8ba336e)
- docs(qa): the pre-v0.94.12 test-server pass — both production images (2d300c14)
- docs(release): notes for v0.94.12 — security updates and a strict API (3a58d4f3)
- chore(npm): an .npmrc and a test that holds the install policy (task 16.168) (4da716f1)
- docs(qa): v0.94.11 verified live; the API and MCP probes, 20/24 (89f95a24)
- docs(tasks): 16.169 — what the live API and MCP probes found (2eb25f04)
- docs(tasks): the npm review — 16.166 Electron, 16.167 bundled advisories, 16.168 .npmrc (1fead1f6)
v0.94.11 — 2026-10-05
Features
- feat(editor): a zone's name can also sit centred, top or bottom (task 16.164) (c576bcfd)
- feat(editor): a zone's name sits in any corner and keeps its line breaks (task 16.164) (1210e92a)
Fixes
- fix(canvas): a caption facing a neighbouring cable flips to its own outer side (task 16.154) (3ea707de)
- fix(connections): a waiting ring is named by its cable, not its number (task 16.160) (0ad24ee5)
- fix(editor): Name position reads Top and Bottom rows of Left, Centre, Right (task 16.164) (83327bac)
- fix(routing): a cable across a gap narrower than the buffers is square (16.149) (4849cedd)
- fix(canvas): the pointer leaving the canvas puts the hover out (task 16.159) (d8c21836)
- fix(routing): a diagonal fan's ends slide along the border (task 16.158) (2e418899)
- fix(cli): a successful headless run writes nothing to stderr (task 16.151) (25639497)
- fix(cli): a headless run does not load the collab transport (16.151, half) (90fcee6a)
- fix(templates): a regional map opens readable, not at 37% (16.155) (29f41a34)
- fix(import): a UniFi export is drawn in the three layers, gateway on top (16.153) (f78652d9)
Other
- docs(qa): second test-server pass on the v0.94.11 candidate, 6/6 (a11230d4)
- docs(release): 16.160 in the next patch's notes (bb750878)
- docs(qa): the pre-v0.94.11 test-server pass, 5/5 (5faddea7)
- docs(tasks): 16.165 — the community gallery, as decided with the user (7ecb395c)
- docs(release): the zone name corner in the next patch's notes (12c34065)
- docs(tasks): three product decisions — 16.147 declined, 16.154 flips away, 16.160 rewords (3cde3a90)
- docs(release): notes for the next patch (ef5d2159)
- test(playground): narrow-gap gets its snapshot; watchlist rows for 16.149, 16.158, 16.159 (02c14697)
- test(routing): the 16.158 and 16.149 tests get their own files (b4a9ba33)
- docs(tasks): 16.160 is a product decision, with the trace and the options (14213bed)
- perf(editor): an edit rebuilds only what it touched (task 16.8) (a9163282)
- docs(qa): watchlist rows for 16.58, 16.151, 16.153 and 16.155 (7548bdc2)
- docs(tasks): 16.147 measured — the three looks and what each costs (d5859d59)
- docs(tasks): what 16.154 needs, and why this lane did not attempt it (1be447ca)
- perf(app): a first visit preloads the router beside the entry (task 16.33) (7e7f8bcc)
- chore(desktop): the installers leave out 7.6 MB that can never load there (task 16.34) (e6e8e812)
- perf(site): the layout gallery's screenshots are lossless WebP (task 16.35) (f09521a1)
- docs(tasks): 16.61 closed — hit-testing measures 0.2-0.3 ms a move, GPU or not (5566eba1)
- docs(qa): v0.94.10 verified live; 16.130 at nine clean Linux e2e runs of ten (a07bd613)
- perf(files): auto-save waits for a drag to end (task 16.58) (0bba2297)
v0.94.10 — 2026-10-05
Fixes
- fix(compare): nothing the Compare panel reports sits under the panel (16.152) (19aac63b)
- fix(canvas): the template gallery stays away while the first block is typed (16.150) (282befd2)
- fix(legend): the Line row's name sits beside its specimen (16.146) (fa36f93d)
- fix(canvas): a double-click on a connector's middle captions it, not bends it (16.145) (08d78ff3)
- fix(store): Open lets go of the session's drags (task 16.26) (2653823a)
- fix(routing): a folded group's view is one object per snapshot, and every edge field is classed (task 16.28) (02370f4c)
- fix(routing): a cluster sheds the pins a drag left behind (task 16.21) (6da88bd1)
Other
- docs(qa): the pre-v0.94.10 test-server pass (e0a7d70b)
- test(canvas): the peer-ring test draws 60 devices, not 500 (task 16.24) (b8b3a360)
- docs(release): notes for the next patch (bb92cf51)
- docs(qa): watchlist rows for 16.145, 16.146, 16.150 and 16.152; citations re-pointed (bb6b83f3)
- docs(qa): watchlist rows for 16.18 and 16.19; scene-render citations re-pointed (fd397169)
- perf(canvas): sweep the port labels only when the picture needs it (16.19) (bdb72f92)
- perf(canvas): compare before writing every port-label attribute (16.18) (6656fff8)
- perf(collab): a big frame is copied once as it arrives, and converted once for every peer (task 16.23) (1be0dc6f)
- perf(collab): peer selection rings repaint only when they would change (task 16.24) (4b72d31d)
- perf(collab): a big selection travels as its first 500 node ids (task 16.25) (1025df33)
- perf(collab): a delivered batch of remote edits is one transaction (task 16.22a) (fbd2df01)
- docs(qa): REG-34's load is not its verdict; 16.109 closed by 16.133's atomic build (cc8980c3)
- chore(release): the local gate always runs; the billing-era switch is gone (task 16.43) (67efd0a2)
- chore(scripts): remove the stale gate.sh and gate-linux.sh copies (task 16.42) (cb99dd25)
- docs(qa): COLLAB-23's citation re-pointed after 16.39's test insertion (1d9ad6bc)
- test(collab): the negative probe test no longer waits out the 6 s default (task 16.39) (e28bf6d7)
- test(templates): the SD-WAN sweep asserts only what would fail (task 16.37) (e3b80503)
- docs(qa): watchlist row for 16.15 (53b65d1e)
- perf(import): did-you-mean skips labels too far off in length, once per value (task 16.15) (34070bf8)
- docs(qa): watchlist row for 16.21 (935df08c)
- docs(tasks): 16.143 verified live on v0.94.9; the post-deploy checks recorded (8250891e)
v0.94.9 — 2026-10-04
Fixes
- fix(scene): a bend the fastened device was moved over is hidden by the draw, not lost (task 16.128) (28c0141f)
- fix(palette): a disarmed tile shows no ring unless it was reached by keyboard (task 16.94) (04e64aa6)
- fix(release): a published --no-qa reason is written for the reader (task 16.94) (742f2819)
- fix(connections): the card's Type picker says IPsec tunnel, not ipsec (task 16.94) (036c789c)
- fix(compare): a re-label names the device once (task 16.94) (2b026475)
- fix(files): the Save tooltip names the format the document really saves as (task 16.94) (7e39e406)
- fix(inspector): the connector tooltip names the type new cables really get (task 15.181) (e987b6ca)
- fix(scene): a cable with a width of its own is cued by the same proportion whatever its type (task 16.139) (60fbc9e3)
- fix(routing): unlinking one of two runs leaves its cables flowing through the icon (task 16.97) (c221ee5c)
- fix(inspector): the Connections list is drawn only when it can be seen (task 16.5) (89894a60)
- fix(import): filling asset fields on devices already drawn is one commit (task 16.4) (d20f7ec5)
- fix(import): a big Meraki or UniFi export no longer stalls on line lookups (task 16.14) (cc4f982f)
- fix(import): a one-line controller export no longer freezes the Import box (task 16.3) (8b83cf91)
- fix(inspector): a port picker holds a document listener only while it is open (task 16.6) (e7039675)
- fix(qa): the driver library keeps the bytes, and eleven scenario lines say what the app does (task 16.95) (bfc4f628)
- fix(routing): a cable with free ends between touching tiles is the joint at the seam (task 16.131) (15fc54df)
- fix(export): a large drawing exports as PNG, and a failed render says what failed (task 16.143) (1d062a54)
Other
- docs(qa): the pre-v0.94.9 test-server pass (68d74d78)
- docs(release): notes for the next patch (049f13df)
- docs(qa): watchlist rows for 16.128 and 16.9; coverage map re-pointed (63441f8d)
- perf(store): a drag frame commits once, however many cables travel with it (task 16.9) (532eb561)
- test(release): the verify-downloads retry test no longer sleeps 12 seconds (task 16.38) (df270b35)
- docs(qa): watchlist row for 16.30 (01557dd4)
- perf(drawio): a save copies preserved fragments in instead of parsing them again (task 16.30) (4498f039)
- test(playground): the loader's scenario list includes 16.131's touching-tiles-free (88753798)
- docs(qa): watchlist rows for 15.181 and 16.94's fixes; CONN-20's range re-pointed (6b78c7cd)
- docs(tasks): 16.94 closed — six fixed, Escape declined, sixteen filed as 16.145–16.160 (b0398605)
- perf(store): a big paste or Duplicate builds its page answers once (task 16.31) (7422c069)
- perf(export): a one-page PDF builds its drawing once (task 16.32) (21ae0e7b)
- docs(qa): watchlist row for 16.29 (fbb7a0da)
- perf(files): a desktop auto-save builds the .drawio once, not twice (task 16.29) (7470161e)
- perf(panels): a docked cable schedule redraws only when a row changes (task 16.17) (00eae57a)
- perf(panels): the Drawing panel rebuilds once per edit and not for a click (task 16.16) (3eed4278)
- perf(inspector): a large selection is resolved by map, not one scan per id (task 16.7) (daea8efd)
- docs(qa): watchlist rows for 16.97 and 16.139; dates and a range citation (4c7a773a)
- docs(tasks): why 16.128 needs the draw and not the store, measured (96f4bfd7)
- chore(import): escape the key separators so git diffs two importers as text (e004f125)
- docs(tasks): 16.93 and 16.95 dated the day they were done (46cb30bc)
- docs(manual): four lines now say what the build does (task 16.93) (38e67ed1)
- docs(qa): watchlist rows for 16.143 and 16.131; coverage map re-pointed (5cefa257)
- docs(tasks): 16.142 verified live on v0.94.8; 16.85 and 16.90 were done (0c8732a7)
v0.94.8 — 2026-10-04
Fixes
- fix(render): the edge hands each render to a free replica, and the fleet scales ahead of demand (task 16.142) (2753f138)
- fix(cables): an install link names the document, not the active page (task 16.91) (eea9e2e8)
- fix(export): print, PDF and the HTML viewer name the document after its file (task 16.91) (6b74a436)
- fix(shapes): star, note and triangle take cables, and the manual says so (task 16.40) (d65f80ea)
- fix(bundle): a ring crosses every member, even one leaving another face (task 16.88) (1164b48e)
- fix(workspace): a docked panel stays inside its dock in edit layout (task 16.84) (40075bf8)
Other
- docs(release): notes for the next patch, and its test-server pass (0a455a7e)
- test(ci): the file-watch suite gets the machine to itself, like collab (task 15.68) (8a578244)
- style(qa): re-pad COVERAGE-MAP after the re-pointed citations (fcb3803b)
- docs(tasks): file 16.141 — a ring cannot reach members leaving opposite faces (5211a114)
- docs(qa): traceability row for 16.40's decision (cfdbf14e)
v0.94.7 — 2026-10-04
Fixes
- fix(export): PDF can be pressed whenever any page has something on it (task 15.183) (7b48cc3d)
- fix(view): the View menu no longer ends on a stray divider (task 15.171) (4ea24c40)
- fix(inspector): every Asset data field says which field it is (task 15.172) (70f670ed)
- fix(align): the Align menu's gap readout follows the selection (task 15.124) (e854cc15)
- fix(palette): Tab now reaches a tile's star and its copy button (task 15.117) (d45a2432)
- fix(inspector): a disabled inspector button now looks disabled (task 15.125) (b2a47408)
- fix(import): a group's box leaves a device declared outside it alone (task 14.44) (5d4cf065)
- fix(legend): the legend explains only what the page actually shows (task 15.168) (af907456)
- fix(import): a DOT syntax error names the line it is on, in plain words (task 15.178) (4ec9d7d4)
- fix(import): a port-channel with nothing drawn is reported once, by name once (task 15.103) (aa0938cc)
- fix(routing): an ordinary cable no longer runs under a through cable after a move (task 16.96) (274640dd)
- fix(routing): Direct and Arc fan a bundle in the same port order as Auto (task 16.98) (41eb9ef3)
- fix(collab): a view-only guest's name reads in full in the host's People list (task 16.108) (bb100ef2)
- fix(collab): a host that stops sharing says so, and a kicked assistant can rejoin (tasks 16.106, 16.107) (2bbbe365)
- fix(collab): a refused join says why, not ApplicationClosed(...) (tasks 16.102, 15.193) (2ec38382)
- fix(collab): panels follow the store a join puts in place (tasks 16.41, 16.103) (de7a5a09)
- fix(collab): a joiner's pill describes its own link, not the room's (task 16.104) (2ad96bf1)
- fix(collab): a share that cannot finish leaves no half-live session (task 16.92) (e363b7ba)
Other
- docs(release): notes for the next patch, and its test-server pass (93790bf0)
- docs(qa): traceability rows for the two worker batches, and DATA-01's seventh field (task 16.140) (bc73247e)
- docs(tasks): close 14.45 — both halves shipped as 15.100 and 15.101 (task 14.45) (a8245f15)
- chore(git): ignore node_modules as a symlink too, not only as a directory (b6b82166)
- test(collab): the 15.199 reconnect test drops the link instead of leaving (task 16.106) (b43b8d16)
- docs(qa): re-point COLLAB-23's transport test citations after the 16.106 test (7e025cf3)
- style(collab): format the 16.106 transport test (5a336245)
v0.94.6 — 2026-10-04
Features
- feat(import): a device keeps its LLDP chassis id, so one capture at a time draws it once (task 15.207) (fcc81e3f)
Fixes
- fix(canvas): Fit clears the corner cards, not only the edge panels (task 16.126) (e2acee16)
- fix(canvas): ring captions join the label collision pass (task 16.82) (76821517)
- fix(import): a view-only session is refused an import instead of being told it worked (task 16.105) (ce9fe0ae)
- fix(import): two group zones of a lab are drawn clear of each other (task 16.83) (cdf48179)
- fix(canvas): the selection casing clears the cable as drawn (task 16.99) (ef2a7e7c)
- fix(trace): a way with no cable of its own says so instead of promising a colour (task 16.76) (84580d48)
- fix(canvas): a ring takes in a member that leaves another face (task 16.88) (313d28e4)
- fix(drawio): a basic shape's caption opens in draw.io where the editor draws it (task 16.86) (a0e1cc74)
- fix(deploy): keep agent worktrees out of the image build context (task 16.137) (dcfb0dc2)
- fix(canvas): an empty branded page draws no brand strip at all (task 16.90) (57e523f1)
- fix(app): the auto-link toast's Settings leaves the app menu open (task 16.87) (17589ef7)
- fix(cables): the schedule marks a missing port at the FAR end too (task 16.89) (3b52a432)
- fix(app): a ticked suggestion keeps the keyboard in the list (task 16.85) (5581e8fe)
- fix(arrange): Gap + keeps a row level when a device has no column-mate (task 16.77) (343ebf2e)
- fix(app): an exact kind name wins the device picker (task 16.78) (aefa6f1f)
- fix(import): a DOT cable to a Purdue frame is refused, as the editor refuses it (task 16.135) (f455a720)
- fix(layers): a rack moved to another layer takes its mounted units (task 14.51(a)) (ba5cda26)
- fix(app): ⌘Z from a focused tick box, slider or dropdown undoes the drawing (tasks 14.52(a), 16.100) (af41ddb8)
- fix(export): an isometric SVG lays flow arrows and blocks flat, like the screen (task 11.345) (c0474624)
- fix(canvas): Fit frames what is drawn, not a hidden layer or switched-off object (task 14.47) (1020b7fe)
- fix(export): a DOT export keeps a map a cable is drawn to, and the cable (task 14.63) (4f589707)
- fix(app): undoing a title-block edit no longer strands the block (task 16.74) (b494613f)
- fix(app): a legend row's dot takes no cable and selects like anything else (task 16.79) (9d1fdc77)
- fix(app): a template replace or an Open no longer keeps the old selection (task 16.80) (94eea6ce)
- fix(app): hidden or locked devices drop their connect handles and start no cable (task 16.75) (21247d99)
- fix(build): stop the Electron tests hanging on a half-written bundle (task 16.133) (047acb35)
- fix(app): a plain click on a mounted rack unit no longer re-mounts it (task 14.38) (0ba932f6)
- fix(app): keep a drawing too big for localStorage in IndexedDB (task 16.73) (1a05d5f7)
Other
- docs(release): notes for the combined patch (9eab5a90)
- docs(qa): the combined pre-v0.94.6 test-server pass, and 16.137 closed (23c534fa)
- revert: take 16.88's ring change out — enclosing a member on another face drew a circle through the device (31869f72)
- docs(tasks): file 16.139 — an explicit-width cable's selection cue swells by its type (c65f7425)
- perf(canvas): only look for ring captions when a ring is named (task 16.82) (4a71f6fb)
- test(e2e): the app-menu reachability test waits out its own resize (task 16.138) (8e6e8c21)
- docs(tasks): close 12.43 — the Layers panel staying open on a canvas click is 11.430's design (912c0f57)
- docs(tasks): triage — one task per bug, and close what was already done (8a32bcdb)
- docs(release): notes for the next patch (0675be18)
- docs(qa): the pre-v0.94.6 test-server pass, and 16.137 filed (474c3868)
- perf(build): the map geometry is a chunk of its own, so an update stops re-downloading it (task 16.12) (4b585602)
- test(scripts): give deploy-site's spawn-bound hook a measured 20 s budget (task 16.134) (549708ce)
- perf(app): load the manual on first open, and warn before the 5 MiB build cliff (tasks 16.13, 16.2) (aac41ddf)
v0.94.5 — 2026-10-04
Fixes
- fix(electron): a door's server child never outlives the door (task 14.93) (c64f2331)
- fix(pwa): Update now asks before it activates, and finishes a tab already taken over (task 16.72) (97b5a8b7)
- fix(links): an install or import link opened in a tab already on the app is read (task 16.71) (38cfd1fd)
- fix(files): a save takes down the changed-on-disk offer, and auto-save waits for an answer (task 15.137) (6ccebf07)
- fix(collab): a reconnect loop belongs to its session and never ends the next one (task 15.199) (9f5a6706)
- fix(import): a Mermaid architecture-beta
--peer pair lands side by side (task 15.102) (76094f12) - fix(drawio): a basic hexagon opens in vanilla draw.io as a hexagon, not a box (task 15.186) (51fb81d2)
- fix(export): every page is routed before a whole-document export (task 16.68) (657ec486)
- fix(export): the HTML viewer's opened-groups picture keeps every route the fold never touched (task 16.67) (3f5c4460)
- fix(isometric): a standing cabinet has an opaque front, so nothing behind it shows through (task 15.167) (8b1ed831)
- fix(routing): a cable between touching tiles is the joint at the seam, not a loop round both (task 14.40) (51028f78)
- fix(canvas): port names on a short captioned cable stay at their own device, clear of the caption and the line (task 16.69) (f9163334)
- fix(canvas): an arrow drawn onto a device a little lower goes straight between the borders (task 16.66) (01efb1e7)
- fix(canvas): an arrow's or line's end fastens to devices only, never to a zone (task 16.65) (1cec3ef5)
- fix(document): a click outside Document info keeps what was typed (task 11.357) (39dd959c)
- fix(collab): the host's answer to a joiner's SyncStep1 goes to that joiner alone (task 15.200) (71cc1585)
Other
- docs(release): notes for v0.94.5 (11a09be8)
- docs(qa): the pre-v0.94.5 test-server pass, and what it found (tasks 16.131, 16.132) (f2f4fbc3)
- docs(tasks): close 15.142 as fixed by 15.152 (49e5a345)
- test(e2e): the bundled-font check waits for the woff2 and asks the face, not the family (task 15.98) (b138ff04)
- test(rack): a mark behind a Full unit leaves the unit whole, on either face (task 12.42) (ea821c7f)
- docs(tasks): v0.94.4 shipped, with the post-publish checks (f283fc7e)
v0.94.4 — 2026-10-03
Other
- docs(release): notes for v0.94.4, zooming a big drawing is smooth too (b4352fc3)
- perf(canvas): zooming a big drawing lays out only the labels it shows (task 16.127) (563aeefb)
- docs(tasks): v0.94.3 shipped, with the post-publish checks (b78e9f37)
v0.94.3 — 2026-10-03
Fixes
- fix: small things the pre-v0.94.2 run saw — seven fixed, one filed, three declined (task 16.123) (f4ece4ad)
- fix(files): restored work that no file holds asks before it is replaced (task 16.122) (04e4f26d)
- fix(inspector): each edit is its own undo step, per selection and per target (tasks 16.121, 16.70) (ab079f7f)
- fix(connections): the first click after typing in a card field lands (task 16.120) (5a82b5a8)
- fix(racks): a device placed into a rack is mounted, and a re-seat keeps its depth (tasks 16.119, 16.125) (4d942d06)
Other
- docs(release): spell the undo chord for every OS in the v0.94.3 notes (a2420f88)
- docs(release): notes for v0.94.3, and the build on the test server (c7ef5aba)
- perf(minimap): panning a big drawing no longer rebuilds the overview every frame (tasks 16.27, 16.57) (dc0ac6f1)
- docs(tasks): panning a big drawing, measured — the minimap is the lag (16.27, 16.127) (e9aeab39)
- docs(qa): suite and harness defects the pre-v0.94.2 run hit, and an exact evidence guard (task 16.124) (58d4f424)
- docs(tasks): 16.64, 16.110, 16.114, 16.115 shipped in v0.94.2, with the post-publish checks (6a9fd250)
v0.94.2 — 2026-10-03
Fixes
- fix(routing): compare routing inputs by value, so a rename really keeps the refined cables (task 16.114) (d2b567c0)
- fix(files): a file opened from the OS asks before replacing unsaved work (task 16.64) (84d48797)
- fix(canvas): a cable bumps at every crossing with a hub-fan arc (task 16.115) (8c2dc13d)
- fix(routing): a rename no longer throws away the refined cables (task 16.114) (27d7ffcf)
Other
- docs(release): notes for v0.94.2, big drawings refine in seconds (96a72cb4)
- docs(qa): the pre-v0.94.2 directed run, its report and findings 16.119-16.124 (be152b39)
- docs(tasks): 16.117-16.118, why the AI-QA run costs what it did last time (bbc158d5)
- docs(tasks): 16.64, 16.110, 16.114-16.116 done; scratch tests stay out of the tree (8f675be8)
- perf(routing): carry libavoid crossing-stage patches, route-identical (task 16.110) (d55483ae)
- docs(tasks): 16.110 restated as the libavoid patch work in flight, not only its harness (4733427a)
- docs(qa): the 2026-10-03 building-blocks review report, linked from 16.111 (290e889c)
- docs(tasks): building-blocks review 2026-10-03, findings 16.110-16.113 (b7db6602)
- docs(tasks): 16.54 shipped in v0.94.1, with the post-publish checks (04d6894b)
v0.94.1 — 2026-10-03
Fixes
- fix(bridge): a drag holds when the device it moves re-routed slowly (task 16.63) (f3c48513)
- fix(routing): the cluster router merges what a global solve would see, all in one pass (tasks 16.54, 16.10) (500054f1)
Other
- docs(release): notes for v0.94.1, big networks stay responsive (1ae701e7)
- docs(qa): the pre-v0.94.1 full run, its report and findings 16.96-16.109 (69f7ff3e)
- docs(tasks): the pre-v0.94.1 full run's findings, 16.64-16.95 (11a0432b)
- docs(manual): a change re-routes only as far as it reaches (task 16.54) (14f01f2d)
- docs(tasks): routing-at-scale review, 16.54-16.62 (task 16.62) (14320209)
- test(qa): a campus-sized LLDP preset and REG-35, the drop that froze (task 16.54) (adf5fa54)
- perf(bridge): report only cables whose route changed, look edges up by id (tasks 16.55, 16.20) (2156cf52)
- docs(tasks): 15.210 shipped in v0.94.0 (944cc422)
v0.94.0 — 2026-10-02
Features
- feat(canvas): a device's link badge follows its Link, Back returns, New page links a site (task 15.210) (5d806cfc)
Other
- test(scripts): the deploy-site argument cases get a checkout of their own (task 15.213) (fc7136ed)
- docs(qa): test-server validation of the link badge, Back and New page (task 15.210) (389c00f9)
- docs(tasks): 15.206 shipped in v0.93.0 (862ee2a0)
v0.93.0 — 2026-10-01
Features
- feat(import): a site's ArubaOS captures name each other and draw in three layers (task 15.206) (34a4d7ec)
Fixes
- fix(scripts): deploy-app.sh no longer calls a correct editor stale (task 15.205) (a8ad784b)
v0.92.2 — 2026-09-28
Fixes
- fix(import): ArubaOS per-port LLDP detail reads whole, management address included (task 15.204) (9ae9fd84)
Other
- docs(tasks): 15.203 shipped in v0.92.1 (2bbee567)
v0.92.1 — 2026-09-28
Fixes
- fix(import): two captured switches build one topology, not one hub (task 15.203) (9bf8e96d)
Other
- docs(tasks): v0.92.0 shipped — 15.188, 15.190, 12.34, 15.191 and 15.192 (37ef4d20)
v0.92.0 — 2026-09-28
Features
- feat(qa): plan every run — skip what a test proves, drive the release's own work (task 15.110) (8beb653e)
Fixes
- fix(collab): a kicked person is told they were removed, and stops reconnecting (task 15.192) (a669ba98)
- fix(desktop): closing the window while sharing hands the session on, on macOS too (task 15.191) (058a6e37)
- fix(collab): the sync handshake stays between the host and each joiner (tasks 15.190, 12.34) (d8aa559e)
- fix(qa-plan): a change of runner is not this release's own work (task 15.110) (d853436b)
- fix(connectors): a Purdue backdrop takes no cable end from a connect-mode press either (task 15.188) (54a6c7fe)
Other
- test: two gate defects the v0.92.0 release found — a hosted-runner font gap and a peer-list race (tasks 15.201, 15.202) (62874ddf)
- docs(release-notes): v0.92.0 — a third person no longer wipes a shared drawing; view-only guests see it (df047dba)
- docs(tasks): 15.110 — v0.92.0 used the plan on a focused run; the timed full run is still owed (cf3a2c51)
- docs(qa): focused QA run before v0.92.0 — every change passes in the built app (task 15.110) (6dc55f0b)
- docs(tasks): 15.192's owed gate runs are green on an idle machine (31c3b2b1)
- docs(qa): nothing in the suite needs a person any more; a second joiner can wipe a shared diagram (task 15.180) (80ad3e0a)
- style(qa): prettier on the coverage map's two new rows (task 15.110) (e1a09323)
- test(qa): one ⌘Z unticks a cables-panel row, and the Trace panel lights what the inspector does (task 15.110: SHELL-26, SHELL-27) (a93e3d87)
- test(qa): the app menu's links open a new tab with no opener and leave the editor alone (task 15.110: MENU-01) (22bfa39f)
- test(qa): the layer grip's arrow keys, its drop line, and a locked layer's three controls (task 15.110: LAYER-04) (9cbd5e15)
- test(qa): the export's Theme and Transparent hold for the session and reset on reload (task 15.110: EXP-09) (f47f928e)
- test(qa): eleven edits undo in order and redo to the same drawing (task 15.110: HIST-01) (cc726547)
- test(qa): eight port labels on a four-cable hub stay clear through three hub moves (task 15.110: CONN-09, REG-06) (4bc05e46)
- test(qa): the sample file is asserted as it opens, not just as it parses (task 15.110: FILE-01) (83dcb45a)
- test(qa): the marquee's touch-versus-contain rule is asserted (task 15.110: SHAPE-08) (56fb9eb7)
- docs(qa): programme worklog (task 15.110) (b8d059dc)
- test(qa): CONN-14 could not fail; now it can, and MAP-01's map refuses cable ends both ways (task 15.110) (be2f128b)
- test(qa): the saved file writes the map's layer before the devices', so draw.io paints it behind (task 15.110: VIEW-07) (2e948e23)
- test(qa): a rack unit drags across to the rear elevation, and the armed device disarms (task 15.110: RACK-04) (5942eb0d)
- test(qa): every label-position button is asserted to move the caption where it says (task 15.110: LABEL-03) (1a016388)
- docs(qa): the human pass shrinks to one step here and there, and the routes found six defects (task 15.180, part 1) (31ddc43a)
- test(qa): About shows one set of release notes at a time (task 15.110: ABOUT-03) (ca4a9181)
- test(qa): a walk through the production app asserts nothing hidden is drawn and nothing is refused by the CSP (task 15.110: REG-01, REG-02) (315d4045)
- test(qa): toolbar-reach reads Import by its id, which main.ts creates (task 15.110) (9a84c1ad)
- test(qa): every toolbar control is hit-tested at every width, every popover at 1280 and 900 (task 15.110: SHELL-03, REG-08, REG-15) (87b379b6)
- docs(qa): three gaps closed by their fixes' guards are spec-backed (task 15.110) (80f7ec48)
- docs(qa): the watchlist and PWA lines say what ships; the drift gate is cleared (tasks 15.109, 15.175, 15.133, 15.70) (5a036d4b)
- docs(qa): files, export and menu lines say what ships; the FSA route needs no person (tasks 15.107, 15.131, 15.132) (01c53c24)
- docs(qa): connectors and containers say what ships; qa-lib selects a cable by id (tasks 15.115, 15.128) (0c19c33e)
- docs(qa): file 02's stale lines, and the manual's "SVG icons are pixels" (tasks 15.118, 15.123, 15.174) (f8646cdc)
- docs(qa): file 01's seven stale lines say what v0.91.0 does (task 15.116) (44c57ba6)
- docs(tasks): close 15.135 and 15.69, correct CLAUDE.md on 14.21/14.24 (37c68525)
- docs(tasks): Phase 16 header — 14.21 and 14.24 are already done (b6d821f6)
- docs(tasks): file the dead-code and performance review as 16.2-16.53 (045f402a)
- docs(review): dead-code and performance review, open Phase 16 (16.1) (b3ac5246)
- docs(tasks): record 15.166 as released in v0.91.0 (058ebc61)
v0.91.0 — 2026-09-23
Features
- feat(view): show asset data under device names, one switch per field (15.166) (ab95b538)
Other
- docs(qa): directed run before v0.91.0, findings filed as 15.167–15.175 (b7f898b3)
- docs(collab): say the relay is in every internet session (15.165) (79f2ab0b)
- docs(tasks): carry the TLS-inspection question as open (15.164) (4bdf4073)
- docs: what the network has to allow, measured not assumed (15.163) (283d676b)
- docs(manual): collaboration gets a picture of each connection (15.160) (8dc974e5)
- docs(collab): the LAN mode, and a packet flow diagram for both paths (15.159) (9187d497)
- docs(qa): COLLAB-23 confirmed on two Macs — the click, not the unplug (15.156) (6557cb28)
v0.90.2 — 2026-09-22
Fixes
- fix(collab): a LAN-only session hands out a local link (task 15.156) (d5f74ab9)
- fix(isometric): a standing cabinet joins the depth sort (task 15.155) (f4f2f080)
- fix(publish): the last exiting path off the LAN delivery (task 15.143) (444f819b)
- fix(publish): an up-to-date host is a successful LAN delivery (task 15.143) (f9ebdd9c)
Other
- test(scripts): the delivery tests get a repo of their own (task 15.157) (32448150)
v0.90.1 — 2026-09-21
Fixes
- fix(release): the QA-report gate reads both documented layouts (tasks 15.153, 15.154) (72951299)
- fix(palette): the World map tile obeys one backdrop per page (task 15.152) (df95a31f)
- fix(minimap): the resting corner belongs to the floating map alone (task 15.151) (a6f3af0e)
- fix(inspector): a card with nothing selected stops covering the Minimap panel (task 15.150) (32502bf8)
- fix(workspace): a panel dropped on the middle of the canvas stays reachable (task 15.149) (25dd1344)
Other
- docs(release-notes): the four workspace fixes from the directed QA run (63ca7f66)
- docs(tasks): 15.147-15.148 shipped in v0.90.0 (45defbad)
v0.90.0 — 2026-09-21
Features
- feat(workspace): lock the panels against stray drags (task 15.147) (b08e7b4c)
Fixes
- fix(workspace): a locked grip swallows the press (task 15.148) + the pre-v0.90.0 QA run (ff34c83a)
Other
- docs(ai-qa): put the v0.90.0 run report where release.sh looks (task 15.154) (4651bc14)
- docs(release-notes): Lock panels (task 15.147) (5de210dd)
- docs(tasks): 15.144–15.146 shipped in v0.89.3 (fe3d481c)
v0.89.3 — 2026-09-21
Fixes
- fix(selection): a question about a device in a group is about the icon, not the group (tasks 15.144–15.146) (a28f00a8)
Other
- docs(tasks): an up-to-date host fails the LAN delivery, and its warning is a hard abort (task 15.143) (b05e4056)
v0.89.2 — 2026-09-20
Fixes
- fix(toolbar): the overflow pass re-runs when the bar's contents change, not only its box (task 15.134) (ecc445c6)
- fix(rack): the builder asks the shared question about which bay a unit is in (task 15.127) (9ba8809e)
- fix(canvas): Tab steps the selection only from the canvas itself, not from the panels inside its host (tasks 15.112, 15.119) (24be0385)
- fix(schedule): a progress code names cables by their ends, and a foreign one is refused whole (task 15.111) (89afd4d2)
- fix(import): grouped imports are laid out group by group, so no two boxes overlap (task 15.101) (75cfef19)
- fix(import): a zone already on the page is that zone, not a second copy (task 15.100) (8520993c)
- fix(import): a declared peer group that layout splits is seated back on one row (task 15.99) (bada71a0)
Other
- docs(qa): the pre-v0.89.2 directed run, and the three findings it produced (119836c2)
- docs: host egress restored — close 15.73 and 15.108, and correct who owns the render stack (e9523403)
- docs(tasks): corrected timeline — intermittent since Sep 9, and the gateway has likely lost its uplink (15.73) (0877472b)
- docs(tasks): the drop is in the FORWARD path on the LAN gateway, and it is silent (15.73) (5af810d0)
- docs(tasks): the host is isolated, not merely offline — it cannot reach
either (15.73) (fd26be98) - docs(tasks): the site host has no outbound internet at all, and it has lost three feedback reports (15.73) (165219a8)
- docs(tasks): the host egress failure recurred on both of today's releases (15.73, 14.85) (5c530360)
v0.89.1 — 2026-09-20
Fixes
- fix(connectors): a thick flow arrow's head grows with its shaft (task 15.139) (3230bb5f)
v0.89.0 — 2026-09-20
Features
- feat(connectors): thickness is a px width with a slider, not a three-way step (task 15.138) (0ce3d491)
Other
- docs(qa): human pass finds a stale external-change offer after Save (task 15.137) (ffb78cb5)
- docs(tasks): the render stack is still two releases behind after v0.88.0 (task 15.108) (c4cd5775)
v0.88.0 — 2026-09-19
Features
- feat(qa): a committed driver library and four QA skills (task 15.110, started) (1e066af3)
- feat(connectors): a Thin · Normal · Heavy thickness on cables, lines and flow arrows (task 15.97) (03108aa1)
- feat(collab): LAN-only sessions — a direct connection with no relay (task 15.91) (0ffd8433)
- feat(routing): order cable slots on a shared face by destination, and a bundle by its port labels (task 15.89) (8d223a5a)
- feat(import): Huawei VRP, HPE Comware, PAN-OS and MikroTik neighbour tables (tasks 15.93–15.96, closes the 15.87 programme; issue #29) (ea514282)
- feat(import): Arista EOS show lldp neighbors, table and detail (task 15.92) (9cd2d3d1)
Fixes
- fix(inspector): the Thickness row no longer pushes the panel past the window on Linux (task 15.136) (6f47300b)
- fix(qa-lib): capture YAML exports, and file lane 08's suite notes (5e4fd9e2)
- fix(qa-lib): index tiled nodes in nodeCenter, and file lane 02's findings (a4991d74)
- fix(import): the Cisco LLDP detail probe claims nobody else, and a lone CSV header only opens a table first (task 15.86) (d1ffa3d1)
- fix(import): recognise NX-OS's Device-ID header in show cdp neighbors (task 15.85) (603dc5cf)
Other
- style(qa): prettier the twelve lane worklogs (645ea623)
- docs(qa): put the run report where the release gate can see it (task 15.135) (5779dea3)
- docs(qa): the pre-v0.88.0 full run is complete — 326 scenarios, report written (21a34b69)
- docs(qa): lane 10's notes, and a waiting service worker without a rebuild (f4af4cf1)
- docs(manual): the Shapes page no longer denies the Thickness this release ships (4795ce21)
- docs(qa): lane 06's findings and nine more selector traps (5dc66420)
- docs(qa): lane 05's scenario corrections and three more selector traps (6fbd4438)
- docs(qa): lane 03's findings, the traps it proved, and a clickAnnotation helper (87068f76)
- docs(tasks): record the decision not to delete scenarios a test covers (task 15.110) (8d66efd8)
- docs(qa): correct one overstated line in the coverage map (7ec4a32c)
- docs(qa): skip spec-backed scenarios for the rest of this run (task 15.110) (2429c1b0)
- docs(qa): map every scenario to its automated coverage (task 15.110 item 1) (e50fc92d)
- docs(manual): regenerate the API reference's format list for the Junos label (task 15.90) (026e29ad)
- refactor(import): LLDP vendor profiles — block and table forms as data (task 15.90) (a14215eb)
- docs(tasks): vendor neighbour-table coverage probe — NX-OS CDP, the over-broad detail probe, the top-vendor plan (tasks 15.85–15.88) (5d98d8d8)
v0.87.3 — 2026-09-18
Fixes
- fix(tests): read the Playwright listing from the JSON reporter's file, not a pipe (task 15.77) (86bc72be)
- fix(app): size the empty-state gallery from the canvas host, not the viewport (task 15.83) (e9193895)
- fix(publish): grep the downloaded /app/ bundle, not a pipe that pipefail closes (task 15.84) (ee3b8214)
Other
- docs(release-notes): v0.87.3 — the empty-state gallery stays off a widened palette (6115053e)
v0.87.2 — 2026-09-18
Fixes
- fix(import): a name with its domain and without it are one device (task 15.81) (2fba626a)
- fix(deploy): let a cut-off host deploy the refs a bundle gave it (c6721eb1)
v0.87.1 — 2026-09-16
Features
- feat(deploy): deliver the tag to the host as a git bundle, over the LAN (3ef8a682)
- feat(deploy): publish.sh ships the editor instead of asking the server to rebuild it (ae1b2bf0)
Fixes
- fix(publish): a stale /app/ fails the release, but not before the prune runs (b8ce68a7)
Other
- docs(tasks): 15.75 shipped in v0.87.0; 15.73/15.74 re-measured on the run (5deef748)
v0.87.0 — 2026-09-16
Features
- feat(text): bullet and numbered lists in text blocks and callouts (6790f73b)
Other
- docs(tasks): 15.73/15.74 — the host lost egress; publish never checks /app/ (8e26f1f9)
v0.86.3 — 2026-09-16
Fixes
- fix(trace): Escape clears the lit path without losing the selection (5bc25b90)
- fix(find): own the find key in the capture phase (1d34475f)
- fix(marquee): sweep a collapsed group by its placeholder, not its members (16e62f0b)
- fix(workspace-edit): Escape in the paste box closes only the box (b0992ba8)
- fix(labels): never print one port name over the other (7979011b)
- fix(toolbar): the app menu survives any window width (bd7296f2)
- fix(drawing-panel): list layers topmost first, like the Layers popover (4540dec8)
- fix(workspace): a moved floating card no longer spans two edges (d18c99e6)
Other
- docs: close 15.61 — browser-verified, watchlist row, release note (67731046)
- docs(tasks): close 15.59 with its result note (874ccb69)
- docs(tasks): close 15.64 with its result note (ea6ca593)
- docs(qa): REG-13 passes post-deploy; file the last run findings (93f0856d)
v0.86.2 — 2026-09-15
Fixes
- fix(minimap): keep the dodge across a layout change (9bb9b553)
- fix(workspace): the Properties card resizes from its side edges (8c58fdee)
- fix(storage): a refused sign-in now says what the user can do about it (07817b03)
Other
- docs(tasks): 15.68/15.69 — why the v0.86.2 gate aborted (ef46ae78)
- docs(qa): pre-v0.86.2 short run — 74 pass, 3 fail, 0 blockers (69279dd9)
- docs(qa): lane-12 findings — REG-09 corrected, 10 harness notes, 2 tasks filed (2afc3676)
- docs(tasks): 15.52 -- lead with where publisher verification stands (3df27579)
- docs(tasks): 15.52 -- the MPN enrolment went to the wrong programme (1fca392f)
- docs: fortiknight.com verified on the tenant, publisher domain set (4cf19ba1)
- docs(tasks): 15.52 -- the publisher domain blocks verification before the MPN id (58eb9a1d)
- docs(tasks): 15.52 -- Partner Center has no MPN enrolment, so no id to attach (839991e0)
- docs(storage): close 15.51 -- User.Read removed from the Entra registration (1c97f4b4)
- docs(tasks): file 15.51-15.53 from the Entra consent-screen finding (d1ab93aa)
- docs(tasks): file the Linux-leg flake from the v0.86.1 gate (task 15.50) (7c81f14e)
v0.86.1 — 2026-09-15
Fixes
- fix(deploy): the site image keeps the public client ids, and refuses to build without them (task 15.49) (e411da40)
v0.86.0 — 2026-09-15
Features
- feat(storage): the Storage sheet says what a connected cloud can see (task 15.47) (beaf5ae1)
- feat(storage): folders inside the cloud folder — browse, create and save into them (task 15.47) (84105442)
- feat(desktop): the loopback sign-in pages wear the app's look and clear the code from the address bar (task 15.46) (ca87f16d)
- feat(storage): cloud providers connect from the desktop app, Google through its own client (task 15.29) (2f2fa05b)
- feat(palette): tiles reflow into as many columns as the dock fits (task 15.35) (b56ded7a)
- feat(canvas): a Flow arrow drawn between two devices arrives fastened to both (task 15.34) (68613c18)
- feat(workspace): a Paste button in the Layout sheet (task 15.32) (475187bb)
- feat(site): layout gallery — twelve downloadable layouts with real screenshots (task 15.31) (71485fd5)
Fixes
- fix(storage): allow the personal OneDrive download host, so opening a file works on web and desktop (task 15.48) (19607cfc)
- fix(storage): OneDrive folders are created under the resolved app-folder item, not the approot alias (task 15.47) (d119d633)
- fix(desktop): the main process makes the token requests, as a native app must (task 15.45) (5e815cf4)
- fix(storage): the desktop sign-in asks for the code in the query, never the fragment (task 15.44) (18f361fd)
- fix(desktop): let the desktop reach the cloud hosts, and give Dropbox fixed loopback ports (tasks 15.40, 15.41) (554223ea)
- fix(storage): keep the pending OAuth sign-in in origin storage so Google's redirect completes (task 15.39) (dec78750)
- fix(connections): Tab walks the port fields instead of dropping focus (task 15.33) (1f105120)
- fix(storage): ship the public Dropbox app key in a tracked .env.production (dedb4ce9)
Other
- docs(qa): partial full-run worklogs and status before the v0.86.0 --no-qa release (b7cee4fb)
- chore(storage): the Microsoft registration exists — public client id in the production env (task 15.43) (3294c420)
- docs(qa): Dropbox on the desktop verified; task 15.42 filed for the raw timeout toast (ba96a1a9)
- docs(qa): Google Drive on the desktop verified; Dropbox desktop findings recorded (f191393b)
- docs(qa): Google Drive on the web verified against the real service after 15.39 (5c0c6726)
- test: guard that no env file reaches the Docker image build context; add the public Google web client id (dcbeba16)
- docs(qa): Dropbox on the web, end to end against the real service (run report + tasks 15.37, 15.38) (e83b949f)
- build(deploy): pass the Google web client secret into the site image build (task 15.36) (143c2bf5)
- docs(manual): why Save is a download in Firefox, Safari, Brave and over http (15.30) (89dc9c4d)
v0.85.0 — 2026-09-15
Features
- feat(storage): Dropbox live, Google and OneDrive greyed, desktop rows deferred (15.27) (596db42b)
- feat(storage): open from and save to the connected cloud, auto-save and conflicts (15.26) (b0c44d4e)
- feat(storage): Dropbox through an app-folder app (15.25) (d0e65465)
- feat(storage): Microsoft OneDrive through Graph's app folder (15.24) (369001ae)
- feat(storage): Google Drive (15.23) (72497aa6)
- feat(storage): OAuth 2.0 with PKCE for browser and desktop, no provider yet (15.22) (2bec6454)
- feat(storage): the Storage settings section, with only local files enabled (15.21) (07831316)
- feat(workspace): Find, History and Collaborators as panels (15.13) (5137c682)
- feat(workspace): Trace a path as a panel (15.12) (c42f02c0)
- feat(workspace): the Cable schedule as a panel (15.11) (dd990c5e)
- feat(workspace): the Drawing panel — layers and objects as one tree (15.10) (05310ee3)
- feat(workspace): the divider between two panels in one dock (15.9) (de65fe1e)
- feat(workspace): the minimap is a panel (15.8) (cff84bae)
- feat(workspace): layout presets — Default, Focus, Review, Present, Fresh (15.7) (d07e0d5a)
- feat(workspace): the layout file — export, import, copy, paste, drop (15.6) (a5a7c42b)
- feat(workspace): tab groups — combine panels in one slot (15.5) (88b9e8fb)
- feat(workspace): floating panels — drop on the canvas, move, resize, persist (15.4) (eac5dcc4)
- feat(workspace): edit mode — move, dock, hide and show panels, with undo (15.3) (2ce54fd2)
- feat(workspace): the docks render the three panels from the layout model (15.2) (f561b0eb)
- feat(workspace): the layout model, pure and tested (15.1) (5dc32982)
Other
- docs(qa): SET-06 run for real against Dropbox, SET-04 deferred (Google greyed) (82804a19)
- docs(cloud-storage): the real redirect URIs, the Google registration as done, and task 15.29 (desktop client secret) (922735a7)
- docs(tasks): 15.28 reproduction attempt under synthetic load, still open (f02743f9)
- docs(release): cloud-storage release notes and the second QA sitting for v0.85.0 (15.27 prepared) (02e3e995)
- docs(tasks): 15.21 shipped in 07831316; file 15.28 (connector-drag e2e flake under load) (e97fa44c)
- docs(cloud-storage): the data-flow proof that nothing reaches our server, and the registration checklist (15.20) (2dadd03e)
- docs(workspace,notes,ai-qa): the workspace module doc, v0.85.0 release notes and its directed QA run (15.14, publish pending) (92f18520)
- docs(tasks): 15.9 shipped in de65fe1e (d8363054)
- docs(tasks): 15.20 — the cloud-storage doc is a data-flow proof that nothing reaches our server (6ed88072)
- docs(tasks): Phase 15 — customizable workspace and user-chosen cloud storage (product decision 2026-09-14) (fe796a66)
- docs(ai-qa,tasks): correct the Windows-leg claim, and file 14.103 (b2a45d95)
v0.84.0 — 2026-09-14
Features
- feat(trace): every cabled way between two devices, not one (14.101) (d1bc406)
Other
- docs(notes,ai-qa): the v0.84.0 release notes and its directed QA run (0b0901f)
- docs(tasks): 14.100 shipped in v0.83.0 (74da360)
v0.83.0 — 2026-09-11
Features
- feat(shapes): a Directory kind — the store of users, not the thing that authenticates (14.100) (6731ca5)
Other
- docs(notes,ai-qa): the v0.83.0 release notes and its directed QA run (a85d452)
- docs(tasks): 14.98 shipped in v0.82.3 (47c63ac)
v0.82.3 — 2026-09-09
Fixes
- fix(connectors): a caption is centred on the line you can see, not on the route under the tile (14.98) (d86e4d7)
Other
- docs(tasks): 14.96 shipped in v0.82.2; 14.99 notes the re-run detached first time (3b3d364)
v0.82.2 — 2026-09-09
Fixes
- fix(connections): a cable alone in a ring gets no second "New ring…", and the hint says what to do (14.96) (af93364)
Other
- docs(tasks): 14.98 caption centred on the route not the visible line; 14.99 dmg detach failed again with ten retries (5356d10)
- docs(tasks): 14.94 and 14.95 shipped in v0.82.0, 14.97 in v0.82.1 (d893d44)
v0.82.1 — 2026-09-08
Fixes
- fix(connectors): a caption keeps a margin at each end of a long cable, not a fifth of it (14.97) (daf98f6)
v0.82.0 — 2026-09-08
Features
- feat(connectors): typing an address on one end fills the other end with its partner, behind a switch (14.95) (74fb3be)
Fixes
- fix(connectors): an address alone sits where a port name would, and both ends of a straight cable share a side (14.94) (96961bc)
Other
- docs(qa): note how the pre-v0.82.0 directed report relates to the release gate's mtime check (a782b63)
- docs(tasks): 14.89, 14.90 and 14.92 shipped in v0.81.0; 14.93 leak count and source (29e299f)
v0.81.0 — 2026-09-08
Features
- feat(document): one line weight for the whole drawing — Fine / Normal / Bold in Document info (14.90, closes 14.88) (2196e67)
- feat(inspector): Link, Speed and Cable become pickers and the Properties tab folds into Look, Text, Facts and Arrange (14.89) (84edcdc)
Fixes
- fix(connectors): a caption wraps to the connector it sits on, and never breaks a word in half (14.92) (557e034)
- fix(inspector): the folded panel really fits a 1280x800 window — two connector commands share a row, speed colour and wavelength sit beside their pickers (14.89 follow-up) (8d054fe)
- fix(release): the idle-machine precheck says it cannot check when pgrep is missing instead of passing in silence (14.91) (5e7a086)
Other
- docs(tasks): file the Electron api-main process leak that trips the idle precheck (14.93) (dcc874c)
- docs(qa): directed run before v0.81.0 on the built bundle — PANEL-01, EXP-17, CONN-44, REG-14; PANEL-01 step 5 corrected for a page with layers (47c1ae5)
- docs(tasks): decide 14.87 — file the panel re-arrangement (14.89) and document line weight (14.90) (368dbea)
- docs(tasks): investigate connector/border thickness and the crowded Properties panel (14.87), file the dead text-scale selector (14.88) (c065dcd)
- build(release): why a release takes five attempts — measure, refuse a busy machine, make retries loud, cancel abandoned hosted runs (14.83) (7d3e1fa)
- docs(tasks): 14.81 shipped in v0.80.1; file the release-flakiness investigation (14.83) (8383f30)
v0.80.1 — 2026-09-08
Fixes
- fix(routing): a basic shape with devices standing in it is a frame, not a wall (14.81) (5596701)
Other
- test(e2e): the compare-is-read-only spec waits for its own autosave before compare (14.82) (d2822a4)
- docs(tasks): the knock flake took the third attempt at v0.80.1 (14.80) (3ed766b)
- docs(tasks): the compare-is-read-only spec races its own autosave on Linux (14.82) (e7ec9f3)
- docs(tasks): deployhost.test.ts timed out inside a release again (14.80) (04c8438)
- docs(tasks): 14.76 shipped in v0.80.0 — folder icon import (0417234)
v0.80.0 — 2026-09-07
Features
- feat(my-shapes): import a whole folder of icons (14.76) (3350688)
- feat(my-shapes): keep the list in IndexedDB, with localStorage as the fallback (14.76) (40deb8f)
- feat(my-shapes): reduce a folder of SVGs to importable rows (14.76) (ecc975a)
- feat(icons): an imported SVG stays vector (14.76) (3f3bd86)
- feat(icons): sanitize an SVG into a storable vector icon (14.76) (fb02ae3)
Fixes
- fix(release): cap the notes section that ships, not the ones that already did (14.78) (e4835ea)
- fix(icons): parsing an SVG no longer logs a CSP violation per file (14.76) (9209f79)
- fix(icons): lint and typecheck the sanitizer (14.76) (faa08e5)
Other
- docs(tasks): the collab knock flake recurred on Windows and aborted the release (14.80) (c7525fe)
- test(e2e): pin the new icon guarantee, not the old mechanism (14.76) (1272f71)
- docs(tasks): prune-artifacts.test.ts aborted a release on a flake (14.80) (2f6f91b)
- docs(release-notes): the notes for the icon-import minor (11d5549)
- docs(tasks): the folded -white twin is the one dark mode wants (14.79) (9030c4f)
- docs(manual,ai-qa): the folder import ships with its paragraph and its scenario (14.76) (67fcff9)
- docs(tasks): the release-notes size guard has been red since v0.79.0 (14.78) (d13c6d3)
- docs(tasks): eight doc tasks done; the code findings they turned up (14.77) (db3c924)
- docs(manual): the code chapter matches the shipped CLI, API and MCP door (14.71) (1244851)
- docs(pipeline,routing): the gate, the artifacts and the wasm build as they are (14.72, 14.73) (db10d81)
- docs(collab,publication): the collab docs and the launch checklist tell the truth (14.74, 14.75) (a5e1b68)
- docs(site,readme): the public copy stops overstating privacy (14.65) (d098207)
- docs(manual): the files, export, settings and shortcuts pages match the app (14.70) (d621531)
- docs(manual): the core pages describe the app that ships (14.69) (95ead79)
- docs(tasks): record the icon-pack product decision (14.76) (c1b3e6d)
- docs(tasks): the 2026-09-07 documentation verification becomes tasks (14.61-14.75) (ee66a40)
- docs(tasks): every remaining v0.79.0 run finding becomes a task (14.50-14.60) (06a6d17)
- docs(tasks): 14.42 and 14.43 shipped in v0.79.0 (0fdb02a)
- docs(release-notes): v0.79.0 lists its known issues (0172db7)
v0.79.0 — 2026-09-06
Features
- feat(schedule): one cable-schedule row per joined run, with a Via column (14.24) (c71f175)
- feat(import): the preview counts prefixes and hosts, not devices and links (14.21) (1946bc8)
- feat(shapes): patch panel, PDU and console server kinds (14.24) (447dca6)
- feat(import): an Ansible inventory becomes devices and zones (14.21) (03203d9)
- feat(import): a prefix list becomes zones (14.21) (74afffa)
- feat(palette): My shapes in the palette, and the device-type importer (14.28) (a66df98)
- feat(import): the dialog and the editor commit description cables (14.18) (8a3cfc7)
- feat(connections): a device type's port names under the port field (14.28) (65c1f69)
- feat(import): read
show interfaces descriptioninto cables (14.18) (5cfd0cc) - feat(rack-builder): mount a device type at its own U height and depth (14.28) (48f475e)
- feat(import): read a FortiGate
get system ha statuspaste as an HA pair (14.17) (f68107b) - feat(my-shapes): a My shapes store for imported device types (14.28) (941e076)
- feat(import): Meraki link-layer and UniFi device exports (14.20) (7718a4a)
- feat(import): read Mermaid flowchart and architecture-beta (14.22) (120d5e9)
- feat(devicetype): read NetBox device-type YAML (14.28) (0ad6ce7)
- feat(export): write the page as a Containerlab topology (14.20) (eb91fc3)
- feat(import): the preview reports what differs, and can update it (14.19) (3319b24)
- feat(import): read Containerlab topology YAML (14.20) (92de8c8)
- feat(import): reconcile a paste against the page (14.19) (b47410d)
- feat(export-html): the export toast says what the viewer weighs (14.29) (928ed90)
- feat(export-html): a folded group opens in the viewer (14.29) (a362f33)
- feat(inspector): three chips put a rack unit on a power feed (14.27) (020cd4d)
- feat(export-html): legend rows switch what they name on and off (14.29) (b0840f3)
- feat(files,inventory,describe): the power feed travels through every format (14.27) (d50a2ad)
- feat(export-html): the cable schedule is a tab of the handover file (14.29) (3cbcc41)
- feat(model,canvas): a rack unit says which power feed it is on (14.27) (2eb5111)
- feat(export-html): the viewer searches names, IPs, serials, models (14.29) (04b9c7b)
- feat(exports,minimap): HA links travel through DOT, .drawio, .vsdx, Mermaid and the overview (14.7) (b96bc23)
- feat(formats): the breakout media travel through DOT, .drawio and .vsdx (14.26) (301ee91)
- feat(import): a port-channel paste binds the rings, in one undo step (14.16) (37a8b57)
- feat(model,canvas): HA / heartbeat link type — value, dash rhythm and paired-boxes badge (14.7) (d697af3)
- feat(inventory,describe): a rack unit inherits its rack Location (14.27) (16e9100)
- feat(import): read
show etherchannel summary/show port-channel summary(14.16) (4a8e591) - feat(rack): the builder and the rack card say how full it is (14.27) (17cfb9a)
- feat(optics): two breakout media, counted 1 + 4 (14.26) (b6eb43c)
- feat(api,cli): edit_diagram and validate on both doors (14.23) (6bd4f95)
- feat(inspector,legend): circuit id and provider on WAN links (14.6) (5e0a7d2)
- feat(connections,canvas): an address at each end of a cable (14.5) (3ef3355)
- feat(app): apply a change set to a diagram, laying out only what is new (14.23) (9ac82b0)
- feat(files,describe,inventory): installed travels through every format (14.25) (aa05057)
- feat(cli,docs): netbox-devices.csv as an export kind, and the manual (14.11) (bb677de)
- feat(inspector,object-list): tick a device Installed, list its status (14.25) (726492f)
- feat(import): a NetBox device CSV lands without renaming a column (14.11) (e8b65b7)
- feat(export): PDF with schedules in the Export menu (14.13) (b36acb2)
- feat(canvas,inspector): draw the VLAN under a cable's caption (14.4) (03baf47)
- feat(cables): Print labels beside Print in the cable schedule (14.14) (9832206)
- feat(canvas,minimap): a planned device draws with a dashed outline (14.25) (7df4d95)
- feat(export): NetBox devices CSV beside the NetBox cables one (14.11) (6c2f4ec)
- feat(export): PDF with schedules — the site pack document (14.13) (194ce32)
- feat(cables): a printed label for each end of every cable (14.14) (f6dd892)
- feat(minimap,export): the overview and every export fold a collapsed group too (14.8, 11.591) (3b911b1)
- feat(inventory): the CSV says which rack, which U and which zone (14.11) (15359f2)
- feat(model): a device can be marked installed or planned (14.25) (32fde74)
- feat(canvas,routing): a collapsed group draws as one tile and keeps its cables (14.8) (12d83f9)
- feat(model,files): a cable carries a VLAN (14.4, data layer) (0ca9178)
- feat(group): one pure helper folds a collapsed group to a placeholder that keeps its cables (14.8) (c2f7222)
- feat(cli): --doc a.drawio --compare b.drawio --export changes.md|json (14.9) (fc1cdde)
- feat(object-list): a row says which page it links to (14.3) (edc355d)
- feat(export-html): the viewer's details panel switches page (14.3) (04937e0)
- feat(blocks): the Blocks menu is five switches (14.10, 14.15) (ec24cc3)
- feat(inspector,canvas): Trace path lights the way between two devices (14.1) (186d886)
- feat(revisions): Compare with file… against a chosen .drawio (14.9) (a5a7b92)
- feat(inspector): "Link to page…" under the Link field (14.3) (783d818)
- feat(blocks): a table of the page's flow arrows and what they run between (14.15) (7cdb489)
- feat(compare): Copy as text on the Compare panel (14.9) (6ed1137)
- feat(drawio): a page link names the page the FILE calls it (14.3) (5c854f1)
- feat(export-pdf): paper steps to A2 and A1, and chooses portrait (14.12) (a09efc7)
- feat(object-list): the inventory search reads asset data and subnets (14.2) (1ddabe8)
- feat(blocks): a revision table derived from the file's snapshots (14.10) (220111d)
- feat(find): ⌘F matches asset data and the subnet that contains an address (14.2) (59d41d1)
- feat(diff): render a comparison as Markdown or JSON (14.9) (34aa180)
- feat(trace): the shortest cabled path between two devices (14.1) (9887f34)
- feat(links): device-link learns draw.io's page-link form (14.3) (192effb)
Fixes
- fix(export-pack): a ticked cable prints as a filled box (14.43) (ce24d6e)
- fix(export-pdf): the paper ladder reaches A2 and A1 again (14.42) (86c8f6d)
- fix(revisions): the image pool sees draw.io's marker-stripped data URLs (14.36) (29c22f6)
- fix(cli): a headless export waits for the ROUTER, not for the DOM (14.32) (addd7de)
- fix(merge): close the 14.19 fixture test before the 14.20 ones (090b713)
- fix(merge): reopen the 14.20 fixture comment beside 14.19's; regenerate mcp.md (5e08244)
- fix(merge): close the 14.6 vsdx test block before the 14.26 one (8729552)
- fix(e2e): anchor the DAC chip locator, which two media now match (14.26) (c393fcb)
- fix(merge): regenerate docs/openapi.json after 14.11 × 14.23 (netbox-devices.csv kind + edit/validate routes) (0d43d2d)
- fix(merge): 14.25 × 14.9/14.11 seams — Compare verbs for installed/planned, NetBox device status from the Installed tick (4063994)
Other
- docs(ai-qa): the run report names the commit being released (v0.79.0) (74a0428)
- docs(ai-qa,tasks): the v0.79.0 full run — 280 scenarios, twelve findings filed (b293541)
- docs(tasks): 14.36 and 14.37 shipped — the revisions image pool sees every picture; the Linux e2e stage matches test:e2e (7ef7270)
- docs(manual,ai-qa): a picture is stored once per file, and REV-01 checks the number (14.36) (a577133)
- docs(tests): the revisions growth spec is green, and says what it measures now (14.36) (7e3ac69)
- test(revisions): the pool is proved over every spelling a data URL has (14.36) (b5c710e)
- docs(tasks): 14.34 done — the spec repair, and what it found (acf1a1f)
- ci(linux): the e2e stage runs the same three projects as test:e2e (14.37); file 14.36 — the revisions image pool misses image nodes (e7d49f0)
- test(e2e): the revisions-logo test never had a logo, and read a stale autosave (14.34) (37ba1a7)
- test(site): the security page names two input surfaces now (14.34) (a389426)
- test(e2e): the HTML viewer has a third tab, and it lists the cable (14.34) (e96884d)
- test(e2e): the icon library holds 110 kinds, and three of them have names (14.34) (d0b17d0)
- docs(tasks): 14.31 done — both documentation lanes merged (91b4ce7)
- docs(notes,manual): the 14.24 release line; Basic shapes row in the palette table (38b8fbc)
- docs(notes): draft the Unreleased notes for the Phase 14 minor (14.31) (1706162)
- docs(tasks): 14.34 narrowed to three macOS failures plus two Linux-only reproductions (ee4dce7)
- docs(manual): the DOT format page teaches the cable facts (14.31) (a2358bd)
- docs(tasks,ai-qa): 14.32 shipped; 14.35 files the headless-export placeholder bug with its traceability row and REG-34 (3d286db)
- docs(manual): the CLI page counts its export kinds and ships --theme (14.31) (f2b9f09)
- docs(manual): the DOT reference tables name two attributes it reads (14.31) (ce2caeb)
- docs(manual): the collaboration limits agree with the page above them (14.31) (8b35c75)
- docs(manual): the settings page lists the App menu the app has (14.31) (e698208)
- docs(manual): troubleshooting stops contradicting the files page (14.31) (b9fb8c6)
- docs(manual): the code chapter's loop ends where the exports do (14.31) (b7b829e)
- docs(manual): the MCP page counts its tools (14.31) (cad31f3)
- docs(tasks): 14.34 — nine Playwright specs fail on main; the gate read tail's exit code (dc4823e)
- docs(manual): welcome names the handover pack and the way in from code (14.31) (79edd71)
- docs(manual): the export page covers every entry in the Export menu (14.31) (4e4fd89)
- docs(manual): the canvas page lists the switches and fields that exist (14.31) (a0c928c)
- docs(manual): shapes stops saying the HTML viewer twice (14.31) (ab628fa)
- docs(manual): connectors names the controls the app has (14.31) (a9a2298)
- docs(manual): the recognised-formats list renders as one list again (14.31) (b1c2927)
- docs(tasks): 14.24 shipped — patch panel, PDU and console server kinds; one schedule row per run (c9ba3c6)
- test(e2e): two "flaky" specs were deterministic drift, and the server was the wrong checkout (14.32) (ab5b961)
- test(dot): the three new kinds travel through
kind=both ways (14.24) (26dd1a5) - docs(manual,ai-qa): patch panels, PDUs and one schedule row per run (14.24) (6c0ad32)
- docs(ai-qa): name the four 14.21 fixtures in the README table (the 14.31 guard caught the gap) (c52950e)
- docs(tasks): 14.31 lane A merged; 14.33 files the two gaps it found (b84b9e1)
- test(mcp): record what the render-backed calls actually cost (14.32) (1ba358a)
- test(ai-qa): FILE-38 covers prefix lists and Ansible inventories (14.21) (69526ed)
- docs(proposals): both investigation docs outlived their status lines (14.31) (d275957)
- docs(collab): name doc.ts as one of the four homes a new field must reach (14.31) (299ea7d)
- docs(06): name the two routes task 14.23 adds to the hosted door (14.31) (db12a7d)
- docs(04): the hero GIF is not a side-by-side any more, and .github is still empty (14.31) (d9f9dca)
- docs(03,05): desktop.yml is gone, the gate is twelve steps, and billing was restored (14.31) (0e86feb)
- docs(08): the CC0 device-type fixtures belong in the third-party section (14.31) (f271b7e)
- docs(security): the hosted render door is an input surface, and the policy said there was only one (14.31) (bb733f9)
- docs(manual): prefix lists and Ansible inventories in files.md (14.21) (382bfc0)
- docs(ai-qa): SELECTORS learns the Phase 14 controls (14.31) (0e5d379)
- docs(ai-qa): the gap list is not empty any more, and the spec count was three years of specs out of date (14.31) (9d1ca3a)
- docs(ai-qa): the fixtures table lists all 31, and a guard keeps it that way (14.31) (eafd7d4)
- docs(site): the formats card names the paste-import edge; privacy names what MCP can now do (14.31) (4446d93)
- docs(01): crossingPenalty is 24, nudging is not a user setting, and draw.io ships libavoid (14.31) (7e406fe)
- docs(07): the MCP server has five tools and two resources, not three tools (14.31) (2682fce)
- docs(tasks): 14.24 icons approved — Patch panel B, PDU A (olive), Console server A; keep the contact sheet (acb90cb)
- test(scripts): the bash-spawning script tests stop paying macOS provenance (14.32) (713623a)
- docs(claude): record Phase 14's product decision and its declined list (14.31) (b9d24c9)
- docs(readme): routing is no longer "the core differentiator", and the layout matches the tree (14.31) (63fe292)
- docs(02): table the nine Phase 14 model fields and their round-trip forms (14.31) (8ee1b29)
- refactor(import): the CSV reader moves to its own module (14.21) (bd120b2)
- docs(tasks,manual): 14.17, 14.18, 14.28 shipped — FortiGate HA, interface descriptions, device-type library; regenerate dot-reference.md (fc9f72e)
- docs(tasks): 14.32 notes the mcp-stdio render budget under load (33383fd)
- test(palette): the empty My shapes group must be VISIBLE, not merely present (14.28) (6712da3)
- docs(tasks,manual): 14.22 shipped — Mermaid import; regenerate dot-reference.md (dce0e6d)
- docs(manual,ai-qa): device types in the manual and a scenario for them (14.28) (add1c4c)
- test(import): the folded no-description line is asserted, not assumed (14.18) (bee682c)
- test(qa): FILE-37 — port descriptions become cables, and one that must not (14.18) (ce2eb7b)
- docs(manual): what the importer reads out of a port description (14.18) (4ac68af)
- test(import): register the HA fixture with the detection sweep (14.17) (a5e0b01)
- docs(ai-qa): FILE-36 — the HA pair a FortiGate paste draws (14.17) (086c7b3)
- test(ai-qa): FILE-35 looks at a Mermaid paste and at Copy Mermaid coming back (14.22) (47ba49b)
- docs(manual): the HA pair a FortiGate paste draws (14.17) (cc6b4ea)
- docs(manual,ai-qa): the lab and controller formats, with fixtures (14.20) (f06f35e)
- test(import): the HA pair against a real store, and the dialog's preview line (14.17) (f0a25b1)
- docs(manual): how a Mermaid paste arrives, and that Copy Mermaid comes back (14.22) (1a01247)
- docs(tasks): 14.19 shipped — import reconcile report; 14.32 partly closed (door-spec ports) (1d2c54e)
- test(api): api-edit-validate takes a kernel-chosen port through test/serve (14.32) (f301ac4)
- test(qa): FILE-33 reads a second inventory export against the page (14.19) (edb8a17)
- docs(tasks): 14.7 and 14.29 shipped — HA link type; the HTML viewer as the handover file (45636ae)
- docs(manual): the import preview's third line and the update box (14.19) (0c9530f)
- test(import): the update path against a real store, and one undo (14.19) (d3ca1da)
- docs(tasks): 14.27 shipped — rack occupancy, inherited location, power feed chip (fecabf7)
- docs(manual,ai-qa): the handover file, in prose and as a scenario (14.29) (1ac7c81)
- docs(manual,ai-qa): the rack extras, in prose and as a scenario (14.27) (8424041)
- docs(manual,ai-qa): the HA link type is documented and has a scenario (14.7) (eb8f207)
- test(minimap,inspector,viewer): the HA link is in the map, the picker and the saved file (14.7) (1296e01)
- docs(tasks): 14.16, 14.26, 14.30 shipped; 14.32 records the scripts-test timeouts (c1eefb3)
- test(exports): HA survives .drawio, DOT, .vsdx and Mermaid (14.7) (9af38ac)
- test(import): the fixture-detection sweep names the two new fixtures (14.16) (534e042)
- test(canvas,legend,painter): the HA link is drawn, named and painted (14.7) (9d8979d)
- test(export-html): the viewer's neighbours and connected path (14.29) (87a9994)
- docs(tasks): 14.23 shipped — MCP edit_diagram and validate; 14.31 documentation pass; 14.30 flake list grows (3f6562d)
- docs(ai-qa): FILE-32 and its two fixtures for the port-channel paste (14.16) (c8010ea)
- docs(manual,ai-qa): breakouts in the manual and CONN-40 (14.26) (77deb41)
- docs(manual): the port-channel paste, in files.md and the detected-formats list (14.16) (19d9161)
- refactor(trace,find): self-contained kernels the HTML viewer can inline (14.29) (26abeb2)
- test(api): drive /api/edit and /api/validate over the real door (14.23) (317e880)
- test(api-limits): the last pid-derived port (14.30) (96b3216)
- test(optics): the 1 + 4 rule, the block flag and the report caveat (14.26) (609888c)
- test(api-parity): the anchors are route geometry too (14.30) (2f088a0)
- docs(manual,ai-qa): the edit loop and the pre-flight check (14.23) (946a8b6)
- test(api-auth): the quota flake was two suites sharing one server (14.30) (39cdd8c)
- docs(tasks): 14.4, 14.5, 14.6 shipped — VLAN, per-end addresses, circuit and provider on a cable (ee67282)
- test(cli): --edit and --validate against the real binary (14.23) (fb62dbe)
- docs(tasks): 14.25 shipped — planned vs installed on a device (8c4d82b)
- test(file-watch): coalescing runs on a clock the test fires (14.30) (1c89de2)
- docs(tasks): 14.13 shipped — PDF with schedules, the site pack (d1420bb)
- test(fonts): the two 5 s timeouts were cost, not flake (14.30) (784d516)
- test(store): the Installed setter writes false, it does not clear (14.25) (1e23c86)
- docs(manual,ai-qa): the Installed tick, in prose and as a scenario (14.25) (9f575e5)
- docs(tasks): 14.11 shipped — inventory columns, NetBox devices CSV, NetBox header aliases (b72fa57)
- refactor(api): one change-set schema for both doors (14.23) (7b03359)
- docs(tasks): 14.8 shipped — a collapsed group keeps its cables (2b3ab52)
- docs(ai-qa): EXP-13 — Rack/U/Zone and the NetBox devices CSV (14.11) (ba83253)
- docs(tasks): 14.14 shipped — print cable labels (f25dd94)
- test(export-pack): drop the two index assertions the lint rule forbids (14.13) (ebd1b50)
- test(e2e): GRP-05 drives collapse → the uplinks are still there → expand (14.8) (ac5f5b8)
- docs(ai-qa): EXP-14 — the PDF site pack (14.13) (a3a44b1)
- docs(manual): PDF with schedules in the export page (14.13) (ff2c8d5)
- docs(ai-qa): CONN-39, printing the labels for both ends (14.14) (47e3c3e)
- docs(manual): Printing labels, under the cable schedule (14.14) (b14f754)
- test(csp): assert the PDF site pack's document carries no style text (14.13) (0a074b4)
- docs(manual,ai-qa,drawio): collapse keeps its cables — prose, scenario, round-trip guard (14.8) (51e1e42)
- test(csp): the cable label sheet is asserted style-text-free too (14.14) (fc1dc3f)
- refactor(export-pdf,inventory): a print appendix hook and the band fields, for the site pack (14.13) (5556bdc)
- docs(tasks): 14.9 shipped — Compare as text, compare with a file, CLI --compare (13c8f57)
- docs(tasks): 14.1, 14.3, 14.10, 14.15 shipped; 14.30 records the timing flakes seen under load (982277a)
- docs(ai-qa): FILE-31 — a comparison leaves the app (14.9) (848794a)
- docs(ai-qa): the page picker's selectors (14.3) (d1d9c2e)
- docs(manual,ai-qa): page links in the manual and as FILE-30 (14.3) (d7d63f2)
- test(e2e): the Trace path gesture in a real browser (14.1) (419ac05)
- docs(manual,ai-qa): the Blocks menu is five switches (14.10, 14.15) (5824b29)
- docs(manual,ai-qa): Trace a path — manual section and TRACE-01 (14.1) (8b67698)
- docs(tasks,claude): 14.12 shipped — PDF steps to A2/A1 and chooses portrait; full-run count 250 (92a37db)
- docs(tasks): 14.2 shipped — find and the object list reach asset data and subnets (35c7a24)
- docs(manual,ai-qa): the PDF paper rule, and EXP-12 for it (14.12) (fbf6cac)
- docs(manual,ai-qa): find reads asset data — manual paragraph and FIND-02 (14.2) (01a1bc3)
- docs(tasks): 14.29 — the HTML viewer as the handover file (user decision 2026-09-05) (a813c3a)
- docs(tasks): Phase 14 — network-engineer parity features, product decision 2026-09-05 (14.1–14.28) (778b702)
- docs(ai-qa): competitive feature review through a network engineer's lens (13.54) (e6b2d22)
- docs(tasks): v0.78.0 shipped and verified (13.53) (2d2987b)
v0.78.0 — 2026-09-04
Fixes
- fix(canvas,inspector): a selected cable is grabbable through a note (13.51); port-label options move to the Connections card (13.52) (e57b7d1)
Other
- docs(ai-qa): directed run on the built bundle before v0.78.0 (13.51, 13.52) (52def0b)
- docs(manual,notes): every chord in prose reads on every OS (13.49) (1d7e178)
- docs(tasks): v0.77.0 tag run green (13.48) (b12bf36)
- docs(tasks): v0.77.0 shipped and verified (13.48) (50c7b28)
v0.77.0 — 2026-09-04
Features
- feat(keys): a keyboard for the rest of the toolbar (13.47) (7fb6f0c)
Other
- docs(tasks): v0.76.1 tag run green (13.46) (51fe089)
- docs(tasks): v0.76.1 shipped and verified (13.46) (e947342)
v0.76.1 — 2026-09-02
Fixes
- fix(rings): a ring drags towards the pointer whichever end it hugs (13.44); a wheel notch glides to its step (13.45) (7eae3ed)
Other
- docs(tasks): v0.76.0 shipped and verified (13.43) (83c3147)
v0.76.0 — 2026-09-02
Features
- feat(rings): one to three rings per set of cables, Unbind takes one ring, rings stand square and clear of the tile (13.36–13.39); C arms the connector tool (13.41); a wheel notch is a step (13.40c) (92b0e23)
Fixes
- fix(rings): a new ring never inherits a stale registry entry (13.42) (b922047)
- fix(pwa): a browser "skip this version" covers the waiting worker, not the running version (13.32) (8f9593d)
Other
- docs(ai-qa): directed run report for v0.76.0 (0c01da3)
- docs(tasks): v0.75.0 tag run green (13.35) (e814447)
- docs(tasks): v0.75.0 shipped and verified (13.35) (1d2bd80)
v0.75.0 — 2026-09-02
Features
- feat(drawio): a saved file carries each tile's icon, so draw.io shows the drawing you made (13.19) (00a4c52)
Other
- docs(ai-qa): directed run report for v0.75.0 (13.19) (c5dc24f)
- docs(tasks): 13.19 investigated — embedded icons cost ~700 B per device and render as the tile in draw.io (05b339e)
- docs(tasks): v0.74.1 tag run green (13.34) (6b18919)
- docs(tasks): v0.74.1 shipped and verified (13.34) (253b31f)
v0.74.1 — 2026-09-02
Fixes
- fix(collab,pwa): a stale tab says so before hosting, and the agent names the right host (13.8, 13.9) (6406279)
- fix(canvas): a port label is placed from where the cable leaves the tile (13.28) (3054cf2)
Other
- test(e2e): read the toolbar's Import/Export pair as one settled snapshot (13.33) (5c4f706)
- test(api): the parity test compares the drawing, not the pixels (11.616) (05fa410)
- docs(tasks): v0.74.0 shipped and verified (13.31) (cec089e)
v0.74.0 — 2026-09-02
Features
- feat(import): Cisco LLDP detail and both Aruba LLDP families import (13.26) (1468114)
- feat(import,legend,drawio): feedback round — merge on import, FortiSwitch LLDP, sticky legend rows, no draw.io arrowheads (13.18, 13.20, 13.21, 13.22) (e5dd67c)
- feat(deploy): the feedback relay watches its own token expiry, and publish.sh reads it (13.24) (e6b5273)
Fixes
- fix(import,legend): the pre-v0.74.0 QA run's three findings (13.27, 13.29, 13.30) (b6210d8)
- fix(deploy,ci): two mirrors for the render image, and Playwright on Linux (13.16, 13.17) (c93516c)
Other
- docs(deploy): the attachment token is rotated — expires 2027-08-31 (13.25) (1bffe1b)
v0.73.0 — 2026-09-01
Features
- feat(editor): a resize sticks at a neighbour's size, and Shift keeps the proportions (13.11) (c77d4e4)
Fixes
- fix(ci): the two Linux-only failures that blocked the release (13.13, 13.14) (eeaf909)
Other
- docs(ci): the hosted gate is wasm + linux e2e, not ubuntu + windows (13.12) (2536ce3)
- docs(tasks): 13.10 — v0.72.1 released and verified (723a7a1)
v0.72.1 — 2026-08-31
Fixes
- fix(collab): a damaged invite explains itself, and the share popover anchors to the toolbar (12.36, 13.7) (e5df40e)
Other
- docs(release): v0.72.1 notes — damaged-invite explanation and share-panel placement (e75fac5)
- docs(qa): invite-path verification run — flow proven live, friend's failure diagnosed as 12.36; findings 13.7–13.9 filed (f7e2ee4)
- docs(tasks): 13.6 — v0.72.0 released and verified (97f0c15)
v0.72.0 — 2026-08-30
Features
- feat(shapes): a custom icon inside the device tile (13.4) (5d1dd7b)
- feat(model): a device carries a Link — sixth asset-data field, draw.io's own link attribute (13.3) (fe66353)
- feat(export): PDF exports the whole document, one sheet per page (13.2) (2ceb100)
- feat(files): compressed legacy draw.io pages inflate and open editable (13.1) (3422aca)
Other
- docs(ai-qa): close out the pre-v0.72.0 run report — observation filed as 13.5 (2fa3a2f)
- docs(release): v0.72.0 notes, pre-release directed run, and finding 13.5 (526112f)
- docs(tasks): 13.2 shipped in 2ceb100 — record the result (53d9c74)
- docs(tasks): phase 13 — four parity features chosen from the 2026-08-30 draw.io scout (13.1–13.4) (7998694)
v0.71.0 — 2026-08-30
Features
- feat(collab): a 20-minute open door, and browser sharing finished (12.13, 12.6) (80ad30a)
- feat(license): move from Apache-2.0 to PolyForm Shield 1.0.0 (12.35) (96dbf8e)
Fixes
- fix(release): let publish.sh forward --no-qa, and record why (12.45) (be11d8b)
Other
- docs(tasks): 12.35 licence page is live on the website, /app/ deliberately unchanged (da9727c)
- docs(tasks): 12.33 shipped in v0.70.0, verified from the artifacts users get (005a518)
v0.70.0 — 2026-08-28
Features
- feat(agent): an AI joins the session and draws while you watch (12.33) (23452ab)
- feat(release): ask whether anyone looked at the product before a minor ships (b27d81f)
- feat(deploy): the render stack follows the tag, and its drift has a number (e5bc245)
Other
- docs(qa): directed pre-v0.70.0 run — the agent feature proven on the real relay (60854d2)
- docs(tasks): an AI can join a live session — the peer already exists as test code (12.33) (69af580)
- docs(release): announce the MCP page rewrite, and correct 12.32's note (c596551)
- docs(mcp): the hosted door leads the page, and the site says it exists (10c6e2f)
- docs(qa): run the pass v0.69.0 shipped without, and file what it exposed (34046c4)
- docs: the MCP door's missing concurrency check was an isolation gap, not a slow path (0989b9f)
v0.69.0 — 2026-08-28
Features
- feat(hosted): unrestricted quotas, per-request usage detail, shortfall autoscaling (25daa82)
Fixes
- fix(render-edge): the relay's pid limit was the whole door's connection limit (d341885)
- fix(mcp): the hosted MCP door queued without bound, and health could not see it (5ae6bdf)
- fix(privacy): the hosted-API disclosure had lost its edit, and nothing noticed (68b3bfc)
- fix(autoscale): reach the warm floor from below, not only refuse to fall past it (0a0a826)
Other
- docs: what the hosted door actually does, measured from outside (acca235)
- docs(tasks): 12.16-12.18 shipped in v0.68.0 (a6e31e6)
v0.68.0 — 2026-08-26
Fixes
- fix(collab): let a browser and a desktop actually share a session (f44b441)
Other
- docs(release): notes for browser-and-desktop sessions, and the rebuilt share panel (745c7de)
- docs(tasks): close 12.9, and log the two things I had left unwritten (cbbe215)
- docs(tasks): 12.12 shipped and verified; record the open-door request as 12.13 (30e752e)
v0.67.0 — 2026-08-26
Features
- feat(collab): point browser peers at the same-origin relay, and revert the CSP (1c2b3da)
- feat(deploy): gate the relay transport to our own origin (c3c1d3c)
Other
- docs: say plainly that a browser session now relays through our server (b396a35)
v0.66.0 — 2026-08-26
Features
- feat(collab): self-hosted relay, single-relay clients, and a short invite link (2e9b248)
Other
- docs(release): notes for the shorter invite link (f3fda58)
- docs(tasks): promote the relay self-hosting work to 12.12 (93da7eb)
- docs(tasks): self-hosting the relay, reframed around one firewall opening (a80c70f)
v0.65.0 — 2026-08-26
Features
- feat(collab): rename yourself mid-session, without reconnecting (7731d99)
Other
- docs(tasks): cost out self-hosting the collab transport (5ec99d7)
v0.64.1 — 2026-08-26
Fixes
- fix(collab): the share panel, the join toast, and pasting a web invite (a42684a)
v0.64.0 — 2026-08-26
Features
- feat(collab): collaboration in the browser (afe3d67)
- feat(collab): build the browser iroh binding, and settle the CSP question (a64deb6)
Fixes
- fix(collab): actually commit the collab wasm artifact (6dcd1b7)
Other
- docs(release): notes for collaboration in the browser (82ede96)
- refactor(collab): put the transport on a runtime seam so a browser can run it (07cd128)
- refactor(collab): make the auth handshake runtime-agnostic (WebCrypto) (f13d15b)
- docs(collab): task 12.8 — session labels carried in the link (48186b1)
- test(collab): prove browser-to-browser, and mark the gap it does not close (0bcc499)
- docs(collab): Phase 12 — hosted collab, and the spike that unblocked it (4defb47)
- docs(tasks): 11.618 shipped in v0.63.2 (ae48b82)
v0.63.2 — 2026-08-26
Fixes
- fix(app): the Role and Functions fields now show what they know (80576df)
v0.63.1 — 2026-08-25
Features
- feat(mcp): tell the client how to use the server, before it asks (4605fb1)
Other
- docs(release): notes for the MCP handshake instructions and kind vocabulary (be34f1a)
v0.63.0 — 2026-08-25
Features
- feat(api): the MCP tools teach the product, not just the contract (0d30c55)
- feat(desktop): watch the open document for changes made by anything else (bafb282)
- feat(api): every result suggests what to call the files (c919f1f)
- feat(app): device role and functions, drawn and reaching every surface (d467c44)
- feat(model): device role and functions — the model, collab and repaint halves (77b214f)
Fixes
- fix(site): a #heading deep link landed behind the sticky header (da5eeba)
- fix(hosting): the Debian mirror is a deploy-time choice (ebd57b6)
Other
- docs(release): notes for the role/functions, file-watch and MCP guidance release (4c0ca03)
- docs(tasks): 11.613 + 11.614 from Discord feedback on the MCP door (fe798d3)
- docs(tasks): 11.612 done — device role and functions (1375da7)
- docs(manual): local models on the MCP page — LM Studio, Ollama, DIY, hosted door (3941791)
- docs: tasks 11.607-11.609 (replicas, scaler, mirror), and the local-LLM MCP cookbook (16da438)
v0.62.1 — 2026-08-24
Features
- feat(hosting): queue-driven autoscaling for the render replicas (a346c85)
- feat(hosting): one render per container — N replicas, MAX_CONCURRENT=1 (8effaf3)
- feat(hosting): go-live wiring — edge, stats and the hosted disclosure (fe83c01)
Fixes
- fix(test): the autoscale shims must beat Git bash's own curl on Windows (e2f32f7)
- fix(test): unblock the v0.62.1 gate — parity is the drawing, fixtures leave RFC 1918 (ffc6627)
- fix(hosting): autoscaler freezes on version skew instead of mis-scaling (5b27dcd)
- fix(stats): the api section's empty state no longer contradicts the Today tile (a858ad8)
- fix(stats): the today block shows API + MCP calls the hour they happen (06e7c68)
- fix(hosting): socat relay — caddy's file caps refuse exec under NNP + cap_drop ALL (0c9427e)
Other
- docs(tasks): v0.62.0 shipped, the hosted door is live (11.604-11.606) (60e632d)
v0.62.0 — 2026-08-24
Features
- feat(hosting): identity, quotas, and MCP over HTTP (11.602) (c8d0b9d)
- feat(hosting): the hardened render service, built dark (11.601) (75899e6)
- feat(api): the local HTTP door + OpenAPI (11.600) (80cccb4)
- feat(mcp): the disclosure — privacy, docs page and manual (11.599) (b3f327d)
- feat(mcp): create_diagram, and the quality bar it had to clear (11.598) (65671ab)
- feat(mcp): export over MCP, and --doc reaches every kind (11.597) (51a668c)
- feat(site): search across /docs/, using the app's own manual matcher (11.603) (642c4f5)
- feat(mcp): describe — the document as structured JSON (11.596) (79e5e80)
- feat(mcp): core API handlers and
Drawbridge --mcpstdio door (11.595) (6421b0f)
Other
- docs(tasks): both front doors — a public API and MCP (11.594, +11.600-11.602) (4852e37)
- docs(tasks): decompose the MCP build into 11.595-11.599 (3004cbb)
- docs(tasks): the MCP decision, and a correction about hosting (11.594) (8cd3126)
- docs(tasks): what an MCP server would mean for the product (11.594) (99b7e51)
- docs(tasks): v0.61.4 released (11.593) (48e58ad)
v0.61.4 — 2026-08-24
Features
- feat(minimap): the overview draws notes, callouts and group frames (11.498, 11.512) (aa25d66)
- feat(marketing): the banner IS the canvas (11.590) (0c5dfba)
- feat(marketing): a profile-picture and banner kit drawn from the app's own art (3e93414)
Fixes
- fix(annotations): a connector annotation's caption takes its colour (11.576) (b6a7372)
- fix(ci): the collab suite gets the release gate to itself (11.582) (e4efd1e)
- fix(connections): naming a ring reveals where its caption goes (11.588) (0dceb94)
Other
- docs(release): the notes for v0.61.4 (3a87703)
- docs(qa): the second directed run before v0.61.4 — REG-05 passes now (11.592) (d202eb6)
- docs(tasks): close 11.498, 11.512, 11.575, 11.576, 11.582, 11.589; file 11.591 (550c849)
- docs(connectors): unlinking leaves the join, and both sides now say so (11.575) (e0a2fb0)
- docs(qa): Setup A's real dismissal, and four gestures that fake a defect (11.589) (a5a5b75)
- docs(qa): the directed run before v0.61.4 (f5a3919)
- docs(qa): the short run's second sitting — exports, pages, shell, REG-23 (c9077d5)
- docs(qa): the post-v0.61.3 short run, and what it found about the suite (2c14550)
- docs(qa): the v0.61.3 release record (9f8fb26)
v0.61.3 — 2026-08-23
Fixes
- fix(branding): the watermark fits the drawing instead of running off it (11.581) (03f9711)
- fix(manual,trail): word-start search, and a closed page is never silent (11.584) (095654d)
- fix(export): the print document carries no style text at all (11.566) (5713a24)
- fix(model): the already-marked placement button clears a dragged caption (11.573) (5887256)
- fix(inspector): a run plus a connector extends the run (11.574) (1f14a43)
- fix(inspector): ring colour asks which ring instead of hiding (11.572) (a9dc04d)
Other
- docs(release): the notes for the six QA fixes (a8fa2e2)
- docs(qa): the pre-v0.61.2 directed run, and the release record (fb9eaca)
v0.61.2 — 2026-08-23
Fixes
- fix(trail,manual): finish 11.565, and undo 11.567's precision regression (7a6bb23)
- fix(trail,manual): a page switch is not a mass delete; city finds cities (b245b8a)
- fix(test): drop an unnecessary cast lint rejected (2a39d70)
- fix(map): Add place… does not join a same-named device layer (5480bde)
Other
- docs(release): the notes match what the fixes actually cover (e5ba5d1)
- docs(release): the v0.61.2 notes (7dd94ab)
- docs(tasks): record the v0.61.1 release (7784a06)
v0.61.1 — 2026-08-23
Fixes
- fix(import): an import is one undo step, title and all (665e41e)
- fix(canvas): a grab halo stays invisible, and handles track the zoom (c2cce14)
- fix(shell): a hidden object leaves the selection, and ⋯ stays usable (2d27bce)
- fix(export): the printed sheet carries the branding (17b3187)
- fix(rack): a mounted unit drags to another U again (c058f09)
Other
- docs(tasks): the stale-knock transport test is 16ms from flaky (9fee436)
- docs(qa): the pre-v0.61.1 directed run, and one observation filed (0855030)
- docs(release): the v0.61.1 notes (efc514c)
- docs(tasks): record the v0.61.0 release (dff695f)
v0.61.0 — 2026-08-23
Features
- feat(shapes): a Shape section for the basic shapes' Dashed and Filled (9bfbcb7)
Fixes
- fix(canvas): a pan must never re-write the zoom, overview included (1f039c9)
- fix(map): place a crowded extent's city names around the cluster (8a20fa9)
- fix(canvas): let Fit go below the zoom floor, but not the buttons (b77b857)
Other
- docs(tasks): renumber three task IDs that were already taken (4ee572e)
- docs(qa): the pre-v0.61.0 full run, and five more findings (24b5a40)
- docs(qa): four findings from the containers and files pass (cc0341d)
- docs(qa): four findings from the containers and files pass (e45ac45)
- docs(qa): four findings from the app-menu and pages pass (9bc10ce)
- docs(qa): two findings from the pre-v0.61.0 full run (f6f40fb)
- docs(release): the v0.61.0 notes (8218193)
- chore(ci): pause the hosted CI gate until 2026-09-01 (c6daaed)
v0.60.2 — 2026-08-23
Fixes
- fix(align): step the gap rank by rank, not box by box (40e4cd8)
- fix(app): empty a generated block instead of removing it (f64459c)
- fix(app): judge the subnet hint on Management IP, not only the label (725b6b2)
- fix(app): boot with local storage denied instead of dying in a dead zone (54b676b)
Other
- docs(qa): the pre-v0.60.2 targeted run, and the release notes (dcdbf8f)
- docs(tasks): record the three product decisions, and file the rule gap (5f6d5e4)
- docs(tasks): record the v0.60.1 release (17eaf1d)
v0.60.1 — 2026-08-22
Features
- feat(keys): bind ⌘B / ⌘I / ⌘U, and make every shortcut platform-correct (11.539) (8136125)
Fixes
- fix(compare): the panel says read-only, so the document is (11.554) (0833701)
- fix(bug-report): one answer to how big an attachment is (11.557) (9b19d74)
- fix(inspector): three from the containers pass — subnet, cities, unit rows (11.553) (6e28c0c)
- fix(bounds): export and fit follow a grown bubble's drawn height (11.558) (26909e2)
- fix(iso): bound a billboarded node as it is drawn, not as a rhombus (11.545) (d8fc62d)
- fix(paint): stop painting labelPos and align where the renderer ignores them (11.535) (96584cc)
- fix(color): one drag is one undo step, and the accents follow the theme (11.486) (1e8cbdd)
- fix(build): stamp the bundle with a date, not a millisecond (11.513) (26f4de8)
- fix(canvas): the resize handles follow the drawn height too (11.547) (2a0eb82)
- fix(schedule): ⌘Z reaches the schedule even when focus never entered it (11.551) (25d453c)
- fix(canvas): the selection ring follows the height a callout is DRAWN at (11.547) (4d36fb2)
- fix(canvas,iso,docs): callouts grow, captions clear the chassis, Space activates, and the QA suite tells the truth (11.489, 11.497, 11.492, 11.337, 11.487, 11.350, 11.360, 11.342, 11.365, 11.490, 11.496, 11.463, 11.538, 11.540) (c014baa)
- fix(store,canvas): the wrong layer was being deleted, and fit-to-view clipped captions (11.440, 11.441, 11.340, 11.341, 11.358) (bc7cda5)
- fix(schedule,links): undo reaches inside the dialog, and a broken link says something a person can read (11.494, 11.495) (8fc9e92)
- fix(collab): a host cannot be read-onlyed by a straggler, and NaN stops at the write side (11.344, 11.349) (84e75d5)
- fix(files,ui): New starts a new file, a refused revision says so, and four smaller lies (11.347, 11.348, 11.493, 11.500, 11.366, 11.363) (75a340b)
- fix(chrome,bug-report): legible under a clamped font, and a report a triager can trust (11.435-11.439, 11.364) (f451810)
- fix(inventory,objects): the CSV lists devices, and the object list sorts A-Z (11.362, 11.443) (e2d8f5e)
- fix(scripts,deploy): one main-module guard, and a scan that cannot abort (11.329, 11.330) (9fe317a)
- fix(drawio): one owner per style key — no kind writes verticalAlign twice (11.332) (ed9566f)
- fix(routing): an annotation is not an obstacle (11.444) (33029c4)
- fix(canvas): the lock holds on racks and zones too (11.338) (9973c59)
- fix(site): inlined markdown is content, not a template (11.352) (732c331)
- fix(clipboard): a copy carries every field of the node it copied (11.462) (810e2b1)
Other
- docs(qa): the pre-v0.60.1 targeted run, and one observation filed (beebafa)
- docs(release): notes for the next release (0ba9084)
- docs(qa): PAL-03 counts thirteen sections, and a test keeps it counting (11.559) (9995669)
- docs(qa): the 2026-08-22 full run — 222 scenarios, no regression, six defects filed (a41651e)
- docs(qa): file the shell/palette findings, and record two traps that cost a lane real time (11.548-11.550) (403771b)
- docs(qa): repair three malformed watchlist rows and two scenario ids that point at nothing (6cc2ad5)
- docs(qa): the 2026-08-22 full run — gate green on all eight legs, scenarios in flight (928551a)
- test(keys): the DOM suite presses the platform's own modifier (11.539) (655eec7)
- docs(tasks): close five tasks whose only remaining value was historical (99b7af4)
- docs(tasks): audit the 80 open tasks against the tree — six were already done (c535b19)
- docs(tasks): 11.531 — v0.60.0 released; the gate's one abort was the test budget, fixed (1714adb)
v0.60.0 — 2026-08-21
Features
- feat(connectors): an Auto cable leaves within the middle half of a side (11.519, 11.520) (43dbfb9)
Fixes
- fix(connectors): a direct run's corner is the average, not the intersection (11.529) (f0fe9b7)
- fix(connectors): weld run corners on the routed geometry, not the ideal (11.528) (66ad3c8)
- fix(connectors): trim the corner overshoot, derive the missing side (11.527) (6dd46e2)
- fix(connectors): tiles touching edge-to-edge no longer collapse the pair onto one line (11.526) (40e4049)
- fix(connectors): a straight-through run is a straight line (11.525) (78c7352)
- fix(connectors): a run's corner is the true intersection of its two lanes (11.524) (05049ff)
- fix(connectors): the lane moves the whole route, spaced alike on both axes (11.523) (2ac065f)
- fix(connectors): the clamp scales a side's whole fan instead of piling it up (11.522) (6786890)
- fix(connectors): a parallel pair keeps the same lane at both ends (11.521) (b88f841)
- fix(connectors): two parallel Auto cables never coincide (11.521) (79c2d04)
- fix(connectors): the corner's real branch — a 64px tile misses a 28px cap (11.518) (36ffa36)
Other
- test: subprocess tests in ci-linux.test.ts get a load-proof budget (4242032)
- docs(release): the day's routing work, in the notes (7584ed2)
- style: no assertions in the weld terminal reader (03e722f)
- style: eslint --fix on the weld pass (non-nullable assertions) (a61da2f)
- docs(tasks): 11.517 — v0.59.1 released, third billing abort in a row (aae04e6)
v0.59.1 — 2026-08-21
Fixes
- fix(connectors): a linked run's corner, and the overview that was an edit behind (11.515, 11.516) (b9f5401)
Other
- docs(tasks): 11.514 — v0.59.0 released, and the pre-flight skipped on evidence (1b76932)
v0.59.0 — 2026-08-21
Features
- feat(connectors): a cable run acts as one cable (11.507) (d5796b4)
- feat(connectors): two runs through one icon run parallel, not knotted (11.507) (6bdb83a)
- feat(connectors): cable runs — link connectors into one line (11.507, WIP) (d4546e9)
- feat(updates): the offer says what is coming, and hands out the newest (11.503) (cb279e3)
Fixes
- fix(connectors): crossings always bump, and a through cable's own ends stay on the border (11.510, 11.511) (379a6b5)
- fix(connectors): if cables cross, they bump — no silent exceptions (11.510) (16439b0)
- fix(connectors): the bend always closes, and an icon can cover a through cable (11.509) (703a0e5)
- fix(connectors): lanes get their own pins, and runs nest at corners (11.508) (23b60fb)
- fix(connectors): three cables between one pair, three visible cables (11.506) (03f3f3f)
- fix(connectors): a through cable keeps the icon's centre, whatever runs beside it (11.506) (16cf3dc)
- fix(connectors): two through cables turning a corner read as one line (11.504) (9b09995)
Other
- docs(qa): the pre-v0.59.0 FULL run, its two findings, and the last release notes (bc221a1)
- docs(tasks): 11.507 — cable runs, the product decision and the design sketch (98245c8)
- docs(qa): the pre-v0.59.0 targeted run, and 11.506 from it (4abdcf4)
- ci: the Windows leg runs locally, on a real machine over ssh (11.505) (c32002e)
- docs(tasks): 11.502 — v0.58.0 released, and the deploy trigger's fallback exercised (25a2421)
v0.58.0 — 2026-08-20
Features
- feat(app): cables that run through the icons, and a colour picker (11.483–11.486) (67e4bc0)
Fixes
- fix(inspector): every row of the colour sheet reads as a row (11.488) (a40f008)
- fix(inspector): the colour picker's hex field shows the selection's colour (11.484) (491b6de)
Other
- docs(qa): the pre-v0.58.0 targeted run, and 11.497–11.501 from it (dff6d8c)
- docs(tasks): 11.492–11.496 — what the connector QA pass found (4d7cf1f)
- docs(tasks): 11.487 — updateHover reads the canvas rect twice per move (3fb4a38)
- docs(release): notes for the through connectors, the colour picker and the painter fix (5ddf4bf)
- build(ci): cut the hosted run to what it alone can answer (11.480) (5081550)
- build(ci): run the Linux leg locally, and trim hosted CI to what this Mac cannot do (11.479) (7bbd77d)
- docs(tasks): 11.478 — v0.57.3 released, cross-OS gap recorded (d71a6d2)
v0.57.3 — 2026-08-20
Fixes
- fix(toolbar): Import and Export fold together, because now something makes them (11.476) (e7de27a)
Other
- docs(tasks): 11.477 — the 4-second billing aborts are back and blocked v0.57.3 (f0d6e8f)
- docs(release-notes): Import and Export fold together, for the next release (bb3c737)
- docs(tasks): 11.475 — tag run read, green on all four jobs (f18b1de)
- docs(tasks): 11.475 — v0.57.2 released; 11.476 — toolbar sheds Import, keeps Export (e3543e7)
v0.57.2 — 2026-08-20
Fixes
- fix(canvas): a Direct crossing bumps unless the device itself hides it (11.472) (e0b38ed)
Other
- build(release): give dmgbuild longer to detach its staging volume (11.473) (01595c1)
- docs(release-notes): the crossing-bump fix, for the next release (3a6c7aa)
- docs(tasks): 11.471 — v0.57.0 released; first publish exited 0 and did nothing (7c18f0f)
v0.57.0 — 2026-08-18
Features
- feat(layers): choose the layer you are drawing on, and never land out of reach (11.470) (fed4458)
- feat(canvas): a cable and its annotations follow their layer (11.442) (69975bb)
- feat(canvas): layers decide what is on top, and Send to back means it (11.442) (8e10b46)
- feat(site): the feedback form asks WHERE to reach you, not just for an email (11.469) (3c98c80)
Other
- docs(tasks): 11.468 — re-verify on a fresh v0.56.0 build; first repro was stale (e3ea6f0)
- docs(tasks): 11.469 deployed to the live site and verified there (087cbdd)
- docs(tasks): 11.468 — layers don't work around it either, proven by probe (25886fe)
- docs(tasks): file 11.468 — an image can never be put behind a connector (issue #21) (6292ac1)
- docs(tasks): v0.56.0 released and verified end to end (11.465) (5a5de32)
v0.56.0 — 2026-08-18
Features
- feat(shapes): the line and the arrow behave like connectors (11.433) (1f76153)
- feat(layers): hidden means hidden, locked means locked, and the list reads top-first (11.430) (e386c77)
- feat(search): ship our own clear ✕ on every search field (11.432) (7d4dc75)
Fixes
- fix(tests): two guards from the 11.430-11.433 batch only passed on macOS (11.466, 11.467) (4d9b50e)
- fix(review-a): connector gestures — the drag issues the drop's commands (11.447, 11.448, 11.452, 11.457, 11.458) (15ea627)
- fix(review-b): geometry writes re-seat fastened ends; four lock refusals; line inspector controls (11.449–11.451, 11.453, 11.454) (3504b7d)
- fix(review-c): format-paint size trade, view switches, ingestion invariants, IME Escape (11.446, 11.455, 11.456, 11.459) (7084ef6)
- fix(palette): degrade gracefully under foreign font metrics (11.431) (cfcc62b)
Other
- docs(release): notes for v0.56.0; fix a lint error the fix pass left on main (950bf2d)
- docs(tasks): tick 11.446–11.459 — the review fix pass is merged; file 11.461–11.463 (d85a1c6)
- test(inspector): a line's caption buttons write, not merely show (11.447+11.451 seam) (c78af66)
- docs(tasks): file the 11.430–11.433 code-review findings as 11.446–11.460 (c33c5d9)
- docs(tasks): 11.430–11.433 shipped by four Opus 5 workers; 11 findings filed as 11.435–11.445 (a45a7fd)
- chore(e2e): make dev-server ports env-overridable for parallel worktrees (cd35b04)
- docs(tasks): file 11.434 — v0.55.0 shipped through the outage; add worker agent definition (b61362e)
v0.55.0 — 2026-08-17
Features
- feat(groups): tab strip on one line, canvas name labels, auto-naming (11.426–11.428) (9b2cf02)
Fixes
- fix(e2e): title-block divider spec measures with one stick — closes 11.429 (c2cf485)
Other
- docs(tasks): 11.433 — user summary is the spec; recording is optional background (05878b1)
- docs(tasks): file 11.433 — line and arrow should behave like connectors, not squares (e301ccd)
- docs(tasks): file 11.432 — icon-search clear button is the browser's own; ship a real one (9294625)
- docs(tasks): 11.430 gains the popover dismissal finding — canvas clicks must not close the Layers panel mid-flow (4f4324e)
- docs(tasks): 11.430 gains the locked-layer delete bug — lock must disable the popover's delete (1b46843)
- docs(tasks): 11.430 gains the hidden-layer adornment bug — port labels and ring markers survive hiding every layer (875aead)
- docs(tasks): file 11.431 — left palette breaks under foreign font metrics (9c7b778)
- docs(tasks): file 11.430 — validate layers, top-first dropdown order, drag-to-reorder (1ba95dc)
- docs(release): notes for the groups polish (b479dad)
- docs(tasks): file 11.429 — title-block divider e2e red on main after 11.426 merge; do not release until green (3d075fb)
- docs(tasks): file 11.425 — v0.54.0 shipped; tag CI run read, green (9371d04)
v0.54.0 — 2026-08-17
Features
- feat(groups): named groups and a Groups inspector tab (11.423) (0d83abf)
- feat(align): space evenly per row, and a gap stepper (11.416–11.422) (b6dd256)
Fixes
- fix(export): print-iframe styles survive the production CSP (11.424) (1417303)
Other
- docs(release): notes for the PDF export fix and the Groups view (7102ee5)
- docs(tasks): v0.53.5 tag CI run read — green on all four jobs, 227 e2e (8ed80f8)
- docs(tasks): file 11.414 — an undeclared access-pair ISL demotes a declared tier-1 peer (c9b1c4e)
v0.53.5 — 2026-08-17
Fixes
- fix(import): read FortiLink dumps from stacks whose switches have names (11.413) (4f19ec5)
Other
- test(import): drive the real Import dialog with a named FortiLink stack (11.413) (5d96d33)
- docs(tasks): pin how long the named-stack import was broken — 53 releases (11.413) (c0dfb25)
- docs(tasks): v0.53.4 tag CI run read — green on all four jobs (11.412) (8e70415)
- docs(tasks): v0.53.4 shipped — the toolbar arranged by purpose (11.412) (9cee802)
v0.53.4 — 2026-08-17
Other
- refactor(toolbar): group the top bar by purpose (11.411) (c5a8590)
- docs(tasks): v0.53.3 shipped — the label-wrap bound, proven on the tag run (11.410) (c37f8a4)
v0.53.3 — 2026-08-16
Fixes
- fix(labels): recalibrate the wrap bound from CI, not from one platform (11.407) (3887631)
- fix(labels): make the wrap table an upper bound, measured (11.407, 11.409) (274d9d5)
Other
- docs(release): notes for the label-wrap bound fix (014404f)
- docs(tasks): 11.407 confirmed green on the runner that failed it (449109b)
- docs(tasks): v0.53.2 shipped, and the tag run read (11.408, 11.409) (f47f482)
v0.53.2 — 2026-08-16
Fixes
- fix(tests): LABEL-06 sentence measured against Linux font metrics (11.407) (3d719ca)
Other
- chore(naming): vendor names only where vendor functionality lives (11.406) (c269c83)
- docs(tasks): v0.53.1 tag CI run read — green on all four jobs (11.405) (16cfcf4)
- docs(tasks): v0.53.1 shipped — the carry-forecast repair, verified live and installed (f0d82d9)
v0.53.1 — 2026-08-16
Fixes
- fix(canvas): the carry forecast dims what stays behind, and the inspector counts it (11.404) (6c9f014)
- fix(canvas): show what a selected container leaves behind, not a pin on every detached object (11.403) (53acde7)
Other
- docs(tasks): v0.53.0 shipped — the zone feedback round, verified live and installed (4162e24)
v0.53.0 — 2026-08-16
Features
- feat(canvas): containers carry by keyboard and Align, and objects can be detached (11.397-11.399) (a84ef69)
- feat(stats): graphs of downloads and app usage over time, all-time retention (11.396) (57c892f)
Fixes
- fix(stats): the app chart claimed a fixed order between opens and addresses (11.396) (5ca41e1)
- fix(stats): say where the release markers run out (11.396) (ded37c1)
Other
- docs(release): notes for the zone carry fixes and the detach mark (bcccff8)
- test(qa): the 2026-08-16 run — report, the export guard, and a stale catalog count (11.400) (97594a9)
- docs(tasks): v0.52.0 shipped — the six fixes, verified live and on the packaged app (c41f2ca)
v0.52.0 — 2026-08-15
Fixes
- fix(legend,manual,fonts,qa): the five open findings, plus one found verifying (df808fc)
Other
- docs(tasks): v0.51.0 shipped — the fixes the QA run paid for (1881d96)
v0.51.0 — 2026-08-15
Features
- feat(files): dropping a .drawio or .vsdx on the canvas opens it (11.387) (3adf70f)
Fixes
- fix(manual): render emphasis, and recurse into bold (11.361, half) (43438de)
- fix(iso,layers): cable captions read forwards, and hide with their layer (11.354, 11.385, 11.346) (29f6f22)
Other
- docs(release): v0.51.0 notes — the file drop and three label fixes (fc4cffa)
- docs(qa): fold three duplicate findings back into the tasks that already had them (1388a2d)
- docs(qa): v0.50.0 run finished at 39/204 — five CSV/DOT exports verified, PDF blocked (607ea0b)
- docs(qa): v0.50.0 run continued — 34 scenarios by hand, 5 findings, one systemic (20bc492)
- docs(qa): v0.50.0 full run — 3 findings, and the harness that nearly faked three more (e5e17b4)
- docs(tasks): v0.50.0 shipped — three bundled typefaces and the font drop-down (73477d4)
v0.50.0 — 2026-08-15
Features
- feat(fonts): three bundled typefaces and a typeface drop-down (11.379) (c8c2382)
Other
- docs(tasks): v0.49.0 shipped — font repaint, the whole format painter, opacity (6a438d3)
v0.49.0 — 2026-08-14
Features
- feat(shapes,zones): opacity, in all four homes at once (11.377) (670f303)
- feat(format-paint): carry the whole formatting, and end the forgotten-list pattern (11.376) (d6b27ea)
Fixes
- fix(canvas): changing the font repaints text you already wrote (11.375) (ce38f60)
Other
- docs(release): v0.49.0 notes and the census re-verification (4e346be)
- docs(tasks): v0.48.0 shipped — typography and basic shapes, verified end to end (0bd0547)
v0.48.0 — 2026-08-14
Features
- feat(drawio,vsdx): basic shapes and typography through both file formats (11.372, 11.373) (ff34d6c)
- feat(shapes): eight resizable basic shapes, parametric rather than iconic (11.373) (3e8f2dd)
- feat(app): typography controls, and rename FontFace before it bites (11.372) (c8cacee)
- feat(drawio): typography through the codec, keeping the bits we do not own (11.372) (790583a)
- feat(render): paint typography, and teach the wrapper that it changes metrics (11.372) (9f90c7c)
- feat(model,collab): typography fields, and a guard for the seam that had none (11.372) (3fe10b4)
Other
- docs(release): v0.48.0 notes, and the licence census a minor requires (2435bac)
- docs(qa,manual): scenarios, manual paragraphs and traceability for both features (d4ea0d8)
- docs(tasks): record the typography and basic-shapes product decisions (11.372, 11.373) (6e3625c)
v0.47.2 — 2026-08-14
Fixes
- fix(electron): overlapping saves no longer fail on Windows with EPERM (11.370) (3dfcb26)
Other
- ci(release): hosted CI gates the release instead of reporting on it (11.371) (7c3331f)
- docs(release): notes for the Windows overlapping-save fix (975b9ff)
- docs(tasks): 11.370 — overlapping saves can fail on Windows with EPERM (ba2b6d9)
- docs(tasks): v0.47.1 shipped — the palette scrollbar fix, verified end to end (e623472)
v0.47.1 — 2026-08-14
Fixes
- fix(app): the palette's scrollbar no longer shrinks the palette (11.368) (bea0189)
Other
- docs(release): notes for the palette scrollbar fix (c155a79)
- docs(tasks): v0.47.0 shipped — the 2026-08-13 review closed, 13 QA findings filed (017f669)
v0.47.0 — 2026-08-13
Fixes
- fix(routing,site,deploy,docs): close the last fifteen review findings, including the one that routed cables through devices (11.274, 11.308-11.311, 11.314, 11.316, 11.317, 11.319, 11.320, 11.323, 11.325, 11.327, 11.328, 11.331) (70f5048)
- fix(app,routing,electron): eighteen robustness and performance defects, with the numbers (11.278, 11.286, 11.288-11.298, 11.302, 11.303, 11.313, 11.315, 11.324) (ad1f47a)
- fix(store,collab,electron,export): close seven model and boundary defects, and the credential window one of them opened (11.275, 11.276, 11.282, 11.284, 11.285, 11.287, 11.312) (72f5f3e)
- fix(interactions,canvas): the lock holds on the way in, a focused control owns its keys, and captions keep their scale (11.279, 11.280, 11.281) (459daea)
- fix(drawio,vsdx,diff): stop the file round-trip losing fields it was told to keep (11.277, 11.283, 11.299, 11.300, 11.304, 11.305) (71107b6)
- fix(release,deploy): close the six ship-path checks that reported success while doing nothing (11.301, 11.306, 11.307, 11.318, 11.321, 11.322) (b8951c5)
Other
- docs(release): v0.47.0 notes, refreshed licence census, and the pre-release QA run (c15390e)
- docs(review): file the 2026-08-13 full-tree code review as tasks 11.273-11.328 (8233f1c)
- docs(tasks): 11.271 and 11.272 shipped in v0.46.0 (0599b16)
v0.46.0 — 2026-08-12
Features
- feat(palette): one control for every map, and a tool row that reads right (11.271, 11.272) (2fa2874)
- feat(stats): backfill three weeks the aggregator never recorded (11.266, 11.267) (f8e687d)
- feat(stats): count builds picked up, chunks loaded and /app errors (11.262-11.264) (cdf5a56)
- feat(stats): count the bytes the release files cost, and what checking them costs us (11.261) (68e42c8)
Fixes
- fix(stats): take our own release checks out of the history too (11.270) (9cccce2)
- fix(stats): name both causes of a 4xx, and ship the tile that never rendered (11.268, 11.269) (04e6700)
- fix(stats): say plainly that the chunk table measures installs, not feature use (11.265) (085ff02)
- fix(stats): stop counting our own release verification as downloads (11.258) (8ea85b9)
- fix(stats): refresh the code figures and wire the generator to both publish paths (11.257, 11.259, 11.260) (b12e147)
Other
- docs(tasks): record 11.270 — the history is robot-free too (66e9027)
- chore(stats): commit the code.json the site deploy regenerated (65be518)
- chore(stats): commit the code.json the site deploy regenerated (a536433)
- chore(stats): commit the code.json the site deploy regenerated (20cd9ee)
- chore(stats): commit the code.json the site deploy regenerated (bb83e29)
- chore(stats): commit the code.json the site deploy regenerated (fbc5d1f)
- docs(tasks): record 11.261 shipped — the download bytes are 15x the app's (4d489f0)
- chore(stats): commit the code.json the site deploy regenerated (25b3baf)
- docs(tasks): record 11.258 shipped — the release robot is out of the download counts (390ba69)
- chore(stats): commit the code.json the site deploy regenerated (8370c30)
- chore(stats): commit the code.json the site deploy regenerated (11.257) (82b0c73)
- docs(tasks): record v0.45.3 shipped — the inspector's height is a constant (d658483)
v0.45.3 — 2026-08-10
Fixes
- fix(inspector): pin the section-heading line-height; unbreak the red tag run (11.256) (6452b44)
Other
- docs(release-notes): the minimap keeps its corner a little longer (11.256) (461a031)
- docs(tasks): 11.256 verified green on the runners (dispatched CI run) (ffe37f5)
- docs(tasks): record v0.45.2 shipped — one set of sizes across the app (1aa382e)
v0.45.2 — 2026-08-10
Fixes
- fix(ui): one size per control across the dialogs, inspector and palette (11.255) (5ceb879)
- fix(toolbar): one row treatment across every menu (11.254) (7d68f0d)
Other
- docs(tasks): record v0.45.1 shipped — menus open under their button (f3539ac)
v0.45.1 — 2026-08-10
Fixes
- fix(toolbar): menus hang under the button that opened them (11.253) (be00191)
Other
- docs(tasks): record v0.45.0 shipped — the Blocks menu is three switches (00cc38f)
v0.45.0 — 2026-08-10
Features
- feat(blocks): the Blocks menu is three switches, and it stays open (11.252) (03ac1b4)
Fixes
- fix(test): point the draw.io compat spec at the Blocks switches (11.252) (a688327)
Other
- docs(tasks): record v0.44.0 shipped — remove a block from the Blocks menu (6a3e0a9)
v0.44.0 — 2026-08-10
Features
- feat(blocks): remove a block from the Blocks menu, not the canvas (11.251) (496a831)
Other
- docs(release-notes): remove a block from the Blocks menu (11.251) (f5d3ec3)
- docs(tasks): record v0.43.1 shipped — one toolbar menu at a time (c5af59a)
v0.43.1 — 2026-08-10
Fixes
- fix(toolbar): one menu at a time — opening one closes the one already open (11.250) (a3cc663)
Other
- docs(tasks): record v0.43.0 shipped — the View menu (df37348)
v0.43.0 — 2026-08-10
Features
- feat(view): a View menu — toggle labels and objects behind the toolbar eye (11.249) (666e225)
Other
- docs(tasks): record v0.42.0 shipped — the SD-WAN generator wires every box (d1b9c31)
v0.42.0 — 2026-08-10
Fixes
- fix(sdwan): arch the non-facing inter-region tunnels over the hub row (11.248) (ae5442e)
- fix(sdwan): wire every box, and add an overview detail level (11.246, 11.247) (6af333e)
Other
- docs(release): the SD-WAN generator wires every box, and draws less when you ask (146520b)
- docs(tasks): record v0.41.1 shipped — the overview map fixes and the import-paste dialog (9ef3d91)
v0.41.1 — 2026-08-10
Fixes
- fix(minimap): draw the routed path and the link type, not a straight hairline (11.245) (3524d3f)
- fix(minimap,dialogs): draw the overview for very large imports; keep a paste when its rows are edited (11.242, 11.243) (e8b7e52)
Other
- docs(release): the overview map fixes and the vanishing import paste (a21f0b4)
- build(beta-bundle): refuse to package a dmg older than the source (11.244) (53cf761)
- docs(tasks): record v0.41.0 shipped — the performance chain + CI-flake fix (f466def)
v0.41.0 — 2026-08-10
Features
- feat(routing): cluster-local routing ships — per-edit reroutes at island cost (11.241) (bda0a30)
- feat(routing): ClusterRouter M1 — per-cluster child routers, identity-tested (11.241) (7134498)
- feat(routing): adaptive drag-hold keeps route-heavy drags smooth (11.239) (aa0da25)
- feat(routing): staged full quality off the main thread, with old-vs-new bench (11.237) (194f7bd)
- feat(publish): refuse to release without 20% free on the host (11.236) (5296bcb)
- feat(updates): the amber panel says what is in the update it offers (11.233) (78c867d)
Fixes
- fix(publish): require 20 GB free, not 20% (11.236) (21957b1)
- fix(publish): survive the deploy race, and recover without a wasted version (11.235) (75bb203)
Other
- ci(collab): run the collab suite one file at a time to end the tag-run flake (11.228) (4365f44)
- docs(ai-qa): pre-release run report for the performance chain — shippable pending human list (f9b751d)
- docs(release): Unreleased covers the whole performance chain (11.223–11.241) (372e338)
- docs(tasks): 11.241 go-ahead — design settled, milestone/resume checklist opened (21ad269)
- perf(canvas): segment-grid jumps, fan jump-exemption, nudge-run hold (11.240) (ed6e48b)
- perf(canvas): line jumps off the per-edit critical path (11.238) (a6ed5ce)
- docs(tasks): record the evaluation findings — jumps outcost routing per edit (11.238), drag-feel decision (11.239) (b92085a)
- perf(routing): hub-fan bypass keeps huge documents routable (11.223) (537a416)
- docs(tasks): correct the collab-CI evidence — two tag runs never ran the step (416c75b)
- docs(tasks): record the publish 502 race and how v0.40.1 was recovered (11.235) (900dec9)
v0.40.1 — 2026-08-09
Fixes
- fix(tests): the upright-window check no longer times out on CI runners (11.234) (8ba2974)
v0.40.0 — 2026-08-09
Features
- feat(about): What's new — this version's release notes, in the app (11.232) (6dd2004)
v0.39.0 — 2026-08-09
Features
- feat(map): country and state maps stand upright — re-projected on their own meridian (11.231) (f8b13c6)
- feat(app): rename Add country… to Add place… — the picker holds US states too (11.230) (6fca6e2)
v0.38.0 — 2026-08-08
Features
- feat(map): no key below 0.9 without a named physical reason — median IoU 0.981 (11.229 second pass) (fcba969)
- feat(map): the whole world regenerated from Natural Earth 10m, topologically — 56 new countries, states matched (11.229) (64aa5dc)
Other
- docs(tasks): 11.228 — v0.37.0 CI green on third attempt, evidence appended (914b20f)
- ci: retry the isolated real-endpoint collab suite once; record 11.228 triage (8224318)
v0.37.0 — 2026-08-08
Features
- feat(map): geometry verified against Natural Earth, US states as countries, top-ten cities (11.225–11.227) (b91606c)
Other
- chore(docs): prettier pass on the map verification run report (e43f13d)
- test(qa): IMPORT-07 — the 586-device hub-and-spoke import becomes a scenario (11.224) (7030ff0)
- docs(tasks): 11.223 — hub-and-spoke routing at import scale measured, mitigations sized (e1dc12b)
v0.36.1 — 2026-08-07
Fixes
- fix(legend): a flow arrow is not a device symbol — no legend row (11.222) (fd37ca3)
Other
- docs(tasks): 11.220 + 11.221 closed — shipped in v0.36.0 (f74b82f)
v0.36.0 — 2026-08-07
Features
- feat(flow): standalone flow arrow annotation — drag-to-draw, connector-grade labels, in-plane isometric (11.220) (009aeab)
Fixes
- fix(export): PDF always prints the light theme — a dark editor exported black boxes (11.221) (47762b7)
Other
- docs(tasks): 11.218 + 11.219 closed — shipped in v0.35.0 (d16a75f)
v0.35.0 — 2026-08-07
Features
- feat(palette): ★ Favorites section + toolbar Quick menu, individually configurable (11.219) (79681df)
Fixes
- fix(text): a text block's writing follows its box — wrap at width, re-flow on resize (11.218) (483c19d)
- fix(shapes): the malicious file owns the word 'malware' (11.217); QA delta run for v0.33.0–v0.34.1 (dfb66d0)
- fix(optics): a User group buys no module (11.214); watchlist rows for the 0.34.1 collab fixes (bd79b6b)
Other
- docs(release): unreleased note for the text-block wrap fix (11.218) (e82a559)
- docs(tasks): 11.209 — 300/300 quiet soak green post-MIGRATE_ACK; loaded overnight soak is the decisive test (6e05b4f)
v0.34.1 — 2026-08-07
Fixes
- fix(collab): MIGRATE_ACK + AUTH_PENDING ordering; ci: prune artifact storage every run (11.215) (044fc95)
Other
- ci: run the real-endpoint collab suite as its own step (11.215) (acf8e9f)
- docs(tasks): 11.215 falsifier fired on the v0.34.0 tag run — flush width was not the mechanism; MIGRATE_ACK is the fix to evaluate (d393e22)
- docs(tasks): 11.216 shipped in v0.34.0 (c3e3a89)
v0.34.0 — 2026-08-07
Features
- feat(shapes): colour carries the verdict; attack vocabulary under one heading (11.216) (47fadd8)
Fixes
- fix(collab): make the close-flush bound injectable; widen it in tests (11.215) (d84a3ec)
Other
- docs(tasks): 11.215 — first tag-fired CI run verified; one relay-flaky transport test (11.212 follow-up) (af15554)
- docs(tasks): 11.213 shipped in v0.33.0 — downloads and linux artifacts verified (a8503dc)
v0.33.0 — 2026-08-07
Features
- feat(shapes): attack-flow shapes — attacker, home, verdict trios, infected laptop (11.213) (d922b2c)
Fixes
- fix(ci): pin LF for the whole tree — windows runners check out CRLF (11.211) (32f2ff8)
Other
- docs(tasks): CI round 3 blocked by the storage-overage recalc window (11.212) (da7451a)
- test(ci): normalize --list paths on windows; make CI uploads advisory (11.212) (f50f18a)
- test(ci): make the suite honest across the OS matrix (11.212) (8918f44)
- ci: fire on tags + dispatch only, drop the macOS leg (11.210) (7ffdcaf)
- docs(tasks): 10.46 fixes shipped in v0.32.3; 11.209 notes the release (469cc27)
v0.32.3 — 2026-08-06
Features
- feat(labels): an inside caption overhangs whole instead of breaking mid-word (11.199) (fc05ed9)
Fixes
- fix(collab): hand-over survives an early peer close, and a dial is bounded (10.46) (46631a2)
- fix(files): New resets the view to 100% (11.207) (f80712e)
- fix(import): a skipped line is reported once, not once per defect (11.206) (ed55561)
Other
- docs(release-notes): the 10.46 hand-over fix, in the user's terms (eaf94f9)
- docs(tasks): close 11.193/11.194 (stale checkboxes), 11.204-11.208; suite lessons into SELECTORS.md; 10.46 hunt note (ad65b3c)
- docs(ai-qa): 2026-08-06 agent full run on v0.32.2 — findings filed as 11.204–11.208 (44cf578)
- style: prettier pass on the 2026-08-06 run report (5ae732f)
- docs(ai-qa): full gate + browser verification run 2026-08-06 — 14/14 green (aa80aaf)
- docs(tasks): 11.203 shipped in v0.32.2 (3ad1e2d)
v0.32.2 — 2026-08-06
Fixes
- fix(files): New gives you a genuinely new document (11.203) (1af1705)
Other
- docs(tasks): 11.201 and 11.202 shipped in v0.32.1 (9ac9a66)
v0.32.1 — 2026-08-06
Fixes
- fix(canvas): the font size now reaches every object that offers it (11.201) (5bab2ba)
v0.32.0 — 2026-08-06
Features
- feat(editor): document text scale, per-object override, and Update all (11.198) (ff441fc)
Fixes
- fix(ui): the document text scale was filed under Branding (11.200) (54e1e45)
- fix(canvas): Alt-drag moves a container alone, and the carry respects layers (11.195, 11.196) (73cdc8f)
- fix(canvas): the ring caption's Above rendered below, and Below above (11.197) (0602be2)
- fix(site): the docs sidebar scrolls itself (11.192) (39642b0)
Other
- docs(release): notes for the text scale, zone carry and ring label release (545998e)
- docs(tasks): font-size inventory and the zone carry findings (11.193-11.196) (78bb2ff)
- docs(tasks): 11.192 is live on the site (db66fb4)
- perf(test): run tests within a file in parallel too (11.185) (35eab1d)
- docs(tasks): the publish is 5m04s, measured on v0.31.0 (11.181) (62b5c8c)
v0.31.0 — 2026-08-06
Features
- feat(toolbar): the page is named in one place, not two (11.190) (ba4e450)
Fixes
- fix(release): the gate's own cleanup test was flaky (11.186) (259c5ca)
- fix(release): the ssh control socket was too long to open (11.187) (4a430c8)
Other
- docs(release): notes for the next version (4583369)
- perf(release): overlap the publish steps that share no resource (11.181-11.191) (f3ef9d7)
v0.30.0 — 2026-08-06
Features
- feat(shapes): PAM and User group, two new icons (11.180) (17dc4ee)
v0.29.0 — 2026-08-06
Features
- feat(layers): mark the selection's layer and refuse the move that does nothing (11.31) (8d65e8f)
- feat(deploy): hold the site's download history to 10 versions (11.50) (f88555a)
Fixes
- fix(feedback): one honest answer to "how big is this file" (11.179) (640b53f)
Other
- docs(tasks): attachment uploads are live and verified (11.12) (56572be)
- docs(edge): replace the Server banner on our vhost only (11.55) (bcc625b)
- test(dot): close 11.177 — fontname is irrelevant, the warning is the engine (2eb0632)
- test(iso): guard rack paint order; close 11.15 as not reproducible (7bd6495)
v0.28.0 — 2026-08-05
Features
- feat(palette): every shape hands you its DOT name (11.60) (575121c)
- feat(toolbar): collapse the wordmark to the mark before stashing controls (11.178) (2499ce7)
Fixes
- fix(toolbar): ellipsise the document title instead of slicing a glyph (10.34) (dd6f0c5)
- fix(dot): newrank=true, so Graphviz stops dismantling our own clusters (11.84) (3244f9c)
- fix(collab): say "Waiting to be let in", not "Reconnecting" (11.176) (6eaf5c4)
- fix(collab): flush the verdict before closing, so a rejected joiner is told why (11.175) (af66d44)
- fix(deploy): pin /app/* to the image so a site deploy cannot ship it (11.48) (dd60260)
Other
- docs(tasks): remeasure 11.50 — the host volume was grown, 91% is stale (b61684a)
- docs(deploy): the config-only deploy needs --force-recreate (11.173, 11.174) (170c927)
v0.27.1 — 2026-08-05
Fixes
- fix(collab): a stale knock no longer evicts a live one (11.134) (1fab4ee)
- fix(hygiene): navigation origin, teardown, IPC shape checks, repaint (11.135-11.138, 11.144, 11.146) (994cd36)
- fix(files): bound character refs, keep speed spelling, export the registries (11.149-11.151) (30b2050)
- fix(canvas): reveal a paste using the viewport rect, not client corners (11.142, 11.143, 11.145) (2bd84c7)
- fix(collab): a kicked peer must knock again after Regenerate link (11.133) (5eb9d7e)
- fix(files): drop XML-invalid characters on save; validate vsdx ids (11.148, 11.147) (ed4c44b)
- fix(select): geometric selection respects locked and hidden layers (11.139-11.141) (bcd36d3)
- fix(collab): a view-only guest stays view-only across a hand-over (11.132) (2d33ea1)
- fix(stats): say what the address count counted (11.130) (0548998)
- fix(publish): verify downloads AFTER the deploy settles, and retry 502s (11.129) (6d27953)
Other
- test: close the four missing guards found by the pre-release QA (11.142-11.146) (6b2ad20)
- docs(release): notes for the code-review fixes (878f9b0)
- docs(tasks): record the 11.169 decision (028e20d)
- refactor(origin): cross-reference the three site-origin declarations (11.169) (497891f)
- docs(deploy): give the stats validator a runbook entry (11.172) (a3d84af)
- build(electron): stop packing already-bundled deps into the asar (11.166) (b9deadc)
- test(qa): a hostile .vsdx fixture and the FILE-11 scenario (11.170) (5bea430)
- chore(deps): caret the cross-env pin, and resync the lock (11.167) (52c3c5e)
- docs(licenses): regenerate the census against the real tree (11.168, 11.171) (c360af0)
- chore(cleanup): remove dead code found by the review (11.152-11.165) (044b53f)
- docs(review): full-repo code review findings as tasks 11.131-11.169 (6493e39)
v0.27.0 — 2026-08-04
Features
- feat(branding): watermark, background logo and classification (11.114-11.118) (eba83dd)
- feat(publish): verify every artifact downloads intact (11.127) (5f8503e)
Other
- docs(release): notes for enterprise branding and smaller revisions (4ac8c59)
- perf(revisions): hold each embedded image once per file (11.122) (fc0d6de)
- test(compat): open our .drawio in the real draw.io, every release (11.128) (88e77b6)
- docs(tasks): record v0.26.0 as shipped (11.107-11.126) (193c0bd)
v0.26.0 — 2026-08-04
Features
- feat(toolbar): Revisions replaces Compare with…, which is removed (11.123) (0580cb1)
- feat(files): save a revision of a drawing and load it back (11.121) (a54565a)
- feat(editor): a title block, so a drawing says who made it (11.107-11.113) (56e378a)
Fixes
- fix(title-block): column dividers, because the handles were unfindable (11.126) (fd64cdb)
- fix(revisions,title-block): give revisions an identity; stop cells escaping (475d81b)
- fix(title-block): label the revision row, and make revisions manual (11.120) (feeedbd)
- fix(inspector): stop offering controls the generated blocks throw away (11.119) (eadb20f)
Other
- docs(release): notes for the title block, revisions and the Blocks menu (1b1d1da)
- refactor(toolbar): Revisions joins the File group, Blocks menu shortened (11.124) (32a514b)
- refactor(toolbar): one Blocks menu for the three generated blocks (11.124) (71b6d5c)
- docs(tasks): plan the title block (11.107-11.113) (0dac39d)
- docs(tasks): record v0.25.0 as shipped (11.100-11.106) (f5636fa)
v0.25.0 — 2026-08-04
Features
- feat(canvas): even-spacing guides, and a country map you can put sites on (11.102, 11.104) (08cf3e0)
- feat(connectors): drag a caption, and grab a centre-anchored end (11.100, 11.101) (a9414ea)
- feat(cables): tick progress as a text code, replacing the sync server (11.99) (30f5d7b)
Fixes
- fix(ui): name a ring by double-clicking it, say Ctrl on Windows, fix the dropdown (11.105, 11.106, 11.103) (26b38f8)
Other
- docs(tasks): correct 11.102 — drag-time alignment guides already exist (be986b3)
- docs(tasks): record v0.24.0/v0.24.1 as shipped (11.86-11.97) (919156a)
v0.24.1 — 2026-08-02
Other
- docs(release-notes): 0.24.1 notes — where a share link works (1c7ae3b)
- docs: say where an install link works, and that ticks do not come back (d941740)
v0.24.0 — 2026-08-02
Features
- feat(optics,cables): count the optics, schedule the cabling, share the checklist (36335ea)
Other
- docs(tasks): record v0.23.0 as shipped (11.79-11.85) (f0ca2b2)
v0.23.0 — 2026-08-01
Features
- feat(dot): zones and every other inventory item ride the round trip (11.82) (5c69e0f)
- feat(dot): the round trip keeps the drawing (11.79-11.81, 11.83) (ad445de)
Fixes
- fix(site): "MB" now means MB, in the one size formatter (11.78) (bb926d7)
Other
- docs(tasks): 11.85 closed — the template wedge was a confirm() dialog (cd0864b)
- docs(tasks): DOT round-trip loss investigation lands as 11.79-11.85 (eb033d3)
- docs(tasks): record v0.22.0 as shipped (11.74–11.77) (31258cb)
v0.22.0 — 2026-08-01
Features
- feat(export): the page leaves as Graphviz DOT, as a file and as text (11.74) (f53a999)
- feat(stats): coding stats on /stats/ — commits, lines, size, tasks (11.69) (29b78fb)
- feat(stats): the page refreshes hourly and shows today (11.68) (fc430ae)
Fixes
- fix(format-paint): say when there is nothing to paint (11.75, 11.76) (59f9bda)
- fix(deploy): stats passes land on the clock, not on the uptime (11.71) (847adf6)
Other
- test(import): pin the two DOT defects the round trip exposed (11.77) (9802ef1)
- chore(stats): regenerate code.json, and keep prettier off it (11.73) (23c1a66)
- test(stats): validate the displayed numbers against the raw logs (11.72) (d161da9)
- refactor(deploy): the stats schedule moves into the container (11.70) (8d03477)
v0.21.0 — 2026-07-30
Fixes
- fix(layers): a map's layer lives and dies with its map (11.67) (9ef9db9)
v0.20.0 — 2026-07-30
Features
- feat(import): Purdue levels ride the import — clusters declare bands, the backdrop seats them (11.66) (981e9f6)
Other
- docs(manual): anchor ENG-01 at level 3 in the Purdue example (dbe7a47)
- docs(manual): level the Purdue PLC/SIS pair; document the rank=same row nuance (e47f86b)
- docs(manual): the Purdue model as tiers — new OT example, rendered both themes (bef61e5)
- docs(manual): it's a spine–leaf fabric, not leaf–spine (user correction) (0b7e2a5)
- docs(site): wider code column + tighter mono in example pairs — no scrolling left but the verbatim dump (11.65) (34781d0)
- docs(site+manual): copy bar outside the box, Prism highlighting, wrap reverted (11.65) (c748ad2)
- docs(site+manual): copy buttons, image lightbox, theme-matched renders, no snippet scrolling (11.64) (89c258f)
- docs(site+manual): example code and its render side by side (11.63) (1ae2236)
- docs(manual): every DOT example now shows its real render (11.62) (c28959d)
- chore: drop stray screenshot committed by a mis-pathed check (a4d6d97)
- docs(manual): icon thumbnails in the DOT reference + CI pipeline recipes (11.61) (939d22f)
- docs(manual): the Diagrams-from-code chapter — five pages, executable examples (11.59) (2c47129)
- docs(tasks): 11.58 — v0.19.0 released and live-verified; publish 502 resume recorded (b438bf5)
v0.19.0 — 2026-07-30
Features
- feat(import): the open API — DOT/FortiLink import, import links, headless CLI, docs (11.57) (2f027ed)
Other
- docs(release): notes for the open-API release; 11.58 go recorded (a097756)
- docs(tasks): 11.56 — the quality bar; v1 consumes tier declarations (292edb5)
- docs(tasks): 11.56 addendum — own the vocabulary, not the grammar (a945586)
- docs(tasks): 11.56 — open-API/diagram-as-text investigation; DOT import is the road (a6f2ff0)
- docs: the edge default site answers 444, not a Congratulations page (777e85a)
- docs(tasks): 11.54 — the gateway change is half applied, finish it in the UI (9cd07cc)
- chore: ignore .claude/settings.local.json (94f0825)
- docs(tasks): 11.54 — edge sweep results, and the headers-more inheritance trap (cfb86a9)
- docs(tasks): 11.54 — the gateway default site advertises NPM (beta report) (43d9e96)
v0.18.0 — 2026-07-30
Features
- feat(map): sorted country pickers, frame show/hide toggles, Map: layer names (3e12442)
- feat(scripts): prune old desktop artifacts instead of keeping all 58 (00d414a)
- feat(deploy): mount the Caddyfile so config ships without a release (abc3b4a)
Fixes
- fix(stats): read rolled logs, stop the false rotation warning, show warnings (63d7995)
Other
- docs(tasks): 11.52 — sort the country pickers alphabetically (user decision) (dc8a38d)
- docs(tasks): 11.51 done — host root filesystem grown to 97 G (37bf366)
- docs(tasks): the host disk is 100 GB, the root LV is 49 (11.51) (fdf04d1)
- docs: clarify how a deploy/ change ships under the website-only rule (3dc4a43)
- docs(tasks): record the stats-pipeline verification and two findings (0b4d147)
- docs(tasks): record the v0.17.0 release (3040569)
v0.17.0 — 2026-07-29
Features
- feat(shapes): router, L3 switch and switch as one system (0e589b9)
Other
- docs(tasks): record the v0.16.1 patch release (5fecb77)
v0.16.1 — 2026-07-29
Fixes
- fix(rings): a drag no longer deletes the ring's name (e1392e3)
Other
- docs(release): notes for the ring-label fix (781680e)
- docs(tasks): record the v0.16.0 release (e13b212)
v0.16.0 — 2026-07-29
Features
- feat(rings): place a ring's caption the way a connector's label is placed (78c11f8)
- feat(rings): a cable can be in several aggregates, each with its own label (e08a818)
- feat(connections): one card per cable, positional arrows, aggregates as rings (ef7a2fb)
- feat(stats): count web-app usage and load, not just downloads (f0cc9a4)
- feat(stats): gate /stats at the edge by IP, not with a password (9bf1bd2)
- feat(site): a password-protected /stats/ page for the download counts (1fe1d25)
- feat(scripts): read the download counts from this machine over ssh (5709a88)
Fixes
- fix(connections): MC-LAG captions, a ring control inside the ring, taller inspector (8dfed09)
- fix(deploy): pass the /stats/ credentials into the container (5f98ec9)
Other
- docs(release): notes for the multi-ring aggregates release (8c5761e)
- docs(tasks): selection + Bind is the primary gesture for making rings (f12b8cb)
- docs(tasks): record the /stats deploy, the edge IP gate and the compose bug (e61b185)
- docs(tasks): download counting is fully live — units installed and verified (08f66fc)
- docs(tasks): record the v0.15.0 release, its verification, and queue 11.31 (b9be827)
v0.15.0 — 2026-07-29
Features
- feat(layers): map layers follow the map, one per map, and the inspector says which (b22383b)
- feat(deploy): count downloads in aggregate only — no identifiers, ever (13cad6f)
- feat(scene): draw the LAG badge as the aggregate ring in miniature (8d38be2)
- feat(paint): size + font size paint, named trail entries, row delete in Connections (3e85860)
Fixes
- fix(iso): cables meet the slab's bottom face — the ground they run on (d03d22a)
Other
- docs(release): notes for v0.15.0 + targeted pre-release QA run (8/8) (6ef277f)
- docs(tasks): record the v0.14.0 release and its post-deploy verification (1825cfb)
v0.14.0 — 2026-07-28
Features
- feat(export): copy the page as a Mermaid flowchart for markdown articles (e0abf49)
Other
- test(export): give the mermaid parse test the timeout its import needs (8ffcd58)
- docs(qa): targeted pre-release run for v0.14.0 — 4/4 on the built bundle (15d5317)
- docs(release): write the Copy Mermaid notes into Unreleased as the work lands (e014383)
- docs(tasks): record the v0.13.0 release and its post-deploy verification (4c6f5d1)
v0.13.0 — 2026-07-28
Features
- feat(vsdx): import a foreign Visio file faithfully, and export pictures back (cb48ce5)
Other
- docs(qa): run the v0.13.0 pre-release short run, and fix what it found (1033053)
- docs(release): write the Visio-import notes for the next release (af0a1d0)
v0.12.1 — 2026-07-28
Features
- feat(feedback): file each attachment as its own comment, and stop cutting logs (111103f)
Fixes
- fix(format-paint): paint a label's alignment, and stop failing silently (07f1236)
- fix(iso): let a cable cross its own chassis instead of diving behind it (c0cd464)
Other
- docs(release): write the v0.12.1 notes, and the run that checked them (653b993)
- docs(tasks): record the v0.12.0 release, and the config it still needs (70dbbae)
v0.12.0 — 2026-07-28
Features
- feat(feedback): give the bug report's .zip somewhere to go (b0a37cc)
Fixes
- fix(feedback): a sent report must not linger, and an oversize file must not trap one (3917ca9)
v0.11.0 — 2026-07-28
Features
- feat(objects): document-wide object list, with connections and search (c316c1f)
- feat(inspector): Connections tab — edit a device's cables without selecting them (3107594)
- feat(maps, layers): country map objects, layer lock, bottom map layer (4d7796c)
- feat(connectors): per-end port label placement; fix 10.41, 10.42, 10.46 (591c023)
- feat(connectors): align and rotate connector and port labels (10.45) (c84fc53)
Fixes
- fix(collab): flush the MIGRATE frame before closing on a graceful host exit (fb9e83f)
Other
- test(e2e): settle the route before unbinding an aggregate (11.7) (3b3021c)
- docs(release): write the v0.11.0 notes (5c6f218)
- docs(tasks): record v0.10.0, verified from the published arm64 image (e99772a)
v0.10.0 — 2026-07-27
Features
- feat(release): publish an arm64 docker image beside the amd64 one (bdba113)
Other
- docs(site): make the arm64 install instructions stand on their own (a638672)
- docs(tasks): confirm 10.41 by building the bundle, and file 10.42 (c61c8b8)
- docs(qa): trace the arm64 image gap in the regression watchlist (d640d5e)
- docs(qa): record v0.9.1, and correct the session-0 claim it disproved (d3779ef)
v0.9.1 — 2026-07-27
Fixes
- fix(windows): ship the MSVC runtime beside iroh's native module (a8995e7)
Other
- docs(tasks): v0.9.0 shipped and verified end to end (10.36) (aa6015d)
v0.9.0 — 2026-07-27
Features
- feat(collab): the session survives the host leaving (6.12) (f24c0d5)
- feat(collab): self-hosted relays (6.14); 6.15 blocked upstream (c126a9d)
- feat(collab): view-only invite links (6.11) (0a33498)
- feat(collab): every guest goes to the lobby, always (6.17) (f8f212c)
- feat(collab): follow a participant's view (6.10), split 6.8 (7bcd628)
- feat(connectors): auto link detection (2.109) (35cbae3)
Fixes
- fix(packaging): the .deb could not start on a minimal Ubuntu (9.7) (3ffe2eb)
- fix(connectors): a shaped cable travels whole (10.31), close 7.9 (432ae61)
- fix(deploy): the tag poller runs as the checkout's owner, not root (10.30) (6445f01)
Other
- qa: pre-release run for the next minor (10.33, 10.34, 10.35) (c7bc86e)
- docs(release): notes for the collaboration work (6.10-6.14, 6.17) (d66c771)
- test(connectors): pin that auto link detection touches NEW cables only (2.109) (bcd57d2)
- docs(release): notes for the next release (9d3eae6)
- test(qa): every Playwright-owned scenario now has a spec (10.20, 10.32) (edd9fdc)
- docs(tasks): v0.8.10 shipped and REG-13 verified (10.27, 10.28, 10.29) (feed758)
v0.8.10 — 2026-07-27
Fixes
- fix(about): the update panel lines up, and never claims two versions (10.27) (b451db5)
Other
- docs: record that the GitHub workflows are disabled at the repo level (2b606a2)
- docs(tasks): v0.8.9 shipped and REG-13 verified against the live site (10.26) (55099fe)
v0.8.9 — 2026-07-27
Fixes
- fix(updates): a manual check now lights the shield and is remembered (10.26) (f667181)
v0.8.8 — 2026-07-27
Features
- feat(canvas): a selected cable keeps its speed colour (10.22, 10.23) (aec99a8)
Other
- docs(ai-qa): close 10.25 — the legend backdrop is the zone contract, not a defect (def4247)
- docs(ai-qa): short run before the halo release — clean product, seven harness defects (10.24, 10.25) (376d44b)
- docs(tasks): record what shipped in v0.8.7 and how it was verified (10.21) (a75201b)
v0.8.7 — 2026-07-26
Features
- feat(updates): the browser button reads "Update now" (10.21) (5dfc912)
- feat(updates): the shield lights amber when a new version is waiting (10.21) (92791db)
Fixes
- fix(lint): clear five errors my own gate hid behind tail -1 (10.21) (31cbff5)
- fix(release): stamping release notes must leave the tree passing format:check (d2a3f2c)
Other
- docs(tasks): agreed design for the new-version dot (10.21) (89c895b)
- test(e2e): 15 specs for scenarios nobody drove, and two tasks closed (10.16, 10.18, 10.20) (9cfbac7)
- docs(qa): split the suite by runner, and enumerate what nobody drives (10.19, 10.20) (86c9131)
- test(qa): full-run attempt — 37 verified, and a wrong diagnosis corrected (10.16-10.19) (94be347)
- test(qa): first run of the suite — seven suite defects, zero product defects (10.14, 10.15) (c773965)
- docs(qa): audit both nets, document the four undocumented features (10.13) (c247d51)
- test(qa): 134 browser scenarios an AI agent runs before every release (10.12) (76e09ae)
- docs(tasks): record 10.8-10.10 as shipped in v0.8.6, and add 10.11 (215ce6d)
v0.8.6 — 2026-07-26
Fixes
- fix(app): the kind picker offers devices only, and the trail counts the change (10.8, 10.9, 10.10) (c605612)
- fix(publish): a release publishes its own website (10.6) (13100f8)
Other
- style: prettier formatting, and correct the action-log module header (10.9) (c5015da)
- docs(release): notes for the issue #14 fixes (e43fdcb)
- perf(release): build the shared app bundle once, not once per platform (10.7) (a3f4d44)
v0.8.5 — 2026-07-25
Features
- feat(feedback): attached logs travel inside the report (10.5) (4511d43)
- feat(callout): an optional bubble around a callout (10.3) (3b9ce19)
- feat(app): report a bug from the app menu, with the trail and files (10.4) (11d4b63)
- feat(site): docker guide follows its tab, compact release archive (9.9, 9.10) (5931a39)
Fixes
- fix(labels): port labels stop vanishing on multi-homed devices (10.1, 10.2) (544d99f)
- fix(release): re-staging an old version no longer advertises it as current (dae5fc6)
- fix(deploy): preflight the site dir, not the downloads dir (task 9.11) (5288fa0)
Other
- docs(release): notes for the beta-feedback round (4dfbf69)
v0.8.4 — 2026-07-25
Features
- feat(dist): ship Linux and Windows on every release (tasks 9.1-9.6, 9.8) (d607ba2)
v0.8.3 — 2026-07-25
Features
- feat(app): honour the PWA file associations, add a bug-report copy button (tasks 8.55, 8.56) (dc71217)
Other
- docs: require release notes before handing over the publish command (00375db)
- docs(release): notes for the next release (a737d6f)
- docs(tasks): Phase 8 shipped as v0.8.2 (c02c17b)
v0.8.2 — 2026-07-25
Features
- feat(callout): let the leader be aimed (task 8.53) (44df663)
- feat(collab)!: remove the host allow-list — every join needs approval (task 8.46) (7f0d5df)
Fixes
- fix(canvas): click-to-place a Callout or Text actually places it (task 8.54) (52e3fb8)
- fix(tests): stop pwa.spec masking the failure it exists to catch (tasks 8.40, 8.49) (0eccf22)
- fix(release-notes): stop the placeholder shipping in published notes (tasks 8.15, 8.32, 8.42, 8.45) (67c3f5d)
- fix(css): delete four dead selectors, wire up four inert tokens (task 8.23) (d44747e)
- fix(files): give the Firefox save path the detached-anchor fix (task 8.9) (bbfa5f9)
- fix(electron): make --smoke actually fail when a lazy chunk is dead (task 8.8) (a3b390b)
Other
- docs(release): notes for the next release (c43885e)
- docs(tasks): file 8.54 — click-to-place is broken for text kinds (214c080)
- docs: close Phase 8 — exported types are documentation, not dead surface (task 8.52) (0a013f3)
- docs(tasks): record the result for 8.44 (a878859)
- test: give the 18 node factories one shared base (task 8.44) (acd6119)
- style: enforce prettier, and fix two docs against the code (tasks 8.29, 8.50, 8.51) (e630b7f)
- docs(tasks): record results for 8.47 and 8.48 (4e2bad6)
- refactor(manual): drop the unbuilt deep-link params, pin the authoring subset (tasks 8.47, 8.48) (975aa42)
- test: share the Playwright editor helpers, so every spec gets the chrome guard (task 8.39) (39bc253)
- docs(tasks): record results for 8.41 and 8.43 (d7c6c4a)
- test: verify the snapshot baselines, share four duplicated helpers (tasks 8.41, 8.43) (357e382)
- docs(tasks): record results for 8.24-8.26 (30daa5e)
- refactor: tokenise the dialog surfaces, guard the brand mark (tasks 8.24-8.26) (92a6d1a)
- docs(tasks): record results for 8.16-8.20, file 8.53 (be709a7)
- refactor: settle five legacy seams (tasks 8.16-8.20) (a2236d5)
- refactor: sunset the FortiKnight localStorage carry-overs (task 8.14) (7df8417)
- refactor: stop exporting 50 symbols nothing outside their module reads (task 8.4) (963e25b)
- refactor: factor the legend specimen and the export payload (tasks 8.12, 8.13) (3e7995c)
- refactor: one owner for the snap grid and the filename sanitizer (tasks 8.21, 8.22) (f7fc82c)
- refactor: one owner for the image guard and the rack-containment rule (tasks 8.10, 8.11) (60d51af)
- refactor(theme): delete the theme.css fallback that had already drifted (task 8.7) (076c76c)
- refactor(providers): drop the unreachable module-absent seam (tasks 8.5, 8.6) (e12bacb)
- docs: correct the documentation that had gone false (tasks 8.31, 8.33-8.38) (e4ddf43)
- ci: stop desktop.yml clobbering the release feed, drop Phase-1 scaffolding (tasks 8.27, 8.28, 8.30) (963907a)
- refactor(shapes): delete FAMILY_ORDER and the test guarding a false invariant (task 8.3) (8ffafa7)
- refactor: delete four functions nothing calls (task 8.2) (670f9d3)
- chore(repo): delete the stale committed build output at the repo root (task 8.1) (b90c643)
- docs(tasks): Phase 8 — code health audit, 49 verified cleanup tasks (02ed803)
- test: kill the aggregate-ring flake at its real cause, widen the collab auth window (task 7.27) (e69db24)
v0.8.1 — 2026-07-24
Fixes
- fix(pwa): re-check for a release, so the update prompt can actually fire (task 2.126) (870f55e)
v0.8.0 — 2026-07-24
Features
- feat(shapes): a CPE shape in the Network section (task 2.125) (2339976)
- feat(editor): align a node's label left, centre or right (task 2.124) (6242b92)
v0.7.0 — 2026-07-24
Features
- feat(editor): multi-line labels and a label editor you can type in (task 2.123) (850ca7b)
- feat(site): a real vulnerability disclosure route (task 7.32) (30008ed)
- feat(installer): fetch and verify releases from the site (task 7.28) (f2fb334)
Fixes
- fix(security): route reports through the form, which a private repo makes confidential (task 7.32) (30fd3e4)
- fix(security): drop style-src 'unsafe-inline' from the app CSP (tasks 7.30, 7.31) (3eae94c)
- fix(installer): the site identifies the build, not mtime (task 7.29) (81a5267)
v0.6.2 — 2026-07-24
Fixes
- fix(shapes): VDOM and VSYS are security family, not network (task 2.122) (e2ac61d)
Other
- docs(release): notes for the VDOM/VSYS colour change (b86295d)
v0.6.1 — 2026-07-24
Other
- docs(tasks): 7.27 also covers the flaky collab transport spec (6b220be)
- docs(release): notes for the donate-height fix and the loader cleanup (4869281)
- refactor: delete two dead dynamic-import fossils; publish the site without a release (17d7b75)
- chore: record v0.6.0, and two fixes the publish log surfaced (task 7.24) (73dcf3b)
v0.6.0 — 2026-07-24
Features
- feat(app): a Website row in the app menu (task 2.121) (c8d8e04)
- feat(site): Ko-fi tip panel on /donate/, click-to-load and theme-aware (7.22) (07a19cd)
- feat(app): icon library dialog + restyle the sponsor row (task 2.121) (ed550f0)
Other
- refactor(css): make
hiddenhide globally, and write both rules down (7.23) (c270e3e) - docs(release): notes for the icon library and the inline tip panel (6b15380)
v0.5.0 — 2026-07-24
Features
- feat(palette): sibling sections, decoupled from the accent family (task 2.120) (2615dbf)
- feat(purdue): snap devices into a level, and fix backdrops taking connectors (5f8e14f)
- feat(editor): Purdue plant template, conduit/fieldbus links, OT docs (task 2.119) (eb5cdd2)
- feat(shapes): the vertical OT equipment (task 2.119) (098d5cb)
- feat(shapes): Purdue level backdrop (task 2.119) (71a78cf)
- feat(shapes): add the OT family and the 18-shape OT batch (task 2.119) (1490090)
Other
- docs(release): notes and tester checklist for the OT release (3d716d7)
- docs(tasks): record the v0.4.4 release and its post-release verification (0f23110)
v0.4.4 — 2026-07-24
Fixes
- fix(map): pressing Map again selects the existing map instead of stacking one (task 7.19) (83b0476)
- fix(security): harden headers, drop site CSP unsafe-inline, fix /app/ caching (task 7.18) (f813ba5)
Other
- docs(release): write the notes for the upcoming release (08fee2b)
- chore(publish): trigger site rebuild on publish + trim docker build context (f5c34ca)
v0.4.3 — 2026-07-23
Features
- feat(publish): Docker image download + Windows/Linux artifact support (task 7.16) (b81ac78)
v0.4.2 — 2026-07-23
Features
- feat(site): first-launch install help on the download page (task 7.15) (56c8ee6)
v0.4.1 — 2026-07-23
Other
- docs(release-notes): v0.4.1 desktop-parity maintenance note (207be10)
- docs(deploy): TLS 1.3-only enforced gateway-wide (5bec92b)
- docs(deploy): external pentest results + edge header hardening (2026-07-23) (3889bf4)
v0.4.0 — 2026-07-23
Fixes
- fix(site): declutter the download card — teaser notes + folded checksums (task 7.14) (a3dd7cc)
Other
- docs(release-notes): v0.3.1 download-page cleanup note (e122571)
v0.3.0 — 2026-07-23
Features
- feat(site): OS-aware download page + full license texts served (tasks 7.12, 7.13) (a5ea102)
- feat(release): human release notes, on site and gated into every release (task 7.10) (a7812c3)
- feat(site): feedback form relaying to GitHub issues (task 7.9) (62f75d2)
- feat(site): SEO polish + site build joins the release gate (task 7.8) (13ea1f3)
- feat(updates): desktop update feed defaults to drawbridge.fortiknight.com (task 7.7) (55192a1)
- feat(publish): upload release artifacts to the site downloads volume (task 7.6) (231c988)
- feat(deploy): tag-poll auto-deploy — deploy.sh + systemd timer + runbook (task 7.5) (7c53c50)
- feat(deploy): container stack for drawbridge.fortiknight.com (task 7.4) (7ffa431)
- feat(site): download, donate, privacy, licenses and 404 pages (task 7.3) (c022e83)
- feat(site): generate /docs/ from the in-app manual + changelog (task 7.2) (1c8641e)
- feat(site): distribution website scaffold + landing page (task 7.1) (55fcdba)
Fixes
- fix(deploy): parameterize the web container's host ports (4d0d6bc)
- fix(deploy): skip release tags that predate the site deploy files (231f511)
- fix(site): serve the LGPL text from a committed root copy (task 7.13) (51f6bfa)
Other
- docs(deploy): URL allowlist for fronting-proxy provisioning (1bfca07)
- docs(tasks): Phase 7 — public distribution site at drawbridge.fortiknight.com (a38906b)
v0.2.9 — 2026-07-22
Features
- feat(templates): Global template cards draw the real world map (task 2.118) (9ded23c)
- feat(app): discreet 'Buy me a ☕' sponsor link in the app menu (task 2.117) (311860f)
Other
- docs(beta): checklist item for the Global template map thumbnails (task 2.118) (d6677a0)
- docs(beta): checklist item for the sponsor link (task 2.117) (8165b7e)
v0.2.8 — 2026-07-22
Fixes
- fix(minimap): honour pinned connector sides — anchor with the bridge's anchorPoint (b8c02c8)
v0.2.7 — 2026-07-22
Fixes
- fix(minimap): render the bus as its bar with spread taps (task 2.116) (3fda365)
Other
- docs(tasks): record the v0.2.6 release of the bus shape (73d79ce)
v0.2.6 — 2026-07-22
Features
- feat(shapes): bus / shared-segment bar with spreading taps and auto-grow (task 2.116) (2ef2c3e)
Other
- test(e2e): fix the border re-attach flake — poll and capture the handle box in one attempt (829d9b2)
- docs(tasks): record the v0.2.5 release of the minimap dodge (3b4a6c2)
v0.2.5 — 2026-07-22
Fixes
- fix(minimap): dodge left of the inspector instead of being covered (task 2.115) (1ff9385)
v0.2.4 — 2026-07-22
Fixes
- fix(minimap): draw shaped connectors faithfully — arc bows and custom bends (task 2.114) (e67fd4a)
v0.2.3 — 2026-07-22
Features
- feat(edges): multi-point arc shapes — Custom's gestures on a smooth curve (task 2.114) (97d2f8f)
Other
- docs(tasks): record the v0.2.2 release of the adjustable arc (4c92e9a)
v0.2.2 — 2026-07-22
Features
- feat(edges): adjustable arc — drag the crest handle to tune the bow (task 2.113) (6e101af)
Other
- docs(tasks): record the v0.2.1 release of the Arc connector (1b0dc86)
v0.2.1 — 2026-07-22
Features
- feat(edges): add the Arc connector type (task 2.112) (278f9aa)
Other
- docs(beta): Arc on the tester checklist; fix(manual): don't swallow keys after close (tasks 2.112, 2.111) (470b7e7)
- docs(beta): add the Arc connector to the tester checklist (task 2.112) (6ce5804)
- docs(tasks): record the v0.2.0 release of the in-app manual (323822a)
- docs(beta): add the manual to the tester checklist (task 2.111) (6279a45)
v0.2.0 — 2026-07-22
Features
- feat(manual): ship a complete manual inside the app (task 2.111) (3aa3cbe)
v0.1.10 — 2026-07-22
Features
- feat(release): publish the tester bundles from publish.sh (66a3ea2)
v0.1.9 — 2026-07-22
Fixes
- fix(shapes): file VDOM under security, not network (c6762b6)
Other
- refactor(export): derive export colours from the catalog family (b863af9)
- chore(release): add scripts/publish.sh one-command release wrapper (5a67971)
v0.1.8 — 2026-07-22
Features
- feat(editor): remove Tidy up, promote Align to the toolbar (2.110) (9fb7cf9)
- feat(edge): wireless link type — dash-dot line, radio badge at the midpoint (2f46ba5)
- feat(map): "Show neighbours" for regions — solo a region, not just a country (1a0bb50)
- feat(map): name a map after the extent it draws, until you name it yourself (d117aed)
- feat(map): resize a map to the extent it draws, and carry its devices (58e5a84)
- feat(map): 132 country extents, a searchable picker, and the borders back (cc613ad)
- feat(map): show a country alone or with its neighbours (db8667b)
- feat(map): country extents for Europe, generated from the source geometry (82b5af0)
- feat(map): zoom out to 8%, and a Nordics extent (863c92f)
- feat(map): a real world map, and AMER/EMEA/APAC layouts (3d2739e)
- feat(map): narrow a world underlay to a region (ee1a9cb)
- feat(templates): global operations on a world underlay, on its own layer (dbad928)
- feat(shapes): network-area shapes — WAN, MAN, WLAN, PSTN and the site scales (cc3ac59)
- feat(shapes): redraw the VDOM icon, add a LAN icon (d960df3)
- feat(shapes): virtual domains and contexts, as a container and as icons (b0c30d9)
- feat(toolbar): auto-save moves into the app menu (2676885)
- feat(draw): a connector tool, zones you can cable, and room in the toolbar (8b60a49)
- feat(palette): collapse or expand every icon family at once (99ed185)
- feat(beta): Docker bundle for testers, install guide in the checklist (8cd57cb)
Fixes
- fix(beta): publish the checklist from the stamped copy, not from docs/ (b7993c9)
- fix(edge): the wireless badge drew the route instead of its own arcs (ef5a671)
- fix(map): geographic audit against trusted sources; three regions cut land (dc4df81)
- fix(minimap): draw map underlays, not an empty container box (ece70a8)
- fix(map): another 35% bigger, so a device needs no resizing (b49f583)
- fix(map): make underlays big enough for a device to read as a site (7939221)
- fix(map): measure the extent bounds instead of eyeballing them (7bbad11)
- fix(map): extents show the region they name, and nothing else (fdda3d7)
- fix(map): cables no longer attach to it, it can be grabbed, and a button adds it (995a962)
- fix(connector): centre starts pick their own side, endpoint handles are catchable (5f86de1)
- fix(palette): pin the connector tool and collapse toggle (caf2cf9)
- fix(image): paste an icon and it lands device-sized, not five tiles wide (474b711)
- fix(zone): a pasted zone no longer drags the original's devices away (ede7597)
- fix(toolbar): export/layers/more menus were clipped away by the bar (354b487)
- fix(layout): tidy up pins top-level zones and widens peer-link detection (e660d6f)
- fix(layout): tidy up treats zones as layout scopes, not rigid bodies (72969e5)
Other
- ... (71572f1)
- docs(tasks): 2.109 — the learned connector memory lives in the app (1f03ef2)
- docs(tasks): 2.109 gains a toggle and learned per-pair connector defaults (bfa671b)
- docs(tasks): 2.109 — infer the link type from the devices a cable joins (eb2f224)
- chore(beta): 0.1.7 (6196460)
- chore(beta): 0.1.6, with the wireless link type in the checklist (dc1be81)
- build(beta): install what you built, and archive what it replaces (5e513d2)
- chore(beta): 0.1.5, with region solo in the checklist (283bb2e)
- chore(beta): 0.1.4, with the geography audit in the checklist (9fdf624)
- chore(beta): 0.1.3, with map naming in the checklist (5c2c111)
- chore(beta): 0.1.2, with the minimap fix in the checklist (22894db)
- chore(beta): 0.1.1, and a checklist section for maps (8700e98)
- style(palette): give the collapse toggle a chevron and tie it to the categories (744f577)
- style(palette): left-align the collapse toggle (ca92c13)
- docs(beta): checklist for v0.1.0 (bb7072a)
v0.1.0 — 2026-07-19
Features
- feat(iso): draw a rack as one real cabinet, orbit for the rear (1207805)
- feat(iso): draw a rack as two joined halves (fde669f)
- feat(rack): dropping a device into a rack MOUNTS it (af21602)
- feat(iso): one deep cabinet, front and rear mounted inside it (4fae283)
- feat(iso): close the cabinet and give mounted units real depth (5ccc277)
- feat(iso): stand a two-elevation rack as two cabinets (bb9bbd5)
- feat(iso): give racks real depth, with front and rear elevations (ad6edba)
Fixes
- fix(rack): bound both sides of every rail (c0b8576)
- fix(iso): wall the near side of the cabinet, and sit the elevation flush (1b6855d)
- fix(iso): deepen the cabinet, and stop burying a rear unit's name (5841397)
- fix(iso): compare marks and peer selections follow the view (e82937d)
- fix(iso): paint order, and every gesture that still read the floor (df4b7be)
- fix(export): stand racks up in isometric exports too (1497d02)
- fix(iso): cables, minimap, rear mounting, and unit labels (42d10c0)
- fix(iso): make the standing rack look right (d123b45)
- fix(iso): keep mounted units on the rack face when anything moves (405fdbe)
- fix(iso): put a mounted unit's ring and handles on the rack face (7efd5b1)
- fix(iso): keep a rack's selection ring and handles on its face (bbec717)
- fix(beta): stamp the checklist with the version it ships beside (03ac7f4)
Other
- chore(dev): add the visual-check harness as a script (1eaeb39)
v0.0.5 — 2026-07-19
Features
- feat(iso): stand racks up as cabinets (ee857e3)
- feat(rack): a dedicated rack builder (88c4fdd)
- feat(rack): half/full depth and front/rear elevations (debafd5)
- feat(inspector): searchable, grouped device picker (a0fa6df)
- feat(import): read FortiOS "diagnose lldp rx neighbor" (812e0a3)
- feat(beta): fill the tester's Mac details in automatically (8a4b0ec)
- feat(export): a self-contained HTML viewer, one file, no server (d52a780)
- feat(compare): visual diff between the document and another .drawio (85b873f)
- feat(import): paste CDP/LLDP output or CSV and get a laid-out diagram (b1ce495)
- feat(layout): "Tidy up" auto-layout via ELK, as a separate chunk (79200c9)
- feat(layers): named layers with visibility, on draw.io's own model (d5c5186)
- feat(inspector): asset data on devices, and a CSV inventory export (555b047)
- feat(dist): script the beta bundle, and verify it before it ships (8454a87)
- feat(view): rotate the isometric camera a quarter turn per press (9c48430)
- feat(view): isometric view behind one toolbar button (72fd7f9)
- feat(dist): add macOS install script that fixes the Gatekeeper "damaged" block (5ab1dc9)
- feat(shapes): add Auth server (RADIUS/AAA) icon, distinct from NAC (c95f51f)
- feat(palette): collapsible categories, icon search, + SASE/managed-client icons (b8d77f2)
- feat(toolbar): consolidate export controls into an Export menu (9e272c2)
- feat(model): true groups — group a multi-selection into one movable unit (task 2.44) (4199bd8)
- feat(model): free text / callout annotation (task 2.43) (06454c2)
- feat(editor): bulk find-replace in labels (task 2.42) (2b47993)
- feat(inspector): format painter — copy/paint presentational style (task 2.41) (b9d073b)
- feat(canvas): overview minimap navigator (task 2.39) (e2b1bcc)
- feat(app): canvas find (⌘F) — quiet find box with ranked node search (c5e9363)
- feat(export): theme override + transparent-background for PNG/SVG/PDF (5ebd520)
- feat(shapes): expand catalog with 13 on-brand device kinds (task 2.37) (10e6d4c)
- feat(export): copy the diagram to the clipboard as an image (32923ba)
- feat(collab): saved sessions, approval lobby, and "joinable now" (9d96e84)
- feat(collab): reusable personal link + per-page presence; fix desktop close (0399575)
Fixes
- fix(rack): front/rear legibility, a missing token, and a depth-change move (cd8b955)
- fix(toolbar): move controls into a "More" menu instead of clipping them (ea0103d)
- fix(desktop): serve the renderer over app:// instead of file:// (4750849)
- fix(export): exports never reached disk in the desktop app (661bc07)
- fix(editor): connector handles, welded zone copies, toolbar order (cb66f22)
- fix(duplicate): carry layer and shared asset traits onto a copy (d3621a6)
- fix(collab): only save an invite secret a host actually gates (4570430)
- fix(updates): key the feed by platform, and keep nested comments (8208fd1)
- fix(release): gate releases on the local CI run, not hosted checks (0de86be)
- fix(playground): surface failures and fix the scenario race (fb36ae2)
- fix(electron): close the arbitrary-path hole and harden the shell (7595f6c)
- fix(editor): repair undo integrity in gesture handling (d0d48e0)
- fix(collab): validate peer-supplied presence and image data (14c97db)
- fix(format): stop losing edits and model data on save (5df0201)
- fix(minimap): project the overview with the isometric camera (92afd6d)
- fix(legend): preserve label edits and delete the whole legend as one unit (fb34b39)
- fix(duplicate): carry edge speed/bundle/router/waypoints on copy+paste (7beeae6)
- fix(minimap): render a faithful thumbnail (real tiles, icons, edge colors) (e71f30a)
- fix(canvas): keep the minimap below the inspector so it never steals clicks (d267522)
- fix(text): remove empty text/callout on commit (task 2.43) (6eeab90)
- fix: multi-agent code-review pass — correctness, x-platform, docs (5895dce)
Other
- docs(beta): v0.0.4 checklist covering the six new features (1753c70)
- docs(tasks): record the six gap-closing features as 2.53–2.58 (1dbb339)
- docs(beta): ship the feedback checklist inside the bundle (84fa00f)
- docs(beta): write down how a beta bundle is built and published (d849fe9)
- chore(beta): bump to 0.0.3 and cover the isometric view in the checklists (2d66e02)
- style(docs): prettier-format the versioning note (bacb6a1)
- docs(release): agree CalVer YY.M.PATCH for the first production release (b01426d)
- docs(beta): use the real Drawbridge brand mark in the checklist header (4d82583)
- docs(beta): add interactive HTML checklist with feedback capture (28e3861)
- docs(beta): add a macOS beta-tester checklist (165fd3b)
- docs(claude): run the full CI pipeline locally as the gate until release (3ae9f3a)
- docs(tasks): record 2.37–2.45 feature round (product decision 2026-07-14) (e39a63a)
- docs(licenses): complete npm license report + ship LGPL-2.1 text (task 5.3) (46b947f)
- docs(collab): add how-it-works overview + post-6.4 admission deviations (7ddd1f2)
- docs: add desktop v0.0.2 evaluation checklist (331108c)
v0.0.3 — 2026-07-18
Beta build. The headline change is the isometric / 3D view — one button tilts the whole diagram, a second orbits the camera. Device labels also now sit inside the tile by default.
Features
- feat(view): rotate the isometric camera a quarter turn per press (9c48430)
- feat(view): isometric view behind one toolbar button (72fd7f9)
- feat(dist): add macOS install script that fixes the Gatekeeper "damaged" block (5ab1dc9)
- feat(shapes): add Auth server (RADIUS/AAA) icon, distinct from NAC (c95f51f)
- feat(palette): collapsible categories, icon search, + SASE/managed-client icons (b8d77f2)
- feat(toolbar): consolidate export controls into an Export menu (9e272c2)
- feat(model): true groups — group a multi-selection into one movable unit (task 2.44) (4199bd8)
- feat(model): free text / callout annotation (task 2.43) (06454c2)
- feat(editor): bulk find-replace in labels (task 2.42) (2b47993)
- feat(inspector): format painter — copy/paint presentational style (task 2.41) (b9d073b)
- feat(canvas): overview minimap navigator (task 2.39) (e2b1bcc)
- feat(app): canvas find (⌘F) — quiet find box with ranked node search (c5e9363)
- feat(export): theme override + transparent-background for PNG/SVG/PDF (5ebd520)
- feat(shapes): expand catalog with 13 on-brand device kinds (task 2.37) (10e6d4c)
- feat(export): copy the diagram to the clipboard as an image (32923ba)
- feat(collab): saved sessions, approval lobby, and "joinable now" (9d96e84)
- feat(collab): reusable personal link + per-page presence; fix desktop close (0399575)
Fixes
- fix(minimap): project the overview with the isometric camera (92afd6d)
- fix(legend): preserve label edits and delete the whole legend as one unit (fb34b39)
- fix(duplicate): carry edge speed/bundle/router/waypoints on copy+paste (7beeae6)
- fix(minimap): render a faithful thumbnail (real tiles, icons, edge colors) (e71f30a)
- fix(canvas): keep the minimap below the inspector so it never steals clicks (d267522)
- fix(text): remove empty text/callout on commit (task 2.43) (6eeab90)
- fix: multi-agent code-review pass — correctness, x-platform, docs (5895dce)
Docs & chores
- style(docs): prettier-format the versioning note (bacb6a1)
- docs(release): agree CalVer YY.M.PATCH for the first production release (b01426d)
- docs(beta): use the real Drawbridge brand mark in the checklist header (4d82583)
- docs(beta): add interactive HTML checklist with feedback capture (28e3861)
- docs(beta): add a macOS beta-tester checklist (165fd3b)
- docs(claude): run the full CI pipeline locally as the gate until release (3ae9f3a)
- docs(tasks): record 2.37–2.45 feature round (product decision 2026-07-14) (e39a63a)
- docs(licenses): complete npm license report + ship LGPL-2.1 text (task 5.3) (46b947f)
- docs(collab): add how-it-works overview + post-6.4 admission deviations (7ddd1f2)
- docs: add desktop v0.0.2 evaluation checklist (331108c)
v0.0.2 — 2026-07-13
Note: some commits below (STUN servers, the hostable signaling server, and "collaboration over WebRTC") belong to an earlier collaboration line that was superseded before this release. The shipped collaboration transport is iroh (peer-to-peer, no signaling server); the WebRTC/signaling code is not in the shipped tree. See
docs/INCIDENT-2026-07-13-divergence.md.
Features
- feat(desktop): build the iroh desktop app for Windows + Linux (1cf30a4)
- feat(collab): STUN servers so peers connect across different networks (533d5ad)
- feat(collab): C3 presence — live remote cursors with names (2c7fbaf)
- feat(collab): deployable free-hostable signaling server + live demo (ac3b652)
- feat(collab): C2 complete — live editor collaboration over WebRTC, verified (938ccd8)
- feat(collab): C2 (part 1) — sync engine seam + share-link codec (4ae468d)
- feat(collab): C1 — CRDT model bridge for real-time collaboration (232f741)
- feat(desktop): offline assertion + platform info in About (Phase 6.5) (d7fcc1b)
- feat(desktop): Electron desktop app for macOS/Windows/Linux (Phase 6.1–6.4) (be9b29e)
- feat: configurable default LACP ring color, red by default (6bbdd12)
- feat: enrich templates with link speeds + LACP aggregates; flatter ring (a9a3f70)
- feat: parallel-link fan, edge marquee, center-anchor connect (task 2.36) (1dc1abb)
- feat: aggregate ring — oval, colorable, draggable, in the legend (task 2.35) (6221153)
- feat: link speed as color, with recolorable palette and legend (task 2.34) (1b8a38b)
- feat: aggregate/LACP link binding with ring notation (task 2.33) (1340e10)
- feat: subnet-aware zones and PDF export with title block (tasks 2.31, 2.32) (21af88d)
- feat: SD-WAN generator, endpoint labels, semantic link types, auto-legend (tasks 2.27-2.30) (79365e8)
- feat: notify-only update check + window title shows filename (tasks 6.7, ux) (f2bc108)
- feat: templates follow editor defaults; Direct is factory connector default (task 2.26) (08ab8b4)
- feat: real-time collaboration (Yjs + iroh) and macOS desktop app (tasks 6.1-6.5) (b5ff95d)
- feat: Visio (.vsdx) open, edit and save (task 2.25) (a33efee)
- feat: easier connectors from selected nodes + connector type defaults (f0cbb08)
- feat: fit-to-window frames objects in the VISIBLE canvas with padding (cbb06a2)
- feat: edge auto-pan while dragging (task 2.24) (e754986)
- feat: drag smart guides — magnetic alignment while moving (task 2.23) (c6ecad9)
- feat: Docker container (multi-stage, non-root, healthcheck) (6fe2c5e)
- feat: clone-and-run setup scripts + committed wasm artifacts (e77072c)
- feat: SD-WAN hub-and-spoke template family (user request) (c9de715)
- feat: align + even spacing with flash guide visualization (task 2.22) (4722ae3)
- feat: IPsec link type, cmd/ctrl multi-select, blank-template dismiss (task 2.21) (20fe28d)
- feat: local distribution bundle with auto-installers (task 5.2) (57d2d24)
- feat!: rebrand FortiKnight → Drawbridge with new shield+topology mark (task 5.1) (a330c5d)
- feat: paste images into diagrams (task 2.20) (313753e)
- feat: multi-page diagrams with tabs (task 2.17) (54c4541)
- feat: PWA offline + release pipeline (tasks 3.1-3.4, 4.1-4.4) (d185e25)
- feat: toasts, about box, label-position multi-edit, auto-save to file (tasks 2.7, 2.18, 2.19) (ad17c04)
- feat: rack units — mark U rows into aggregated devices; numeric rack height (task 2.16) (603c067)
- feat: topology templates + rack planning (tasks 2.13, 2.14) (87033bb)
- feat: anchor-point preview on new connections too; icons at 85% (a3d9647)
- feat: show candidate anchor points while re-attaching an endpoint (6321bc4)
- feat: endpoint re-attach — drag an edge end to a new anchor side or node (task 2.12) (9ae1bf2)
- feat: selection inspector, z-order layers, color overrides + drag feel (task 2.11) (dd9e5f8)
- feat: per-edge connector types — auto / direct / custom (task 2.10) (d7db324)
- feat: direction-aware connections — gesture sets exit/entry sides (9d96b37)
- feat: node/zone resize + line jumps at edge crossings (tasks 2.8, 2.9) (ab0bf61)
- feat: expand shape catalog 14 → 25 (691feb3)
- feat: save-as, unsaved-changes guard, F2/Enter rename (b2ed502)
- feat: clipboard shortcuts — copy/cut/paste/duplicate + arrow-key nudge (52ebe6b)
- feat: FortiKnight editor MVP — canvas, interactions, shapes, .drawio I/O (tasks 2.1-2.6) (6996544)
- feat!: pivot to custom simple network diagram editor (7d09f06)
- feat: libavoid wasm engine + routing playground (tasks 1.1-1.4) (3ef9cf0)
- feat: npm run dev — patched drawio webapp served locally (task 2.1) (50b39f9)
- feat: toolchain scaffold + routing contracts (task 0.3) (e8789a6)
Fixes
- fix(test): wait for the aggregate ring to paint before measuring it (929d1b5)
- fix(test): give the 1152-combo SD-WAN sweep a 120s timeout (4ebf9bd)
- fix(desktop): don't let electron-builder auto-publish in CI (b307cc8)
- fix(editor): apply connector + label-position defaults to templates/new nodes (8e213dc)
- fix: unify the aggregate ring on a span-both-lines "tie" (2 or 4+ links) (ab9d650)
- fix: aggregate ring adapts to the connectors' angle (spans both links) (d64582e)
- fix: parallel-bundle ring is a cross-section oval, not one along the links (62993e7)
- fix(collab): status pill now actually hides — the real "stuck Live" bug (8c6f110)
- fix(collab): terminating a session clears the pill immediately (e83c2d5)
- fix: slim the MC-LAG ring height (OWNER_THIN 12 → 8) (a8a004a)
- fix: MC-LAG ring is a flat wide oval at the device, not a tall one (87847c9)
- fix: speed-chip overflow, LACP discoverability, live auto-legend (2.30/2.33/2.34) (19959bf)
- fix: native file layer in the Electron shell (task 6.6) (83fb369)
- fix: duplicates inherit full presentation; selected connectors re-home on duplicate (009bd75)
- fix: stray text selections can no longer hijack canvas drags (6f865c5)
- fix: node drag wins over border handles; failed re-attach self-heals; labels default to inside (9d72948)
- fix: inside label never shrinks the icon (user report) (a59c698)
- fix: lint — dblclick re-hit-test narrowing (optional chains after non-null proof) (23ba743)
- fix: rack units — clear resize handles + proper duplication (22f62cc)
- fix: sibling edges crossing far from their shared hub bump again (65c028e)
- fix: lost-release guard uses a grace timer — mixed trackpad streams no longer kill drags (34c4bf4)
- fix: tap-drag / three-finger drag broke — lost-release guard now edge-triggered (fbb3c34)
- fix: drag no longer sticks to the mouse after a lost release (32107bd)
- fix: apply icon wrapper contract (fill:none, currentColor strokes) in canvas and palette (bd9edce)
- fix: eslint ignores for emsdk tree; node globals in dev server (05e3cc7)
Other
- ci(desktop): publish installers to a GitHub Release on version tags (3116034)
- test(collab): real n0 two-peer sync proof +
collab:verifyscript (9c5ea04) - docs: record the 2026-07-13 divergence incident + prevention rules (d817cdf)
- docs(claude): always push committed work to origin (fd08ec8)
- ci(collab): verify two-instance collaboration on macOS/Linux/Windows (f338e4d)
- test(collab): verify real WebRTC P2P sync works in the Electron stack (f136e6e)
- docs(tasks): record cross-platform desktop installers built green in CI (88ea658)
- ci(desktop): build native installers on all three OSes in the release workflow (be6a347)
- ci(desktop): build + smoke the desktop app on all three OSes (parity gate) (bf578b8)
- ui: template picker fills the height; empty state anchored to the top (e02c6cf)
- ui: larger template gallery (ee2359f)
- docs: clone-and-run install section in README (5a226d1)
- docs: re-plan phase 5 as rebrand + local distribution (90a5c7d)
- test: perf harness, routing snapshots, editor E2E + CI jobs (tasks 1.5, 1.6, 2.3) (d8ea6d4)
- chore: add vite-plugin-pwa (Phase 3 groundwork) (c1660d4)
- docs: add task 2.20 — paste images into the diagram (with investigation) (8383dea)
- docs: README consistency — jumps shipped, Apple prereqs removed (8c7b463)
- docs: re-plan delivery — browser-first PWA, Electron to backlog (b7db9ca)
- docs: add task 2.19 — auto-save to the open file (f5e1463)
- docs: add task 2.18 — multi-edit (label position et al across a selection) (f57df4a)
- test: interaction regression suite — every shipped gesture fix pinned in CI (fa2bda3)
- style: bigger node icons — tile fill 56% → 70% (9194623)
- chore: task 0.4 done — CI green on all three OS (run 28943562836) (c66ce27)
- ci: cross-OS workflow + drawio patch layer (tasks 0.4, 0.5) (7487e96)
- docs: codify offline-first requirement + per-OS verification task 4.6 (82c7354)
- chore: mark tasks 0.1-0.3 done; add build:wasm + playground scripts (0b46ae9)
- chore: pin vendor submodules (task 0.2) (6428226)
- chore: bootstrap repo — docs, licenses, layout (1c8ccce)