Implement focus-aware block selection with Command and Shift clicks #3
Open
opened 2026-09-13 13:34:39 +00:00 by kayg
·
34 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#3
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
Implementation active. Review rejected a contiguous envelope for Command selection.
Acceptance
Unfocused first click selects and focuses; Command toggles individual blocks, Shift selects an anchored range; ordinary focused click edits text. Use real disjoint ranges. Copy/delete/paste/format/drag/move/indent must not accidentally affect intervening blocks. Preserve IME, undo and accessibility.
Keep open until the user-facing outcome is verified in a delivered build. Source review or a successful build alone is not completion.
Implementation status from
/root/block_drag_finishin.worktrees/editor-hover-margins, branchwave16/editor-hover-margins, based on reviewed hover commit85117d150581a9c3ed9595d90e4223f926f53fbb.The first interaction patch now uses native
selectedRanges: first unfocused click focuses and selects one exact projected block; focused ordinary clicks return to NSTextView editing; Command-click toggles exact individual block ranges; Shift and Command-Shift extend from a stable block anchor in either direction. A focused caret or partial text selection is discarded before Command-click creates block selection, so partial ranges cannot leak into block actions.Reviewer findings addressed in the dirty patch:
Regression coverage in progress exercises native focus selection, matching mouse-up suppression, caret-to-Command normalization, nonadjacent add/remove, Shift both directions, unsupported modifiers, exact Copy/Cut/Delete plus Undo, adjacent/noncontiguous drag eligibility, and unfocused handle focus. No local build or GUI run per lane policy; next gate is exact source review, then the sole build/QA lane.
Dependencies: issue #17 list behavior and issue #15 mixed drops should consume these exact native block-selection semantics after this candidate is reviewed; neither should assume a contiguous envelope for Command-selected blocks.
Reviewer status — focus and multi-block selection
Reviewed dirty two-file scope in
.worktrees/editor-hover-marginsatop exact85117d150581a9c3ed9595d90e4223f926f53fbb(Sources/CalternalEditor/BlockEditorView.swift,Tests/CalternalEditorTests/MarkdownBlockDocumentTests.swift). Source review only; no build, mounted test, or GUI verification was run.Current blockers/findings:
selectedRangeswithout proving each range is a whole projected block. From a focused caret or ordinary text selection this creates a mixed partial-text plus full-block selection, which makes later Copy/Delete mapping unsafe. Normalize retained ranges to exact whole blocks or start a new block selection, and cover caret-to-Command-click.performKeyEquivalent/keyDownconsume common commands. The minimum coherent behavior is exact discontiguous Copy, Cut only after copy succeeds, Backspace/Delete in one canonical transaction with one Undo and a defined surviving selection. Adjacent selected blocks can use the existing contiguous drag transaction; genuinely separated drag may remain rejected.contains, allowing Option-click to enter native editing and Command+Option/Shift+Option to act as block selection. Match supported modifier masks explicitly and preserve native Control-click context menus.Coverage needed before the next source gate: exercise public
mouseDown/mouseUp, focused ordinary caret entry, caret-to-Command normalization, nonadjacent toggle/removal, exact Copy/Cut/Delete plus Undo, and adjacent versus separated handle drag behavior.Reviewer transition — second source pass on the current dirty two-file patch atop
85117d150581a9c3ed9595d90e4223f926f53fbbThe first-pass P1 is resolved: Command-click now discards a caret/partial text selection before creating exact whole-block ranges. The patch also adds one canonical Copy/Cut/Delete transaction and adjacent-only multi-block drag eligibility. Source review only; the patch is still dirty/unfrozen and has not been built or run by this reviewer.
Remaining findings:
performKeyEquivalentcompares.deviceIndependentFlagsMask; Caps Lock therefore prevents Command-C/Command-X. Compare only Command/Shift/Control/Option.super.cursorUpdate(with:)for ordinary focused interaction.Exact source gate remains pending these repairs and a frozen SHA. Build, mounted tests, accessibility, and GUI behavior remain unverified.
Candidate frozen for exact source review:
/root/block_drag_finish,.worktrees/editor-hover-marginswave16/editor-hover-marginsa413f10f62cf06acc45ea32ac34652b89c342fc885117d150581a9c3ed9595d90e4223f926f53fbbSources/CalternalEditor/BlockEditorView.swift,Tests/CalternalEditorTests/MarkdownBlockDocumentTests.swiftgit diff --checkpassed; worktree clean. No build or GUI run under the sole-builder policy.Implemented behavior: first unfocused click focuses and selects one exact block; focused ordinary click enters native text editing; Command toggles true native discontiguous ranges; Shift/Command-Shift extend from a stable block anchor. Copy, Cut, Backspace/Delete are exact whole-block actions; Cut/Delete share the canonical transaction/Undo seam. Adjacent selected blocks can drag together, while grabbing a selected member of a noncontiguous set is rejected and grabbing an unselected block collapses to that block. Context-click explicitly collapses to its clicked action target.
Deliberate bounded limitation for this candidate: discontiguous paste, typing/IME replacement, formatting, indent/move, and accessibility text replacement are rejected rather than silently acting on the primary range. Those commands can be added only with exact multi-range source transactions; issue #17 and issue #15 must not route their behavior through a contiguous envelope.
The mounted regression covers focus/mouse-up behavior, caret-to-Command normalization, add/remove and Shift both directions, Caps-Lock Command-C, CRLF and hidden-ID exact export, exact Delete/Cut source with one Undo and valid post-delete selection, adjacent/noncontiguous drag eligibility, context-click policy, unsupported modifiers, and unfocused handle focus. Exact reviewer gate is in progress.
Reviewer transition — frozen candidate
a413f10f62cf06acc45ea32ac34652b89c342fc8is not source-passedParent is exact hover commit
85117d150581a9c3ed9595d90e4223f926f53fbb; worktree was clean and diff-check clean. Prior Caps-Lock shortcut, native cursor fallback, unselected-handle collapse, and deletion-envelope findings are fixed. Source review only; no build, mounted test, accessibility run, or GUI verification.Remaining findings:
normalizedWholeBlockDisplayRangesexpands a contiguous Shift selection and usesnormalized.containsfor every block. Shift-select-all followed by Command-click in the supported 10K editor performs roughly 50 million range comparisons on the main thread. Preserve ordering and deduplicate against the last appended range, or use an ordered Set-backed pass, so the operation is linear.Add a sole-block toggle-off assertion. Exact source gate remains pending an amended SHA.
Candidate superseded after exact reviewer findings. The current frozen SHA is
66c43fa4b632e94a04ae326a457277139c4c9deb(same worktree/branch and parent).Changes from the superseded
a413f10fcandidate:git diff --checkpasses and the worktree is clean. Exact reviewer re-gate is active; no build/GUI has run.Exact source review PASS for
66c43fa4b632e94a04ae326a457277139c4c9deb(parent85117d150581a9c3ed9595d90e4223f926f53fbb). Reviewer found no remaining P1-P3 issues; worktree and diff-check are clean. The 10K normalization path is linear, and sole Command-toggle collapses to a valid projected UTF-16 caret boundary without entering editing.Pending gates remain build, mounted regression runtime, GUI behavior, and accessibility verification. The issue stays open until the user-facing behavior is verified in a delivered build.
Reviewer transition — exact source gate PASS for
66c43fa4b632e94a04ae326a457277139c4c9debParent:
85117d150581a9c3ed9595d90e4223f926f53fbb. Worktree.worktrees/editor-hover-marginswas clean andgit diff --checkpassed. Scope remains the editor source and its mounted regression.No remaining P1–P3 source findings. Whole-block normalization now preserves ordered native ranges and uses adjacent last-only deduplication, removing the 10K quadratic Command-toggle path. Command-clicking the sole selected block now collapses to a valid projected UTF-16 caret, clears the block anchor, and consumes mouse-up without entering native editing. The earlier focus, exact Copy/Cut/Delete with one Undo, adjacent-only selected drag, Caps-Lock shortcut, native cursor fallback, CRLF/hidden-ID, and context-click repairs remain present.
Verification limit: source review only. Build, mounted test execution, GUI behavior, and the deliberately unavailable discontiguous accessibility mutation remain pending/unverified. Keep the issue open through delivered-build user verification.
Post-review compile correction: root’s independent read found that
performKeyEquivalent(with:)became a multi-statement function when the discontiguous-selection branch was added, but its former trailing single expression lacked an explicitreturn. Commitcb9b7b85526f74558b1f386e99d270bceb89c7f7adds only that required return atop margin commita876821f/ interaction commit66c43fa4.An analogous scan of the changed expression bodies found no other converted implicit-return cases.
git diff --checkpasses and the worktree is clean. Exact tip review is active; build has not started.Reviewer transition — compile repair
cb9b7b85526f74558b1f386e99d270bceb89c7f7source PASSParent: passed margin commit
a876821f4677e01578a13b0ad4b660d3d4ac43b8. The exact one-line change adds the required explicitreturnto the now multi-statementperformKeyEquivalent(with:)implementation. Worktree and diff-check are clean; no analogous omission was found in the changed expression bodies.Verification limit: source/compile-plausibility review only. An actual compiler/build and mounted runtime remain pending.
Root integrated the reviewed focus/multiselection stack66c43fa4, margin reductiona876821f, explicit-return repaircb9b7b85 and styled-background candidatea1a8b163. Integration tip37c5d40d now contains all four with clean cherry-picks. Text's compounded inset is reduced while preserving a stable handle gutter. Source review is complete; compile/mounted/runtime verification of this combined tip is pending. Build waits for the exclusive compiler-idle performance capture to finish. No desktop replacement or UI acceptance claim yet.
Build pipeline update —
/root/build_pipeline_recover(sole builder)Marker:
BUILD-HOLD-37C5-ISSUE3-20260913/Users/kayg/Developer/calternal-app/.worktrees/editor-overnight-combined/wave14/editor-overnight-combined6ca85fd2performance capture is active. No compiler or test process was started for this revision.37c5d40de40a2d0b279aad8d13d6f68837533c2d; treea4ab6f472e41dc4ad43e6f4af3aade68fcee5713; 259 verified inputs. Focus selection commit in this lineage:960b23a07ad80ae90883fb886d65d68e30c26f24; formatting-result follow-up:c02320f963b6c6e76cdd19996e63114c4fb990e0.927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; source manifest SHA-256:18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.testFocusClickAndModifierClicksUseNativeFullBlockSelections,testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction, andtestBlockDragPreviewTargetGeometryAndFeedbackCleanup.Limitations: prepared provenance is verified, but this exact integration has not compiled, run tests, reached VM QA, or been delivered to the user. The issue remains open.
Build started —
/root/build_pipeline_recover(sole builder)Marker:
BUILD-START-37C5-ISSUE3-20260913/Users/kayg/Developer/calternal-app/.worktrees/editor-overnight-combined/wave14/editor-overnight-combined.agents@mbp; no local build and no central mutation.37c5d40de40a2d0b279aad8d13d6f68837533c2d; tree:a4ab6f472e41dc4ad43e6f4af3aade68fcee5713; 259 verified inputs.927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; manifest SHA-256:18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.testFocusClickAndModifierClicksUseNativeFullBlockSelections,testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction, andtestBlockDragPreviewTargetGeometryAndFeedbackCleanup.QA plan for the pending exact 37c VM candidate is recorded at
/tmp/qa-runs/20260913-37c-prep/37c-plan.md(shared summary will be copied with candidate evidence). This is a plan only; no outcome is claimed before the artifact is hash-verified and a fresh native post-action frame proves the target state.Issue-specific acceptance for #3 will be exercised with a synthetic/disposable launch only. Each route uses fresh window-local screenshot coordinates with foreground delivery and a post-action screenshot plus viewer/editor state. Virtualized offscreen AX rows and driver return values are insufficient evidence.
Build worker update for exact central candidate
37c5d40de40a2d0b279aad8d13d6f68837533c2d(tree a4ab6f472e41dc4ad43e6f4af3aade68fcee5713, worktree.worktrees/editor-overnight-combined). SwiftPM Release test compilation and staging passed onagents@mbp.The focused selection selector
CalternalEditorTests.MarkdownBlockDocumentTests/testFocusClickAndModifierClicksUseNativeFullBlockSelectionsis not passed on the non-Aqua build-host runner. It entered the test and then remained blocked atMarkdownBlockDocumentTests.swift:1313 -> BlockEditorView.mouseDown -> NSTextView.mouseDown -> nextEventMatchingMask; the worker sampled the exact stack and terminated only that hung XCTest process after a bounded wait. Evidence:/Users/agents/Developer/BuildOnly/package-tests-d40/Evidence/package-tests/20260913T141514Z-central-37c5d40d-focus-0f35ed69/focused-1.logandfocused-1-hang-sample.txt.Per the preview gate owner, Release packaging may continue after successful compilation and unaffected focused checks, but this remains preview-only. Native focus, Command-click toggle, multi-selection, and background-click behavior still require the VM GUI and user QA. This comment records a runner limitation; it does not relabel the selector as passed and does not close the issue.
Build-host result and bounded harness correction:
testFocusClickAndModifierClicksUseNativeFullBlockSelectionsdid not complete: it hung at the direct call toNSTextView.mouseDownon line 1313. On the non-Aquaagents@mbptest host, AppKit enterednextEventMatchingMaskand did not consume the separately posted synthetic mouse-up. This is an unsupported headless native-event simulation, not a product assertion failure. The focused test is not passed yet.3700311d44ce2ebc210089cbddfcc251387c5d68removes that direct native tracking-loop call. It retains the editor-owned decision assertion (handleBlockSelectionMouseDownreturns false for an ordinary focused click, handing the gesture to NSTextView), then asserts the resulting native caret state explicitly. The full physical mouse gesture remains assigned to VM QA; the headless test does not claim it.Stack tip is now
3700311d44ce2ebc210089cbddfcc251387c5d68atop compile repaircb9b7b85, margina876821f, interaction66c43fa4, and hover85117d15. The correction touches onlyTests/CalternalEditorTests/MarkdownBlockDocumentTests.swift;git diff --checkpasses and the worktree is clean. Reviewer and rerun are pending.Reviewer:
/root/editor_polish_inventoryExact tests-only correction reviewed:
3700311d44ce2ebc210089cbddfcc251387c5d68in.worktrees/editor-hover-margins.Source verdict: PASS — no P1-P3 findings.
The commit removes only the unsupported direct
NSTextView.mouseDowntracking-loop call that hung the non-Aqua build runner. It retains the editor-owned assertion thathandleBlockSelectionMouseDownreturnsfalsefor an ordinary click in an already-focused editor, which is the boundary proving the event is handed to AppKit. The explicitsetSelectedRange/equality assertion establishes only the fixture’s expected caret target/state; it does not simulate or prove native mouse gesture delivery.No product source or selection behavior changes. No local build was run. The previously hung selector must be rerun on
agents@mbpto establish that the headless suite completes, while the actual focused click-to-caret gesture remains explicitly unverified until VM testing with a real native event and post-action selection evidence. This review does not claim the physical gesture passed and issue #3 remains open through delivered user acceptance.Root integration: reviewed test-only
3700311dintegrated as5b602934. It removes a native NSTextView mouse-tracking loop that hung the non-Aqua build-host test. The decision-seam assertion remains; assigned caret state is only fixture evidence, not proof of a physical click. Exact-tip rerun is queued behind the 37c5 Release preview. Physical click-to-caret must be checked on the VM.Current preview37c5: compile, hover, and drag checks passed; focused selection test NOT PASSED (hang preserved). Preview build proceeds under the user-authorized preliminary-check policy, with the limitation explicit. No stable acceptance/merge gate is relaxed.
Parallel execution: title#5 remains in performance repair; inspector#10 in final test review; image controls#12 and codeblocks#9 now have independent implementation/planning owners. Caret performance#13/#14 plan is under review. Event#1 continues Store-boundary recovery fixes.
Build/stage result for focus and native block selection, produced by build worker
/root/build_pipeline_recoverfrom.worktrees/editor-overnight-combined:37c5d40de40a2d0b279aad8d13d6f68837533c2d; treea4ab6f472e41dc4ad43e6f4af3aade68fcee5713; 259 verified inputs.927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; source manifest SHA-256:18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.agents@mbp; package binary SHA-25603a041be97c0fc56a26a6b4437f66373c169604fe73aeb7a0d8c082e2fe4371f.MarkdownBlockDocumentTests.swift:1313 -> BlockEditorView.mouseDown -> NSTextView.mouseDown -> nextEventMatchingMask; only that XCTest process was terminated after a bounded wait. Log SHA-2567647ee10715dce7d66b1a8fc9780615acca26098f7a808d3f209d6ce49a0c58a; sample SHA-256adf89ec63bbe10173e064d38bc927ea12d843559da82fca85d880dd79294257b.72a344ce72ec1d848703af89f71c11ac3255077df24e0cf155168bbdcd6b6dfa; executable SHA-25653d72abd06aca991ea8dfde7be807dd0959185da601fc83461c8b8e6daa2ae51. Fresh-unzip strict codesign and bundle diff: PASS./Users/Shared/CalternalBuilds/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip./Users/lume/CalternalQA/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip./Users/Shared/CalternalBuilds/37c5d40de40a-150324a1/tests/and immutable build-host evidence/Users/agents/Developer/BuildOnly/package-tests-d40/Evidence/package-tests/20260913T141514Z-central-37c5d40d-focus-0f35ed69/.State is built and staged, not runtime-accepted or user-accepted. VM GUI verification of real focus, Command-click toggle, multi-selection, and background-click behavior is next. No GUI was executed by the build worker. Keep this issue open.
37c5 preliminary VM result: first foreground click visibly selected the synthetic event, but a second click stayed in the event viewer. The post-state has no mounted text field/text area or focused editable control (
.agents/native-break/37c5-vm-qa/11-after-second.json), so unfocused/focused block selection and Command/Shift disjoint/range behavior were not exercised. Issue remains open.Build worker
/root/build_pipeline_recoverhas frozen.worktrees/editor-overnight-combined(wave14/editor-overnight-combined) at exact56e61d2e4d8da6915fc693a99b2d09d8b5160863, tree3a21c99da5c7c0ab3ae8ec2d949439b5a0c5e5a3, clean withgit diff --checkpassing. This tip includes the reviewed headless focus-test repair5b602934and retains the real focus/multi-selection product code from the prior preview.The sole
agents@mbplane will compile SwiftPM Release tests, rerunCalternalEditorTests.MarkdownBlockDocumentTests/testFocusClickAndModifierClicksUseNativeFullBlockSelections, then build an immutable arm64 Release only after the focused package gates. This records build start only; no runtime or user acceptance is claimed.Root delivery verified: desktop ~/Applications/Calternal.app now runs exact37c5d40de40a2d0b279aad8d13d6f68837533c2d, executable SHA25653d72abd06aca991ea8dfde7be807dd0959185da601fc83461c8b8e6daa2ae51. Native Quit then atomic replacement, prior bundle retained, no user source/settings writes; expected Calternal Space/window restored. Receipt
.agents/desktop-install/37c5d40d/install-receipt.json.User QA now available: hover-only six-dot handle with tighter margins; first unfocused block click selection, focused edit, Cmd/Shiftselection; styled-note top background candidate; cold sidebar overlap candidate. VM basic launch and eventselection passed; actual editor gestures/stylednote and exact collapsed-preview overlap remain unverified, and focus headless test is NOTPASSED. No performance/stable/useracceptance claim.
Next56e61 build contains reviewed imageQuickLook/transcription/inspector and testharnessfix. Eventdate/title/code/list refinements continue separately; this delivery does not close issues.
37c5 VM result on the documented disposable no-image note: first click visibly focuses text with a caret (
22-first-focus.png); Cmd-clicks produce visibly disjoint selected blocks 3 and 6 with intervening 4–5 unselected (26-cmd-disjoint.png); Shift-click produces a visible contiguous range 3–8 (28-shift-range.png). This establishes the UI selection paths. Copy/delete/paste/format/drag/move/indent, IME and Undo adversaries were not run, so do not close the issue yet.Exact
56e61d2e4d8da6915fc693a99b2d09d8b5160863SwiftPM Release test compilation passed onagents@mbp. The repaired headless selector now completes instead of hanging, but it fails three assertions atMarkdownBlockDocumentTests.swift:1339,:1353, and:1395: actual clipboard text isFirst block\r\n\r\nThird blockwhile the expected value isFirst block \r\n\r\nThird block(the actual result lacks the space before the first CRLF).Exact log:
/Users/agents/Developer/BuildOnly/package-tests-d40/Evidence/package-tests/20260913T143932Z-central-56e61d2e-image-voice-inspector-15a9e8a8/focused-1.log, SHA-2560a89cdff7a853afd4393f63b17073abedefe65444eeffb22e50e17a7e1dc34de. Release is held at this focused gate; this is neither a pass nor runtime acceptance. Root has the direct failure report. Keep #3 open.Focused 56e selector diagnosis —
/root/block_drag_finishThe three failures are a product UTF-16/Swift-Character boundary bug, not an expectation mismatch.
writeSelectedBlocksrecognizes a trailing\r\nand callsString.dropLast(2). Swift treats CRLF as one extended grapheme cluster, so that removes the CRLF plus the authored separator space immediately before the hidden block ID. This explains the exact observed asymmetry: the first selected block loses its trailing space before CRLF, while the final block without a line ending retains it.The export contract remains: remove the hidden
^idtoken, preserve its preceding authored horizontal separator, then remove exactly one physical trailing line ending before joining selected blocks. I am preparing a minimal product fix that removes CRLF by UTF-16 length (2 code units) and LF/CR by 1, leaving the existing exact clipboard/Undo regression unchanged. No local build or GUI run; the focused selector must be rerun by the sole builder.Candidate frozen for exact source review —
/root/block_drag_finish.worktrees/editor-hover-marginswave16/editor-hover-marginsdb0b1f203dbe7c329c078b5d5fd49bdc5e9387613700311d44ce2ebc210089cbddfcc251387c5d68Sources/CalternalEditor/BlockEditorView.swift(5 additions, 2 deletions)The selected-block export now removes one trailing physical line ending in UTF-16 units: 2 for CRLF, 1 for LF or CR. This preserves the authored separator before a hidden block ID and directly addresses all three exact failures in the 56e focused selector. The existing clipboard expectations were not changed or weakened.
git diff --checkpasses and the worktree is clean. No local build or GUI run. Independent source review is active; the exact focused selector still requires the sole-builder rerun on the integrated tip.Reviewer:
/root/editor_polish_inventoryExact product fix reviewed:
db0b1f203dbe7c329c078b5d5fd49bdc5e938761in.worktrees/editor-hover-margins, parent3700311d44ce2ebc210089cbddfcc251387c5d68.Source verdict: PASS — no P1-P3 findings.
Swift treats CRLF as one extended
Character, sodropLast(2)removed the CRLF plus the preceding authored character. The repair bridges toNSStringand removes exactly two UTF-16 code units for CRLF or one for LF/CR. The suffix guards guarantee the subtraction cannot underflow; trimming occurs at an ASCII line-ending boundary and cannot split a preceding Unicode scalar. Each block’s own terminal ending is handled independently, so mixed line endings remain safe while the existing preferred separator policy is unchanged.No local build was run. Rerun the focused CRLF/hidden-ID clipboard regression on
agents@mbp; issue #3 remains open through VM/user acceptance.The three exact-source
56e61d2efailures identified a product bug, not an obsolete expectation. Swift's character-level CRLF handling made the priordropLast(2)remove the hidden ID boundary and the authored space before CRLF. Root integrated the reviewed UTF-16/NSString correction as central exact0e835eed87233ab1156fbef86c0286e18a45fa90(Preserve block text before CRLF export), tree48fca32ee4a06602470d50e7cc5ebe953081d018; the worktree is clean andgit diff --checkpasses.Build worker
/root/build_pipeline_recoveris restaging exact0e835eedfor a fresh SwiftPM Release compile and rerun of the unchanged focus/modifier selector plus the integrated image/speech checks, followed by immutable Release packaging only on pass. Prior 56e remains failed evidence and is not a release candidate. No runtime or user acceptance is claimed by this transition.Exact reviewed CRLF correction candidate
0e835eed87233ab1156fbef86c0286e18a45fa90(tree 48fca32ee4a06602470d50e7cc5ebe953081d018, 262 verified inputs) compiled and passed the unchangedtestFocusClickAndModifierClicksUseNativeFullBlockSelectionsonagents@mbpin 4.545s. This verifies the headless test no longer hangs and the authored space before CRLF now survives block clipboard export. Focus log SHA-256:2c964a18064075e14f74b7dbc314fe5f076d7a028e27a9362163664124c928f4.Release arm64 build and extraction-safe archive passed. Source archive SHA-256
7abfd7108583fe70696e53e6e615057e142b6ce6e83f3a5ff736b5c9b93959ec; manifest SHA-2563a2c2afd60ad995ce4d8bf3dc1c60e65e3376eaef8344d8d056b7933d95afd65; zip SHA-256a18cecf74cb32fd205201b21783b2a7df56aec77a081e04d3c791f6377b4e0ee; executable SHA-256e2ce47b34c64f73d5b7d57384e9b17bc13379658138803ab56ec670246965226. Fresh-unzip strict codesign and byte-for-byte bundle diff passed.Local artifact:
/Users/Shared/CalternalBuilds/0e835eed8723-3507d319/Calternal-0e835eed8723-Release-arm64.zip. VM artifact:/Users/lume/CalternalQA/0e835eed8723-3507d319/Calternal-0e835eed8723-Release-arm64.zip. Receipt:/Users/Shared/CalternalBuilds/0e835eed8723-3507d319/archive-verify.json, SHA-256572c67fcdb1c5521360fcfcf4d6ec6e972c11de195a8e426fcf6cdbbc5a67eca.State is built and staged. The build worker ran no GUI. Exact 0e runtime/user acceptance remains pending; keep #3 open through that verification.
Task
/root/editor_polish_inventory— next-combined-preview acceptance handoff (planning only; no GUI/build).Already established: exact
0e835eedcompiled and its focused focus/modifier/CRLF clipboard selector passed; prior VM evidence showed Command-disjoint and Shift-contiguous block highlighting. This does not establish destructive commands on disjoint selections.Remaining VM checks, owned by
/rooton the next exact combined build: in the disposable fixture Command-select two nonadjacent uniquely labelled blocks, then separately exercise Copy, formatting, Delete+Undo, paste, drag/move, and Tab/Shift-Tab. At every step assert the intervening block bytes/selection are unchanged, primary range remains predictable, and one Undo restores the exact source. Include a plain caret/IME composition sanity check after clearing the disjoint selection. Capture before/after fixture hashes; never use the real vault. Keep #3 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.
codex/wip/editor-handle-diagnostic-20260914—a4a34c7401bdca2c0e2ab10db58d71087d16df95codex/wip/editor-handle-geometry-20260914—5aac728b2fb3e2e1d77b2881ba2036a3d22d0196codex/wip/editor-handle-render-diagnostic-20260914—d17a8d1cd16670082ce89a0617525d345b8307b3wave14/editor-block-drag—05fefc98890003a4d14ff297d4ead459deca0538wave14/editor-empty-marker-host-repro—79dc861166b57a70a29e6591c1dc1effbd4f7a82wave14/editor-empty-marker-map-publication—c2dcd6d05e22d0ef39b9da8d9e37fa95ec03e2bewave14/editor-empty-marker-paint—e32565510ac13063a5c72994ce0db16dae7ac355wave14/editor-empty-marker-preview—10d6af95f1fe4d786c6c7423d4154bc9e39a2bcewave14/editor-empty-marker-probe—bded2b644854c65f4e1c4dfbaeedf30302b19f34wave14/editor-empty-marker-runtime-diag—bf946ddd7a0c9b0e89e73dc6cc85f1461228b9e4wave14/editor-list-enter-next—66c4af4aaddb3b09f7366211d48d4533d8b08cf6wave14/editor-list-handle-integrated—3441a34263f24aab2c4a8142db103ca1cd8ee3e6wave14/editor-list-keyboard-audit—846a9c768425e2bec809063aae09c3dd6f16ba78wave16/editor-list-refinements—eeed031a28cbae672de108d70738c6c89f19584eMaster #20 contains the resume instructions. No force push; dev remains
1d8f4adf.Spec update from user (2026-09-14), Craft reference screenshots supplied in session:
Assignment: parallel track
wave19/block-editor-craft(worktree.worktrees/block-editor-craft), starting from dev1d8f4adf. Scout mapping of the current selection code is in progress.Chunk 2 (click / double-click editing) on
wave19/block-editor-craft:fa90c96repeated-click caret path,fb8b1bcdefer selected-block editing until mouse-up (8 pt drag threshold replays the native press; visible handle excluded; per-character TextKit 2 hit mapping so the caret lands on the clicked character),90c00f7restores the unfocused ordinary-click guard and drag-preview grab geometry. Reviewer (read-only) findings addressed: unreachable branch, swallowed handle/text drags, exact caret index assertion. Build host: focus/modifier test, drag-preview test and the new double-click test each 1/1; the rest of the class matches the dev baseline (dev has a pre-existing crash in the rendered-image copy test, noted on #11). Delivery to kayg@mbp waits on chunk 1 (#4) acceptance.Click/double-click editing commits are on
wave19/block-editor-craft@bc3ace0(see #24 for status); not yet VM-driven; paused for supervised continuation tomorrow.