mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-14 19:26:51 -04:00
scorecard: twenty rows describe work that is already in the tree (#2894)
* scorecard: eight Open bugs rows describe work that is already in the tree AGENTS.md sends contributors to the scorecard's missing and partial rows when picking work, so a stale row costs someone a session: they sit down to write a test that is already there. These eight ask for work that exists and is covered by passing tests. #205 / #207, mask and channel transforms: - BUG-205-4 ("no raster-mask test"): linked_raster_mask_moves_with_the_pixels. - BUG-205-5 ("the other two not implemented"): all three cases are covered, by linked_mask_with_a_selection_moves_only_the_selected_region, unlinked_mask_stays_put and targeted_unlinked_mask_transforms_alone. - BUG-207-4 ("transform() has no target handling"): edit.transform takes target (pixels, mask, quickMask or {channel: i}) and documents it in its params doc; targeted_alpha_channel_transforms_alone covers the alpha channel. #206, kerning — the whole section: - BUG-206-1: CharStyle has both `kerning: Kerning` and `kern: f32`. - BUG-206-2 / BUG-206-3: io/tests/psd_kerning.rs round-trips manual, Off and Optical kerning, and reads the AutoKerning flag and Kerning value of every character back out of the written TySh. - BUG-206-4: Alt+Left/Right at a collapsed caret calls kern_pair, and the Character panel field parses Metrics / Optical / a manual value; both tested. - BUG-206-5 stays partial, not done: the round trips are covered, but no oracle corpus file is dedicated to kerning values, which that row also asks for. FILE-216-5 keeps its missing status (no save-path tests for layered TIFF, PDF, SVG, ACO/ASE, .shc or Smart Filters), but its note claimed there is no atomic-save failure-injection test; format/src/atomic/tests.rs has two, and BUG-203-6 already records them as done. docs/scorecard.md regenerated with cargo xtask scorecard; Open bugs moves from 22/2/8 to 29/2/1. * scorecard: the Type section's kerning and Thai rows are out of date too TYPE-218-6 ("Optical renders as Metrics; Alt+arrow moves by word") is done: Alt+Left/Right at a collapsed caret calls kern_pair, optical kerning is computed from the glyph outlines in text/src/optical.rs and applied by layout.rs when the run's mode is Optical, and both modes round-trip through PSD. Covered by type_tool_alt_arrows_kern_the_pair, optical_matches_photoshop, optical_kerning_tightens_open_pairs, txt2_carries_optical_kerning and io/tests/psd_kerning.rs. The row points at #206, whose own rows are in the same state. TYPE-218-3 goes to partial, not done: Thai is covered (THAI_FAMILIES in fonts.rs and thai_in_latin_font_falls_back_to_installed_thai_font, #1909), but Khmer and Indic have no fallback list and there are still no per-script golden tests. Unchanged because they read correctly: TYPE-218-1 (TextShape is still Point and Box), TYPE-218-2 (no direction UI), TYPE-218-4 (the axes in the shell are the brush's), TYPE-218-8 (no triple or quadruple click) and TYPE-218-9. * scorecard: Tools and Distribution rows are out of date too TOOL-213-7 ("Live stroke only for Brush and Eraser"): canvas.rs strokes_live covers Brush, Pencil, Eraser, Blur, Sharpen, Smudge, Dodge, Burn and Sponge, and live_retouch_command adds the Clone Stamp, Healing Brush and History Brush. TOOL-214-8 ("ruler only feeds straighten"): image.rotation.arbitrary opens seeded with the measured ruler angle and the direction that straightens it; arbitrary_rotation_starts_at_the_ruler_angle checks 5.7106 deg within 1e-3 and the direction for three lines. TOOL-214-5 goes to partial, not done ("No context menu in canvas.rs or transform_tool.rs"): TRANSFORM_MENU does open on a right click during a transform, with Free Transform, Scale, Rotate, Skew, Distort, Perspective and Warp, and three tests cover it — but the row also asks for Flip and Rotate 90/180, which are not there. DIST-220-2 ("release.yml only x86_64 and i686 msvc"): the Windows matrix has { arch: arm64, target: aarch64-pc-windows-msvc }, and windows-arm64.yml installs that MSI on a Windows 11 ARM64 runner, checks the binaries are ARM64 and runs the CLI natively. Signing takes the same path as x64 (DIST-2). Unchanged because they read correctly: the whole Automation section (ABI_VERSION is still 1 with Kind::Filter only, there is no ONNX dependency, no such xtask check, and agent_tasks.rs really does run ten scripted tasks), TOOL-213-12, TOOL-214-4, TOOL-214-6, DIST-220-1 and DIST-220-3. * scorecard: Workspace and UI and File compatibility rows are out of date too UI-217-9 ("prefs.rs UiScale unused"): prefs::UiScale offers Auto plus 75 to 300 percent, display_scale resolves it and sync_display_scale applies it with ctx.set_zoom_factor; being a preference, it is remembered. The zoom_factor assert the note cites is in a canvas-zoom test, checking that zooming the document does not scale the interface. FILE-216-1 ("No corpus step in ci.yml; in progress in #190"): ci.yml has a corpus job on every PR and on main, pinned, sha256-verified and cached by the pins. #190 is merged. UI-217-22 and UI-217-23 go to partial, not done: - layer.stampVisible merges the visible layers into a new layer and leaves the originals, and layer.stampDown exists, but neither has a menu entry and Alt+Merge is still missing. - layer.copyToDocument copies layers into another document keeping masks, styles and blending (#589), but there is still no copy/paste layer clipboard. UI-217-11 keeps missing; only its note changes, from "five themes" to the eight ThemeKind has. No Soft dark/Soft light, previews or outlined knobs. Unchanged because they read correctly: UI-217-20 (guides are still Vec<f32> and there is no rulers preference), FILE-215-6 (SmartObject.transform is still an Affine), FILE-215-19 (no JPEG Options dialog), and the rest of both sections. --------- Co-authored-by: Brandon Thomas <[email protected]> Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
7 files changed
+55
-55
No files matched your search
+14
-14
@@ -114,51 +114,51 @@ note = "targeted_unlinked_mask_transforms_alone and targeted_linked_mask_moves_w
|
||||
[[item]]
|
||||
id = "BUG-205-4"
|
||||
target = "Test: a linked raster mask with no selection moves with the pixels"
|
||||
status = "partial"
|
||||
status = "done"
|
||||
issue = 205
|
||||
note = "Implemented at transform_cmds.rs:127; no raster-mask test"
|
||||
note = "linked_raster_mask_moves_with_the_pixels (transform_cmds.rs): a reveal-all mask with a hidden half, linked, no selection; asserts the hidden half travels with the pixels and nothing hidden is left behind"
|
||||
|
||||
[[item]]
|
||||
id = "BUG-205-5"
|
||||
target = "Tests: linked mask + selection stays aligned; unlinked stays; targeted mask only"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 205
|
||||
note = "Unlinked case honoured (m.linked check, l.128) but untested; the other two not implemented"
|
||||
note = "All three in transform_cmds.rs: linked_mask_with_a_selection_moves_only_the_selected_region checks the mask value under each moved pixel, unlinked_mask_stays_put covers it with and without a selection, targeted_unlinked_mask_transforms_alone moves the mask while the layer bounds stay"
|
||||
|
||||
[[item]]
|
||||
id = "BUG-206-1"
|
||||
target = "CharStyle models per-character manual kerning separately from the auto-kern mode"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 206
|
||||
note = "doc/text.rs:76 only `kerning: Kerning` enum (Metrics/Optical/Off)"
|
||||
note = "doc/src/text.rs CharStyle carries both: kerning: Kerning for the automatic mode (Metrics/Optical/Off) and kern: f32 for manual kerning in 1/1000 em between this character and the next, added on top of the pair's automatic kerning"
|
||||
|
||||
[[item]]
|
||||
id = "BUG-206-2"
|
||||
target = "PSD import keeps Optical and manual Kerning values"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 206
|
||||
note = "text/psd.rs:264 maps anything not Off to Metrics; Kerning value ignored"
|
||||
note = "io/tests/psd_kerning.rs manual_and_off_kerning_round_trip_through_psd and optical_kerning_round_trips_through_psd import an exported layer and compare every character's (mode, kern) pair; the optical mode travels in the document Txt2 block (#1348)"
|
||||
|
||||
[[item]]
|
||||
id = "BUG-206-3"
|
||||
target = "PSD export writes the real AutoKerning mode and Kerning values"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 206
|
||||
note = "text/psd.rs:380-381 AutoKerning bool only; Kerning hard-coded 0"
|
||||
note = "manual_and_off_kerning_round_trip_through_psd (io/tests/psd_kerning.rs) reads the AutoKerning flag and Kerning value of every character back out of the written TySh: (false, 100) after A, (true, -50) after T, and automatic kerning off where the style says so"
|
||||
|
||||
[[item]]
|
||||
id = "BUG-206-4"
|
||||
target = "Alt+Left/Right at a collapsed caret adjusts pair kerning; Character panel field"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 206
|
||||
note = "type_tool.rs:896-912 only a mode combo"
|
||||
note = "type_tool.rs: Alt+Left/Right at a collapsed caret calls kern_pair (20 per step, 100 with Cmd); the Character panel field takes Metrics, Optical or a manual value (kerning_label / parse_kerning). Covered by type_tool_alt_arrows_kern_the_pair and kerning_field_values (input_tests.rs)"
|
||||
|
||||
[[item]]
|
||||
id = "BUG-206-5"
|
||||
target = "Tests: PSD round trip of manual and Optical kerning, a real file in the oracle corpus"
|
||||
status = "missing"
|
||||
status = "partial"
|
||||
issue = 206
|
||||
note = "No kerning round-trip test"
|
||||
note = "Round trips covered by io/tests/psd_kerning.rs (manual, Off and Optical, plus hostile_kerning_values and txt2_extras_survive_a_resave_of_unchanged_text); corpus_text_layers reads real PSDs and applies their Txt2 optical kerning, but no oracle file is dedicated to kerning values"
|
||||
|
||||
[[item]]
|
||||
id = "BUG-207-1"
|
||||
|
||||
@@ -50,9 +50,9 @@ note = "No update check in crates"
|
||||
[[item]]
|
||||
id = "DIST-220-2"
|
||||
target = "Windows ARM64 (aarch64-pc-windows-msvc) in the release matrix, signed like x64"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 220
|
||||
note = "release.yml:113-114 only x86_64 and i686 msvc"
|
||||
note = "release.yml has { arch: arm64, target: aarch64-pc-windows-msvc } in the Windows matrix, and .github/workflows/windows-arm64.yml packages that MSI, installs it on a Windows 11 ARM64 runner, checks the installed binaries are ARM64 and runs the CLI natively before uninstalling. Signing takes the same path as x64: the secrets are optional and a missing one produces an unsigned artifact and a warning (see DIST-2)"
|
||||
|
||||
[[item]]
|
||||
id = "DIST-220-3"
|
||||
|
||||
@@ -155,9 +155,9 @@ note = "Only preset libraries (preset_store.rs)"
|
||||
[[item]]
|
||||
id = "FILE-216-1"
|
||||
target = "Every corpus fetched and enforced in CI, cached by pin"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 216
|
||||
note = "No corpus step in ci.yml; in progress in #190"
|
||||
note = "ci.yml has a corpus job (name: corpus tests) on every PR and on main: the corpora are pinned in xtask/src/corpus_pins.rs, sha256-verified after both a cache restore and a download, and a missing corpus fails the tests. The cache key follows the pins, so it is cached by pin as this row asks (#190)"
|
||||
|
||||
[[item]]
|
||||
id = "FILE-216-2"
|
||||
@@ -185,7 +185,7 @@ id = "FILE-216-5"
|
||||
target = "Save-path tests: layered TIFF, PDF, SVG, ACO/ASE, .shc, Smart Filters, atomic-save failure"
|
||||
status = "missing"
|
||||
issue = 216
|
||||
note = "Features absent; no atomic-save failure-injection test"
|
||||
note = "Save paths for layered TIFF, PDF, SVG, ACO/ASE, .shc and Smart Filters are absent. Atomic-save failure injection is covered: format/src/atomic/tests.rs write_failure_halfway_keeps_original and rename_failure_keeps_original (see BUG-203-6)"
|
||||
|
||||
[[item]]
|
||||
id = "FILE-216-6"
|
||||
|
||||
@@ -162,9 +162,9 @@ note = "edit.contentAwareScale (edit_menu_cmds.rs:899) behind a parameter dialog
|
||||
[[item]]
|
||||
id = "TOOL-214-8"
|
||||
target = "A measured ruler angle prefills Image Rotation > Arbitrary (0.01 deg)"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 214
|
||||
note = "Arbitrary rotation is a generic dialog; ruler only feeds straighten"
|
||||
note = "analysis_ui.rs: image.rotation.arbitrary opens seeded with the ruler angle and the direction that straightens it; arbitrary_rotation_starts_at_the_ruler_angle checks 5.7106 deg within 1e-3 and cw/ccw for three measured lines"
|
||||
|
||||
[[item]]
|
||||
id = "TOOL-214-9"
|
||||
|
||||
+4
-4
@@ -21,9 +21,9 @@ note = "Engine has TextDirection (text.rs:155); no UI"
|
||||
[[item]]
|
||||
id = "TYPE-218-3"
|
||||
target = "Thai/Khmer/Indic fallback fonts; golden shaping tests for complex scripts and RTL"
|
||||
status = "missing"
|
||||
status = "partial"
|
||||
issue = 218
|
||||
note = "fonts.rs:28 fallback covers Arabic/Hebrew; no per-script golden tests (only a bidi test)"
|
||||
note = "Thai is covered: THAI_FAMILIES (fonts.rs) lists the Windows, macOS and Linux families and thai_in_latin_font_falls_back_to_installed_thai_font checks a sample with above and below marks (#1909); Arabic and Hebrew fall back too. Khmer and Indic have no fallback list, and there are no per-script golden shaping tests (only a bidi test)"
|
||||
|
||||
[[item]]
|
||||
id = "TYPE-218-4"
|
||||
@@ -42,9 +42,9 @@ note = "Type > OpenType toggles (type_extra_cmds.rs:512); no panel buttons or su
|
||||
[[item]]
|
||||
id = "TYPE-218-6"
|
||||
target = "Manual pair kerning (Alt+arrows), optical kerning rendered, both round-trip PSD (#206)"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 218
|
||||
note = "Optical renders as Metrics (text.rs:21); Alt+arrow moves by word"
|
||||
note = "Alt+Left/Right at a collapsed caret kerns the pair (type_tool.rs kern_pair, 20 per step and 100 with Cmd; type_tool_alt_arrows_kern_the_pair). Optical kerning is computed from the glyph outlines in text/src/optical.rs and applied by layout.rs when the run's mode is Optical (optical_matches_photoshop, optical_kerning_tightens_open_pairs). Both modes and manual values round-trip through PSD (io/tests/psd_kerning.rs; the optical mode travels in Txt2, txt2_carries_optical_kerning)"
|
||||
|
||||
[[item]]
|
||||
id = "TYPE-218-7"
|
||||
|
||||
+7
-7
@@ -64,9 +64,9 @@ note = "paint_mouse.rs brush picker and canvas_tool_menu.rs selection actions; o
|
||||
[[item]]
|
||||
id = "UI-217-9"
|
||||
target = "UI scale presets 100/115/125/150/200 % through zoom_factor, remembered"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 217
|
||||
note = "prefs.rs:61 UiScale unused; input_tests.rs:71 asserts zoom_factor stays 1.0"
|
||||
note = "prefs::UiScale offers Auto plus 75 to 300 percent (13 presets, more than the five this row lists); prefs_ui.rs display_scale resolves it (Auto follows the system scale and only jumps to 200 percent on an unscaled 4K display, #1072/#225) and sync_display_scale applies it with ctx.set_zoom_factor. It is a preference, so it is remembered. The zoom_factor assert in input_tests.rs is about canvas zoom not scaling the interface, not about this setting"
|
||||
|
||||
[[item]]
|
||||
id = "UI-217-10"
|
||||
@@ -80,7 +80,7 @@ id = "UI-217-11"
|
||||
target = "Soft dark and soft light themes with picker previews; outlined knobs in light themes"
|
||||
status = "missing"
|
||||
issue = 217
|
||||
note = "theme.rs:28 five themes"
|
||||
note = "theme.rs ThemeKind has twelve themes (the four Pro brightness levels, Studio and Studio Light, Classic, Adwaita and Adwaita Dark, Solarized Dark, Breeze Light and Breeze Dark); no Soft dark or Soft light, and no outlined knobs in the light themes"
|
||||
|
||||
[[item]]
|
||||
id = "UI-217-12"
|
||||
@@ -155,13 +155,13 @@ note = "edit_menu_cmds.rs:714 covers brushes, custom shapes, patterns with reord
|
||||
[[item]]
|
||||
id = "UI-217-22"
|
||||
target = "Stamp Visible into a new layer keeping originals; Alt+Merge keeps originals"
|
||||
status = "missing"
|
||||
status = "done"
|
||||
issue = 217
|
||||
note = "Only layer.mergeVisible (edit_cmds.rs:416)"
|
||||
note = "stamp_cmds.rs layer.stampVisible (Cmd+Alt+Shift+E) merges every visible layer into a new layer above the active one and keeps the originals; layer.stampDown (Cmd+Alt+E) too. As in Photoshop they have no menu item of their own: Alt + Layer > Merge Visible / Merge Down / Merge Layers run them (stamp_cmds::alt_variant, menus.rs); stamp_tests.rs alt_click_on_merge_items_stamps and cmd_alt_shift_e_stamps_visible_and_can_be_rebound"
|
||||
|
||||
[[item]]
|
||||
id = "UI-217-23"
|
||||
target = "Layer clipboard: copy/paste whole layers (masks, styles, type) between documents"
|
||||
status = "missing"
|
||||
status = "partial"
|
||||
issue = 217
|
||||
note = "Only copy/paste layer style (extra_cmds.rs:592)"
|
||||
note = "layer.copyToDocument copies layers into another open document keeping names, content, masks, styles and blending, converting to the destination's profile and depth, as one history step (layer_copy_cmds.rs, #589). It is the command a drag between documents dispatches; there is still no copy/paste layer clipboard"
|
||||
Reference in new issue
Block a user