| NFR-1a |
A page with 10 000 nodes shall stay fluid. On the reference machine (a 2023 mid-range laptop: 4 performance cores, 16 GB RAM, integrated GPU, 1440p display) with the benchmark fixtures in test/fixtures/bench/: a page with 10 000 nodes and 200 images pans and zooms at 60 fps, drags a selection of 500 nodes at 60 fps, and single-node edits commit in under 16 ms of main-thread time. CAN-11 points here. |
Must |
non-functional |
test |
0.2 |
| NFR-1b |
A file with 50 000 nodes shall open and edit within budget. Same machine and fixtures: a 50 000-node file opens in under 2 s, and the NFR-1a page budgets hold with the whole file loaded. |
Must |
non-functional |
test |
1.0 |
| NFR-2 |
Files shall merge in git. Changes to different nodes or properties on two branches merge without conflict (COL-4). |
Must |
non-functional |
test |
0.1 |
| NFR-3 |
Files shall stay small. No binary data in the .design file; a 10 000-node file is under 15 MB after consolidation; images deduplicated by hash. |
Must |
non-functional |
test |
0.2 |
| NFR-4 |
The extension shall be secure by default. Strict CSP, no remote code, licence and API tokens in SecretStorage, AI runs sandboxed (AI-14). The parts that ship earlier are NFR-4a and NFR-4b. |
Must |
non-functional |
inspection |
1.0 |
| NFR-4a |
The bridge and the loopback asset server shall be hardened. Bridge sockets readable only by the user, with a random token; the asset server of CMD-5 binds 127.0.0.1 only, accepts a request only when its Host header matches the bound address and port, rejects any request that carries an Origin header (no browser page may fetch it), caps uploads at 10 MB, and hands out 128-bit single-use tokens that expire after 10 minutes. |
Must |
non-functional |
test |
0.1 |
| NFR-4b |
Imported SVG shall be sanitised. No scripts, no event handlers, no external references (images, fonts, stylesheets, use across documents) survive import (EXP-4, upload_assets). |
Must |
non-functional |
test |
0.2 |
| NFR-5 |
The code shall be tested in CI on three platforms. Unit tests for the core (events, layout, text, render, commands), CLI and Figma MCP schema conformance (CMD-8, CMD-19), Plugin API conformance (CMD-15), golden-image render tests, webview checker, integration tests in VS Code; Linux, Windows, macOS. |
Must |
non-functional |
inspection |
0.1 |
| NFR-6 |
The editor shall recover from errors. A malformed file opens with the readable part and a warning (FMT-001 §9); a render error in one node shows a placeholder for that node only; crashes of the webview reload it without losing unsaved state. |
Must |
non-functional |
test |
0.2 |
| NFR-7 |
Strings could be localizable. English only for 1.0. |
Could |
non-functional |
inspection |
backlog |
| NFR-8 |
Rendering shall agree across surfaces within a stated tolerance. The resvg output of ud render (the RasterRenderer) is the reference. The Canvas2DRenderer with GPU rasterisation off, PNG exports and get_screenshot differ from it by less than 0.5 % of pixels with a per-pixel tolerance of 2/255, and 8/255 inside the bounds of blur and shadow effects, on the golden set. PDF and SVG exports are compared after rasterising them with resvg; JPG and WebP are excluded (lossy). The GPU-accelerated canvas gets a smoke tolerance only (no pixel contract). The preview player joins the contract at 0.5. Conic and diamond gradients use one shared raster tile on both renderers; the SVG writer sets color-interpolation-filters="sRGB" so filters match Canvas. Decided in Appendix D issue 3 and an ARC-001 ADR. |
Must |
non-functional |
test |
0.2 |
| NFR-9 |
The extension shall have a documentation site. Specifications, user guide, CLI reference generated from the registry, file format and JSON Schema; Hugo site styled like the sibling products, served by GitHub Pages. |
Should |
non-functional |
inspection |
1.0 |
| NFR-10 |
Memory shall stay within budget. With the 50 000-node benchmark file open on the reference machine (NFR-1a): the extension host plus its workers (script sandbox, render) use at most 1.5 GB, and one webview at most 1 GB, including tile and glyph caches. Raster output above 8 192 px on a side is tiled (CMD-32) so that no single pixmap exceeds the budget. |
Must |
non-functional |
test |
1.0 |
| NFR-11 |
The package shall stay small. The VSIX is at most 25 MB; CI fails the build when a packaged VSIX exceeds it. Script and emoji fonts are not bundled (TXT-6). |
Must |
non-functional |
test |
0.2 |