27 KiB
Roadmap
-
UI.5: Panels can detach, join other tab groups, split, resize and redock through shared docking transactions. Custom layouts persist with workspaces, respect workspace locking, and retain collapse flags for intact native groups.
-
UI.3: Shared icons, accessible icon buttons and panel tabs come from the pinned
craft-uilibrary. Tab overflow stays within narrow panels; document tiling uses bounded shared geometry. Palettes and document commands remain app-owned. Existing strict-Clippy boolean/range warnings are corrected. -
UI.4: Compact toolbars keep colour and mode controls visible while tool rows scroll. Long tool-options rows scroll horizontally and reveal keyboard focus; offscreen geometry and interaction regressions cover all themes and 1×/1.5×/2× display scales.
Status legend: ✅ done · 🟡 in progress · ⬜ not started. Updated 2026-10-08.
Parity metrics. cargo xtask parity measures how much of Photoshop's menu tree is wired to a
command and writes parity.md. It does not measure whether those commands behave
like Photoshop, feel right, or survive real files. Read it next to the PSD composite oracle, the
test count, and the honest parity assessment below, which
is the reference answer to "how close are we really". The weighted feature estimate in
parity-estimate.md (~82%) counts feature surface and overstates user-facing
readiness; treat it as an upper bound.
| M | Status | Where we are |
|---|---|---|
| M0 Skeleton | ✅ | workspace, xtask (layers / wasm / ci / stats / corpus / parity), CI workflow |
| M1 Foundation | ✅ | geom, color (27 blend modes), raster (COW tiles, any depth), doc, ops, cms (ICC) |
| M2 PSD v1 | ✅ | photocraft-psd: 134/135 real files byte-exact round trip |
| M3 Viewer app | ✅ | egui shell (Pro / Studio / Classic themes), 13+ codecs, native and web (trunk) builds |
| M4 Native format + engine | ✅ | 500+ commands, .pcraft (incremental, autosave, crash recovery), CLI, persistent preferences |
| M5 GPU compositor | 🟡 | wgpu compositor drives the canvas, layer effects, vector masks, artboards, pattern fills and every clip case included (≤1/255 vs CPU); Multichannel documents fall back to the CPU |
| M6 Paint + select | 🟡 | brush engine, all selection tools, multi-layer selection, snapping + smart guides, free transform + warp; stylus pressure on Windows (WM_POINTER via winit), the web (Pointer Events, with tilt/twist), macOS (AppKit event monitor: pressure, tilt, rotation, eraser end) and Linux X11 (XInput2 raw valuators); on Linux Wayland a pen opens the window through Xwayland (native tablet-v2 still open, #79) |
| M7 Adjust + filters | 🟡 | 16 adjustment layers + destructive-only adjustments, 70+ filters incl. Blur Gallery, Actions record/replay, Fade |
| M8 PSD v2 | 🟡 | adjustments (incl. Selective Color, Color Lookup), fills, effects, patterns, text, shapes, smart objects, alpha channels; oracle 111/170 |
| M9 Text, vector, styles | 🟡 | type engine + Warp Text, shapes / pen / paths, all 10 effects on CPU and GPU (parity ≤1/255, 30/31 corpus effect files on the GPU) |
| M10 Smart features | 🟡 | classical Select Subject / Object, content-aware fill and scale, healing, auto-align / auto-blend; ML backend not started |
| M11 Automation + formats | 🟡 | MCP (headless + live bridge), batch, Image Processor, prefs over MCP; DoD test passes (10 agent tasks over MCP, automation/tests/agent_tasks.rs); since 2026-10-07 the CLI rejects unknown flags and answers <subcommand> --help, batch runs report same-name outputs instead of overwriting them, MCP command_batch steps can start background jobs, and headless saves never flatten over the opened file; JP2 / DICOM / DPX / C2PA pending |
| M12 Pro parity | 🟡 | CMYK / Lab / Indexed / Bitmap / Duotone, ICC + soft proofing, channels + Quick Mask, smart-object stack modes, artboards, layer comps; print, HDR, photomerge, timeline pending |
Menu parity: 532 / 625 (85.1%) on 2026-10-01, up from 224 (35.8%) the day before. See parity.md.
2026-10-08: Affinity .af, .afdesign, .afphoto and .afpub documents (container versions
8–12) open natively (format notes): pages and artboards, layers
and groups, curves and geometric shapes with fills, gradients and strokes, text as type layers,
placed images as smart objects, pixel layers and masks, as an 8-bit RGB document without a source
save path. Measured against the thumbnail Affinity embeds in each file, 21 pinned public documents
(cargo xtask corpus --affinity) differ by 0–4.6 of 255 on average. Layer effects, adjustments,
live filters, brush strokes, special shapes, master pages and CMYK/Lab/16-bit document colour are
approximated or left out, each with a warning; damaged or unknown files fall back to the embedded
preview. Affinity writing is not implemented: no Affinity installation was available to check
written files, so .af export stays unsupported.
2026-10-09: corpus/affinity/ now has 39 pinned documents and 21 PNGs (20 rendered references and
one bitmap-fill texture): the prior 21 public documents plus 18 CC0 samples for #1606. The new
samples compare against their exported PNGs;
mean differences range from 0.44/255 (conical gradients) to 86.05/255 (RGB/32 reduced to 8-bit).
Clouds, hearts, cogs, callouts, arrows, double stars, tears, crescents, diamonds and circular segments
now import as parametric shapes; the special-shapes sample measures 5.68/255 against its PNG. The
remaining gaps in #1606 stay tracked with per-sample corpus ceilings.
Honest parity assessment (2026-10-05)
This is the reference answer to "how close are we to Photoshop parity, really". Agents: read it before picking work. Update it (with dated measurements) when the numbers move; don't restate the menu-parity number in its place.
Measured numbers live in the scorecard (cargo xtask scorecard, kept current
by CI): performance scenarios against their budgets, corpus floors, per-area checklists with
done / partial / missing counts, and the number of settings that do nothing. Where the scorecard
and the estimates below disagree, the scorecard's numbers supersede them. As of 2026-10-05 it
counts 67 of 129 preferences that nothing reads; 3 of the 25 budgeted performance scenarios meet
their #209–#211 targets (first baseline, taken on a heavily loaded machine), and the 150-layer
nudge scenario crashes the GPU compositor; the open area issues' checklists (#203–#220) are
almost entirely missing or partial.
2026-10-07: UI Font Size now applies to interface text, including CJK fallbacks, independently of display and canvas zoom (#532). The current preference audit drops from 59 to 58 unread settings out of 135; see the regenerated scorecard.
2026-10-09: Output-preserving Radial Blur direct sampling measured on a local i7-9750H, 12 workers, 24 MP RGBA8, Good quality, amount 1: Spin 66.10 → 16.43 s (4.02×), Zoom 19.19 → 5.35 s (3.59×), one paired run each, exact output equality. These are local measurements at amount 1; see method and limits.
2026-10-10: native selection distance transforms measured 7.59–10.57x faster on six 24–36 MP synthetic masks on an AWS c7i.4xlarge (16 workers, three paired release runs). The transform also corrects f32 envelope errors past coordinate 4096, including nonzero distances at selected pixels. The parallel path needs an additional four bytes per pixel; see measurements, correctness and limits.
Bottom line. Two days after 0.2.0 we had merged ~96 PRs and closed ~48 issues, but real
Photoshop parity is still well below 50%. The biggest gaps are AI, missing tools, professional
workflow depth and the plug-in ecosystem. Most fixes since 0.2.0 have passed our tests but have
not yet been validated by users, and this week proved our tests miss what users hit:
on first public use they found broken basics (text selection offset, 214 shortcut failures, panels
resizing themselves, an immovable crop frame, folders that wouldn't collapse, lag on layout PSDs)
that all counted as "live" in parity.md.
Overall. Feature surface: roughly 60–70% of what a typical Photoshop user touches exists in some form. "A professional could switch for daily work": roughly 25–35%. True 1:1 parity is many months of focused work, and some areas need product decisions rather than effort. Confidence: moderate — the next users of 0.2.x will move these numbers either way.
By dimension
2026-10-10: Shape stroke controls expose existing Solid/Dashed/Dotted, custom dash/gap, offset, caps, joins, alignment, miter-limit and opacity capabilities in Shape/Pen options and Properties. Properties stages a cached canvas preview before one undoable edit. Gradient fill controls from #1053 remain open; the Line tool still draws a filled bar. This extends UI reachability and does not claim Photoshop-authored stroke parity.
| Dimension | Measured / evidence (2026-10-05) | Grade | Notes |
|---|---|---|---|
| Menu wiring | 626/626 menu items dispatch a command (parity.md) |
high but shallow | Says nothing about behaviour. |
| PSD fidelity (rendering) | Corpus oracle 115/170 (68%): 30 differ, 26 have no usable reference, 1 import error. 2026-10-07: io corpus 146/170, psd-tools corpus 236/309 (was 229: Advanced Blending knockouts), Photoshop oracles 132/258 | medium | Push to 170/170 under way (effects/strokes, multi-instance effects, 16/32-bit and colour modes, references for skipped files). |
| PSD round trip | 169/169 re-import identically; every adjustment layer and blend mode round-trips | high (within corpus) | Floors in crates/io/tests/corpus.rs; raise, never lower. Corpora: cargo xtask corpus --all (ours: https://github.com/storytold/photocraft-corpus). |
| OpenRaster read/write | 2026-10-09: 34 Krita 5.2.9-authored .ora files (27 blend modes, groups, pass-through, offsets, opacity, visibility, masks, 16-bit, gray) render within 3/255 of Krita's merged image (30) or differ for known reasons (4: Krita's lighter/darker-colour tie-break, Hard Mix at exactly 1, a linear-light 16-bit document); Krita re-opens our exports and renders them identically to its originals (33/34; Soft Light is written as svg:soft-light) |
medium (one authoring app) | MyPaint and GIMP files untested. Masks are applied to pixels and layer styles dropped on save (reported). See OpenRaster. |
| Paint.NET import | 2026-10-09: 14/14 local PDN3 textures preserve editable layers exactly through .pcraft and render within 2.142/255 of full-size previews; a supplied 5.x document (1280×720, 11 layers) passes editing/history/native saves and matches its thumbnail within 0.418/255 mean; all 14 blend modes exercised synthetically |
medium (limited corpus) | Import only; metadata omitted. More current-version files and full-size exports needed. See PDN support. |
| Smart filters / text / effect shapes in PSDs | Measured on our Photoshop-authored set (https://github.com/storytold/photocraft-corpus, corpus/photoshop, 258 files): see the per-group floors in crates/io/tests/corpus.rs and crates/engine/tests/photoshop_oracles.rs. Smart objects and smart filters now survive PSD save and open (41 corpus files, 206 smart objects, round trip strict; Photoshop opens our exports with live filters); re-rendering Photoshop's smart filters with ours matches 5/30 (was 1/30) |
low–medium | Remaining re-render gaps are filter maths (Gaussian/Motion Blur, Unsharp Mask, Emboss, Add Noise RNG) and bicubic placement. |
| Core editing (layers, masks, selections, adjustments, filters, transforms) | Broad engine coverage; many interaction bugs fixed after 0.2.0 (adjustment dialogs, Curves, crop, Move/Transform modifiers, gesture origin) | medium | Fixes not yet user-validated. |
| UI / UX polish | Shortcut audit 214 → 0 failures; dock, Layers rows and menus reworked; first visual-QA sweep found 14 defects (#147–#157). 2026-10-07: the keyboard-only shortcuts with no menu item (⌥[ ⌥] ⌥, ⌥. layer navigation, ⇧⌥[ ⇧⌥] to extend the selection, 1–0 for opacity and ⇧ for flow or fill, ⇧[ ⇧] hardness, ⌥⌘T to transform a copy and ⌥⇧⌘T to step and repeat), ⌥-click colour sampling with painting tools, double-click a Layers row for Layer Style, File › New from Clipboard, a centred main window and remembered Liquify settings (#352, #417, #350, #368, #419, #418). 2026-10-09: canvas zoom is physical at any display scale — 100% is one document pixel per physical display pixel, and every screen-space overlay, cursor, scrollbar, navigator and fit follows it (#1943) | low–medium | Needs recurring visual QA with realistic documents. |
| Tools | 2026-10-09: Pencil, Mixer Brush, Patch, Content-Aware Move, Vertical Type, Pattern Stamp and Rotate View are toolbar tools. Remaining missing tools include Red Eye, Art History Brush, Freeform/Curvature Pen, Add/Delete Anchor Point tools, single row/column marquee, Color Sampler, Perspective Crop, type masks and Frame | low–medium | Patch has a live healing preview. Content-Aware Move is partial: Move/Extend, Structure/Color and Sample All Layers exist; Transform On Drop and a live result preview remain missing (TOOL-213-4 in the scorecard). Magic/Background Eraser added; live gradients in progress (#180). Magnetic Lasso added 2026-10-08 (live-wire edge tracing, Width/Contrast/Frequency, select.magneticLasso). Pattern Stamp added 2026-10-08 (S flyout, paint.patternStamp, Aligned / Impressionist). Rotate View (2026-10-09) turns the canvas camera around its centre without rewriting pixels; Reset View and Match Rotation copy the angle. Crop rotation (2026-10-09, #1792): dragging outside the crop frame turns it (⇧ 15° steps, angle readout), and ↵ rotates the document and crops in one undo step (image.crop angle); the frame turns over the image as in Photoshop's Classic Mode, and the options-bar Straighten is still missing. |
| Painting | Brush model and Brush Settings panel near Photoshop; .abr/.grd import; persistent presets; pen pressure/tilt on Windows, web, macOS and X11 | medium | Native Wayland pen input open (#79; a pen opens the window through Xwayland meanwhile); X11 pressure confirmed by a user, macOS not yet verified on tablet hardware. |
| Text / typography | Engine works; caret placement and size editing fixed; OpenType features, text-on-path editing, composer parity partial | medium-low | Measure with the Photoshop-authored set. |
| Colour management | Colour-managed canvas (document → monitor), embedded CMYK profiles, linear EXR/HDR, 16-bit float canvas | medium-high | Monitor profile follows only at launch. |
| Performance | 14k+ px on the GPU at ~⅓ the memory; adjustment preview 285 ms → 4–9 ms; font-size edits 297 ms → 4.6 ms; 2026-10-07: 30 MP TIFF open (banded, parallel strip/tile decode) Deflate 345 → 32 ms, LZW 428 → 43 ms, BigTIFF and every IFD readable; 2026-10-09: 4.2 MP Indexed Color, 256 colours, full-resolution CPU preview p50 3018 → 1061 ms (Ryzen AI 7 350, three measured runs; GPU upload excluded) | medium-high on rasters | Complex layout documents still laggy (#125/#128); >16384 px GPU tiling in progress (#49). Native Indexed Color previews run on one background worker with stale-result rejection; large palettes can still take about a second to compute. Web previews remain synchronous. |
| Stability | Never-crash lint series, crash guard, panic_hunt fuzzing in the gate |
medium-high | No field crash data yet. |
| Camera RAW | DNG, CR2, Sony ARW (lossless + compressed), Nikon NEF (lossless + lossy compressed), RW2, uncompressed ORF; 2026-10-09: uncompressed Fujifilm RAF, Bayer and X-Trans (edge-directed X-Trans demosaic; 26 MP X-Trans develop 306 ms on 12 cores) | medium | CR3, compressed RAF, Nikon "lossy after split" and calibrated colour for non-DNG cameras (no Fuji colour calibration: neutral fallback) still open (#50). |
| AI / generative | none | ~0% | Deferred by decision (#41). |
| Ecosystem | Sandboxed WebAssembly plug-ins instead of .8BF; no ExtendScript/UXP/.atn; no Adobe Fonts/Libraries/cloud docs | low | By design for 8BF; scripting compatibility open. |
| Platforms | macOS (notarized), Windows, Linux (AppImage/deb/rpm/Flatpak bundle), web | medium-high | Flathub later (#173); Windows signing material pending. |
| Localisation | 2026-10-07: 10 UI languages; menu, tl!, blend mode, preference and brush-section coverage enforced by tests; live switching and scoped Preferences previews |
medium | Engine errors/status messages still partly English; CJK web fonts, browser-locale detection, and RTL remain open. |
2026-10-08: Motion Blur adds adaptive FFT convolution for wide streaks while retaining the row kernel merged in #902 for shorter streaks and unsupported cases. Native release medians of three paired runs on an Intel i7-9750H with 12 Rayon workers, synthetic RGBA8 at 30° / distance 1000: 24 MP 22.594 → 9.785 s (2.31×), and 1.5 MP 2.455 → 0.592 s (4.15×). Full-image comparisons differ by at most one U8 code level; distance 64/256 retain the byte-identical row output. These measure decode/halo/filter/write/prune, excluding UI proxy creation, compositing and upload; the UI remains synchronous. FFT work is scheduled within a conservative 512 MiB working-set estimate, excluding stored Surface tiles and row fallback memory. The crossover is a heuristic; images dominated by near-cutoff alpha can need extra scalar work. These measurements do not establish Photoshop filter parity.
2026-10-10: Proximity Match search medians on an AWS c7i.4xlarge improved 1.54–3.82x for four synthetic stroke regions (50–300 px holes), with identical source displacements. Bounding the mask table to the hole and pruning losing SSD candidates reduced table storage by about 90–93 percent there. Full 24–36 MP kernel inputs improved 4.60–6.24x, but normal engine strokes already use a cropped region. See method and limits.
2026-10-09: the Remove tool is in the J flyout (paint.remove, a background job). A stroke
around an object also removes what it encloses. The fill is non-local patch completion with
texture features (A. Newson et al., IPOL 2017: crates/algo/src/nonlocal.rs), finished by a
best-patch copy and gradient-domain seam hiding. On 20 holes in public-domain photos
(remove_quality, docs/development.md › Remove Tool quality) the fill keeps 0.89 of the
original's texture (Wexler/PatchMatch completion as Content-Aware Fill uses it: 0.54). On a 24 MP
document a 100 px ring takes 120 ms and a 1000 px ring 2.5 s (remove_bench). It is not
generative: large objects over complex structure fill less convincingly than Photoshop's AI mode
(#41).
2026-10-08: the tools update above is checked against the current toolbar groups in
panels.rs, the Pencil and tool-cycle tests in
pencil_tests.rs, Patch's live-preview test in
patch_preview.rs, and Vertical Type's point/paragraph
creation and undo test in type_tool_tests.rs.
These implementations remove the tools from the missing list; they do not establish Photoshop
behavioural parity. The historical estimates and corpus measurements in this assessment are
unchanged; current measured floors remain in the scorecard.
2026-10-07: Camera Raw PSD mapping covers relative custom white balance, Light/Presence,
parametric and four point curves, HSL, Color Grading, sharpening/noise detail, grain and numeric
post-crop vignette controls. Two revisions of one supplied Photoshop ACR 18.4 PSD preserve their
filter descriptors without edits. The updated revision stays opaque because of active manual
Optics and unverified vignette style; a descriptor projection verifies its supported controls.
Synthetic 8/16/32-bit PSD → edit → .pcraft → PSD tests preserve the filter stack, mask and
undo/redo. Unmapped Camera Raw fields/versions remain opaque; Photoshop
acceptance of generated exports and pixel parity are still unverified. Corpus floors above are
unchanged.
2026-10-10: Select and Mask's Shift Edge now computes the exact octagonal footprint with a square window extreme plus a dyadically built Manhattan ball. On a c7i.4xlarge (16 vCPUs), full tiled CPU refinement at radius 64 / Shift Edge +100% takes 3.019 s -> 0.762 s at 24 MP (3.96x), 3.706 s -> 0.921 s at 36 MP (4.02x). Three alternating paired release runs include guide sampling, guided filtering, boundary distances, quantization and assembly. Every output mask matches exactly. The dense fractional 24 MP radius-64 dilation kernel improves 36.00x; circular soft-mask kernels improve 20.76-172.16x at 24-36 MP, radii 4-64. Bounded halo tiles reduce the large-mask workspace allocation bound from 192/288 MB to about 115/163 MB, including output and 16 workers' scratch, excluding the source. See method and results.
Where we're going (priority order)
- Ship the fixes: cut 0.2.1 once the current batch lands, so users validate them.
- PSD fidelity to 170/170 with round trips, plus the Photoshop-authored reference set for smart
filters, the text engine and effect shapes (https://github.com/storytold/photocraft-corpus, fetched by
cargo xtask corpus --all); enforce floors incorpus.rs. - Workflow acceptance tests: 30–50 real tasks (retouch a portrait, social post with text and effects, composite with masks and adjustment layers, CMYK print prep…) scripted end to end and checked against Photoshop's output on every build. Their pass rate becomes the headline parity number.
- Tool coverage and workflow depth: Pen variants (Direct Selection landed, #790) and Perspective Crop; finish Content-Aware Move's Transform On Drop and live result preview. Pencil, Mixer Brush, Patch, Vertical Type, Pattern Stamp and Rotate View are already available on the toolbar.
- Complex-document performance (#125/#128) and GPU tiling beyond the texture limit (#49).
- Recurring visual QA (
cargo run -p photocraft-engine --example designer_psd) and fast turnaround on user reports (OS, document size, layer count, screenshot). - Later / needs decisions: generative AI backend (#41), scripting compatibility (ExtendScript / UXP / .atn), Flathub (#173), Wayland pen pressure (#79).
Current focus (infrastructure before the long tail)
Landed on 2026-10-01:
- multi-layer selection, live smart objects + smart filters, alpha channels + Quick Mask;
- patterns, Warp, preferences, snapping, ~33 filters, the remaining core adjustments;
- Layer Comps and Artboards, GPU layer effects, Liquify / Puppet Warp / Perspective Warp;
- the PSD fidelity pass (oracle 102 → 111), the M11 MCP acceptance test, and the release pipeline
(
docs/releasing.md).
Next:
- Follow "Where we're going" in the assessment above. 0.2.0 shipped signed and notarized on
2026-10-05 (
docs/releasing.md); Windows code-signing material still needs to be obtained. - Fidelity: the PSD oracle (113/170). Modern Brightness/Contrast and grayscale Levels curves; chisel-soft / stroke-emboss bevel shapes; Photoshop's 8-bit blend rounding; non-Normal modes in Lab documents; smart-filter maths against Photoshop's (re-render oracle 5/30).
- GPU: only Multichannel documents and regions over the texture limit fall back to the CPU.
- Vanishing Point, Camera Raw / Lens Correction, Face-Aware Liquify (needs a landmark model).
- Panels: Patterns, Styles, Glyphs, Character/Paragraph Styles, Timeline; Custom Shape tool.
- Print, Photomerge, Merge to HDR, video layers.
Milestone definitions
Each milestone has a definition of done (DoD) and must leave main green on all Tier-1 platforms plus a wasm build.
| M | Name | Scope (key items) | DoD / acceptance |
|---|---|---|---|
| M0 | Skeleton | Workspace, all crate stubs, lints, xtask (layers check, ci), CI matrix, testkit |
cargo test --workspace green; cargo check --target wasm32-unknown-unknown -p photocraft-engine -p photocraft-ui-egui green; layering check passes |
| M1 | Foundation | geom, color (formats, blend math for all 27 modes, sRGB/linear), raster (sparse COW tiles, U8/U16/F32), doc (full type model incl. CMYK/Lab/adjust/smart), ops (history) | Property tests (proptest) on tile COW and history; blend-mode reference tests against published formulas |
| M2 | PSD v1 | photocraft-psd: header, resources, layer records, channel data (raw/RLE/ZIP/ZIP+pred), masks, groups (lsct), unicode names, unknown-block passthrough, merged image, PSB; writer |
Round-trip byte-stability tests; synthetic PSD generator tests; fuzz target; ≥150 unit tests |
| M3 | Viewer app | codecs (png/jpeg/tiff/webp/gif/bmp/tga/pnm/qoi/exr/hdr, all read+write), CPU compositor, egui shell (menu from registry, canvas pan/zoom, layers panel, history), open/save, native + web build | Opens PNG/JPEG/PSD, shows layers, toggles visibility, undo/redo, saves PNG/PSD; web build loads a file from the browser |
| M4 | Native format + engine | .pcraft bundle, command registry with schemas, jobs/cancellation, snapshots via arc-swap, CLI (convert, run, inspect) |
CLI parity tests: every GUI command also runs headless |
| M5 | GPU compositor | wgpu planner backend, tile residency, parity tests vs CPU (all blend modes), viewport on GPU, mips | GPU vs CPU ≤1/255; pan/zoom 60 fps on a 100 MP / 20-layer document |
| M6 | Paint + select | platform input (pen: macOS/Windows/Linux/web), brush engine v1, eraser, marquee/lasso/wand, move, free transform, crop | Brush latency <1 frame; selection-restricted paint tests |
| M7 | Adjust + filters | 16 adjustment layers, first 30 filters, schema-generated dialogs + live preview, actions record/replay | Golden tests at 8/16/32f; action replay determinism |
| M8 | PSD v2 | adjustment layers, fill layers, lfx2 effects (descriptor parser), text (EngineData) preserve+render, smart objects, vector masks | Composite-oracle pass rate ≥90% on corpus |
| M9 | Text, vector, styles | parley text layers, shapes/pen/paths, all 10 layer effects on GPU | Visual goldens; PSD text round-trip |
| M10 | Smart features | ml (ort native / ort-web on the web), Select Subject/Object/Sky, Remove BG, Remove tool, content-aware fill, healing, AI denoise, RAW develop |
Quality benchmarks on a public dataset; timing budgets |
| M11 | Automation + formats | MCP server, batch, scripting, remaining formats (JP2, DICOM, DPX…), C2PA | An agent completes 10 scripted edit tasks via MCP |
| M12 | Pro parity | CMYK/Lab UI, print, HDR display, photomerge/HDR merge, timeline, layer comps, artboards, symmetry, neural filters | xtask parity ≥ 90% of Photoshop menu checklist |