Present the develop panel's groups in the order a photographer reaches for them: optics, composition, tone, colour, effect, detail.
Why
Corrections invalidate the judgements made before them, and detail work depends on everything above it. The current tab order is Attribute::ALL minus Compose — Tone, Colour, Detail, Optics, Effect — which invites a photographer to sharpen before correcting the lens, then correct the lens and invalidate the tonal work done in between.
The chain itself is already correct: white_balance(10) → exposure(20) → contrast(30) → highlights_shadows(40) → blacks_whites(50) → tone_curve(60) → brilliance(70) → vibrance(80) → saturation(90) → colour_mixer(100) → noise_reduction(110) → capture_sharpen(120) is, line for line, the order the four major editors converge on — including denoise before sharpen and contrast after the recovery controls. Rows draw in chain order, so the sequence inside each tab is right too. This is a statement about group order only; no compute changes.
Attribute::ALL's own doc comment already claims to be "roughly the order a photographer works in". This makes the claim true.
Acceptance
Tabs appear as optics, composition, tone, colour, effect, detail; Compose still routes to ComposePanel and is skipped as a tab.
The preset scope sheet, which also walks Attribute::ALL, follows the same order.
A copy_attributes setting written before the change selects the same attributes after it.
Lands in
core/dr-pipeline/src/descriptor.rs — the Attribute::ALL array, and its doc comment.
Verified safe:Scope's bit positions are derived from Attribute::ALL at runtime (preset.rs::bit), and settings persist attribute names, not bit indices (ui/dr-ui/src/presets.rs:168, Attribute::from_name). Nothing serialised depends on the ordering.
Open
Where Effect sits is the one genuinely arguable slot. A spectral film simulation renders — it declares Operation::renders and replaces the base curve — which argues for placing it in the corrective group. Placing it after colour reflects the "preset last" half of a split that is real and genre-dependent (volume work applies a look first; considered work applies it last). Proposed as stated; worth a docs/requirements.md decision entry either way.
Part of the Develop Ergonomics spec (FR-DEV series proposal), 2026-09-05.
Present the develop panel's groups in the order a photographer reaches for them: **optics, composition, tone, colour, effect, detail.**
## Why
Corrections invalidate the judgements made before them, and detail work depends on everything above it. The current tab order is `Attribute::ALL` minus Compose — **Tone, Colour, Detail, Optics, Effect** — which invites a photographer to sharpen before correcting the lens, then correct the lens and invalidate the tonal work done in between.
The chain itself is already correct: `white_balance(10) → exposure(20) → contrast(30) → highlights_shadows(40) → blacks_whites(50) → tone_curve(60) → brilliance(70) → vibrance(80) → saturation(90) → colour_mixer(100) → noise_reduction(110) → capture_sharpen(120)` is, line for line, the order the four major editors converge on — including denoise before sharpen and contrast after the recovery controls. Rows draw in chain order, so the sequence *inside* each tab is right too. This is a statement about group order only; no compute changes.
`Attribute::ALL`'s own doc comment already claims to be "roughly the order a photographer works in". This makes the claim true.
## Acceptance
- [ ] Tabs appear as optics, composition, tone, colour, effect, detail; Compose still routes to `ComposePanel` and is skipped as a tab.
- [ ] The preset scope sheet, which also walks `Attribute::ALL`, follows the same order.
- [ ] A `copy_attributes` setting written before the change selects the same attributes after it.
## Lands in
`core/dr-pipeline/src/descriptor.rs` — the `Attribute::ALL` array, and its doc comment.
**Verified safe:** `Scope`'s bit positions are derived from `Attribute::ALL` at runtime (`preset.rs::bit`), and settings persist attribute *names*, not bit indices (`ui/dr-ui/src/presets.rs:168`, `Attribute::from_name`). Nothing serialised depends on the ordering.
## Open
Where `Effect` sits is the one genuinely arguable slot. A spectral film simulation *renders* — it declares `Operation::renders` and replaces the base curve — which argues for placing it in the corrective group. Placing it after colour reflects the "preset last" half of a split that is real and genre-dependent (volume work applies a look first; considered work applies it last). Proposed as stated; worth a `docs/requirements.md` decision entry either way.
---
Part of the Develop Ergonomics spec (FR-DEV series proposal), 2026-09-05.
Partly overtaken by 474dcf0 and 6a97fdf, filed minutes after this ticket. Restating what is left.
Attribute::ALL is now [Compose, Tone, Colour, Detail, Optics, Effect] — 474dcf0 moved Compose to the front on exactly the reasoning this ticket opens with, and moved declared::Attr::ALL with it. So the body above is stale where it says framing sits fifth.
The remaining gap is the other two ends of the list, and it is unchanged:
Optics still sits fifth, behind tone, colour and detail. Removing vignetting brightens the frame, so every exposure judgement made before the lens correction has to be made again. It belongs first — ahead of Compose, if anything, since it is a property of the capture rather than a decision.
Detail still sits fourth, ahead of Optics. Sharpening depends on everything above it and is the last thing reached for; noise reduction and sharpening are also the two operations that cannot be judged at fit view at all (#2).
6a97fdf makes this matter more, not less. Its own message says the contradiction "was harmless while the list only fed a row of chips nobody reads in order" and "stops being harmless now that the same list drives a column read top to bottom" — that argument applies to Optics and Detail with the same force it applied to Compose.
The Effect placement question in the body still stands, and is still worth a decision entry rather than a preference.
**Partly overtaken by 474dcf0 and 6a97fdf, filed minutes after this ticket. Restating what is left.**
`Attribute::ALL` is now `[Compose, Tone, Colour, Detail, Optics, Effect]` — 474dcf0 moved Compose to the front on exactly the reasoning this ticket opens with, and moved `declared::Attr::ALL` with it. So the body above is stale where it says framing sits fifth.
**The remaining gap is the other two ends of the list**, and it is unchanged:
- **Optics still sits fifth**, behind tone, colour and detail. Removing vignetting brightens the frame, so every exposure judgement made before the lens correction has to be made again. It belongs first — ahead of Compose, if anything, since it is a property of the capture rather than a decision.
- **Detail still sits fourth**, ahead of Optics. Sharpening depends on everything above it and is the last thing reached for; noise reduction and sharpening are also the two operations that cannot be judged at fit view at all (#2).
Proposed, revised: **`[Optics, Compose, Tone, Colour, Effect, Detail]`.**
6a97fdf makes this matter more, not less. Its own message says the contradiction "was harmless while the list only fed a row of chips nobody reads in order" and "stops being harmless now that the same list drives a column read top to bottom" — that argument applies to Optics and Detail with the same force it applied to Compose.
The `Effect` placement question in the body still stands, and is still worth a decision entry rather than a preference.
Done in efa9d84 ("Correct the lens first and settle the grain last"): Attribute::ALL is now Optics, Compose, Tone, Colour, Effect, Detail (core/dr-pipeline/src/descriptor.rs), and both the develop tabs (develop/tabs.rs) and the preset scope sheet (presets.rs) walk it. Settings persist attribute names, not positions, so old presets still select the same groups. Where Effect sits is recorded as an open tension in the doc comment above ALL.
Done in efa9d84 ("Correct the lens first and settle the grain last"): `Attribute::ALL` is now Optics, Compose, Tone, Colour, Effect, Detail (`core/dr-pipeline/src/descriptor.rs`), and both the develop tabs (`develop/tabs.rs`) and the preset scope sheet (`presets.rs`) walk it. Settings persist attribute names, not positions, so old presets still select the same groups. Where Effect sits is recorded as an open tension in the doc comment above `ALL`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Present the develop panel's groups in the order a photographer reaches for them: optics, composition, tone, colour, effect, detail.
Why
Corrections invalidate the judgements made before them, and detail work depends on everything above it. The current tab order is
Attribute::ALLminus Compose — Tone, Colour, Detail, Optics, Effect — which invites a photographer to sharpen before correcting the lens, then correct the lens and invalidate the tonal work done in between.The chain itself is already correct:
white_balance(10) → exposure(20) → contrast(30) → highlights_shadows(40) → blacks_whites(50) → tone_curve(60) → brilliance(70) → vibrance(80) → saturation(90) → colour_mixer(100) → noise_reduction(110) → capture_sharpen(120)is, line for line, the order the four major editors converge on — including denoise before sharpen and contrast after the recovery controls. Rows draw in chain order, so the sequence inside each tab is right too. This is a statement about group order only; no compute changes.Attribute::ALL's own doc comment already claims to be "roughly the order a photographer works in". This makes the claim true.Acceptance
ComposePaneland is skipped as a tab.Attribute::ALL, follows the same order.copy_attributessetting written before the change selects the same attributes after it.Lands in
core/dr-pipeline/src/descriptor.rs— theAttribute::ALLarray, and its doc comment.Verified safe:
Scope's bit positions are derived fromAttribute::ALLat runtime (preset.rs::bit), and settings persist attribute names, not bit indices (ui/dr-ui/src/presets.rs:168,Attribute::from_name). Nothing serialised depends on the ordering.Open
Where
Effectsits is the one genuinely arguable slot. A spectral film simulation renders — it declaresOperation::rendersand replaces the base curve — which argues for placing it in the corrective group. Placing it after colour reflects the "preset last" half of a split that is real and genre-dependent (volume work applies a look first; considered work applies it last). Proposed as stated; worth adocs/requirements.mddecision entry either way.Part of the Develop Ergonomics spec (FR-DEV series proposal), 2026-09-05.
Partly overtaken by
474dcf0and6a97fdf, filed minutes after this ticket. Restating what is left.Attribute::ALLis now[Compose, Tone, Colour, Detail, Optics, Effect]—474dcf0moved Compose to the front on exactly the reasoning this ticket opens with, and moveddeclared::Attr::ALLwith it. So the body above is stale where it says framing sits fifth.The remaining gap is the other two ends of the list, and it is unchanged:
Proposed, revised:
[Optics, Compose, Tone, Colour, Effect, Detail].6a97fdfmakes this matter more, not less. Its own message says the contradiction "was harmless while the list only fed a row of chips nobody reads in order" and "stops being harmless now that the same list drives a column read top to bottom" — that argument applies to Optics and Detail with the same force it applied to Compose.The
Effectplacement question in the body still stands, and is still worth a decision entry rather than a preference.Done in
efa9d84("Correct the lens first and settle the grain last"):Attribute::ALLis now Optics, Compose, Tone, Colour, Effect, Detail (core/dr-pipeline/src/descriptor.rs), and both the develop tabs (develop/tabs.rs) and the preset scope sheet (presets.rs) walk it. Settings persist attribute names, not positions, so old presets still select the same groups. Where Effect sits is recorded as an open tension in the doc comment aboveALL.