Reduce compounded editor margins and reveal handles on hover #4
Open
opened 2026-09-13 13:34:39 +00:00 by kayg
·
57 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#4
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
Source audit: page24 + editor48 + line padding5 puts text77pt inside card. Hover85117 reviewed and mounted-tested, integrated6ca85; width changes pending.
Acceptance
Reduce compounded margins with a stable reachable gutter. No text jump on hover. Retain handle through gutter travel, drag and menus. Verify nested lists/images/narrow panes; settle wide-column preference with user QA.
Keep open until the user-facing outcome is verified in a delivered build. Source review or a successful build alone is not completion.
Status from
/root/block_drag_finishin.worktrees/editor-hover-margins, branchwave16/editor-hover-margins.Hover-only handle behavior is frozen as commit
85117d150581a9c3ed9595d90e4223f926f53fbbon9153c4beda1d32b3e65b29f6d1a32f65453cfd4cand received exact source-review PASS with no P1-P3 findings. It keeps text position stable, reveals the native six-dot handle only for a realized hovered block/gutter corridor, retains it for press/drag/context menu, and clears it on exit/detachment.The margin reduction is deliberately queued as a separate commit after issue #3 focus/multiselect freezes, because both touch
BlockEditorView.swift. Current measured source values are 24 pt page inset per side, 48 pt editor text-container inset per side, and 5 pt line-fragment padding per side under the unchanged 760 pt page cap. The planned narrow change is page 24→12 and editor 48→32, preserving a stable 7 pt gap between the expanded handle hit corridor and text while increasing ordinary text width from about 606 to 662 pt at the cap. No width source edit has been made yet.No local build or GUI run; root owns integration/build and user preview. Keep open until the reduced margins and hover behavior are verified in the delivered app.
Reviewer status — hover-only block handle
Exact source gate PASS for
85117d150581a9c3ed9595d90e4223f926f53fbb, parent9153c4beda1d32b3e65b29f6d1a32f65453cfd4c, in.worktrees/editor-hover-margins. The worktree was clean andgit diff --checkpassed. Scope was exactlySources/CalternalEditor/BlockEditorView.swiftandTests/CalternalEditorTests/MarkdownBlockDocumentTests.swift.No P1–P3 source findings. Hover uses one TextKit fragment lookup with a fragment-Y guard and projects only into the existing gutter corridor. The selected-caret fallback is removed. Press, drag-session, block-menu, and detachment cleanup paths are coherent; text inset/card width are unchanged. The mounted regression covers caret-hidden, text/gutter hover, press-exit cleanup, menu retention, and unchanged text-container origin.
Verification limit: source review only. Build, mounted test execution, and GUI behavior remain unverified by this reviewer.
QA status: not passed.
6ca85 has a verified basic synthetic launch only. The mounted editor/hover handle was not reachable in that fixture, so there is no runtime evidence yet for reduced margins, a stable gutter, hover persistence, or no text jump.
Current VM AX exposes only the virtualized timeline table as a usable token; it does not materialize an editable document block target. Required follow-up is a delivered build with a mounted editable fixture and fresh AX/pixel proof for hover, gutter travel, drag/menu, nested list/image, and narrow-pane cases.
Root integration/build update
Hover-only85117 is integrated in6ca85fd2. Focused mounted hover/gutter/retention regression and existing drag cleanup test passed on agents@mbp; exact Release and basic VM launch passed. Width reduction and focus/multiselection remain separate active work. Preview not yet installed because the user's event-edit draft is open. No full Craft parity claim.
QA route update — foreground screenshot-coordinate input is now verified for sidebar event selection on 6ca85 (post-action frame and viewer change captured). It does not provide a mounted editor/document target, so the image insertion mapping path has not been re-run and this issue is not marked passed. Evidence:
.agents/native-break/sidebar-live-9153/6ca85-foreground/RESULT.md.Reviewer transition — narrow margin delta source review PASS before freeze
Reviewed the dirty three-file delta in
.worktrees/editor-hover-marginsatop exact interaction commit66c43fa4b632e94a04ae326a457277139c4c9deb. Scope: editor text inset 48→32, document-page/editor/footer outer inset 24→12, plus mounted assertions for the stable text origin and expanded handle corridor. No P1–P3 source findings.At the 760 pt cap, the page change widens the editor outer frame by 24 pt and the editor change removes another 32 pt of total internal inset. The height callback receives the same widened outer width used by the live editor. The handle remains at x=8…24 with its hit corridor ending at x=30; text-container origin is x=32 and native line padding starts glyphs at x=37. List-marker layout reserves at least 20 pt of first-line indent and therefore remains clear of the handle. Narrow widths retain the existing clamps and hide the handle when it cannot fit. Footer and editor outer frames both use x=12 and width
bounds-24; the 760 pt cap and layout complexity are unchanged.Verification limit: source review only. Exact frozen SHA, build, mounted execution, and user-visible list/narrow/footer checks remain pending. Keep issue open through delivered-build user verification.
Margin candidate frozen as separate commit
a876821f4677e01578a13b0ad4b660d3d4ac43b8atop reviewed focus-selection commit66c43fa4b632e94a04ae326a457277139c4c9debin.worktrees/editor-hover-margins.Exact delta:
width = bounds - 24).BlockEditorViewtext-container inset: 48→32 pt.Geometry at the cap changes from about 606 pt to 662 pt of ordinary text width. The native handle remains x=8...24 locally, its hit corridor ends at x=30, text-container origin is x=32, and the first glyph begins at about x=37. Native list marker indentation adds at least 20 pt, so list glyphs remain clear of the handle. Footer and editor frames remain aligned.
Dirty-diff reviewer found no P1-P3 issues.
git diff --checkpasses and the worktree is clean. Exact-SHA confirmation is pending; build and runtime list/narrow/footer visual checks remain pending.Reviewer transition — exact margin source gate PASS for
a876821f4677e01578a13b0ad4b660d3d4ac43b8Parent: passed interaction commit
66c43fa4b632e94a04ae326a457277139c4c9deb. The worktree was clean,git diff --checkpassed, and the exact scope is the reviewed three-file 14-addition/7-deletion delta:NoteDocumentScrollView.swift,BlockEditorView.swift, andMarkdownBlockDocumentTests.swift.No P1–P3 source findings. Build, mounted regression execution, and user-visible list, narrow-pane, footer-alignment, and text-jump checks remain pending. Keep the issue open through delivered-build user verification.
Exact source gate PASS for margin commit
a876821f4677e01578a13b0ad4b660d3d4ac43b8(parent66c43fa4b632e94a04ae326a457277139c4c9deb), with no P1-P3 findings. The clean stack tip iscb9b7b85526f74558b1f386e99d270bceb89c7f7, whose sole additional line is the separately reviewed interaction compile correction.Pending: build/mounted regression and user-visible list, image, narrow-pane, footer, and wide-page checks. Keep the issue open for delivered-app acceptance.
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-ISSUE4-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. Margin commit in this lineage:e3afe6a93e62dbd631234cc2245ab5ca90ec5f67; hover behavior remains from integrated6ca85fd2d82428d4fe18db508535bc643f3a0ee4.927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; source manifest SHA-256:18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.testFocusClickAndModifierClicksUseNativeFullBlockSelections,testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction, andtestBlockDragPreviewTargetGeometryAndFeedbackCleanup.Limitations: no narrow-pane, nested-list/image, VM visual, wide-column preference, or user acceptance evidence exists for this exact integration yet. The issue remains open.
Build started —
/root/build_pipeline_recover(sole builder)Marker:
BUILD-START-37C5-ISSUE4-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 #4 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/stage result for margins and hover, produced by build worker
/root/build_pipeline_recoverfrom.worktrees/editor-overnight-combined:37c5d40de40a2d0b279aad8d13d6f68837533c2d; treea4ab6f472e41dc4ad43e6f4af3aade68fcee5713; 259 verified inputs.927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; manifest SHA-25618252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteractionPASS in 0.607s, log SHA-2565714b3cf64692ca4e10f31ef2230656183c3a5819a44137514309cf6a33176df. Existing drag geometry/cleanup PASS in 0.271s, log SHA-256c8a7cd732a94856af56e7cc49e4e0ee293e9b9bd76a4094f4806b3845803ffdf.72a344ce72ec1d848703af89f71c11ac3255077df24e0cf155168bbdcd6b6dfa; executable SHA-25653d72abd06aca991ea8dfde7be807dd0959185da601fc83461c8b8e6daa2ae51. Fresh-unzip strict codesign and bundle diff PASS./Users/Shared/CalternalBuilds/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip; VM artifact/Users/lume/CalternalQA/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip./Users/Shared/CalternalBuilds/37c5d40de40a-150324a1/.State is built and staged. Narrow-pane, nested-list, image, wide-column, real-pointer, and user visual behavior remain unverified in this build. No GUI was executed by the build worker. Keep this issue open pending VM and user QA.
37c5 preliminary VM result: selected synthetic event has no mounted editable block target. Hover/gutter/narrow-handle behavior was not exercised; no handle/margin pass is claimed. Evidence:
.agents/native-break/37c5-vm-qa/11-after-second.json.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 partial runtime result: the real OS pointer reaches the visible six-dot block handle in a mounted editor while the selected range remains visually stable (
41-hover-empirical.png; cursor readback42-cursor-empirical.json). This is not a full hover/margin acceptance: the handle was already visible for selection, and hidden→hover, gutter travel, narrow width, nested-list and image cases remain untested. Keep #4 open.New user feedback on delivered37c: internal photo/block dragging works, but handle remains visible and drag feels dependent on text-edit mode. Editor text still too narrow. Previous margins change incorrectly widened Linked/Unlinked Mentions. Required: restore mentions previous width/inset, align text leading edge on the same vertical line as mentions, give editor text more width; hover over a block reveals only its handle without permanent display or shifting text. Keep handle reachable during pointer transfer/drag. This supersedes the earlier49pt/cap-preserving layout assumption. #4 remains open with this correction; current user confirmation is only internal photo/block drag working.
Worker: editor_layout_correction (task implementation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: started; reading current editor geometry and hover implementation from central
56e61d2e.Plan: restore Linked/Unlinked Mentions geometry from before
e3afe6a9, widen note text while aligning its glyph leading edge to mentions, and preserve hover-only six-dot handle behavior with no text shift and reachable gutter/drag corridor. Scope is NoteEditorHost/container/page/footer margins plus BlockEditorView hover overlay portions only.Next action: map compounded insets and implement the smallest source/test delta; no local build per project rules, root remains sole builder.
Assumptions: central
56e61d2eis the requested integration base; existing hover behavior is retained unless geometry requires a narrowly scoped correction.Worker: editor_layout_correction (task implementation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: candidate implemented and committed; ready for reviewer then root integration/build.
Commit:
d260499b03Changes by file:
Rationale: the prior shared-width page layout widened the footer as a side effect; separating footer width restores its previous geometry. The 27 pt inset gives 10 pt more total text width than the current 32 pt inset and aligns actual glyph origin to the mentions content line while leaving a 2 pt corridor gap.
Assumptions: the restored SwiftUI DisclosureGroup leading label remains 20 pt inside the footer frame, so footer x=24 plus its native label inset aligns with editor x=12 + 27 + 5 = 44 pt. Existing context-menu and active-drag handle retention is approved behavior and remains intact.
Validation: git diff --check passes. No local build/test/GUI run per project rule; root is sole builder and VM/UI owner. Reviewer and QA still need to verify actual glyph origin, footer width, hover-away hiding, gutter travel, nested-list/image, and narrow-pane behavior in the delivered build.
Source review — exact
d260499b034cd57d48b14fa5c73be827395a314b: REJECT (P2). No build or GUI was run.P2 —
Sources/CalternalEditor/BlockEditorView.swift:548-552, 1088-1094, 7071-7105: the narrower gutter makes the hover handle overlap list markers. The source equation is: body glyph x = 27 inset + 5 line-fragment padding = 32; a bullet paints at x = 32 - 6 gap - 5 width = 21...26, while the handle paints at x = 8...24 (and its hit corridor extends to x = 30). Ordered markers can extend farther into the same area. Thus hovering a list block can cover its bullet/number, contrary to the issue's nested-list acceptance. The updated test checks only the glyph leading edge and cannot catch marker overlap. Fix by tuning the handle position/gutter together so the actual bullet and widest supported ordered-marker paint rects are disjoint from the handle visual rect (and decide deliberately whether the hit corridor may cover markers), then add bullet and ordered-list geometry assertions at narrow and normal widths.P2 —
Sources/CalternalEditor/BlockEditorView.swift:796-856, 940-950: mouse-down reconciliation does not fix the reported persistent/stale handle lifecycle. Hover changes only on enter/move/exit and now click. With.activeInKeyWindow, losing key-window status can stop tracking without an exit; scrolling/layout can move a different block under a stationary pointer without a mouse-moved event. In both cases the oldhoveredBlockRangecontinues to drivehandleBlockForDraw(), so the handle remains visible until the next click/move. Fix narrowly by clearing hover when tracking becomes inactive/window resigns and reconciling (or clearing) hover on viewport/bounds/layout changes when no press, drag, or context-menu retention is active. Add decision-seam tests for resign-key and stationary-pointer scroll/layout, while preserving press/drag/menu retention.P2 —
App/Sources/Notes/NoteDocumentScrollView.swift:264-275: the claimed editor/mentions alignment depends on an unverified 20 pt internalDisclosureGrouplabel inset. Source establishes editor glyph x = page 12 + editor inset 27 + padding 5 = 44. It establishes only footer host x = 24;DocumentMentionsViewapplies a nativeDisclosureGroupwith no explicit/measured 20 pt label origin. That internal offset can vary with control style, OS, scale, and disclosure state, so x=44 alignment is not established by this change. The 32→27 change also adds only 10 pt total text width, despite the user reporting the delivered editor was still too narrow. Fix/accept using an actual mounted geometry assertion or VM capture that measures the rendered disclosure label and editor glyph leading edges at supported widths, then tune the public outer geometry from that evidence. Keep the issue open if source is integrated for preview; do not claim alignment or sufficient width from these constants alone.git diff --checkis clean. The restored footer frame/width matches the pre-e3afe6a9outer geometry, but that fact does not prove its internal label alignment with the newly positioned editor glyphs.Worker: editor_layout_correction (task implementation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State:
d260499brejected by source review; revising before next patch.User decision: keep a centered reading-width limit and preserve the current page cap. Widen usable text inside that centered column; do not switch to full-pane layout.
Reviewer findings driving revision: the 27 pt inset overlaps bullet and ordered-list marker paint; the mouse-down hover refresh misses stationary-pointer scroll/layout and key-window loss; footer alignment cannot rely on an assumed DisclosureGroup offset.
Plan revision: (1) retain footer frame/width at the pre-e3afe6a9 24 pt inset; (2) model marker paint bounds from the actual projected first-line origin and tune the handle visual/hit corridor as one geometry contract, with explicit bullet and widest ordered-marker assertions; (3) clear or reconcile hover on tracking/window deactivation and viewport/layout changes while preserving active press/drag/menu retention; (4) remove unverified alignment claims from constants and expose only geometry that can be measured by existing native layout APIs/tests. No local build or GUI run; root remains sole builder/VM owner.
Assumption: the current centered page cap remains the product constraint; no additional width expansion is made until runtime glyph/label evidence supports it.
Worker: editor_layout_correction (task implementation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: revised candidate after reviewer rejection of
d260499b; ready for renewed reviewer inspection.User decision recorded: keep the centered reading-width limit/current page cap; widen usable text inside the column and keep mentions at the previous width/inset.
Commit:
4f9bd971ed(on top ofd260499b)Revision changes:
Marker decision: keep the 32 pt reviewed gutter contract until a runtime/native glyph probe establishes the widest ordered-marker footprint. The 27 pt experiment is rejected because its bullet bounds are x=21…26 against the handle x=8…24 and ordered markers extend farther. No unverified claim is made that a 27 pt inset is safe.
Validation: git diff --check passes. No local build or GUI run; root remains sole builder and VM owner. Renewed reviewer must inspect marker bounds and lifecycle hooks, then QA must exercise key-window loss, stationary-pointer scroll/layout, hover-away hiding, drag/menu retention, nested lists, images, and narrow panes.
User feedback recorded by QA: reject the compounded-margin / always-visible-handle direction. The earlier 37c pointer/handle frame is retained as behavior evidence only and must not be treated as design acceptance. Follow-up should use the user’s preferred editor layout and re-check the reachable hover/drag state there.
Partial source review — exact incremental commit
4f9bd971ed4f33fff21957609a02d7b70ef41c5eatop rejectedd260499b: REJECT (P2). This review covers only the gutter restoration and hover lifecycle delta; it does not approve the cumulative issue #4 layout. No build/GUI was run.P2 —
Sources/CalternalEditor/BlockEditorView.swift:5067-5095(interaction with newclearHoverUnlessRetained/reconcileHoverWithPointerat:871-891): a context menu can still leave the retained handle visible after the pointer has moved away. The new scroll/layout/window hooks deliberately do nothing whilecontextMenuBlockRange != nil. When the menu closes,menuDidCloseclears the retained range and calls onlyupdateHandleOverlay(), which falls back to the pre-menuhoveredBlockRange; menu tracking may have suppressed ordinary mouse-moved/exit delivery. The stale block is therefore drawn until another move/click/layout happens. Fix narrowly by callingreconcileHoverWithPointer()immediately after clearingcontextMenuBlockRangeinmenuDidClose(or explicitly clearing hover if the window is no longer key). Add a menu-retention-then-pointer-away/close case.P2 —
Sources/CalternalEditor/BlockEditorView.swift:6686-6691: synchronous pointer hit testing insidelayout()risks reentrant TextKit layout and adds work to every editor layout pass.reconcileHoverWithPointer()callsupdateHover, which asksNSTextLayoutManager.textLayoutFragment(for:); a changed block then callsupdateHandleOverlay()/blockRect(for:)while the view is already laying out. Ordinary editing, height invalidation, and attachment/task layout can therefore trigger nested layout work on the main thread. Fix by coalescing one main-actor reconciliation after the current layout pass (with cancellation/generation fencing on detach), while keeping the clip-view bounds observer for scroll. Alternatively, clear stale hover synchronously during layout and resolve the pointer on the next run-loop turn. Add an instrumented decision test proving repeated layout notifications coalesce and retained press/drag/menu states are not cleared.What the incremental commit does establish: observer tokens are removed on window moves and deinit; window/application deactivation clears unretained hover; clip bounds changes reconcile a stationary pointer; and the internal inset returns to the previously reviewed 32 pt value.
git diff 4f9bd971^..4f9bd971 --checkpasses.Known cumulative acceptance gap:
4f9bd971restores the editor inset to 32, so it supplies no additional text width over the delivered 37c geometry that the user called too narrow. The parentd260499bfooter still relies on unmeasured nativeDisclosureGrouplabel geometry and does not establish leading-edge alignment. Treat this branch as a partial hover repair only; do not close #4 or claim the requested width/alignment until mounted native measurements and user QA support the final public geometry.Worker: editor_layout_correction (task implementation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: revised candidate ready for exact diff review.
Commit:
a129fe1f12(on top of4f9bd971)Changes:
Sources/CalternalEditor/BlockEditorView.swift: use a 30 pt internal text inset to reduce redundant padding within the centered page cap while retaining the marker-safe handle gutter; coalesce pointer reconciliation onto the next main-actor turn with a generation fence, so editor layout and clip-view scrolling never run synchronous TextKit hit testing or reentrant overlay layout. Menu close now schedules reconciliation immediately after releasing menu retention. Window/application deactivation cleanup and active press/drag/menu retention remain intact.Tests/CalternalEditorTests/MarkdownBlockDocumentTests.swift: expect the reduced 30 pt inset; existing corridor assertion measures native line-leading edge.The footer remains at the pre-e3afe6a9 24 pt inset and
bounds - 48width fromd260499b. The centered page cap is unchanged. No claim is made that the SwiftUI disclosure label alignment is proven by source constants; root/QA must measure actual rendered glyph and label origins.Assumptions: 30 pt remains sufficient for marker clearance at the supported centered widths; runtime/native glyph evidence must confirm bullet and widest ordered-marker cases before acceptance.
Validation:
git diff --checkpasses. No local build or GUI run per project rule. Reviewer must inspect the coalescing fence, menu-close lifecycle, and marker geometry; root remains sole builder, and QA must run the mounted width/hover/menu/scroll scenarios.Partial exact source gate — incremental
a129fe1f12e83a8c7d08bb0624e07bcbfc61e723atop4f9bd971: PASS, no P1-P3 findings in this follow-up. No build/GUI was run, and this does not close the cumulative issue #4 layout acceptance.Verified:
BlockEditorView.swift:895-907, 5103-5111, 6700-6707coalesces layout/clip/menu-close reconciliation onto the next main-queue turn. TextKit fragment lookup no longer runs synchronously fromlayout(), resolving the prior reentrancy/main-thread churn finding.viewWillMove(toWindow:)increments a generation and clears the scheduled flag. A queued callback from an old window returns on generation mismatch; a callback scheduled after reattachment owns the new flag/generation. Observer removal and weak capture keep detach/deinit bounded.menuDidCloseclears context retention, schedules fresh pointer reconciliation, and immediately updates the overlay. This fixes the stale pre-menu hover fallback while retaining the handle during the active native menu.MarkdownProjection.swift:1007-1018applies at least 20 pt paragraph head indent (or ordered-marker width + gap), andMarkdownLayoutFragment.drawderives marker painting from that first-line origin, moving the painted marker away from the handle. The expanded hit corridor remains before ordinary glyph leading according to the mounted geometry assertion. Runtime raster/cursor checks remain necessary for narrow panes and long ordered markers.git diff a129fe1f^..a129fe1f --checkpasses and the worktree is clean.Unverified cumulative behavior: source cannot establish the native
DisclosureGrouplabel's rendered leading edge, so editor/mentions alignment remains unproven. The 32→30 inset adds only 4 pt total text width relative to delivered 37c; whether that satisfies the user's “still too narrow” feedback is a user-visible acceptance question. Keep #4 open through exactagents@mbpbuild, mounted hover test, VM key-loss/scroll/menu/nested-list/narrow-pane checks, measured glyph/label capture, and user QA.Worker: editor_layout_correction (geometry analysis)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction,
a129fe1fState: bounded QA handoff; no source edits in this update.
Observed evidence:
.agents/native-break/0e835-vm-qa/24-after-doubleclick-state.pngreports prose/image leading edge about 482 px and Linked Mentions label about 440 px in a 2x capture: approximately 42 px = 21 pt of visible mismatch.Source geometry on
a129fe1f: editor frame starts at page x=12 pt; text-container inset is 30 pt; native line-fragment padding is 5 pt, so ordinary glyph leading target is x=47 pt in the page coordinate space. Footer host starts at x=24 pt and has widthbounds - 48;DocumentMentionsViewuses native DisclosureGroup content without an explicit leading anchor. Therefore source proves the editor anchor (47 pt) and footer host anchor (24 pt), but it does not prove the rendered disclosure label anchor. The screenshot indicates the native label is roughly 21 pt left of the prose glyph in that runtime state.Expected a129 delta from the prior 32 pt inset: glyph leading moves left by 2 pt (4 px at 2x); the footer width restoration changes wrapping/available width, not the footer label's x origin. Thus a129 should reduce the measured mismatch only to roughly 19 pt if the same runtime geometry holds; it should not be described as aligned. The exact shared anchor still requires a mounted measurement of the first prose glyph/image edge and the rendered Linked Mentions label edge, then a deliberate adjustment that preserves the centered cap, restored footer width, marker clearance, and handle corridor.
Validation limit: screenshot evidence is QA-provided and no local GUI/build was run. Root/QA must measure the candidate directly before choosing the final internal padding or introducing an explicit footer/editor alignment anchor.
Worker: editor_layout_correction (geometry correction)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction,
a129fe1fState: corrected bounded QA handoff; no source edits.
Correction to the prior analysis:
a129fe1fchanges the mentions footer frame from x=12 pt to x=24 pt while restoring its bounds-48 width. Therefore the candidate shifts the footer/label host right by 12 pt in addition to shifting the editor glyph left by 2 pt (32→30 inset). Against QA's current0e screenshot gap of about 21 pt (482 px vs 440 px at 2x), the expected residual gap is approximately 7 pt, subject to the native DisclosureGroup label's internal origin and any screenshot-state differences. The footer change affects both position and wrapping; it was incorrect to describe it as wrapping-only.Refined source target: measure the actual first prose/image glyph leading edge and rendered Linked Mentions label leading edge in the same mounted centered-cap fixture. Tune the shared anchor from that measurement. Keep marker/handle room as a separate invariant: the 16 pt handle remains x=8…24 with its expanded corridor to x=30, and the reduced internal inset must leave projected bullet and widest ordered-marker paint bounds visually disjoint from the handle. The centered page cap and restored footer width remain fixed while measuring.
Validation limit: no native fixture/build/GUI run by this worker. Root QA must capture both anchors at 2x and verify narrow/normal widths, nested lists, menu close, stationary-pointer scroll, and active drag retention before any further inset adjustment.
Worker: editor_layout_correction (bounded QA preparation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction,
a129fe1fState: measurement plan prepared; no source edits.
Goal: resolve the remaining editor/mentions leading-edge mismatch while keeping the centered page cap, restored mentions width/inset, and marker-safe local editor gutter.
Current source anchors on
a129fe1f:Native fixture protocol for root/QA on the exact candidate:
Expected geometry effect: changing only the editor frame origin by Δx translates prose/image glyphs and the handle together by Δx while preserving their local separation. Widening symmetrically to keep the page centered increases usable text width without changing the centered cap. Footer x=24 and bounds−48 remain fixed.
Validation limit: this worker has no build/GUI access; root remains sole builder and VM owner. The source candidate is not alignment-accepted until the paired glyph/label measurement is captured and reviewed.
Combined integration candidate — worker
/root/block_drag_finishReviewed cumulative issue #4 delta
56e61d2e..a129fe1fwas integrated conflict-free on top of the combined editor stack as02875a4e,611646df, and5f8dd69e. All three stable patch IDs exactly match their reviewed originals. Exact combined tip is5f8dd69e029e63d5c87e68d4b5e663b63684ef52in clean.worktrees/editor-structural-combined, based on26eb1552.The integration preserves the reviewed 30pt local editor inset and marker corridor, footer x=24/width=bounds−48, and centered 760pt cap. Hover lifecycle reconciliation is now being interaction-reviewed with fenced-code fragment layout, native paste reveal coalescing, and discontiguous list edits.
Known limitation remains explicit: native measurement still indicates roughly 7pt of visual alignment correction is needed. This candidate enables combined build/QA measurement; it does not complete or close issue #4. No local build or GUI run. Focused editor selector:
testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction; layout/footer visual measurement remains VM/user QA.Source integration review — exact combined tip
5f8dd69e029e63d5c87e68d4b5e663b63684ef52against base26eb155253241603ec8f1a89e263a7a8cd496341: PASS (no P1–P3 findings) for the integrated #4 source delta.All three #4 commits retain identical stable patches. The 30 pt editor inset, footer x=24/width−48 geometry, window/application lifecycle clearing, and generation-fenced coalesced hover reconciliation are preserved. Layout/viewport callbacks schedule one reconciliation; active handle drag and context-menu state remain retained; key-window loss clears stale hover. Code-fragment layout, list edits, and native-paste reveal can schedule layout independently without bypassing the hover generation/ownership guards.
The known roughly 7 pt visible glyph alignment remains a runtime QA item and is not claimed fixed by this source pass.
Root fast-forwarded the clean preview integration branch from26eb1552 to exact5f8dd69e after independent combined source review PASS and diff-check. Includes code-block presentation, atomic disjoint list indentation, native-paste reveal coalescing, and hover lifecycle/footer-width correction. The known roughly7pt visible text/mentions alignment gap remains for native measurement. This is a NEXT build candidate; it does not supersede the current26eb event/title build and is not installed. No runtime/performance acceptance is claimed.
Worker: editor_layout_correction (documentation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: spacing boundary documentation committed; source behavior unchanged.
Commit:
eb8dd87583Change:
docs/DESIGN.mdnow records the centered 760 pt cap, source-observed editor/footer anchors, the 47 pt editor glyph-leading anchor, and the restored footer x=24 / widthpage−48. It labels the roughly 7 pt post-shift alignment gap as inferred from QA evidence rather than accepted measurement and requires same-scale native glyph/label capture before any editor-frame adjustment.Validation:
git diff --checkpassed. No build or GUI run; root owns the next native capture and editor-frame plan.Exact central
5f8dd69e029e63d5c87e68d4b5e663b63684ef52build-host status:SwiftPM Release test compilation stopped before hover/footer selectors because
Sources/CalternalEditor/BlockEditorView.swift:7444:58calls unavailableNSColor.resolvedColor(with:); lines 7445-7446 have the same API shape. Compile log SHA-256:eff73d6e1cdd24b73777ba946f70e7ddd0af6aa15f0ac7f729b15441cf9028e2at/Users/agents/Developer/BuildOnly/package-tests-d40/Evidence/package-tests/20260913T154953Z-central-5f8dd69e-code-list-hover-1d82888f/swift-build.log.No hover/footer test executed, no runtime was staged, and no Release build was attempted. Mounted pointer behavior remains assigned to later VM GUI verification.
Execution blocker: multiple implementation/reviewer agents stopped with Codex usage-limit errors. No further source or runtime acceptance is claimed. Desktop26eb1552 is installed and native launch/prior note verified. Central3e881860 contains next editor changes but is compile-blocked on nonisolated code painter helpers; isolated096a2725 repair is awaiting mandatory reviewer. Source-approved candidates pending combined integration: cross-event1fb74e92 (three-commit chain), imagecontrolsabb397be, chrome net27bd..a969f8ef. Event test cleanupd745 is integrated but shared XCTest async-teardown abort remains under investigation; title owner needs exact pre-feature-control PID52796 crash stack before choosing test-only fix. Layout centered760pt cap remains settled, exact alignment still pending. Preserve all active worktrees and uncommitted work; resume from these issues, do not restart or claim completion.
Worker: editor_layout_correction
Task identity: bounded issue #4 frame-anchor correction
Worktree: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction
Branch: wave17/editor-layout-correction
Current SHA:
eb8dd87583Status: source unchanged while plan awaits review; no build or GUI run.
Measurement correction: the 26eb release repro reports screenshot scale 1.625 (1560×1036 screenshot over 960×635 native), prose leading x≈483 and mentions x≈440, a baseline gap of ≈26.5 pt. On a129/5f8, existing footer restoration shifts the mentions host +12 pt and the editor local inset shifts glyphs −2 pt, leaving an estimated ≈12 pt residual. This is an estimate until the exact candidate is captured.
Bounded plan for review: preserve the centered 760 pt page cap, footer x=24 and width
page−48, and the editor’s local 30 pt inset / 5 pt native padding. Move only the editor frame from x=12,width=page−24to x=0,width=page, increasing usable text width by 24 pt while keeping handle/marker geometry unchanged in editor-local coordinates. The expected page glyph shift is −12 pt, which would cancel the estimated residual; this is a target, not an acceptance claim.Checks required after review: confirm page cap remains 760 pt, editor remains clipped/contained by the centered page, handle x=8…24 and corridor through x=30 do not overlap rendered bullet/long ordered markers, text/image leading edge aligns with rendered Linked Mentions label at 1.625x, and narrow widths retain a reachable gutter. Preserve menu/drag/scroll/key-window hover lifecycle behavior.
Handoff: request exact source review of this plan before editing NoteDocumentPage. Root remains sole builder and VM owner; no local build/GUI run is permitted here.
Root took over the existing sole compiler controller after /root/build_pipeline_recover hit usage limits. Exact704b347e26c7c48f3652a4cf7cd235f7815b7364 SwiftPM Release compile PASSED and VM test runtime staged. Tests executed:0 so far. Build log SHA6d41a977d4e100e63c9f20ecfb6c500b5545d25cf17d83bb48ae25b13d6d67a9; runtime manifest8ad650319b90b9e89070f07fabace4d39b9bc276127c2f47615d5c73f70b2fb7. /root/image_preview_qa assigned exact runtime tests. Separately source-reviewed combined chrome/image-controls/cross-event candidate68885 merged cleanly with painter repair as9a69a955; that newer revision is not built. Each thread owns updates in its relevant issues. Desktop remains26eb1552.
Issue #4 bounded plan review — reviewer
/root/editor_polish_inventory: GO (no P1–P3 plan blockers).The proposed one-boundary change is internally consistent: set the editor frame to
x = 0, width = max(1, bounds.width), pass that exact same width toeditorHeight, and leave the footer atx = 24, width = max(1, bounds.width - 48). The enclosing SwiftUI surface still owns the centered 760 pt cap, so expanding the native editor insideNoteDocumentPagedoes not change the page cap.The 30 pt text-container inset plus native 5 pt fragment padding moves the ordinary glyph origin from page x≈47 to x≈35. The handle stays editor-local at x=8…24, with its expanded hit corridor ending at x=30; both remain inside the page and clear of ordinary text. List-marker collision and long ordered-marker behavior remain governed by the existing internal marker inset, so the source change should not alter their relative geometry. Giving the height estimator the same expanded width used by the editor frame avoids wrap/height disagreement and should reduce wrapping rather than introduce clipping.
Keep the implementation limited to the editor width/frame and its matching diagnostic width. Do not change the local inset, line-fragment padding, handle math, footer frame, vertical offsets, scroll restoration, or the 760 pt SwiftUI cap. Update the spacing-boundary documentation after native measurement because its current x=12 / glyph x≈47 values will become stale.
Runtime acceptance remains required: capture text/image and actual
DisclosureGrouplabel glyph origins at the same 1.625 scale, exercise narrow widths and long ordered markers, and verify the handle corridor, drag/menu hover retention, wrapping, and scroll position. The −12 pt alignment result is a prediction, not a source-proven fix.Worker: editor_layout_correction
Task identity: issue #4 editor frame anchor correction
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: candidate implemented; ready for exact source review and root integration.
Commit:
4de2c9c979Changes by file:
page−48.0 + 30 + 5) and labels native label alignment as unmeasured.Rationale: moving the complete editor frame outward translates prose/image glyphs and the local handle together, preserving marker/handle separation while providing 24 pt more usable text width inside the unchanged centered 760 pt page cap. This targets the measured residual after the prior footer +12 pt and local glyph −2 pt shifts without changing footer geometry or local inset.
Assumptions: the page remains constrained by its existing 760 pt cap, so editor x=0 is contained within the centered page; native clipping and narrow-pane behavior require root QA confirmation.
Validation:
git diff --checkpasses. No local build or GUI run. Exact source review should verify callback width, cap preservation, editor containment, and unchanged hover/drag/menu lifecycle before integration. Runtime glyph/mentions alignment, marker clearance, and narrow-pane behavior remain unverified.Exact source review —
4de2c9c979a5da60ee75ff3d51bcbe6cf098f132(parenteb8dd875832f703fb963278bd18ecff3e9287507): one P3 documentation finding; product source matches the approved plan.docs/DESIGN.md:102–104: the unmeasured 35 pt value is phrased as an observed glyph anchor. The text says “source-observed geometry … giving an ordinary glyph-leading anchor of 35 pt.” The frame/inset/padding constants are source-observed, but the actual visible glyph origin is the pending runtime measurement. In a design boundary record, this wording can later be mistaken for accepted visual evidence. Change it to state that the source constants predict or calculate x≈35 and explicitly say that value is not runtime-measured. Keep the existing same-scale native capture requirement.The product delta at
App/Sources/Notes/NoteDocumentScrollView.swift:267–271is correct: editor x changes from 12 to 0; width changes frombounds.width - 24tobounds.width; the exact same width feedseditorHeight; footer x/width and all vertical geometry remain unchanged. The diagnostic logs the same expanded editor width.git diff --checkpasses, the worktree has no tracked residue, and no other file changed.No build or GUI run. After the one wording correction, this is ready for a source PASS; actual alignment remains the explicit VM/user gate.
Worker: editor_layout_correction
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: documentation-only wording fix committed; ready for quick literal review.
Commit:
c23cca0963(on top of4de2c9c9)Change:
docs/DESIGN.mdnow states that 35 pt is a source-calculated predicted glyph-leading anchor. It explicitly says the actual visible glyph origin remains unmeasured. No product or layout code changed.Validation:
git diff --checkpasses. No build or GUI run required for this wording-only change.704b focused package hover check:
MarkdownBlockDocumentTests/testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteractionexecuted 1 test with 0 failures. This only covers the mounted/native handle interaction unit path; it is not visual acceptance for the user-rejected always-visible handle/margin treatment or the next layout candidate.Follow-up and cumulative source review — exact tip
c23cca0963df2cdb260bb14700dc54b0c30afc4datop4de2c9c979a5da60ee75ff3d51bcbe6cf098f132: PASS (no P1–P3 findings).The documentation repair resolves the prior P3 exactly.
docs/DESIGN.md:102–105now distinguishes the source-observed frame/inset/padding constants from the predicted 35 pt glyph-leading calculation and explicitly says the actual visible glyph origin remains unmeasured. The same-scale native capture requirement remains.Cumulatively, the issue #4 product patch sets the editor to x=0 and full page width, passes that identical width to the height callback, and leaves footer geometry, vertical layout, local inset/padding, handle math, scroll behavior, and the centered 760 pt cap unchanged. The follow-up changes documentation only. Both diffs pass
git diff --check.This is the final source PASS for this two-commit candidate. Runtime glyph alignment, narrow-width marker/handle clearance, and scroll/hover behavior remain the explicit VM/user gates.
Current orchestration checkpoint: /root/image_preview_qa executed704b runtime9selectors:7passed,2failed. #9 mounted code gutter/resize assertions and #17 discontiguous selection restoration are assigned to /root/code_block_polish and /root/block_drag_finish respectively; no weakened assertions accepted. #4 hover and #13 native paste/Undo passed that bounded runtime. Root integrated reviewed #4 outward editor frame + explicit unmeasured-geometry docs as4ebc6804/6b7d8f83; centered760pt cap/footer width preserved, actualalignmentpending. #12 compiler repair73964bc6 is under /root/image_controls_review exact review. Central6b7d8f83 is not built; desktop26eb1552 unchanged. Each individual issue contains owning task and evidence.
Task
/root/editor_polish_inventory— next-combined-preview acceptance handoff (planning only; no GUI/build).Already established:
c23cca09source review passed; the mounted hover/corridor selector passed on704b. The 35 pt leading anchor is source-predicted, not measured.Remaining VM checks, owned by
/rooton the next exact combined build: use the same styled disposable note and capture at one fixed backing scale with the centered 760 pt cap engaged, then at a narrow width. Measure visible first prose glyph, six-dot handle center, list marker, image edge, and Mentions footer label from pixels/AX where available. Require the handle to be absent at rest, appear on prose/list/image hover without text reflow, remain while crossing the editor-to-handle corridor and while its menu is open, then disappear after pointer-away/menu-close. Scroll and resize while hovered to catch stale/flickering state; verify narrow list markers and handles do not clip or overlap. Footer remains x=24/width-48. Runtime alignment and width remain user-acceptance gates; keep #4 open.3bbb VM package runtime exact hashes verified. Hover gate
testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteractionpassed: one test executed, zero failures, no timeout. This is in-process native-component evidence only. Evidence:.agents/native-break/3bbb-combined-package-qa/04-vm-summary.txtandexact-logs/hover/.Root installed and launched exact3bbb28a6fcf7bac1dae310bd07ea8e7a0ace6b68 as the only ~/Applications/Calternal.app. ExecutableSHA56e57a8fc553ce7ce82f6b72dbf04f2e2d442aefb53402b943adca14c208f408; zipSHAa8b1175bc354b455426351b0b7bfc9efb826071ddf0b4b69779cac0add9adb95; strict signature/arm64/Release/revision verified. Prior26eb quit via native menu; rollback retained. Space content inventory matched before/after replacement. Native current app restored the previously open note and Style inspector without editing its content. Receipt .agents/desktop-install/3bbb28a6/install-receipt.json.
User QA preview only. Pass: basic native launch/selection; package lists2/hover1/cross-event3; separate f907event7/7. Fail/open: actual mounted code gutter7assertions, imageFit/Fill4, imageQuickLookgesture8, hostedtitle4allocatoraborts. StyledVMdeeplink did not reach note; nativeUIfallback assigned. Each failure has independent author+reviewer, not closed. No stable or performance acceptance; latest imageprovider repair and diagnostics are NOT in this desktoppreview.
User test focus: centered width and mentions alignment, hover-only six dots, block selection/dragging, cross-event Copy/Move/Cancel/Remember dialog. These UI outcomes remain user acceptance gates.
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—d17a8d1cd16670082ce89a0617525d345b8307b3wave12/editor-viewport-polish—f0186c5e83f3979dfc7d14448bbff657460e1f43wave16/editor-hover-margins—db0b1f203dbe7c329c078b5d5fd49bdc5e938761wave17/editor-layout-correction—c23cca0963df2cdb260bb14700dc54b0c30afc4dMaster #20 contains the resume instructions. No force push; dev remains
1d8f4adf.Spec change from user (2026-09-14), Craft reference screenshots supplied in session:
⋯block menu on hover/selection is tracked in #24; the selection model in #3.Assignment: same parallel track as #3 (
wave19/block-editor-craft).Chunk 1 (hover slide + handle in the vacated space) — branch
wave19/block-editor-craft(pushed):91bd58bdraw-time per-fragment translation,ff0eaf1reviewer fixes (native hit paths, attachment/task-button frames, caret and link cursor rects, targeted invalidation, scroll snap, projection rebind, deterministic clock test),3facd83single hover entry point driving both handle and slide after the user rejected the first build (static handle, no reliable slide),1035232handle alignment through re-projection.Evidence: focused
MarkdownBlockDocumentTestshover + handle tests pass on agents@mbp (synthetic mouseMoved + injected clock; assert handle visible at the vacated leading edge and rendered offset > 0, reset on exit, reduced-motion instant). VM: list markers/HR regression from the first attempt is fixed (matches dev1d8f4adfrender); the VM cannot emit mouseMoved (cua-driver pointer warp), so the motion itself is user-verified. Build3facd830installed atkayg@mbp:~/Applications/Calternal.appfor acceptance. Next chunks: #3 click/double-click editing, #24 ⋯ menu + context menu, Open-as-note.VM hover verification is now possible: cua-driver 0.28.1 on the VM only warped the pointer (CGWarpMouseCursorPosition) for desktop-scope move_cursor, so NSTrackingArea hover never fired. Patched (
.agents/cua-driver-hover-move.patch, 11 lines: post a CGEventType.MouseMoved at the warped point to the HID tap), built on agents@mbp (rustup, arm64), installed in place in /Applications/CuaDriver.app (ad-hoc re-signed, user re-granted Accessibility + Screen Recording; original backed up at ~/cua-driver-0.28.1.orig on the VM).First real-event result against the branch build after
45a700b(evidence.agents/evidence/block-editor/hov-cmp.png,hov-1.png,hov-2.png): hover transitions between blocks correctly (handle + ⋯ move from row A to row B, A resets) — the stuck-state defect is fixed; but the content does not slide (bullet/text x identical hovered vs unhovered; handle appears statically in the gutter). Sent back for the slide; XCUITest scenario will assert the x-shift.Chunk 1 hover slide is verified on the VM with real pointer events at
bc3ace0(see #24 for the full status comment); paused for supervised continuation tomorrow.User report 2026-09-15 (
bc3ace0on desktop): hover → handle appears works, but dragging a block by its handle to another position no longer moves it (regression from the hover-slide/mode work). Also: the hover-handle behaviour should be a setting under Settings → Editor, and Editor should be a plugin like Search (per-Space settings, DECISIONS.md #20). Fix the drag regression first and verify on the VM with real pointer drags (cua-driver drag), before/after screenshots + the resulting markdown order.Drag-by-handle regression fixed (gutter handle hit-test returned nil after the hover slide → drag never began), mounted reorder test; VM real-pointer drag verified. Explicit text/block editor modes; ⋯ never shows the formatting toolbar. Settings → Editor plugin section with per-Space 'Show block handles on hover' (default on). Reviewer pass (10 findings) fixed in
eac3f9b: Open-as-note keeps full block body, exact generated-link idempotence, note creation keyed to block identity, hover animation no longer mutates NSTextStorage per frame, plainText no longer parsed per tick, reserve reapplied after appearance rebuild, stale hover/menu/mode transitions. On the user's desktop in wave19/desktop-test @5b72a45.Overnight (Main): block-drop merged into desktop-test at
74918b78. VM real-pointer drag of 'populated bullet' ONTO 'Paragraph before the list boundary' (default make-note): destination became[Paragraph before…](<../notes/paragraph-before-the-list-boundary-1b7488aa.md>)and the new note contains '# Paragraph before the list boundary. ✨' + '- populated bullet' (source removed) — as specified. Swap/Nest not VM-verified (the checker's Settings automation never selected them; mounted tests for both pass). Verify swap/nest on the desktop via Settings → Editor → 'Drop onto a block'.Overnight (Main) review fixes: make-note drop left the dragged block's separator behind (blank gap) and joined the moved block to the destination with a single newline (lazy paragraph continuation). Now removal uses the shared
MarkdownBlock.removalRange(in:)(also used by the editor's nest path) and the new note keeps the block separate with a blank line; editor rejects a make-note drop outright when the host has no callback (previously accepted + flushed for nothing). Test:testBlockDropAsNoteClosesTheGapAndKeepsTheMovedBlockSeparate.