Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ccf9c39
Fix: preserve viewer drafts across file navigation
0xLeif Oct 10, 2026
58512a7
Fix Linux viewer regressions and record approved scope
0xLeif Oct 10, 2026
1b10150
chore(lifecycle): materialize put-edit-and-preview-in-the-same-viewer…
0xLeif Oct 10, 2026
fefd831
chore(lifecycle): record put-edit-and-preview-in-the-same-viewer-pane…
0xLeif Oct 10, 2026
c94e075
Match unrestricted Sculpt and viewer camera movement
0xLeif Oct 10, 2026
1fc3cc7
Record completed camera regressions and pending lifecycle gates
0xLeif Oct 10, 2026
9cd91be
chore(lifecycle): materialize keep-sculpt-and-web-cube-cameras-in-par…
0xLeif Oct 10, 2026
4114d3c
chore(lifecycle): record keep-sculpt-and-web-cube-cameras-in-parity-w…
0xLeif Oct 10, 2026
106c058
Record passing native and cross-platform camera verification
0xLeif Oct 10, 2026
f5a7211
chore(lifecycle): materialize put-edit-and-preview-in-the-same-viewer…
0xLeif Oct 10, 2026
1e56f9b
chore(lifecycle): record put-edit-and-preview-in-the-same-viewer-pane…
0xLeif Oct 10, 2026
53a4c19
chore(lifecycle): materialize record-viewer-navigation-verification-e…
0xLeif Oct 10, 2026
fbfb7a5
chore(lifecycle): record record-viewer-navigation-verification-eviden…
0xLeif Oct 10, 2026
6f4d964
Refresh approved viewer and camera verification records
0xLeif Oct 10, 2026
78adceb
Refresh native contract validation hashes
0xLeif Oct 10, 2026
761bdf4
chore(lifecycle): materialize keep-sculpt-and-web-cube-cameras-in-par…
0xLeif Oct 10, 2026
2cb0824
chore(lifecycle): record keep-sculpt-and-web-cube-cameras-in-parity-w…
0xLeif Oct 10, 2026
182dc07
Archive verified Sculpt and viewer camera parity
0xLeif Oct 10, 2026
fd50f4c
chore(lifecycle): materialize put-edit-and-preview-in-the-same-viewer…
0xLeif Oct 10, 2026
47e18d3
chore(lifecycle): record put-edit-and-preview-in-the-same-viewer-pane…
0xLeif Oct 10, 2026
8cf7a07
Archive verified viewer draft navigation
0xLeif Oct 10, 2026
c26fdfc
Record verified viewer and camera closure
0xLeif Oct 10, 2026
7161e4d
chore(lifecycle): materialize record-viewer-navigation-verification-e…
0xLeif Oct 10, 2026
083a3d5
chore(lifecycle): record record-viewer-navigation-verification-eviden…
0xLeif Oct 10, 2026
fa61988
Archive verified viewer delivery evidence
0xLeif Oct 10, 2026
8e9a0c4
Add Sculpt-style Slice editing and matched axis camera controls
0xLeif Oct 10, 2026
c86a777
Record actual parity verification and materialize Slice requirements
0xLeif Oct 10, 2026
3dd9cc9
chore(lifecycle): materialize bring-sculpt-slice-editing-to-the-brows…
0xLeif Oct 10, 2026
879ea25
chore(lifecycle): record bring-sculpt-slice-editing-to-the-browser-wi…
0xLeif Oct 10, 2026
3dce9ac
chore(lifecycle): materialize add-matching-x-y-z-axis-rotation-gizmos…
0xLeif Oct 10, 2026
df0de61
chore(lifecycle): record add-matching-x-y-z-axis-rotation-gizmos-and-…
0xLeif Oct 10, 2026
8a72e47
Record Linux parity checks and synchronize current viewer companion r…
0xLeif Oct 10, 2026
0f32c12
chore(lifecycle): materialize bring-sculpt-slice-editing-to-the-brows…
0xLeif Oct 10, 2026
6e8d0bb
chore(lifecycle): record bring-sculpt-slice-editing-to-the-browser-wi…
0xLeif Oct 10, 2026
06a806d
Archive verified Sculpt-style browser Slice change
0xLeif Oct 10, 2026
deb44c9
chore(lifecycle): materialize add-matching-x-y-z-axis-rotation-gizmos…
0xLeif Oct 10, 2026
60055f7
chore(lifecycle): record add-matching-x-y-z-axis-rotation-gizmos-and-…
0xLeif Oct 10, 2026
dab4258
Archive verified three-axis camera parity and record both closure rec…
0xLeif Oct 10, 2026
95c1213
Fix shared 3D canvas resolution after Slice and display changes
0xLeif Oct 10, 2026
cc71e78
Record verified drawable repair and actual provenance
0xLeif Oct 10, 2026
1269bff
chore(lifecycle): materialize repair-blurry-cubes-and-slice-canvases-…
0xLeif Oct 10, 2026
57a2db9
chore(lifecycle): record repair-blurry-cubes-and-slice-canvases-after…
0xLeif Oct 10, 2026
78a94d0
Archive verified shared canvas resolution repair
0xLeif Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"schema_version": 1,
"workflow_version": 2,
"workflow_origin_version": 2,
"id": "add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer",
"slug": "add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer",
"title": "Add matching X Y Z axis rotation gizmos and precise camera steps to Sculpt and the viewer",
"description": "Add matching X Y Z axis rotation gizmos and precise camera steps to Sculpt and the viewer",
"kind": "feature",
"state": "accepted",
"canonical_applied": true,
"base_commit": "fefd8316adfff3af8bdb87d26b4a417650540b56",
"created_at": 1791644309,
"updated_at": 1791655945,
"affected_specs": [
"ThreeMDViewer"
],
"affected_paths": [
"web/viewer.html",
"uitests/viewer.spec.mjs",
"hi/tools.md",
"specs/ThreeMDViewer",
"apps/sculpt/Sources/RookSculpture/SculptureProjection.swift",
"apps/sculpt/Sources/RookApp/SculptureViewport.swift",
"apps/sculpt/Sources/RookRendering/SculptureLiveVoxelView.swift",
"apps/sculpt/Sources/RookRendering/SculptureVoxelGeometry.swift",
"apps/sculpt/Tests",
"apps/sculpt/hi",
"apps/sculpt/specs"
],
"no_spec_change": false,
"no_spec_change_rationale": null,
"acceptance_criteria": [
"Both volume views show a small sphere with colored X, Y and Z rotation rings and accessible axis buttons. Choosing an axis constrains dragging and step buttons to rotation around that document axis; Free restores unconstrained orbit.",
"Three-axis rotation preserves an orthonormal camera orientation and supports Z rotation without changing model cells, slice, Undo, files, or installed geometry. Native and browser use the same document-axis convention, including row Y and plane Z.",
"Both views offer an editable rotation step in degrees (default 15 degrees) with minus and plus nudges, and an editable pan step in cells (default 0.25) with directional nudges. Values must be finite and positive; invalid input leaves the current camera unchanged. Fit resets the default pose and pan.",
"Tests compare shared asymmetric projection and picking cases including Z rotation, full X/Y/Z turns, negative nudges and exact inverse steps; native live and scalar renderers agree. Camera controls remain usable on narrow screens and have keyboard labels and focus indication.",
"Synchronize viewer and Sculpt contracts and intent, record actual current tests, complete verified lifecycle closure under Leif’s approved PR 93 camera scope, and preserve storage, rendering budgets, parser APIs, releases and trust policy."
],
"selected_artifacts": [
"context",
"requirements",
"plan",
"tasks",
"testing",
"docs",
"design",
"research"
],
"dependencies": [],
"answers": {
"architecture_risk": "yes",
"public_contract": "yes"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
{
"approvals": [
{
"gate": "definition",
"actor": "user:0xLeif",
"timestamp": 1791653015,
"digest": "4b6d4eb372c26f296d08a35c4242b772ba7f537d690b3ac81723034860824618",
"note": "Leif directly replied continue after the complete Slice and matching X/Y/Z camera definitions were presented together for approval and verified closure. This is scope approval, not human diff review or signed provenance.",
"approved_scope": {
"schema_version": 1,
"change_id": "add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer",
"title": "Add matching X Y Z axis rotation gizmos and precise camera steps to Sculpt and the viewer",
"description": "Add matching X Y Z axis rotation gizmos and precise camera steps to Sculpt and the viewer",
"kind": "feature",
"affected_specs": [
"ThreeMDViewer"
],
"affected_paths": [
"apps/sculpt/Sources/RookApp/SculptureViewport.swift",
"apps/sculpt/Sources/RookRendering/SculptureLiveVoxelView.swift",
"apps/sculpt/Sources/RookRendering/SculptureVoxelGeometry.swift",
"apps/sculpt/Sources/RookSculpture/SculptureProjection.swift",
"apps/sculpt/Tests",
"apps/sculpt/hi",
"apps/sculpt/specs",
"hi/tools.md",
"specs/ThreeMDViewer",
"uitests/viewer.spec.mjs",
"web/viewer.html"
],
"no_spec_change": false,
"no_spec_change_rationale": null,
"acceptance_criteria": [
"Both views offer an editable rotation step in degrees (default 15 degrees) with minus and plus nudges, and an editable pan step in cells (default 0.25) with directional nudges. Values must be finite and positive; invalid input leaves the current camera unchanged. Fit resets the default pose and pan.",
"Both volume views show a small sphere with colored X, Y and Z rotation rings and accessible axis buttons. Choosing an axis constrains dragging and step buttons to rotation around that document axis; Free restores unconstrained orbit.",
"Synchronize viewer and Sculpt contracts and intent, record actual current tests, complete verified lifecycle closure under Leif’s approved PR 93 camera scope, and preserve storage, rendering budgets, parser APIs, releases and trust policy.",
"Tests compare shared asymmetric projection and picking cases including Z rotation, full X/Y/Z turns, negative nudges and exact inverse steps; native live and scalar renderers agree. Camera controls remain usable on narrow screens and have keyboard labels and focus indication.",
"Three-axis rotation preserves an orthonormal camera orientation and supports Z rotation without changing model cells, slice, Undo, files, or installed geometry. Native and browser use the same document-axis convention, including row Y and plane Z."
],
"dependencies": [],
"supersedes": [],
"answers": {
"architecture_risk": "yes",
"public_contract": "yes"
}
},
"approved_delta_digests": {
"ThreeMDViewer": "41ce28706a4b04ba3801ad8ef3e98217bdaaf285333d2b519f476919f2767a08"
}
},
{
"gate": "finalization",
"actor": "specsync:finalization",
"timestamp": 1791655945,
"digest": "97d2b14dc39e8ae4fc624f05df89f8af6d26f2dda73159226b4dcd2c0639793d",
"note": "Same-PR finalization closing digest"
}
],
"reopenings": []
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
id: add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer
state: archived
type: feature
base_commit: fefd8316adfff3af8bdb87d26b4a417650540b56
---

# Add matching X Y Z axis rotation gizmos and precise camera steps to Sculpt and the viewer

## Intent

Add matching X Y Z axis rotation gizmos and precise camera steps to Sculpt and the viewer

## Affected Canonical Specs

- `ThreeMDViewer`

## Acceptance Criteria

- Both volume views show a small sphere with colored X, Y and Z rotation rings and accessible axis buttons. Choosing an axis constrains dragging and step buttons to rotation around that document axis; Free restores unconstrained orbit.
- Three-axis rotation preserves an orthonormal camera orientation and supports Z rotation without changing model cells, slice, Undo, files, or installed geometry. Native and browser use the same document-axis convention, including row Y and plane Z.
- Both views offer an editable rotation step in degrees (default 15 degrees) with minus and plus nudges, and an editable pan step in cells (default 0.25) with directional nudges. Values must be finite and positive; invalid input leaves the current camera unchanged. Fit resets the default pose and pan.
- Tests compare shared asymmetric projection and picking cases including Z rotation, full X/Y/Z turns, negative nudges and exact inverse steps; native live and scalar renderers agree. Camera controls remain usable on narrow screens and have keyboard labels and focus indication.
- Synchronize viewer and Sculpt contracts and intent, record actual current tests, complete verified lifecycle closure under Leif’s approved PR 93 camera scope, and preserve storage, rendering budgets, parser APIs, releases and trust policy.

## No-spec Rationale

Not applicable
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
change: add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer
artifact: context
---

# Context

Leif directly requested a Unity/Godot-style three-axis rotation sphere and precise movement. This is a new addition to the approved full orbit and pan work. The user wants matching native Sculpt and browser behavior. This definition is pending human approval; no implementation, verification, acceptance or archive is claimed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# ThreeMDViewer delta

## ADDED

### REQUIREMENT REQ-ThreeMDViewer-007

The viewer and Sculpt volume view SHALL provide matched document-axis rotation constraints and numerical rotation/pan steps alongside the camera sphere.

Acceptance Criteria:

- Both volume views show a small sphere with colored X, Y and Z rotation rings and accessible axis buttons. Choosing an axis constrains dragging and step buttons to rotation around that document axis; Free restores unconstrained orbit.
- Three-axis rotation preserves an orthonormal camera orientation and supports Z rotation without changing model cells, slice, Undo, files, or installed geometry. Native and browser use the same document-axis convention, including row Y and plane Z.
- Both views offer an editable rotation step in degrees (default 15 degrees) with minus and plus nudges, and an editable pan step in cells (default 0.25) with directional nudges. Values must be finite and positive; invalid input leaves the current camera unchanged. Fit resets the default pose and pan.
- Tests compare shared asymmetric projection and picking cases including Z rotation, full X/Y/Z turns, negative nudges and exact inverse steps; native live and scalar renderers agree. Camera controls remain usable on narrow screens and have keyboard labels and focus indication.
- Synchronize viewer and Sculpt contracts and intent, record actual current tests, and complete verified lifecycle closure only under Leif’s explicit approval of this new definition. Leif retains PR merge authority. Preserve storage, rendering budgets, parser APIs, releases and trust policy.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
change: add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer
artifact: design
---

# Design

Show a compact orientation sphere with red X, green Y and blue Z rings. Click a ring or its labeled axis button to constrain rotation. Free restores ordinary orbit. Degree-step minus/plus buttons rotate only the selected axis; directional buttons use the cell-valued pan step. The controls use native SwiftUI and browser SVG, fit the existing stage design and remain accessible by keyboard. Default steps are 15 degrees and 0.25 cells. Preserve browser controls below the drawing and compact phone layout.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
change: add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer
artifact: docs
---

# Docs

Document the matching sphere, constrained drag, degree nudges, cell pan steps and reset behavior in ThreeMDViewer, RookSculpture, RookRendering, RookApp and current intent. Keep historical lifecycle records intact. Retain actual verification receipts; current approval and finalization are pending.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"schema_version": 2,
"change_id": "add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer",
"implementation_commit": "60055f7806a4d46964b766672784be45713e3c3a",
"implementation_tree": "9970ef31ab167b4c3429cc3aa17af3651c830918",
"contract_digest": "4b6d4eb372c26f296d08a35c4242b772ba7f537d690b3ac81723034860824618",
"workspace_digest": "fde013fc78a6110e0c0b88de16f5f6e7522e6561a06c0a5c5fd273d884ed5278",
"closing_digest": "97d2b14dc39e8ae4fc624f05df89f8af6d26f2dda73159226b4dcd2c0639793d",
"review_digest": "cf186ff11b71dbf0169c2d3aeaa61edefc6e214954bf82620c6ad53d5759d410",
"finalization_digest": "1225a89a0f4a47068497828dd6ef78edf4902c37edde6c9670427d91af38c098",
"timestamp": 1791655945
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Lesson bundle — add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer

Material for folding this change's lessons into the affected specs' `context.md`.
Synthesise from what actually happened below; do not restate the change description.

## What this change was

- **Title**: Add matching X Y Z axis rotation gizmos and precise camera steps to Sculpt and the viewer
- **Kind**: Feature
- **Specs**: ThreeMDViewer
- **Paths**: web/viewer.html, uitests/viewer.spec.mjs, hi/tools.md, specs/ThreeMDViewer, apps/sculpt/Sources/RookSculpture/SculptureProjection.swift, apps/sculpt/Sources/RookApp/SculptureViewport.swift, apps/sculpt/Sources/RookRendering/SculptureLiveVoxelView.swift, apps/sculpt/Sources/RookRendering/SculptureVoxelGeometry.swift, apps/sculpt/Tests, apps/sculpt/hi, apps/sculpt/specs
- **Acceptance**: Both volume views show a small sphere with colored X, Y and Z rotation rings and accessible axis buttons. Choosing an axis constrains dragging and step buttons to rotation around that document axis; Free restores unconstrained orbit.
- **Acceptance**: Three-axis rotation preserves an orthonormal camera orientation and supports Z rotation without changing model cells, slice, Undo, files, or installed geometry. Native and browser use the same document-axis convention, including row Y and plane Z.
- **Acceptance**: Both views offer an editable rotation step in degrees (default 15 degrees) with minus and plus nudges, and an editable pan step in cells (default 0.25) with directional nudges. Values must be finite and positive; invalid input leaves the current camera unchanged. Fit resets the default pose and pan.
- **Acceptance**: Tests compare shared asymmetric projection and picking cases including Z rotation, full X/Y/Z turns, negative nudges and exact inverse steps; native live and scalar renderers agree. Camera controls remain usable on narrow screens and have keyboard labels and focus indication.
- **Acceptance**: Synchronize viewer and Sculpt contracts and intent, record actual current tests, complete verified lifecycle closure under Leif’s approved PR 93 camera scope, and preserve storage, rendering budgets, parser APIs, releases and trust policy.

## Evidence

- Verification commit: `60055f7806a4d46964b766672784be45713e3c3a`
- Base commit: `fefd8316adfff3af8bdb87d26b4a417650540b56`
- Verified by: `specsync check --spec ThreeMDViewer --strict`

## From the change's context.md

# Context

Leif directly requested a Unity/Godot-style three-axis rotation sphere and precise movement. This is a new addition to the approved full orbit and pan work. The user wants matching native Sculpt and browser behavior. This definition is pending human approval; no implementation, verification, acceptance or archive is claimed.

## From the change's design.md

# Design

Show a compact orientation sphere with red X, green Y and blue Z rings. Click a ring or its labeled axis button to constrain rotation. Free restores ordinary orbit. Degree-step minus/plus buttons rotate only the selected axis; directional buttons use the cell-valued pan step. The controls use native SwiftUI and browser SVG, fit the existing stage design and remain accessible by keyboard. Default steps are 15 degrees and 0.25 cells. Preserve browser controls below the drawing and compact phone layout.

## From the change's testing.md

# Testing

Test each document axis with positive, negative and full-turn rotations, including Z roll and pole crossings. Compare native live, scalar and browser projected points and nearest cube hits. Assert inverse steps restore the same basis, invalid inputs do not mutate the camera, camera adjustments preserve document and geometry, and mobile and keyboard controls stay usable. Run the relevant native and Chromium/WebKit regressions and current trust gate after implementation.

## Execution evidence

Implementation commit 8e9a0c4 has 226 passing macOS browser tests, 637 passing configured native tests and 11 passing final native parity tests. Expanded browser fixtures and phone checks each passed 4 cases. Pinned Trust passed; actual unsigned agent:codex provenance was recorded and fails the unchanged permitted-signature/reviewer policy as expected. Linux CI passed 218 functional tests with 8 existing platform-snapshot skips and no retries; all macOS snapshots passed. Current receipts are in docs/evidence/viewer-slice; final lifecycle receipts are separate. Source and visual verification are distinct from Leif’s diff review.

## Requirement evidence

| ID | Canonical | Evidence |
| --- | --- | --- |
| REQ-ThreeMDViewer-007 | REQ-ThreeMDViewer-007 | Independent shared camera-parity.json matrix/projection values compared with browser GPU uniforms and nearest picks, native scalar/live basis and picks, full-turn/inverse normalization, ASCII Z picking and mesh installation reuse. Browser precise-input and phone tests pass; native/UI screenshots and logs are in docs/evidence/viewer-slice. |

## Where these lessons go

- `specs/ThreeMDViewer/context.md`
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
change: add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer
artifact: plan
---

# Plan

Add a session-only third camera rotation component and document-axis rotation math. Apply the same orientation to native scalar, ASCII and GPU projection and browser view/picking. Add colored projected sphere rings, accessible X/Y/Z and Free controls, degree steps and cell pan steps in both viewports. Verify shared numerical projection and nearest-hit cases with preserved geometry and source. Update specs and intent before delivering the existing feature PR.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
change: add-matching-x-y-z-axis-rotation-gizmos-and-precise-camera-steps-to-sculpt-and-the-viewer
artifact: requirements
---

# Requirements

### REQ-ThreeMDViewer-007

The viewer and Sculpt volume view SHALL provide matched document-axis rotation constraints and numerical rotation/pan steps alongside the camera sphere.

Acceptance Criteria:

- Both volume views show a small sphere with colored X, Y and Z rotation rings and accessible axis buttons. Choosing an axis constrains dragging and step buttons to rotation around that document axis; Free restores unconstrained orbit.
- Three-axis rotation preserves an orthonormal camera orientation and supports Z rotation without changing model cells, slice, Undo, files, or installed geometry. Native and browser use the same document-axis convention, including row Y and plane Z.
- Both views offer an editable rotation step in degrees (default 15 degrees) with minus and plus nudges, and an editable pan step in cells (default 0.25) with directional nudges. Values must be finite and positive; invalid input leaves the current camera unchanged. Fit resets the default pose and pan.
- Tests compare shared asymmetric projection and picking cases including Z rotation, full X/Y/Z turns, negative nudges and exact inverse steps; native live and scalar renderers agree. Camera controls remain usable on narrow screens and have keyboard labels and focus indication.
- Synchronize viewer and Sculpt contracts and intent, record actual current tests, and complete verified lifecycle closure only under Leif’s explicit approval of this new definition. Leif retains PR merge authority. Preserve storage, rendering budgets, parser APIs, releases and trust policy.
Loading
Loading