Files
selune 9e6e0b8df1 Render workspace: complete experimental ribbon, resources and effects integration (#5493) (#5494)
* wip(render): reconcile completed material and image pipeline source with 0.20 (#5493)

Source-only integration reference for staged review, not a merge-ready aggregate.
Donor: 0xlillith/solidcraft@aea20b0115.
Upstream: 858e5995d6.

Retain original CPU/material contracts and explicit GPU donor provenance in
docs/render-materials-lab.md (#2067, #2191, #2780, #3306). Preserve released
format migrations and current navigation/startup/shell behavior. New saved
records use pending descriptors. The physical-card descriptor follows the
maintainer's material-engineering-cards naming request, with a legacy-lab
format-29 regression. Replace raw new panel hosts with shared containers.

Repository checks, complete workspace/all-target Clippy, and the independent
physical/resource authoring checks pass for this source. The fresh full local
CI invocation has reached test compilation and is not yet complete. Do not
transfer donor native output or prior test totals to this integration.

Generated review screenshots, video, package ZIP and machine logs remain at
the immutable personal evidence pin. Uncommitted geometric displacement is
backed up separately, not silently included. No kernel/vendor change, direct
main write, release or independent contributor-branch rewrite.

Co-authored-by: Christian Svensson <blue@cmd.nu>

* test(cli): pin the Compact camera-sample admission diagnostic (#5493)

The bounded request still refuses 1024x1024x64 samples before host initialization and writes no output. Update only the stale expected diagnostic to the existing Compact budget wording; production limits and code are unchanged. Exact-tree CLI regression suite: 14 passed, 0 failed. The full repository gate has been invoked separately and is not yet complete.

* Normalize UI container violation paths across platforms

Report repository-relative paths with forward slashes so diagnostics and the existing nested-package regression assertions agree on Windows and Unix. Keep the container detection rules unchanged.

Validation: official ui-containers gate and all seven focused xtask tests passed; rustfmt and diff checks passed. Only xtask/dependencies were compiled; no application build or heavy tests.
(cherry picked from commit 44b58d8e10)

* fix(render): preserve camera contracts and correct acceptance regressions (#5493)

Preserve Design view.apply semantics with a separate strict Render camera command. Retain existing translations when English-only aliases collide; add material-axis entries and camera-specific pitch labels. Compare complete validated engineering cards and retain job handles before cancellation.

Focused and native acceptance is pinned to tree f8a423b21f. Full CI has been invoked separately and is not claimed green. Landing follows the render integration policy in #5493.

* fix(render): resolve showcase licence and upstream resource hygiene (#5493)

Record SychPL's explicit MIT OR Apache-2.0 grant, retaining source/model bytes and the Ubuntu lettering notice. Remove 80 absent attribution rows, personal fork records, dead delivery attributes and three fork/resource-only workflows. Existing xtask assets now performs bounded offline hash checks and rejects orphan render attribution; no parallel draft CI or package installation. Original authoring reproduction remains explicit. Scoped xtask tests, assets, Clippy, formatting and prepared SELENE validation pass; no application or renderer-wide result is inferred.

* fix(render): align saved bounds and progressive sample resolution (#5493)

Address review r4364211669/r4364211677/r4364211681/r4364211691/r4364211695. Persisted light/frame domains respect the existing 1e9 document bound; related LED/rectangle/direction cases use the same bound. Workstation primary resolve shares the 4096 admission cap and film counters use checked conversions. Exact candidate: 485 CPU render tests, 21 render document tests and strict scoped Clippy pass, including positive boundary round trips and 2048/4096 end-to-end checkpoints. No released format/migration edits, relaxed test limits or full-stack acceptance claim.

* wip(render): isolate optional resources and harden sample handling (#5493)

Review work in progress: opt-in encoded render library with reproducible runtime catalog exports; native-only robust dependency through the workspace; checked bloom slices; per-sample point-light diagnostics; independent area-light spatial/film keys. Resource-module binaries in both configurations, generation, Cargo production feature graphs and attribution checks pass. Full engine/render regression and combined acceptance are pending: do not merge this donor as a constituent or treat scoped resource proof as runtime acceptance.

* fix(gpu): preserve donor allocations through the scope-safety repair (#5722)

Port the native-validated #5723 scope-cleanup correction into the experimental donor, retaining its adaptive, volume, aging, photographic and bloom allocations. Same reverse-drain helper and regression cases; the donor combination still needs its own compile/test gate and is not covered retroactively by render-base results.

* claim: #1369

* Reject unknown pending concepts after format folding (#1369)

* test(render): close bounded sampling and bloom review regressions (#5493)

Validate the optional-resource/lighting/dependency donor at its exact tree. Required Vulkan GPU 127/0/3; CPU renderer 487/0; engine Render 72/0; document render 21/0; lean library 7/0; strict scoped Clippy, assets/layers/lists/containers and lean-engine WASM pass. Preserve original failed controller/typing attempts. This is the draft donor/disposition source, not a replacement for constituent render PRs or final main acceptance.

* wip(render): preserve stable aging target validation candidate

Exact staged source from prior review work on donor 3b892eab5e. This is a recovery/review checkpoint, NOT accepted delivery. An actual command-path regression currently fails because the selected executor refuses ordered surface aging. No assertion, capability or admission limit is weakened. Native/UI/full combination acceptance remains pending. Saved/runtime split adds one pending descriptor and retains original file scope; no main/render branch is changed.

* test(render): preserve numeric setup intent at the admitted coordinate bound

Follow up jyviko review on #5494 without weakening the corrected saved-coordinate contract. The positive clicked fixture uses 1e9 instead of inadmissible 2e9; explicit out-of-range cases still refuse, and the full saved setup round-trips through JSON and the native container. Exact-source Render workspace 95/0 and strict all-target UI Clippy pass. This does not incorporate the separately failing stable-aging candidate or claim full current-render acceptance.

* test(render): use the real GPU executor for saved aging

Move successful native cold-reopen Check/Start coverage from the CPU-backed protocol fixture into the production GPU executor tests. Verify capture-index changes preserve the stable target and that enabling aging changes both PNG and raw EXR output. Retain explicit, allocation-free refusal coverage for executors without aging support. Production capabilities and admission checks are unchanged.

* fix(render): persist stable identities for targeted aging (#5493)

Separate saved RenderBodyTarget identities from captured mesh ordinals. Reject legacy ambiguous targets, resolve Check/Start after visibility changes and preserve native reopening, copies and undo. Unsupported executors still refuse; real AMD Vulkan regression completes saved aging after reordered capture.

Source tree 6b84c8ad passes document 23, engine Render 75, GPU effects 5 and Render UI 95 with no failures; scoped strict Clippy, WASM and repository gates pass. Fresh CLI/native reopen and clean/aged GPU exports pass with identical physical totals and inspected actual images. Whole current-render integration is separate.

* fix(render): reconcile combined CPU/GPU contracts on current upstream

Unify captured resources/status and CPU-vs-GPU request schemas after the real two-parent integration; remove obsolete duplicate Vulkan selector and retain combined platform-filter regression. Deduplicate only identical or superseded test definitions, retaining the stronger card metadata and reserved-executor assertions. No assertions, admission limits or feature refusals are weakened.

All targets of render dependencies, GPU, engine, UI, CLI and native app pass cargo check with raytrace-cpu and bundled-render-library at tree c70d00d1. Native executable tests and full current-source acceptance remain pending. This is a private integration rehearsal for subsequent constituent PRs, not an aggregate official render/main merge.

* test(render): retain one complete host lifetime regression set

Deduplicate byte-identical DropProbe/task-lifetime tests and retain the adapted environment/texture ownership regressions with every assertion and complete memory estimate. Keep the registered-geometry admission regression once; only struct field order differed. Replace a one-element diagnostic loop with its equivalent block, preserving all wrap/width assertions.

Test-only integration repair. Formatting and diff checks pass; refreshed executable validation is required. No production behavior, limits, assertions or ignores changed.

* fix(doc): recognize the proven format-29 card descriptor alias

Normalize only the historical format-29 physical-material-cards spelling, and only when material-engineering-cards is registered. Admission and migration de-duplication use the same identity. Unknown concepts, wrong versions and incapable readers still refuse before mutation. Six controlled-history Rust regressions and actual CLI migration/no-clobber acceptance pass. No version, released migration or CI changes. Refs #5793, #1369, #5493.

* test(render): preserve grounding refusal before explicit instance moves

Update the two Render binding fixtures for upstream first-occurrence grounding. Verify grounded movement refuses without changing document/history, then explicitly unground through the public command before the intended move. Retain every target, resource, copy and persistence assertion. Refs #5493.

---------

Co-authored-by: Christian Svensson <blue@cmd.nu>
Co-authored-by: Victor Santos Oliveira <56417388+Vittuu@users.noreply.github.com>
Co-authored-by: cfaulkingham <colin.faulkingham@gmail.com>
2026-10-24 14:21:59 +00:00

744 lines
39 KiB
JSON

{
"metadata": {
"schema_version": "0.2.0",
"language": "en",
"status": "concept_catalog",
"provenance_id": "ORIGINAL-2026-10-CATALOG",
"integration_contract": "ui-integration.json",
"integration_status": "proposed_ui_not_runtime_registration"
},
"items": [
{
"id": "UX-001",
"area": "Entry",
"name": "Start from the current subject",
"behavior": "Enter the existing Render workspace with the selected subject retained; use intent and domain as local library filters, not another workspace or mandatory mode selector.",
"acceptance": [
"Render retains its single RENDER ribbon tab; SCENE and IMAGE remain ribbon groups rather than extra contextual tabs.",
"Scenes, Materials, Lighting and Environments are choices in one local resource-browser selector.",
"Changing a library filter preserves subject selection, scene values and pending inspector edits."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-002",
"area": "Entry",
"name": "Bounded and honest preview",
"behavior": "Show the actual preparation phase and a bounded preview supported by the selected executor, while retaining the last successful result with its captured revision.",
"acceptance": [
"A future scene without a bound renderer shows its availability and next action instead of a fabricated preview.",
"An older completed image is visibly identified when the scene or output settings change.",
"Thumbnail work and preview preparation do not block geometry selection or camera input."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-003",
"area": "Entry",
"name": "Progressive inspector disclosure",
"behavior": "Quick is the default collapsed inspector presentation; Detailed and Expert expand sections of the same inspector and persistent scene, without global mode switches or new ribbon tabs.",
"acceptance": [
"Expanding or collapsing a section never resets values, changes quality or applies a scene.",
"Expansion, scroll and focus state remain local to the document and inspected context.",
"The visible Quick area has at most six primary adjustment controls at once, excluding the scene and quality selectors."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-004",
"area": "Entry",
"name": "Reviewable scene recipes",
"behavior": "Preview a resolved scene replacement and its lock conflicts before a future atomic apply; scene selection and hover alone do not commit edits.",
"acceptance": [
"The change summary distinguishes retained fields, replacements, unresolved dependencies and blocked locked fields.",
"A successful future scene apply creates one undo record; cancel or failed resolution leaves the scene unchanged.",
"The current prepared appearance-overlay script remains explicitly non-atomic and is not represented as an implemented preset-apply command."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-005",
"area": "Library",
"name": "Everyday-language search",
"behavior": "Search resource names, stable IDs, intended use, finish and manufacturing process; keep one material concept with linked authored variants instead of counting the 48 opaque projections as new concepts.",
"acceptance": [
"An exact material ID finds its concept and available authored projections with distinct fidelity labels.",
"Search and result selection work without dragging or using a pointer.",
"A zero-result view retains the query, states the active filters and offers a clear-filter action."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-006",
"area": "Library",
"name": "Comparable resource previews",
"behavior": "Use one declared reference rig, exposure and appropriate sample geometry for comparable material thumbnails, with a separately requested current-scene preview.",
"acceptance": [
"Each thumbnail identifies whether it is an actual rendered result, an authored concept image or an unavailable preview.",
"Renderer, resource version and display-treatment changes invalidate the relevant thumbnail cache.",
"Scene cards and material swatches use consistent category-appropriate framing without implying unsupported optics."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-007",
"area": "Library",
"name": "Persistent and practical filters",
"behavior": "Prioritize family, domain and compatibility filters; place provenance, memory cost and specialized optical filters in expandable sections of the shared library.",
"acceptance": [
"Show current result counts and total counts for the selected resource type, with concepts and authored variants distinguished.",
"Query, filters, selected result and scroll position survive opening an inspector and returning to the same category.",
"Virtualized lists preserve stable keyboard focus and accessible item position; loading more records does not reorder the active selection."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-008",
"area": "Library",
"name": "Actionable resource information",
"behavior": "Keep a concise fidelity label and blocker summary visible on each resource card; disclose controls, provenance, versions and detailed dependencies in the inspector.",
"acceptance": [
"Authoring state, source readiness, executor support and validation evidence are reported separately.",
"A resource can show several blockers at once, with an action for each; one badge does not hide another requirement.",
"Priority, authored status and a successful data validator never produce an implemented or visually validated badge."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-009",
"area": "Library",
"name": "Explicit assignment scope",
"behavior": "Preview the exact face, body or shared component target before appearance assignment; offer occurrence-specific edits only where the executor actually supports them.",
"acceptance": [
"A shared-definition edit states its affected occurrence count and highlights the full scope before commit.",
"The current native opaque adapter is labelled as reviewed subject-body assignment, not independent occurrence styling.",
"Click-select and Apply provide a keyboard-accessible alternative to drag-and-drop; Escape cancels a temporary preview."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-010",
"area": "Library",
"name": "Versions favorites and offline state",
"behavior": "Keep favorites and recent resources linked to stable identities and pinned versions, with a clear indication of local availability.",
"acceptance": [
"Offline reopening retains the resource definition and reports missing dependencies without silently substituting a newer version.",
"A favorite with missing content keeps its identity and offers a locate or restore action.",
"Library navigation history is preserved per document; changing favorites does not apply a scene."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-011",
"area": "Materials",
"name": "Contextual primary controls",
"behavior": "Expose at most six meaningful primary adjustments for the selected context; move remaining parameters into Detailed and Expert sections without changing their values.",
"acceptance": [
"Scene and quality selectors are separate from the six-adjustment limit.",
"A selected opaque preview exposes supported color and surface controls while texture, coating, transmission and emission remain explained requirements.",
"Unavailable controls explain their blocker and cannot emit unsupported parameters to current commands."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-012",
"area": "Materials",
"name": "Visible physical layers",
"behavior": "Keep substrate, coating, wear and dust independently inspectable in advanced sections, with a clear boundary between the target stack and the current opaque projection.",
"acceptance": [
"Applying an opaque surrogate never silently overwrites the authored advanced stack.",
"A locked layer remains unchanged when another layer or a scene recipe is edited.",
"Dust coverage preserves uncovered substrate and is not represented as a whole-body flat replacement."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-013",
"area": "Materials",
"name": "Manufacturing direction on the part",
"behavior": "Align a supported finish to a local edge or axis and report lost mapping references through the existing selection and navigation systems.",
"acceptance": [
"Moving an articulated part carries its local texture direction rather than sliding a world-space pattern.",
"A lost reference blocks automatic remapping and identifies the affected appearance.",
"Appearance orientation never changes engineering material axes, geometry or joint coordinates."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-014",
"area": "Materials",
"name": "Physical texture scale",
"behavior": "Display texture dimensions in model units and keep render-detail scale independent of geometry resizing.",
"acceptance": [
"Changing texture size leaves native dimensions, placement and source units unchanged.",
"The inspector distinguishes geometric detail scale from a dimensionless roughness value.",
"Unsupported procedural detail remains an authored target instead of an active control."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-015",
"area": "Materials",
"name": "Guided transparent targets",
"behavior": "Explain surface response, wall thickness, absorption and nested contents in a contextual optical section, with explicit unsupported and opaque-surrogate states.",
"acceptance": [
"A transmitting vessel is never silently converted to an opaque material or approximate alpha blend.",
"Choosing an inspection surrogate creates an explicitly labelled appearance variant without changing the transparent target definition.",
"The current vial, window and diffuser swatches are labelled opaque and do not imply refraction or light transmission."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-016",
"area": "Materials",
"name": "Appearance and engineering separation",
"behavior": "Link to existing engineering-property tools while keeping density, inertia, friction and joint assumptions outside the Render appearance inspector.",
"acceptance": [
"Appearance assignment preserves physical materials, engineering axes, native transforms and motion constraints.",
"A missing engineering property remains unknown rather than being inferred from a visual material name.",
"Engineering, appearance and simulation state are clearly labelled without introducing competing global modes."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-017",
"area": "Materials",
"name": "Optional expert node editing",
"behavior": "Disclose a future node editor from the Expert section for a selected appearance while retaining the same versioned resource and exposed parameters.",
"acceptance": [
"Opening node details does not change the active workspace, quality profile or persistent appearance.",
"A graph that cannot map back to the recipe remains visibly custom instead of silently rewriting simplified controls.",
"Node editing remains capability-gated until typed resource and command support exists."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-018",
"area": "Lighting",
"name": "Selection-sized lighting rigs",
"behavior": "Fit a supported rig once to the selected subject and offer an explicit refit action that respects camera and rig locks.",
"acceptance": [
"Moving the camera or articulated arm after fitting does not change resolved source transforms.",
"Changing the selection does not continuously resize the rig.",
"Refit identifies its subject bounds and affected fields before one undoable apply."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-019",
"area": "Lighting",
"name": "Intent-based lighting controls",
"behavior": "Expose softness and contrast with the energy-normalization policy visible in the same section.",
"acceptance": [
"Changing source size states whether flux, radiance or a calibrated contribution is held fixed.",
"A locked source contribution is not modified by another lighting preset.",
"Unsupported lighting controls show requirements rather than pretending the current fixed studio can execute them."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-020",
"area": "Lighting",
"name": "Reflection placement assistance",
"behavior": "Place a future supported source from a selected surface and view through an advanced, cancelable preview using existing selection controls.",
"acceptance": [
"The preview states which source and physical parameters would change.",
"Keyboard selection and numeric placement remain available as alternatives to pointer placement.",
"Cancel, locked-source conflict or failed placement leaves the source and final camera unchanged."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-021",
"area": "Lighting",
"name": "Studio inspection view",
"behavior": "Inspect sources, flags and reflectors through the existing camera-navigation implementation without overwriting the saved shot camera.",
"acceptance": [
"The active inspection view and the saved output camera are visibly distinguished.",
"Returning to the shot restores its framing and camera-lock state.",
"No independent camera controller or extra global studio workspace is introduced."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-022",
"area": "Lighting",
"name": "Light-group adjustments",
"behavior": "Separate physically linear light-group gain changes from editorial RGB recoloring in an advanced lighting section.",
"acceptance": [
"A gain comparison preserves the captured scene, exposure and display transform unless its comparison scope is explicitly changed.",
"RGB recoloring is labelled an editorial image adjustment when it is not equivalent to a physical rerender.",
"The inspector shows the actual source owner rather than creating another emitter contribution."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-023",
"area": "Environment",
"name": "Environment background and ground",
"behavior": "Keep physical links visible by default while exposing background, ambient illumination and ground as distinct scene properties with independent locks.",
"acceptance": [
"Replacing a background image does not silently replace environment illumination or terrain geometry.",
"A preset change lists any deliberate link exception and retains locked fields.",
"Output transparency does not remove physically required ground or lighting contributions without an explicit supported action."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-024",
"area": "Environment",
"name": "Environment orientation",
"behavior": "Rotate linked illumination and reflection resources together only when supported, preserving the saved camera and any locked orientation.",
"acceptance": [
"A locked environment rotation disables automatic preset replacement and identifies the conflict.",
"Camera movement does not rotate an environment or refit a lighting rig.",
"The current unsupported environment controls cannot become editable merely by opening Detailed or Expert."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-025",
"area": "Environment",
"name": "Stage depth and parallax",
"behavior": "Identify photographic backgrounds, distant environments and nearby three-dimensional stage geometry in the scene inspector.",
"acceptance": [
"A scene card states which stage elements provide actual parallax and occlusion.",
"A camera or subject-fit operation preserves native model scale and reports stage-clearance requirements.",
"Unavailable geometry is shown as a blocker rather than replaced by a misleading flat image."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-026",
"area": "Environment",
"name": "Single Sun ownership",
"behavior": "Assign one owner to the solar contribution and expose conflicts between environment, sky and explicit Sun resources before applying a scene.",
"acceptance": [
"Composing a sky, environment and rig produces at most one owned solar emitter.",
"Physical lunar policy preserves zero atmospheric scattering and zero unrequested studio fill.",
"Resolving a conflict is explicit and undoable; it does not silently brighten a shadow region."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-027",
"area": "Camera",
"name": "Framing and scoped locks",
"behavior": "Provide separate camera-pose, projection, focus and exposure locks, with a labelled explicit fit action and a visible explanation of what each lock protects.",
"acceptance": [
"Camera fit is unavailable while pose or framing is locked and explains which lock blocks it.",
"Changing output aspect while pose is locked reports the resulting framing change rather than silently moving the camera.",
"Resetting a field or section respects user locks; unlocking and applying a conflicting preset is an explicit action."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-028",
"area": "Camera",
"name": "Accessible focus selection",
"behavior": "Set a supported focus distance from a selected scene point, with equivalent numeric entry and clear units.",
"acceptance": [
"Click-to-focus and keyboard numeric entry produce the same focus value through the shared command path.",
"A focus lock prevents automatic changes without blocking camera inspection.",
"Depth-of-field controls remain unavailable when the selected executor lacks the feature."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-029",
"area": "Camera",
"name": "Shots variants and document drafts",
"behavior": "Keep independently editable shot variants and per-document pending drafts, preserving edits when switching library categories or inspector sections.",
"acceptance": [
"Pending edits are visibly distinct from applied scene values; switching tabs or documents does not silently apply or discard them.",
"Apply and Discard are explicit, while document closing follows the existing unsaved-work flow.",
"Render either uses the clearly identified applied shot or requires the draft to be resolved; it never renders an ambiguous mixture."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-030",
"area": "Rendering",
"name": "Quality recommendations by shot",
"behavior": "Offer three recommended quality profiles for the selected shot using exact catalog IDs and names, with all other profiles available in the same selector.",
"acceptance": [
"Profile recommendations reference quality-presets.json and retain specified_unbound status until real resource and executor resolution succeeds.",
"Selecting a cheaper profile does not remove the shot optical, source or physical-policy requirements.",
"There is one quality choice, not a competing Preview/Final switch plus another quality mode selector."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-031",
"area": "Rendering",
"name": "Measured quality and time feedback",
"behavior": "Show actual output size, work budget and measured timing estimates; distinguish incomplete convergence from successful completion.",
"acceptance": [
"No render-time estimate is presented as measured before a relevant executor measurement exists.",
"Reaching a sample or time ceiling can produce an unconverged result with its diagnostics retained.",
"A higher profile name never serves as evidence of photorealism or optical accuracy."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-032",
"area": "Rendering",
"name": "Executor and capability disclosure",
"behavior": "Keep the selected executor and a concise compatibility summary visible, with detailed device and resource requirements in an expandable section.",
"acceptance": [
"The combined shot and quality requirements are checked before start, including source, material and output dependencies.",
"Changing the executor does not silently change materials, output format or scene policy.",
"Blocked controls and jobs name the actual missing feature and provide a relevant next action."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-033",
"area": "Rendering",
"name": "Actual phases and cancellation",
"behavior": "Display the phases exposed by the active executor, with a reachable Cancel control and the last successful image retained according to its actual lifetime.",
"acceptance": [
"The UI distinguishes queued, preparing, running, encoding, cancelling, cancelled, completed and failed states when provided.",
"Cancel affects the owned render job and does not undo an already applied scene or edit the source design.",
"Progress announcements are throttled for assistive technology and do not seize keyboard focus."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-034",
"area": "Rendering",
"name": "Actionable diagnostics",
"behavior": "List all relevant blockers with the affected resource or field and a focused action, keeping quality warnings distinct from hard admission failures.",
"acceptance": [
"Source absence and executor incompatibility can be shown together instead of hiding one behind a single status badge.",
"Opening a diagnostic preserves the current draft and returns focus to the initiating control.",
"A suggested approximation is explicitly labelled and never overwrites the original requested target silently."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-035",
"area": "Image",
"name": "Scoped before-after comparison",
"behavior": "Keep camera, exposure and display transform locked for A/B by default, with captured revisions and any deliberate comparison-scope change visible.",
"acceptance": [
"A/B conditions are comparison-local and do not silently create or remove persistent user locks.",
"Images from different scene revisions or finishing treatments remain identifiable.",
"Only an explicitly selected comparison parameter may differ; changing the comparison scope updates its label."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-036",
"area": "Image",
"name": "Reversible image finishing",
"behavior": "Keep scene-linear output, display treatment and artistic finishing distinct in the IMAGE workflow, exposing only buffers and controls the executor actually provides.",
"acceptance": [
"Raw/finished comparison is unavailable when no raw buffer exists, with an explanation rather than an invented result.",
"Finishing edits do not change physical source values or the approved motion bake.",
"Expert image controls are section disclosures and do not introduce a second global render mode."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-037",
"area": "Output",
"name": "Purpose-based export",
"behavior": "Offer supported presentation, transparent-product and production-master export intents through the existing export workflow.",
"acceptance": [
"Format and resolution choices reflect actual executor and encoder support before rendering.",
"The export identifies the exact retained job and captured scene revision.",
"Failure preserves the completed result where supported and offers a new destination; source native files are never export targets by default."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-038",
"area": "Output",
"name": "Reviewable render queue",
"behavior": "Disclose future batch and variant controls from IMAGE with captured shots, output paths and budgets visible before enqueueing.",
"acceptance": [
"Each queued item owns an immutable shot and resource manifest instead of following later inspector changes.",
"Cancellation and export remain attached to the originating document and job.",
"Batch tools are capability-gated extensions, not new top-level workspaces or claims about the current single-image host."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-039",
"area": "Accessibility",
"name": "Accessible controls and focus",
"behavior": "Use the existing UI kit and accessibility bridge for keyboard navigation, visible focus, scalable text, semantic labels and non-color-only feedback.",
"acceptance": [
"Complete search, filter, selection, numeric edit, Apply, Discard, preflight, Render, Cancel and Export without dragging or a pointer.",
"Virtualized results expose accessible names, selection state, item positions and total or filtered count without losing focus.",
"Primary actions have readable labels; icon-only secondary actions have accessible names and tooltips using approved icon assignments.",
"Text scaling and narrow panels preserve values and actions without overlapping or clipping essential controls.",
"Reduced motion disables automatic turntables, animated camera transitions and decorative preview motion while retaining understandable progress."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-040",
"area": "Automation",
"name": "Shared command authority",
"behavior": "Route actual appearance and render behavior through the existing registered commands; keep future recipe resolution and application explicitly unregistered until implemented.",
"acceptance": [
"appearance.assign and render.preflight/start/status/cancel/export remain the authorities rather than parallel UI-only aliases.",
"Saved setting changes use the existing render.settings command family and validated parameter contracts.",
"Assistant, CLI and UI requests use the same engine semantics; presentation-only focus and section disclosure remain UI state."
],
"priority": "P0",
"status": "proposed_support_unverified"
},
{
"id": "UX-041",
"area": "Lunar",
"name": "Physical lunar or editorial policy",
"behavior": "Expose physical versus editorial lighting as a saved shot policy, not another global interface mode.",
"acceptance": [
"Physical lunar policy prevents atmospheric scattering, automatic sky fill and undeclared editorial sources.",
"Selecting an editorial shot or adding fill records the change and updates the visible fidelity label.",
"Sun direction or exposure adjustments never silently enable an Earth disk or star background."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-042",
"area": "Lunar",
"name": "Cross-scale surface inspection",
"behavior": "Compare regolith detail, wheel features and vial size in the same model units from a contextual surface-scale section.",
"acceptance": [
"Texture and terrain-detail controls do not rescale the native rover.",
"Source bounds and local surface scale remain visible when a preset requests a close-up.",
"Unsupported geometric detail remains a target requirement rather than a false preview result."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-043",
"area": "Lunar",
"name": "Celestial assumptions",
"behavior": "Show site, epoch, stage orientation, local approximations and Earth visibility in an advanced context section.",
"acceptance": [
"Unresolved celestial bindings keep Earth and star overlays disabled.",
"Authored stage azimuth is not presented as a geographic ephemeris.",
"Changing context invalidates affected resolved fields and diagnostics without modifying the source model."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-044",
"area": "Lunar",
"name": "Emitter ownership inspection",
"behavior": "Identify environment, rig and rover-owned emitters in one scene inventory with their explicit contribution and sampling representation.",
"acceptance": [
"A visible emitter surface and its sampled representation are shown as one energy owner.",
"An unpowered LED appearance cannot be treated as an active emitter because of its color or material name.",
"Physical lunar source locks prevent a preset from introducing another Sun or unrequested fill."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-045",
"area": "SELENE",
"name": "Verified improved-source binding",
"behavior": "Check the pinned improved SELENE source and report unresolved semantic targets before model-specific scene application.",
"acceptance": [
"A different source hash or occurrence graph invalidates bindings and blocks automatic reuse.",
"The source native remains immutable; approved styling is saved as a named derivative.",
"Opening the standalone swatch script creates a fresh isolated document and never replays file.new into the source or current working design."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-046",
"area": "SELENE",
"name": "Reviewable material roles",
"behavior": "Preview chassis, foil, solar cell, optics, LED, vial and dust roles separately, including the exact supported scope and the fidelity of any chosen projection.",
"acceptance": [
"Current reviewed whole-body opaque assignments are visibly separated from future optical, emissive and layer bindings.",
"A shared component definition shows all affected copies before Apply.",
"Conflicting body or face overrides and locked appearances are resolved before mutation rather than being hidden by the role label."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-047",
"area": "SELENE",
"name": "SELENE shot guide",
"behavior": "Browse the twelve prepared SELENE shots in the local Scenes category, with intended framing, source readiness, required capabilities and three contextual quality recommendations.",
"acceptance": [
"Shot cards resolve their actual shot and quality IDs instead of inventing implemented presets from friendly names.",
"Unavailable shots remain inspectable with useful next actions; prepared opaque swatches are a distinct independent action.",
"Scene browsing preserves the active shot and pending draft until explicit application."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-048",
"area": "SELENE",
"name": "Realism diagnostics",
"behavior": "Expose scale, contact, light ownership, source evidence and unsupported optics as inspectable diagnostics before claiming a realistic result.",
"acceptance": [
"A dark lunar region explains its actual available lighting contributions without automatically adding fill.",
"An opaque surrogate, absent native source or unverified terrain generator prevents a validated-final claim.",
"Warnings link to the relevant field or resource and remain understandable without color coding."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-049",
"area": "Animation",
"name": "Animation and simulation clocks",
"behavior": "Show playback speed and render frame time separately from simulation time through the existing motion workflow.",
"acceptance": [
"Preview speed changes do not alter gravity, integration steps or the approved trajectory.",
"Render exposes a bound motion summary and links to motion tools instead of introducing another global timeline mode.",
"Reduced-motion preferences prevent automatic playback when opening a shot."
],
"priority": "P2",
"status": "proposed_support_unverified"
},
{
"id": "UX-050",
"area": "Animation",
"name": "Constraint handoff events",
"behavior": "Inspect grip, release, free flight, capture and stow events in the motion workflow, with a concise bound-state summary available to Render.",
"acceptance": [
"Render scene or quality changes preserve the approved event sequence.",
"Unbound or failed handoff states remain visible and prevent a false successful-catch presentation.",
"Any future editing action uses the motion command contract rather than a render-only physics shortcut."
],
"priority": "P2",
"status": "proposed_support_unverified"
},
{
"id": "UX-051",
"area": "Animation",
"name": "Trajectory evidence",
"behavior": "Distinguish analytic planning paths, kinematic studies and simulated trajectories in contextual diagnostics.",
"acceptance": [
"A planning overlay is never labelled a simulated or collision-validated path.",
"Displayed collision and reachability feedback identifies its data source and validity.",
"Appearance edits and thumbnail generation do not alter the trajectory or geometry."
],
"priority": "P2",
"status": "proposed_support_unverified"
},
{
"id": "UX-052",
"area": "Animation",
"name": "Contact diagnostics",
"behavior": "Show available impulses, penetration and relative speed near catch events from recorded simulation evidence.",
"acceptance": [
"Missing solver data remains unavailable rather than being inferred from a plausible animation.",
"Inspection does not change contact parameters or silently rebake motion.",
"Dense diagnostics use readable units, keyboard navigation and Detailed or Expert sections."
],
"priority": "P2",
"status": "proposed_support_unverified"
},
{
"id": "UX-053",
"area": "Animation",
"name": "Explicit sample state",
"behavior": "Show open, filling, sealed, airborne, captured and stored sample states with source evidence and failure paths.",
"acceptance": [
"State labels are distinct from visual material variants and render-quality profiles.",
"Closure and grasp state remain synchronized with the approved motion data.",
"A sealed appearance is not evidence of leak-tight containment or a successful capture."
],
"priority": "P2",
"status": "proposed_support_unverified"
},
{
"id": "UX-054",
"area": "Animation",
"name": "Bake and reproducible replay",
"behavior": "Bind approved motion to a versioned immutable bake while leaving render resolution, samples and display treatment independently editable.",
"acceptance": [
"Changing gravity, contact parameters, topology or motion settings invalidates the affected bake with an explicit reason.",
"Changing render samples or quality preserves the approved motion and joint state.",
"Pending render edits and motion drafts remain separate and are never silently committed together."
],
"priority": "P2",
"status": "proposed_support_unverified"
},
{
"id": "UX-055",
"area": "Presets",
"name": "Capability-aware scene composition",
"behavior": "Resolve material, quality, studio, environment, source and lock requirements before any future atomic preset application.",
"acceptance": [
"All missing capabilities are listed together before scene mutation.",
"Quality alternatives preserve shot optical requirements and source policy rather than acting as silent fallback modes.",
"The current six setup examples and standalone opaque swatches remain distinct from unbound complete-scene recipes."
],
"priority": "P1",
"status": "proposed_support_unverified"
},
{
"id": "UX-056",
"area": "Presets",
"name": "Explicit conflicts and overrides",
"behavior": "Explain field ownership and source, camera, material and physics conflicts before applying a preset, with scoped keep, unlock or cancel choices.",
"acceptance": [
"The change summary identifies resource defaults, scene values, shot overrides and user locks for every conflicting field.",
"A locked required field blocks incompatible application; unlocking is explicit and part of the reviewed change.",
"Cancel preserves applied state and pending draft; a future successful apply is one undoable action.",
"Per-document pending edits remain visible during scene selection, render preflight and source switching."
],
"priority": "P1",
"status": "proposed_support_unverified"
}
]
}