Refine inspector and icon-only controls for fluid interaction #10
Open
opened 2026-09-13 13:34:41 +00:00 by kayg
·
21 comments
No Branch/Tag specified
dev
wave19/desktop-test
wave19/per-space-state
wave19/first-space-integration
wave19/first-space-draft-transfer
wave19/block-editor-craft
codex/wip/root-conflict-snapshot-20260914
wave12/first-space-draft-transfer
wave14/editor-overnight-combined
wave17/editor-diagnostics-3bbb
wave16/code-block-polish
wave16/image-controls
wave16/event-title-crash-control
wave16/image-preview-dispatch-repair
wave16/event-title-lifecycle-qa
wave16/editor-list-refinements
wave17/editor-layout-correction
wave16/event-edit-date
wave16/note-title-presentation
wave16/editor-final-combined
wave18/document-chrome-repair
wave17/cross-event-drop
wave16/editor-structural-combined
wave16/editor-hover-margins
wave16/editor-caret-relocation-perf
wave16/inspector-polish
wave16/image-preview-integration
wave16/english-transcription
wave16/document-background-edge
wave16/sidebar-live-layout
wave15/image-preview-ownership-repair
wave15/editor-handle-six-dot
wave15/titlebar-public-repair
wave15/sidebar-initial-restoration
wave15/editor-formatting-tooltips
wave15/editor-drag-mounted-repair
wave15/image-preview-foundation-isolated
wave15/editor-block-drag-feedback
wave15/sidebar-attachment-layout
wave14/editor-inline-plain-fastpath
wave14/editor-rendered-paste-replacement
wave14/clipboard-awaited-shutdown
wave14/editor-selectall-toolbar-perf
fix/clipboard-body-undo-group
diagnostic/clipboard-insertion-491
wave14/sidebar-unselected-drag-v2
diagnostic/sidebar-unselected-drag-trace
diagnostic/clipboard-phase-0225
wave14/sidebar-prime-access
wave14/nested-projection-handle-test-fix
wave14/sidebar-unselected-event-drag
fix/clipboard-task-ownership-6318
fix/editor-resource-url-invalidation
codex/wip/editor-handle-render-diagnostic-20260914
fix/central9c9-clipboard-crash
codex/wip/editor-handle-diagnostic-20260914
wave14/sidebar-event-runtime-repair
wave14/nested-projection-runtime-fix
wave14/sidebar-event-test-fixtures
wave14/sidebar-attachment-overlap
integration/rendered-image-clipboard
wave14/sidebar-event-preview-integration
wave14/editor-nested-list-integrate
wave14/editor-nested-list-projection
task/rendered-image-clipboard
wave14/sidebar-paste-preview-integration
wave14/sidebar-event-day-dnd
wave14/editor-preview-next
wave14/editor-list-handle-integrated
task/native-basic-paste
wave14/editor-list-keyboard-audit
task/native-clipboard-contract
codex/wip/editor-handle-geometry-20260914
wave14/editor-block-drag
wave14/editor-drag-integrated
wave14/editor-empty-marker-map-publication
wave14/editor-empty-marker-runtime-diag
wave14/editor-empty-marker-preview
wave14/editor-empty-marker-host-repro
wave14/editor-empty-marker-probe
codex/wip/editor-hr-leaf-fix-20260914
wave14/event-attachment-drop
wave14/editor-empty-marker-paint
wave14/editor-drop-list-preview
wave14/editor-finder-drop
wave14/editor-rule-caret
wave14/editor-list-enter-next
wave14/editor-image-qa
wave14/editor-mode-commands
wave13/editor-code-performance-preview
wave14/sidebar-overlap-repair
wave13/cross-day-compile-repair
wave13/spotlight-retry
wave13/editor-chrome-runtime-repair
wave13/editor-inline-fast-path
codex/wip/detached-87aa-20260914
wave12/editor-viewport-polish
wave12/craft-code-block-polish
wave12/editor-asset-return-preview
wave12/voice-polish-preview
wave12/editor-native-return-runtime-repair
wave12/editor-asset-focus
wave12/cross-day-reviewed-integration
wave12/optional-voice-provider-finish
wave12/event-move-descriptor-compile-fix
wave12/editor-image-geometry-preview
wave12/editor-native-return-undo-repair
wave12/image-native-geometry-fixture
wave12/editor-pattern-preview
wave12/editor-bullet-continuation
wave12/editor-top-chrome
wave12/voice-composer-restart
wave12/speech-variable-buffer-repair
wave12/editor-image-preview
wave12/event-move-descriptor-scale
wave12/editor-image-geometry
wave12/afternoon-ui-preview
wave12/sidebar-hosted-bounds-repair
wave12/sidebar-overlap-live
wave12/speech-e2e-verification
wave12/mentions-polish-finish
wave12/editor-structural-range-repair
wave12/sidebar-fade-desktop-preview
wave12/sidebar-design-ledger
wave12/voice-assets-physical-fixtures
wave12/native-event-marker-polish
wave12/sidebar-fade-undo-preview
wave12/event-move-fence-corrections
wave12/sidebar-fade-boundary-repair
wave12/parent-space-entry-integration
wave12/editor-undo-group-repair
wave12/native-event-row-performance
wave12/parent-swipe-integration
wave12/metadata-noteid-test-fix
wave12/space-composer-generation-fix
wave12/voice-lifecycle-clock-fixture
wave12/sidebar-child-binding
wave12/voice-provider-pool-preview
wave12/composer-recording-preview
wave12/event-cross-day-store-corrections
wave12/voice-async-test-locks
wave12/speech-buffer-lease-fix
wave12/composer-no-top-readouts
wave12/sidebar-child-target
wave12/space-required-composer
wave12/editor-correctness-preview
wave12/voice-provider-compile-corrected
wave12/event-move-integration
wave12/voice-assets-compile-fix
wave12/parakeet-compile-fix
wave12/note-metadata-flexibility
wave12/sidebar-event-drag-drop
wave12/editor-paste-source-guard
wave12/note-asset-import-safety-causal-tests
wave12/note-asset-import-safety
wave12/editor-readonly-command-guards
wave12/voice-provider-integration
wave12/editor-format-flexibility
wave12/hosted-sidebar-ui-sdk-fix
wave12/event-cross-day-store
wave12/voice-app-wiring
wave12/voice-parakeet-assets
wave12/voice-hosted-await-fix
wave12/event-edit-date-guard
wave12/event-cross-day-app
wave12/network-client-entitlement
wave12/sidebar-row-overlap
wave12/voice-settings-surface
wave12/parakeet-capture-adapter
wave12/task-marker-normalization
wave12/voice-polish-integration
wave12/voice-capture-hardening
wave12/voice-provider-settings-plan
wave12/copied-space-editor-io
wave12/hosted-background-sendability
wave12/voice-stop-nlp
wave12/voice-fixture-roots
wave12/voice-claim-collision
wave12/sidebar-add-swipe-plan
wave12/copied-space-app-wiring-plan
wave12/voice-fence-stat-compilefix
wave12/composer-dismiss-crash-hotfix
wave12/voice-retainer-defer-fix
wave12/overnight-recovery-space-preview
wave12/background-checkpoint-compilefix
wave12/copied-space-enumeration-fix
wave12/copied-space-local-state
wave12/voice-fence-fixture-fix
wave12/voice-manifest-fd-fix
wave12/voice-recovery-publication-proof
wave12/voice-retainer-bytecount-fix
wave12/overnight-navigation-background-compilefix
wave12/navigation-work-diagnostic
wave12/overnight-navigation-background-preview
wave12/background-import-bounds
wave12/overnight-voice-lifecycle-preview
wave12/voice-frozen-claim
wave12/voice-input-seam
wave12/voice-recovery-compile-fix
wave12/voice-terminal-cleanup-plan
wave12/voice-recovery-activation-plan-current
wave12/overnight-runtime-probe-preview
wave12/overnight-sandbox-startup-preview
wave12/startup-geometry-diagnostic
wave12/voice-source-sandbox-fix
wave12/image-root-sandbox-fix
wave12/perf-scroll-zero-args
wave12/overnight-document-geometry-preview
wave12/native-document-geometry-diagnostic
wave12/overnight-draft-root-preview
wave12/voice-recovery-c-session-fence
wave12/draft-root-direct-open
wave12/hosted-single-module-linkage
wave12/overnight-voice-recovery-preview
wave12/voice-recovery-checkpoint-a-finalization
wave12/copied-space-local-state-plan
wave12/overnight-refresh-hosted-preview
wave12/incremental-refresh-bounded-load
wave12/raw-source-reconciliation-test-fix
wave12/overnight-rendering-startup-preview
wave12/draft-root-diagnostic
wave12/day-event-bulk-load
wave12/speech-asset-install-test-preview
wave12/hr-material-contrast
wave12/height-clamp-followup
wave12/voice-recovery-checkpoint-a-corrections
wave12/overnight-cstore-caret-preview
wave12/voice-recovery-checkpoint-a
wave12/editor-adjacent-caret-boundary-v3
wave12/voice-recovery-index-query-fix
wave12/editor-adjacent-caret-boundary-v2
wave12/voice-recovery-index-query
wave12/startup-collector-empty-args
wave12/editor-adjacent-caret-boundary
wave12/overnight-hr-storage-preview
wave12/hr-native-diagnostic-followup
wave12/hr-native-diagnostic
wave12/overnight-storage-settings-preview
wave12/snapshot-native-move-followup
wave12/speech-local-fallback
wave12/settings-stream-test-compilefix
wave12/snapshot-path-identity-followup
wave12/corefrontmatter-join-fastpath
wave12/speech-fallback-plan
wave12/overnight-caret-control-registry
wave12/editor-registry-compilefix
wave12/voicea-test-compilefix
wave12/overnight-caret-control-ready
wave12/voicea-enum-compilefix
wave12/voice-recovery-phaseb
wave12/overnight-caret-control
wave12/overnight-polish-storage-preview
wave12/voicea-foundation-compilefix
wave12/snapshot-path-identity
wave12/overnight-native-polish-preview
wave12/hr-rule-geometry
wave12/speech-conversion-fixture
wave12/editor-deferred-caret
wave12/overnight-hosted-lifetime-preview
wave12/marker-glyph-clipping
wave12/voice-recovery-activation
wave12/overnight-package-fixture-preview
wave12/overnight-lifetime-voice-preview
wave12/app-tests-cleanup
wave12/snapshot-physical-fixtures
wave12/event-date-title-punctuation
wave12/overnight-lifetime-voice-plan
wave12/overnight-draw-before
wave12/overnight-picker-event-preview
wave12/settings-watcher
wave12/event-date-title-fix
wave12/note-background-picker-fix
wave12/editor-lifetime
wave12/overnight-draw-preview
wave12/snapshot-attribute-compile-fix
wave12/editor-accepted-draw-trace
wave12/overnight-runtime-preview
wave12/composer-test-concurrency-fix
wave12/editor-caret-performance
wave12/overnight-snapshot-correction
wave12/settings-model-callbacks
wave12/overnight-full-preview
wave12/overnight-store-preview
wave12/rendered-bullet-fix
wave12/settings-document-fixture-fix
wave12/composer-task-pill-ui
wave12/overnight-roadmap-preview
wave12/task-tag-readouts
wave12/event-snapshot-dependency
wave12/h1-strict-preview
wave12/settings-store-await-fix
wave12/settings-store-test-fix
wave12/overnight-pill-preview
wave12/composer-pill-accent-fix
wave12/composer-pill-final
wave11/sidebar-cold-index-prime
wave12/overnight-preview
wave11/voice-draft-recovery
wave11/voice-transcription-finish
wave11/note-save-rename
wave11/task-event-preview
wave11/settings-enabled-plugin-section
wave11/pill-fade-preview
wave11/sidebar-top-fade-regression
wave11/event-sidebar-preview
wave11/composer-pill-restore
wave11/settings-plugins-portability
wave11/composer-hash-semantics
wave11/event-composer-edit
wave11/sidebar-spacing-followup
wave11/editor-performance-evidence
wave11/voice-preview
wave11/voice-stop-repair
wave11/polish-verification
wave11/plugins-settings-ui
wave11/bullet-list-regression
wave11/sidebar-insert-stability
wave11/polish-preview
wave11/document-style-repair
wave11/composer-native-readouts
wave11/mentions-disclosure-motion
wave11/sidebar-swipe-compact
wave11/legacy-helper-path-fix
wave11/persistence-integration
wave11/capsule-instant-presentation
wave11/native-link-activation
wave11/desktop-integration
wave11/link-integration
wave11/synthetic-note-names
wave11/composer-overflow-actions
wave11/legacy-root-links
wave11/note-title-punctuation
wave11/note-title-metadata
wave11/spotlight-navigation
wave11/spotlight-trace-baseline
wave11/note-name-collisions
wave11/identity-query-indexes
wave11/note-heading-title
wave11/capsule-scroll-chrome
wave11/sidebar-context-menu
wave11/spotlight-metadata
wave11/rename-link-repair
wave11/analytics-native
wave11/sidebar-scroll-restoration
wave11/sidebar-bottom-spacing
wave11/capsule-optical-alignment
wave11/markdown-link-resolution
wave11/command-results-layout
wave11/capsule-outside-dismissal
wave11/events-folder
wave11/capsule-query-retention
wave11/capsule-snap-preview
wave11/composer-controls-preview
wave11/sidebar-fade-preview
wave11/selection-lookup
wave11/note-creation-routing
wave11/sidebar-header-spacing
wave11/block-editor
wave11/space-onboarding
wave11/space-terminology
wave4/voice
wave2/search
wave4/glur-probe
wave7/cli-integration
wave12/inspector-style
wave4/document-presentation
wave2/cli
wave2/sidebar
No results found.
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/calternal-macos#10
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Request and current status
References and inventory exist. Some formatting tooltip/shortcut changes are integrated; broader inspector polish is unfinished.
Acceptance
Preserve context/focus while switching sections; truthful icon help and working shortcuts; accessible labels. Verify popovers, hover/pressed/disabled states, keyboard and narrow layouts. Apply existing Emil/Jakub guidance with native controls.
Keep open until the user-facing outcome is verified in a delivered build. Source review or a successful build alone is not completion.
Role: task agent (read-only audit)
Worktree: /Users/kayg/Developer/calternal-app/.worktrees/editor-overnight-combined at
9153c4bedaState: audited; no files changed and no build/runtime claim made.
Concrete audit against current code and Craft acceptance artifacts:
FormattingActionDescriptorcentralizes eight icon labels and truthful Bold/Italic tooltips/shortcuts. The app has native inspector presentation through SwiftUI.inspector, with Insert/Format/Style/Info sections and native Picker/Stepper/Button controls. The app-level Format menu exposes selection formatting and asset insertion; the shell toolbar has native inspector toggle help.@State, so section/context restoration across inspector recreation is not explicit; controls have labels but no comprehensive disabled/pressed/keyboard/narrow-layout verification. There is no pointer-near ellipsis/dwell entry point for formatting, and the existing panel always anchors to the text selection. Image-specific inspector/menu/Quick Look, orthogonal size/fit controls and exact attachment targeting remain absent per the inventory.Smallest independent implementation plan:
Sources/CalternalEditor/BlockEditorView.swift; mirror enabled actions throughApp/Sources/App/CalternalApp.swiftandSources/CalternalEditor/NoteEditorRegistry.swift(or the existing command seam). Preserve ⌘K for Add Link and choose collision-free bindings for the remaining actions. ExtendTests/CalternalEditorTests/MarkdownBlockDocumentTests.swiftfrom the existing Bold/Italic shortcut seam, including marked text, raw mode, unavailable actions and one undo transaction.App/Sources/Viewer/ViewerView.swift/App/Sources/Notes/NoteEditorSession.swiftonly if user requires restoration across teardown; otherwise add accessibility identifiers and state/keyboard tests around the existing Picker/Stepper controls. Keep style mutations inNotePresentationStyleand preserve focus when changing sections.BlockEditorViewhover/adornment seam, preferably with a smallFormattingToolbarController.swiftextraction. Use one cancellable dwell task, no entrance animation, and reuse the existing panel with a point anchor. Avoid the drag owner’s active changes.BlockEditorView.swift,EditorImagePresentation.swift, a newEditorImageQuickLookController.swift, and focused image geometry tests; do not mix it into the inspector shortcut patch.Dependencies/order: shortcut truth first; inspector persistence/accessibility second; pointer-near entry third; image controls are independent but larger. Risks: screenshot evidence does not establish dwell duration, motion curves, shortcut semantics beyond existing ⌘B/⌘I, or persistence format for image settings. Do not invent Markdown syntax or claim Craft parity without VM/user acceptance. Validation requires build-host focused tests plus VM checks for popover placement, keyboard/disabled states, narrow width, reduced motion/transparency, VoiceOver labels/order and focus continuity.
Correction to the earlier audit: the central worktree is now at
fb4c66d5956379f3218d84a7a4fd4037ecc608e2(clean at audit time), not the historical9153c4becited above. In the current source,FormattingActionDescriptorcovers all eight actions with native icon labels, tooltips, and accessibility help; Bold and Italic additionally have real focused-editor shortcuts (⌘B/⌘I) routed byhandleFormattingShortcut. The remaining gap is specifically that Strike, Inline Code, Heading, List, Task, and Link have no key equivalents/glyphs, and the app Format menu does not mirror all eight actions. The existing inspector/panel findings remain partial and unverified in runtime; no implementation or completion claim is being made.Bounded inspector-only follow-up (kept independent of the active editor owner):
App/Sources/Viewer/NoteInspectorState.swiftfor the section enum/selection persistence policy, newApp/Sources/Viewer/NoteInspectorControls.swiftfor reusable native Picker/Stepper/ControlGroup rows and accessibility identifiers, plus a newApp/UITests/NoteInspectorUITests.swiftfixture target. Do not editSources/CalternalEditor/BlockEditorView.swiftor formatting shortcut code in this slice.DocumentInspectorView/the current privateNoteInspectorViewinApp/Sources/Viewer/ViewerView.swiftwill need a small follow-up wiring change to inject the state and controls. Keep that integration separate from the editor-owner branch so the new files can be reviewed independently.Implementation plan for the assigned inspector-only slice (worktree
wave16/inspector-polish, base37c5d40de40a2d0b279aad8d13d6f68837533c2d):NoteInspectorState.swiftcontaining the existing tab enum and its stable raw-value/title/accessibility metadata. Use scene-scoped state for the selected section so inspector recreation preserves context without adding session/editor ownership.NoteInspectorControls.swiftonly for repeated native control labeling/AX identifiers if the extraction removes duplication; otherwise keep controls in the existing inspector view to avoid an abstraction-only layer.NoteInspectorViewinApp/Sources/Viewer/ViewerView.swiftto the state metadata, stablenote.inspector.sectionidentifier, explicit accessibility labels/values, and truthful disabled/help text for rendered/raw/loading and formatting availability. Preserve the existing native.inspectorand focus path.Reviewer handoff will include the exact diff and limitations; build/VM validation remains the root build pipeline’s responsibility.
Implementation ready in worktree /Users/kayg/Developer/calternal-app/.worktrees/inspector-polish (pending commit).
Bounded changes:
No BlockEditorView or MarkdownProjection changes. Local validation is limited to git diff --check; build and VM UI execution remain for root/build_pipeline_recover and QA.
Implementation ready in worktree /Users/kayg/Developer/calternal-app/.worktrees/inspector-polish (pending commit).
Bounded changes:
No BlockEditorView or MarkdownProjection changes. Local validation is limited to git diff --check; build and VM UI execution remain for root/build_pipeline_recover and QA.
Reviewer verdict — exact
d10f0cd349ec7d140a2609e4d777027038637b53is not source-passedParent:
37c5d40de40a2d0b279aad8d13d6f68837533c2d. Worktree.worktrees/inspector-polishis clean; exact scope isNoteInspectorState.swift,ViewerView.swift, andNoteInspectorUITests.swift. Source review only; no build or UI run.Findings:
P1 —
App/UITests/NoteInspectorUITests.swift:6-33: the new test's core expectation is contrary to production behavior and is likely to fail.BlockEditorView.formattingAvailability()exposes Heading/List/Task actions for a collapsed caret in an eligible paragraph or heading; it does not require a nonempty text selection. The synthetic “Design review” note begins with eligible heading/paragraph blocks, andNoteEditorHostpublishes availability without requiring editor focus. After opening Format,Open formatting toolbarshould therefore normally be enabled, while line 32 asserts disabled. Fix the test and copy to distinguish inline text formatting from block formatting. To exercise disabled state, switch the session to raw mode through the real “Toggle Rendered / Raw Markdown” command (as the implementation plan promised), then assert disabled; return to rendered/caret and assert enabled.P2 —
App/UITests/NoteInspectorUITests.swift:6-33: the test does not cover the feature this patch primarily adds. It never changes the section value, recreates/reopens the inspector, verifies restoration, checks focus continuity, or exercises keyboard/narrow layout. It also locates the segmented control asotherElementsand assumes each segment is an XCUIbuttonwithout validating the actual macOS AX roles. Fix the single focused UI test to switch Style→Format/Insert, assert the picker value, close/reopen the inspector or navigate away/back in the same scene, and assert the retained section using the runtime AX roles. Include the raw/rendered availability transition in that same test.P2 —
App/Sources/Viewer/ViewerView.swift:985-1102: availability remains inconsistent across inspector controls. The formatting buttons now mirroravailableFormattingActions, but “Image or file…”, style pickers/steppers, background controls, and Reset remain enabled while their session methods reject work during loading or disabled interaction (requestAssetInsertionandapplyAppearanceboth guard those states). This leaves clickable no-op controls and does not meet the issue's disabled-state acceptance. Add one sharedcanEditInspector = session.document != nil && !session.isLoading && session.isInteractionEnabledand disable the affected sections/controls; formatting additionally requires rendered mode and nonempty formatting availability.P3 —
App/Sources/Viewer/ViewerView.swift:935-960: an unknown restored raw value renders Style content/accessibility text while the segmented Picker remains bound to a tag that does not exist. This can show content and control selection out of sync after a future case rename/removal or stale scene restoration. Bind the Picker through a validatedBindingthat reads/writesNoteInspectorSection(or normalizetabRawValueon appearance) so fallback also repairs the stored value.P3 —
ViewerView.swift:996-1018: both formatting helps say “current text selection,” but caret-only block formatting is supported. Use wording such as “current selection or block” so help and disabled behavior are truthful. The background checkmark at lines 1083-1085 is decorative and should be accessibility-hidden or given a meaningful value rather than exposing a symbol name.Compile plausibility: the enum,
@SceneStorage, segmented Picker tags, and accessibility modifiers are SwiftUI-valid, and xcodegen source globs include both new files. Exact gate remains pending repair and a new SHA.Reviewer repair candidate: exact
72f8960d89089da40d3b9520398af86ddb4f5515in.worktrees/inspector-polish.Repairs:
Validation: git diff --check passes. No local build or VM claim; root build/QA remain required. No BlockEditorView or projection changes.
Reviewer verdict — exact
72f8960d89089da40d3b9520398af86ddb4f5515remains not source-passedParent:
37c5d40de40a2d0b279aad8d13d6f68837533c2d. Worktree is clean and diff-check clean. The product source fixes the prior availability/help/raw-value findings: inspector controls share the session editability gate, formatting includes real action availability, stale section values normalize to Style, and decorative status imagery is AX-hidden. SwiftUI compile plausibility is sound. Source/test review only; no build or UI run.Remaining findings:
P1 —
App/UITests/NoteInspectorUITests.swift:25-27: the test assumes Style is always the initial section even though this patch intentionally persists the section with@SceneStorage. The test itself switches to Format and leaves it there, so a restored/repeated app scene may begin on Format and fail before testing anything. Scene storage is not a clean per-test default. Fix by explicitly selecting Style as test setup (without asserting it was the launch default), or launch through a deterministic test-only scene-state reset; then switch to Format and test hide/reopen persistence.P2 —
NoteInspectorUITests.swift:32-50: enabled-state assertions are unsynchronized with the asynchronous note host and rendered/raw host replacement.waitForExistenceonly waits for the button object, not foravailableFormattingActionsorisEnabledto update. The immediateXCTAssertTrue(formatButton.isEnabled)after note load and immediate disabled assertion after Command-Shift-M can race SwiftUI observation/host teardown. Use predicate expectations forenabled == true, thenenabled == false, and optionally rendered re-enable after toggling back.P3 coverage —
NoteInspectorUITests.swift:25-50: focus continuity, segmented-control keyboard navigation, and narrow inspector layout remain unverified. The test invokes global keyboard shortcuts but never captures/asserts first responder before/after section switching, never changes the section from the keyboard, and never narrows the window. Keep these listed as pending VM/UI acceptance, or add bounded assertions if this candidate is meant to satisfy issue #10 rather than only section persistence/availability.The earlier incorrect “formatting requires nonempty text selection” premise is fixed: rendered caret/block formatting is now asserted enabled, and raw mode is the disabled case. Exact gate is pending deterministic state setup and enabled/disabled waits.
Determinism repair candidate: exact
aaa7fbfe79028d2a297c98447d9e9e504c65fd4c.UI test repairs:
Production changes remain the reviewed 72f repairs.
git diff --checkpasses; no local build or VM claim.Reviewer verdict — exact
aaa7fbfe79028d2a297c98447d9e9e504c65fd4cremains not source-passedParent:
37c5d40de40a2d0b279aad8d13d6f68837533c2d. Worktree and diff-check are clean. The deterministic Style setup and bounded enabled/value polling fix the prior SceneStorage-default and asynchronous availability races. Product SwiftUI/state/availability code remains source-sound. No build or UI run.Remaining finding:
App/UITests/NoteInspectorUITests.swift:39-45: the test does not establish inspector recreation before asserting SceneStorage restoration. It sends Command-Option-1 twice back-to-back without waiting for the inspector to disappear. SwiftUI can coalesce the false→true state updates in one render transaction, leaving the sameNoteInspectorViewmounted; the subsequent “Format section” assertion can therefore pass on unchanged local state even if restoration is broken. After the first shortcut, require the identified section element to become nonexistent (for examplewaitForNonExistence(timeout:)); only then send the reopen shortcut, reacquire the element, and assert Format. This makes the test exercise teardown/recreation rather than a toggle round trip in one update cycle.Coverage limit, not a product-source failure: focus continuity, segmented-control keyboard navigation, narrow inspector width, hover/pressed visuals, and real AX role discovery remain pending VM/UI verification. Do not claim those acceptance items passed from this test.
Exact gate remains pending the teardown wait amendment.
Final UI test lifecycle repair: exact
ea36484bb7e59b2324131056de8ffa98289719a5.After issuing ⌘⌥1 to hide the inspector, the test now waits for the section element to disappear before reopening. It then reacquires the section and formatting button elements from the new inspector instance before asserting restored Format state and raw/rendered availability. This removes SwiftUI coalescing ambiguity and makes the recreation assertion meaningful.
git diff --checkpasses. Focus continuity, keyboard traversal, and narrow layout remain pending VM acceptance. No local build claim.Reviewer transition — exact source gate PASS for
ea36484bb7e59b2324131056de8ffa98289719a5Parent:
37c5d40de40a2d0b279aad8d13d6f68837533c2d. Worktree.worktrees/inspector-polishis clean and the cumulative diff-check passes. Exact scope remainsNoteInspectorState.swift,ViewerView.swift, andNoteInspectorUITests.swift.No remaining P1–P3 source findings. The UI regression now waits until the original inspector section element is nonexistent before reopening, reacquires the section and formatting elements, verifies Format restoration, and uses bounded waits for rendered/raw/rendered availability availability. SceneStorage setup is deterministic, stale raw values normalize, editability gates mirror session guards, caret/block formatting help is truthful, and the SwiftUI/XCUITest APIs are compile-plausible.
Verification limit: source review only. Actual build/UI execution, focus continuity, segmented-control keyboard traversal, narrow inspector layout, hover/pressed visuals, and runtime AX role discovery remain pending. Keep issue #10 open through those checks and delivered-build user verification.
Root: inspector source candidate
ea36484bpassed independent review and is now integrated into wave14/editor-overnight-combined. Changes restore section state with validated values, expose truthful native help/accessibility metadata, and gate asset/style/format actions against current session availability. Root inspected the product diff and integration is clean.The existing 37c5 preview is not restaged; this inspector change queues for the next immutable build with image/transcription changes. Build and native UI verification remain pending, including actual focus continuity, keyboard navigation, narrow width and hover/pressed state. No user-acceptance claim; #10 remains open.
Build worker
/root/build_pipeline_recoverhas frozen.worktrees/editor-overnight-combinedat exact56e61d2e4d8da6915fc693a99b2d09d8b5160863, tree3a21c99da5c7c0ab3ae8ec2d949439b5a0c5e5a3, including reviewed inspector commit56e61d2e. The soleagents@mbplane is starting exact-source SwiftPM gates followed by an immutable arm64 Release build.No inspector-specific GUI test is being claimed by this package gate. Focus continuity, keyboard navigation, narrow layout, hover/pressed visuals, runtime AX roles, and user acceptance remain pending; keep #10 open.
Exact central source
56e61d2e4d8da6915fc693a99b2d09d8b5160863(tree 3a21c99da5c7c0ab3ae8ec2d949439b5a0c5e5a3) compiled successfully in the SwiftPM Release test lane onagents@mbp; source archive SHA-25627152b42a01b253d4aa6d439fa28f5f76c71a4903c88c0796469566c5bf35a69, manifest SHA-256265ca17b8c524f85dacfc2169a6d6a9b69de81ecf0b76de1dfa4cec2f1574abe, package binary SHA-2565f4cca0e70958fe0b328dbb9c081b560648b259be79b70264c094e2a932fc2fd.No inspector-specific UI test ran in this package lane. Release is held by an independent focus-selection assertion failure. Inspector runtime/AX/visual/user gates remain pending; keep #10 open.
The integrated inspector candidate is present in exact Release source
0e835eed87233ab1156fbef86c0286e18a45fa90, tree48fca32ee4a06602470d50e7cc5ebe953081d018, which compiled successfully onagents@mbp. Source archive SHA-2567abfd7108583fe70696e53e6e615057e142b6ce6e83f3a5ff736b5c9b93959ec; manifest SHA-2563a2c2afd60ad995ce4d8bf3dc1c60e65e3376eaef8344d8d056b7933d95afd65.Verified arm64 archive:
/Users/Shared/CalternalBuilds/0e835eed8723-3507d319/Calternal-0e835eed8723-Release-arm64.zip, also staged at/Users/lume/CalternalQA/0e835eed8723-3507d319/; zip SHA-256a18cecf74cb32fd205201b21783b2a7df56aec77a081e04d3c791f6377b4e0ee, executable SHA-256e2ce47b34c64f73d5b7d57384e9b17bc13379658138803ab56ec670246965226. Fresh-unzip strict codesign and bundle diff passed.No inspector-specific UI test or GUI was run by the build worker. Focus continuity, keyboard traversal, narrow layout, hover/pressed visuals, runtime AX roles, and user acceptance remain pending; keep #10 open.
0e835 VM visual check (exact zip/executable hashes recorded in
01-integrity.txt): PASS for the bounded inspector restoration case.Using a registered disposable note with a visible inline image, I hid Inspector through its native toolbar control and restored it with the same control. The restored frame shows Inspector with Insert/Format/Style/Info and the Style controls intact. Evidence:
27-inspector-hidden.pngand29-inspector-restored.pngin.agents/native-break/0e835-vm-qa/.This is not a close recommendation: focus preservation while section-switching, icon tooltips/shortcuts, keyboard, disabled, hover/pressed and narrow-layout cases remain unverified.
Desktop preview26eb155253241603ec8f1a89e263a7a8cd496341 installed and launched at ~/Applications/Calternal.app after normal native Quit. Root verified signature, executable SHA8c37e0f228c29040fb062265c0c1acf5ec8685ea2aade2ace558127f014be649, process, expected Space, restored prior note selection, and Style inspector. No notes/settings files were edited by the installer. Previous37c bundle retained for rollback. Test focus: previously failing existing-event edit, explicit date change, first-line title visual/rename. Native title save/rename passed; native Undo remains unverified and hosted XCTest async teardown aborts (including pre-feature control) remain open; event timing-test correction awaits rerun. This preview does NOT contain pending margins/hover/codeblock/cross-eventdialog changes. No stable/performance acceptance.
Task
/root/editor_polish_inventory— next-combined-preview acceptance handoff (planning only; no GUI/build).Already established: inspector product/test candidate
ea36484bpassed source review and compiled in0e835eed; the earlier VM check proved hide/restore with Style controls. It did not prove focus, keyboard, tooltip, or narrow-layout behavior.Remaining VM checks, owned by
/rooton the next exact combined build: with a live editor caret, traverse Insert/Format/Style/Info by pointer and keyboard, confirm the caret/focus returns predictably, and inspect every icon's native tooltip/accessibility name plus only truthful implemented shortcuts. Exercise disabled state in raw mode and recovery in rendered mode, hover/pressed visuals, and a narrow inspector without clipping. Include image-selection context so image controls and inspector section changes do not steal/stick focus. Keep #10 open.Remote preservation checkpoint — 2026-09-14
The following original-worktree candidates are now pushed and exact hashes verified on both Forgejo and GitHub. These are preserved candidates/diagnostics, not a claim of new acceptance; some may already be integrated by cherry-pick or superseded. Use the issue’s existing evidence before choosing changes to resume.
wave16/inspector-polish—ea36484bb7e59b2324131056de8ffa98289719a5Master #20 contains the resume instructions. No force push; dev remains
1d8f4adf.