Reduce compounded editor margins and reveal handles on hover #4

Open
opened 2026-09-13 13:34:39 +00:00 by kayg · 57 comments
Owner

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.

## 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.
Author
Owner

Status from /root/block_drag_finish in .worktrees/editor-hover-margins, branch wave16/editor-hover-margins.

Hover-only handle behavior is frozen as commit 85117d150581a9c3ed9595d90e4223f926f53fbb on 9153c4beda1d32b3e65b29f6d1a32f65453cfd4c and 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.

Status from `/root/block_drag_finish` in `.worktrees/editor-hover-margins`, branch `wave16/editor-hover-margins`. Hover-only handle behavior is frozen as commit `85117d150581a9c3ed9595d90e4223f926f53fbb` on `9153c4beda1d32b3e65b29f6d1a32f65453cfd4c` and 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.
Author
Owner

Reviewer status — hover-only block handle

Exact source gate PASS for 85117d150581a9c3ed9595d90e4223f926f53fbb, parent 9153c4beda1d32b3e65b29f6d1a32f65453cfd4c, in .worktrees/editor-hover-margins. The worktree was clean and git diff --check passed. Scope was exactly Sources/CalternalEditor/BlockEditorView.swift and Tests/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.

Reviewer status — hover-only block handle Exact source gate **PASS** for `85117d150581a9c3ed9595d90e4223f926f53fbb`, parent `9153c4beda1d32b3e65b29f6d1a32f65453cfd4c`, in `.worktrees/editor-hover-margins`. The worktree was clean and `git diff --check` passed. Scope was exactly `Sources/CalternalEditor/BlockEditorView.swift` and `Tests/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.
Author
Owner

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.

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.
Author
Owner

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.

## 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.
Author
Owner

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.

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`.
Author
Owner

Reviewer transition — narrow margin delta source review PASS before freeze

Reviewed the dirty three-file delta in .worktrees/editor-hover-margins atop exact interaction commit 66c43fa4b632e94a04ae326a457277139c4c9deb. 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.

Reviewer transition — narrow margin delta source review **PASS** before freeze Reviewed the dirty three-file delta in `.worktrees/editor-hover-margins` atop exact interaction commit `66c43fa4b632e94a04ae326a457277139c4c9deb`. 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.
Author
Owner

Margin candidate frozen as separate commit a876821f4677e01578a13b0ad4b660d3d4ac43b8 atop reviewed focus-selection commit 66c43fa4b632e94a04ae326a457277139c4c9deb in .worktrees/editor-hover-margins.

Exact delta:

  • Note page/editor/footer outer side inset: 24→12 pt (width = bounds - 24).
  • BlockEditorView text-container inset: 48→32 pt.
  • The 760 pt page cap remains unchanged.
  • Mounted hover regression now asserts the 32 pt inset and that the 6 pt expanded handle corridor remains before the stable text origin.

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 --check passes and the worktree is clean. Exact-SHA confirmation is pending; build and runtime list/narrow/footer visual checks remain pending.

Margin candidate frozen as separate commit `a876821f4677e01578a13b0ad4b660d3d4ac43b8` atop reviewed focus-selection commit `66c43fa4b632e94a04ae326a457277139c4c9deb` in `.worktrees/editor-hover-margins`. Exact delta: - Note page/editor/footer outer side inset: 24→12 pt (`width = bounds - 24`). - `BlockEditorView` text-container inset: 48→32 pt. - The 760 pt page cap remains unchanged. - Mounted hover regression now asserts the 32 pt inset and that the 6 pt expanded handle corridor remains before the stable text origin. 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 --check` passes and the worktree is clean. Exact-SHA confirmation is pending; build and runtime list/narrow/footer visual checks remain pending.
Author
Owner

Reviewer transition — exact margin source gate PASS for a876821f4677e01578a13b0ad4b660d3d4ac43b8

Parent: passed interaction commit 66c43fa4b632e94a04ae326a457277139c4c9deb. The worktree was clean, git diff --check passed, and the exact scope is the reviewed three-file 14-addition/7-deletion delta: NoteDocumentScrollView.swift, BlockEditorView.swift, and MarkdownBlockDocumentTests.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.

Reviewer transition — exact margin source gate **PASS** for `a876821f4677e01578a13b0ad4b660d3d4ac43b8` Parent: passed interaction commit `66c43fa4b632e94a04ae326a457277139c4c9deb`. The worktree was clean, `git diff --check` passed, and the exact scope is the reviewed three-file 14-addition/7-deletion delta: `NoteDocumentScrollView.swift`, `BlockEditorView.swift`, and `MarkdownBlockDocumentTests.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.
Author
Owner

Exact source gate PASS for margin commit a876821f4677e01578a13b0ad4b660d3d4ac43b8 (parent 66c43fa4b632e94a04ae326a457277139c4c9deb), with no P1-P3 findings. The clean stack tip is cb9b7b85526f74558b1f386e99d270bceb89c7f7, 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.

Exact source gate PASS for margin commit `a876821f4677e01578a13b0ad4b660d3d4ac43b8` (parent `66c43fa4b632e94a04ae326a457277139c4c9deb`), with no P1-P3 findings. The clean stack tip is `cb9b7b85526f74558b1f386e99d270bceb89c7f7`, 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.
Author
Owner

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.

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.
Author
Owner

Build pipeline update — /root/build_pipeline_recover (sole builder)
Marker: BUILD-HOLD-37C5-ISSUE4-20260913

  • Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-overnight-combined / wave14/editor-overnight-combined
  • Current state: exact inputs prepared; compile intentionally held while the exclusive 6ca85fd2 performance capture is active. No compiler or test process was started for this revision.
  • Integration revision: 37c5d40de40a2d0b279aad8d13d6f68837533c2d; tree a4ab6f472e41dc4ad43e6f4af3aade68fcee5713; 259 verified inputs. Margin commit in this lineage: e3afe6a93e62dbd631234cc2245ab5ca90ec5f67; hover behavior remains from integrated 6ca85fd2d82428d4fe18db508535bc643f3a0ee4.
  • Immutable source archive SHA-256: 927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; source manifest SHA-256: 18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.
  • Queued focused gates after the hold clears: testFocusClickAndModifierClicksUseNativeFullBlockSelections, testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction, and testBlockDragPreviewTargetGeometryAndFeedbackCleanup.
  • Next action: compile/run the exact focused package gates, then build and stage the same exact Release only on a full pass.

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 pipeline update — `/root/build_pipeline_recover` (sole builder)** Marker: `BUILD-HOLD-37C5-ISSUE4-20260913` - Worktree/branch: `/Users/kayg/Developer/calternal-app/.worktrees/editor-overnight-combined` / `wave14/editor-overnight-combined` - Current state: **exact inputs prepared; compile intentionally held** while the exclusive 6ca85fd2 performance capture is active. No compiler or test process was started for this revision. - Integration revision: `37c5d40de40a2d0b279aad8d13d6f68837533c2d`; tree `a4ab6f472e41dc4ad43e6f4af3aade68fcee5713`; 259 verified inputs. Margin commit in this lineage: `e3afe6a93e62dbd631234cc2245ab5ca90ec5f67`; hover behavior remains from integrated `6ca85fd2d82428d4fe18db508535bc643f3a0ee4`. - Immutable source archive SHA-256: `927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480`; source manifest SHA-256: `18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46`. - Queued focused gates after the hold clears: `testFocusClickAndModifierClicksUseNativeFullBlockSelections`, `testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction`, and `testBlockDragPreviewTargetGeometryAndFeedbackCleanup`. - Next action: compile/run the exact focused package gates, then build and stage the same exact Release only on a full pass. 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.
Author
Owner

Build started — /root/build_pipeline_recover (sole builder)
Marker: BUILD-START-37C5-ISSUE4-20260913

  • Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-overnight-combined / wave14/editor-overnight-combined.
  • Performance owner released the exclusive compiler hold. Package compile has now started on agents@mbp; no local build and no central mutation.
  • Exact revision: 37c5d40de40a2d0b279aad8d13d6f68837533c2d; tree: a4ab6f472e41dc4ad43e6f4af3aade68fcee5713; 259 verified inputs.
  • Source archive SHA-256: 927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; manifest SHA-256: 18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.
  • Focused selectors: testFocusClickAndModifierClicksUseNativeFullBlockSelections, testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction, and testBlockDragPreviewTargetGeometryAndFeedbackCleanup.
  • Next action: run all three focused tests after compile, then produce and stage the exact Release only if all pass. Build, runtime verification, delivery, and user acceptance remain distinct.
**Build started — `/root/build_pipeline_recover` (sole builder)** Marker: `BUILD-START-37C5-ISSUE4-20260913` - Worktree/branch: `/Users/kayg/Developer/calternal-app/.worktrees/editor-overnight-combined` / `wave14/editor-overnight-combined`. - Performance owner released the exclusive compiler hold. Package compile has now started on `agents@mbp`; no local build and no central mutation. - Exact revision: `37c5d40de40a2d0b279aad8d13d6f68837533c2d`; tree: `a4ab6f472e41dc4ad43e6f4af3aade68fcee5713`; 259 verified inputs. - Source archive SHA-256: `927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480`; manifest SHA-256: `18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46`. - Focused selectors: `testFocusClickAndModifierClicksUseNativeFullBlockSelections`, `testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction`, and `testBlockDragPreviewTargetGeometryAndFeedbackCleanup`. - Next action: run all three focused tests after compile, then produce and stage the exact Release only if all pass. Build, runtime verification, delivery, and user acceptance remain distinct.
Author
Owner

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.

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.
Author
Owner

Build/stage result for margins and hover, produced by build worker /root/build_pipeline_recover from .worktrees/editor-overnight-combined:

  • Exact source 37c5d40de40a2d0b279aad8d13d6f68837533c2d; tree a4ab6f472e41dc4ad43e6f4af3aade68fcee5713; 259 verified inputs.
  • Source archive SHA-256 927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480; manifest SHA-256 18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46.
  • SwiftPM Release test compile PASS. testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction PASS in 0.607s, log SHA-256 5714b3cf64692ca4e10f31ef2230656183c3a5819a44137514309cf6a33176df. Existing drag geometry/cleanup PASS in 0.271s, log SHA-256 c8a7cd732a94856af56e7cc49e4e0ee293e9b9bd76a4094f4806b3845803ffdf.
  • Preview-only Release arm64 build PASS. Zip SHA-256 72a344ce72ec1d848703af89f71c11ac3255077df24e0cf155168bbdcd6b6dfa; executable SHA-256 53d72abd06aca991ea8dfde7be807dd0959185da601fc83461c8b8e6daa2ae51. Fresh-unzip strict codesign and bundle diff PASS.
  • Local artifact /Users/Shared/CalternalBuilds/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip; VM artifact /Users/lume/CalternalQA/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip.
  • Focused logs and receipt: /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.

<!-- BUILD-RESULT-37C5-ISSUE4-20260913 --> Build/stage result for margins and hover, produced by build worker `/root/build_pipeline_recover` from `.worktrees/editor-overnight-combined`: - Exact source `37c5d40de40a2d0b279aad8d13d6f68837533c2d`; tree `a4ab6f472e41dc4ad43e6f4af3aade68fcee5713`; 259 verified inputs. - Source archive SHA-256 `927b248d34f322259770c52b9c2690878a532b82ce49d843117e3fd8d13f3480`; manifest SHA-256 `18252bbb20e8639297a378b0f4175fc26090b66d6f34741a42ecf77ccfd5ac46`. - SwiftPM Release test compile PASS. `testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction` PASS in 0.607s, log SHA-256 `5714b3cf64692ca4e10f31ef2230656183c3a5819a44137514309cf6a33176df`. Existing drag geometry/cleanup PASS in 0.271s, log SHA-256 `c8a7cd732a94856af56e7cc49e4e0ee293e9b9bd76a4094f4806b3845803ffdf`. - Preview-only Release arm64 build PASS. Zip SHA-256 `72a344ce72ec1d848703af89f71c11ac3255077df24e0cf155168bbdcd6b6dfa`; executable SHA-256 `53d72abd06aca991ea8dfde7be807dd0959185da601fc83461c8b8e6daa2ae51`. Fresh-unzip strict codesign and bundle diff PASS. - Local artifact `/Users/Shared/CalternalBuilds/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip`; VM artifact `/Users/lume/CalternalQA/37c5d40de40a-150324a1/Calternal-37c5d40de40a-Release-arm64.zip`. - Focused logs and receipt: `/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.
Author
Owner

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.

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`.
Author
Owner

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.

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.
Author
Owner

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 readback 42-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.

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 readback `42-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.
Author
Owner

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.

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.
Author
Owner

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 56e61d2e is 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: 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 56e61d2e is the requested integration base; existing hover behavior is retained unless geometry requires a narrowly scoped correction.
Author
Owner

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: d260499b03

Changes by file:

  • App/Sources/Notes/NoteDocumentScrollView.swift: keep the editor on the widened 12 pt outer side inset, but measure/place the mentions footer at its prior 24 pt inset and bounds-48 width. This prevents Linked/Unlinked Mentions from inheriting the editor width change while preserving editor width for height measurement.
  • Sources/CalternalEditor/BlockEditorView.swift: reduce text-container inset 32→27 pt. With native 5 pt line-fragment padding, first glyphs begin at 32 pt, matching the restored mentions leading line while keeping the six-dot handle's expanded corridor ending at x=30. mouseDown now reconciles hover at the actual event point so a stale previously hovered block cannot keep its handle visible after a click lands elsewhere; active press/drag/menu retention paths remain unchanged.
  • Tests/CalternalEditorTests/MarkdownBlockDocumentTests.swift: update the hover geometry expectation to 27 pt and compare the expanded handle corridor against the glyph-leading edge (container origin plus native line padding), rather than the container frame.

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.

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: d260499b034cd57d48b14fa5c73be827395a314b Changes by file: - App/Sources/Notes/NoteDocumentScrollView.swift: keep the editor on the widened 12 pt outer side inset, but measure/place the mentions footer at its prior 24 pt inset and bounds-48 width. This prevents Linked/Unlinked Mentions from inheriting the editor width change while preserving editor width for height measurement. - Sources/CalternalEditor/BlockEditorView.swift: reduce text-container inset 32→27 pt. With native 5 pt line-fragment padding, first glyphs begin at 32 pt, matching the restored mentions leading line while keeping the six-dot handle's expanded corridor ending at x=30. mouseDown now reconciles hover at the actual event point so a stale previously hovered block cannot keep its handle visible after a click lands elsewhere; active press/drag/menu retention paths remain unchanged. - Tests/CalternalEditorTests/MarkdownBlockDocumentTests.swift: update the hover geometry expectation to 27 pt and compare the expanded handle corridor against the glyph-leading edge (container origin plus native line padding), rather than the container frame. 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.
Author
Owner

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 old hoveredBlockRange continues to drive handleBlockForDraw(), 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 internal DisclosureGroup label inset. Source establishes editor glyph x = page 12 + editor inset 27 + padding 5 = 44. It establishes only footer host x = 24; DocumentMentionsView applies a native DisclosureGroup with 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 --check is clean. The restored footer frame/width matches the pre-e3afe6a9 outer geometry, but that fact does not prove its internal label alignment with the newly positioned editor glyphs.

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 old `hoveredBlockRange` continues to drive `handleBlockForDraw()`, 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 internal `DisclosureGroup` label inset.** Source establishes editor glyph x = page 12 + editor inset 27 + padding 5 = 44. It establishes only footer host x = 24; `DocumentMentionsView` applies a native `DisclosureGroup` with 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 --check` is clean. The restored footer frame/width matches the pre-`e3afe6a9` outer geometry, but that fact does not prove its internal label alignment with the newly positioned editor glyphs.
Author
Owner

Worker: editor_layout_correction (task implementation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, wave17/editor-layout-correction
State: d260499b rejected 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: d260499b rejected 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.
Author
Owner

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 of d260499b)

Revision changes:

  • Sources/CalternalEditor/BlockEditorView.swift: restore the reviewed 32 pt internal text inset because 27 pt overlaps projected list-marker paint; retain the outer page widening for usable column width. Add hover cleanup on window resign/application deactivation, reconcile against the stationary pointer during editor layout and native clip bounds changes (scroll), and retain hover during active press, drag, or context-menu state. Observer tokens are removed on detach/deinit. The existing mouse-down reconciliation remains.
  • Tests/CalternalEditorTests/MarkdownBlockDocumentTests.swift: restore the 32 pt inset expectation; the expanded corridor assertion continues to compare against the native line-leading edge.

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.

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: 4f9bd971ed4f33fff21957609a02d7b70ef41c5e (on top of d260499b) Revision changes: - Sources/CalternalEditor/BlockEditorView.swift: restore the reviewed 32 pt internal text inset because 27 pt overlaps projected list-marker paint; retain the outer page widening for usable column width. Add hover cleanup on window resign/application deactivation, reconcile against the stationary pointer during editor layout and native clip bounds changes (scroll), and retain hover during active press, drag, or context-menu state. Observer tokens are removed on detach/deinit. The existing mouse-down reconciliation remains. - Tests/CalternalEditorTests/MarkdownBlockDocumentTests.swift: restore the 32 pt inset expectation; the expanded corridor assertion continues to compare against the native line-leading edge. 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.
Author
Owner

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.

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.
Author
Owner

Partial source review — exact incremental commit 4f9bd971ed4f33fff21957609a02d7b70ef41c5e atop rejected d260499b: 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 new clearHoverUnlessRetained / reconcileHoverWithPointer at :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 while contextMenuBlockRange != nil. When the menu closes, menuDidClose clears the retained range and calls only updateHandleOverlay(), which falls back to the pre-menu hoveredBlockRange; 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 calling reconcileHoverWithPointer() immediately after clearing contextMenuBlockRange in menuDidClose (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 inside layout() risks reentrant TextKit layout and adds work to every editor layout pass. reconcileHoverWithPointer() calls updateHover, which asks NSTextLayoutManager.textLayoutFragment(for:); a changed block then calls updateHandleOverlay()/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 --check passes.

Known cumulative acceptance gap: 4f9bd971 restores the editor inset to 32, so it supplies no additional text width over the delivered 37c geometry that the user called too narrow. The parent d260499b footer still relies on unmeasured native DisclosureGroup label 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.

Partial source review — exact incremental commit `4f9bd971ed4f33fff21957609a02d7b70ef41c5e` atop rejected `d260499b`: **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 new `clearHoverUnlessRetained` / `reconcileHoverWithPointer` at `: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 while `contextMenuBlockRange != nil`. When the menu closes, `menuDidClose` clears the retained range and calls only `updateHandleOverlay()`, which falls back to the pre-menu `hoveredBlockRange`; 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 calling `reconcileHoverWithPointer()` immediately after clearing `contextMenuBlockRange` in `menuDidClose` (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 inside `layout()` risks reentrant TextKit layout and adds work to every editor layout pass.** `reconcileHoverWithPointer()` calls `updateHover`, which asks `NSTextLayoutManager.textLayoutFragment(for:)`; a changed block then calls `updateHandleOverlay()`/`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 --check` passes. **Known cumulative acceptance gap:** `4f9bd971` restores the editor inset to 32, so it supplies no additional text width over the delivered 37c geometry that the user called too narrow. The parent `d260499b` footer still relies on unmeasured native `DisclosureGroup` label 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.
Author
Owner

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 of 4f9bd971)

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 - 48 width from d260499b. 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 --check passes. 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.

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: a129fe1f12e83a8c7d08bb0624e07bcbfc61e723 (on top of 4f9bd971) 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 - 48` width from d260499b. 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 --check` passes. 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.
Author
Owner

Partial exact source gate — incremental a129fe1f12e83a8c7d08bb0624e07bcbfc61e723 atop 4f9bd971: 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-6707 coalesces layout/clip/menu-close reconciliation onto the next main-queue turn. TextKit fragment lookup no longer runs synchronously from layout(), 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.
  • menuDidClose clears 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.
  • Window/application resignation still clears unretained hover synchronously; clip bounds changes schedule stationary-pointer reconciliation; active press, drag, and context-menu guards remain intact.
  • The 30 pt inset keeps the 16 pt handle visual rect at x=8...24. Under the conservative prior equation, the bullet bound begins at x=24, sharing only an edge rather than area. In actual projection, MarkdownProjection.swift:1007-1018 applies at least 20 pt paragraph head indent (or ordered-marker width + gap), and MarkdownLayoutFragment.draw derives 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 --check passes and the worktree is clean.

Unverified cumulative behavior: source cannot establish the native DisclosureGroup label'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 exact agents@mbp build, mounted hover test, VM key-loss/scroll/menu/nested-list/narrow-pane checks, measured glyph/label capture, and user QA.

Partial exact source gate — incremental `a129fe1f12e83a8c7d08bb0624e07bcbfc61e723` atop `4f9bd971`: **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-6707` coalesces layout/clip/menu-close reconciliation onto the next main-queue turn. TextKit fragment lookup no longer runs synchronously from `layout()`, 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. - `menuDidClose` clears 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. - Window/application resignation still clears unretained hover synchronously; clip bounds changes schedule stationary-pointer reconciliation; active press, drag, and context-menu guards remain intact. - The 30 pt inset keeps the 16 pt handle visual rect at x=8...24. Under the conservative prior equation, the bullet bound begins at x=24, sharing only an edge rather than area. In actual projection, `MarkdownProjection.swift:1007-1018` applies at least 20 pt paragraph head indent (or ordered-marker width + gap), and `MarkdownLayoutFragment.draw` derives 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 --check` passes and the worktree is clean. **Unverified cumulative behavior:** source cannot establish the native `DisclosureGroup` label'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 exact `agents@mbp` build, mounted hover test, VM key-loss/scroll/menu/nested-list/narrow-pane checks, measured glyph/label capture, and user QA.
Author
Owner

Worker: editor_layout_correction (geometry analysis)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, a129fe1f
State: bounded QA handoff; no source edits in this update.

Observed evidence: .agents/native-break/0e835-vm-qa/24-after-doubleclick-state.png reports 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 width bounds - 48; DocumentMentionsView uses 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 analysis) Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, a129fe1f State: bounded QA handoff; no source edits in this update. Observed evidence: `.agents/native-break/0e835-vm-qa/24-after-doubleclick-state.png` reports 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 width `bounds - 48`; `DocumentMentionsView` uses 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.
Author
Owner

Worker: editor_layout_correction (geometry correction)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, a129fe1f
State: corrected bounded QA handoff; no source edits.

Correction to the prior analysis: a129fe1f changes 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 (geometry correction) Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, a129fe1f State: corrected bounded QA handoff; no source edits. Correction to the prior analysis: a129fe1f changes 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.
Author
Owner

Worker: editor_layout_correction (bounded QA preparation)
Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, a129fe1f
State: 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:

  • Editor frame: x=12 pt, width=page bounds−24 pt.
  • Editor local glyph anchor: text-container inset 30 pt + native line-fragment padding 5 pt, so page glyph x=47 pt.
  • Handle remains local x=8…24 with expanded pointer corridor through x=30; marker geometry is local to the editor and remains unchanged if only the editor frame moves.
  • Mentions footer frame: x=24 pt, width=page bounds−48 pt. The native DisclosureGroup label origin is not source-defined.

Native fixture protocol for root/QA on the exact candidate:

  1. Use a mounted note containing a prose block, an image block, a bullet list, and a long ordered marker in the centered-cap column.
  2. Capture one 2x post-action frame with the first prose/image glyph edge and Linked Mentions label visible. Record both window-local x coordinates from the same frame; do not infer the DisclosureGroup internal inset.
  3. Verify local handle/marker bounds independently at normal and narrow widths. The editor frame may move symmetrically (for example x=5 and width=bounds−10) only after the measured shared anchor determines the exact delta; do not commit the example value without evidence.
  4. Exercise stationary-pointer scroll/layout, menu close after pointer-away, key-window loss, nested list, image, and active unfocused drag. Retain the handle only for hover/press/drag/menu states and confirm no text jump.

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.

Worker: editor_layout_correction (bounded QA preparation) Worktree/branch: /Users/kayg/Developer/calternal-app/.worktrees/editor-layout-correction, a129fe1f State: 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: - Editor frame: x=12 pt, width=page bounds−24 pt. - Editor local glyph anchor: text-container inset 30 pt + native line-fragment padding 5 pt, so page glyph x=47 pt. - Handle remains local x=8…24 with expanded pointer corridor through x=30; marker geometry is local to the editor and remains unchanged if only the editor frame moves. - Mentions footer frame: x=24 pt, width=page bounds−48 pt. The native DisclosureGroup label origin is not source-defined. Native fixture protocol for root/QA on the exact candidate: 1. Use a mounted note containing a prose block, an image block, a bullet list, and a long ordered marker in the centered-cap column. 2. Capture one 2x post-action frame with the first prose/image glyph edge and Linked Mentions label visible. Record both window-local x coordinates from the same frame; do not infer the DisclosureGroup internal inset. 3. Verify local handle/marker bounds independently at normal and narrow widths. The editor frame may move symmetrically (for example x=5 and width=bounds−10) only after the measured shared anchor determines the exact delta; do not commit the example value without evidence. 4. Exercise stationary-pointer scroll/layout, menu close after pointer-away, key-window loss, nested list, image, and active unfocused drag. Retain the handle only for hover/press/drag/menu states and confirm no text jump. 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.
Author
Owner

Combined integration candidate — worker /root/block_drag_finish

Reviewed cumulative issue #4 delta 56e61d2e..a129fe1f was integrated conflict-free on top of the combined editor stack as 02875a4e, 611646df, and 5f8dd69e. All three stable patch IDs exactly match their reviewed originals. Exact combined tip is 5f8dd69e029e63d5c87e68d4b5e663b63684ef52 in clean .worktrees/editor-structural-combined, based on 26eb1552.

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.

Combined integration candidate — worker `/root/block_drag_finish` Reviewed cumulative issue #4 delta `56e61d2e..a129fe1f` was integrated conflict-free on top of the combined editor stack as `02875a4e`, `611646df`, and `5f8dd69e`. All three stable patch IDs exactly match their reviewed originals. Exact combined tip is `5f8dd69e029e63d5c87e68d4b5e663b63684ef52` in clean `.worktrees/editor-structural-combined`, based on `26eb1552`. 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.
Author
Owner

Source integration review — exact combined tip 5f8dd69e029e63d5c87e68d4b5e663b63684ef52 against base 26eb155253241603ec8f1a89e263a7a8cd496341: 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.

Source integration review — exact combined tip `5f8dd69e029e63d5c87e68d4b5e663b63684ef52` against base `26eb155253241603ec8f1a89e263a7a8cd496341`: **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.
Author
Owner

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.

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.
Author
Owner

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: eb8dd87583

Change: docs/DESIGN.md now records the centered 760 pt cap, source-observed editor/footer anchors, the 47 pt editor glyph-leading anchor, and the restored footer x=24 / width page−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 --check passed. No build or GUI run; root owns the next native capture and editor-frame plan.

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: eb8dd875832f703fb963278bd18ecff3e9287507 Change: `docs/DESIGN.md` now records the centered 760 pt cap, source-observed editor/footer anchors, the 47 pt editor glyph-leading anchor, and the restored footer x=24 / width `page−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 --check` passed. No build or GUI run; root owns the next native capture and editor-frame plan.
Author
Owner

Exact central 5f8dd69e029e63d5c87e68d4b5e663b63684ef52 build-host status:

SwiftPM Release test compilation stopped before hover/footer selectors because Sources/CalternalEditor/BlockEditorView.swift:7444:58 calls unavailable NSColor.resolvedColor(with:); lines 7445-7446 have the same API shape. Compile log SHA-256: eff73d6e1cdd24b73777ba946f70e7ddd0af6aa15f0ac7f729b15441cf9028e2 at /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.

Exact central `5f8dd69e029e63d5c87e68d4b5e663b63684ef52` build-host status: SwiftPM Release test compilation stopped before hover/footer selectors because `Sources/CalternalEditor/BlockEditorView.swift:7444:58` calls unavailable `NSColor.resolvedColor(with:)`; lines 7445-7446 have the same API shape. Compile log SHA-256: `eff73d6e1cdd24b73777ba946f70e7ddd0af6aa15f0ac7f729b15441cf9028e2` at `/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.
Author
Owner

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.

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.
Author
Owner

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: eb8dd87583
Status: 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−24 to 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.

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: eb8dd875832f703fb963278bd18ecff3e9287507 Status: 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−24` to 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.
Author
Owner

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.

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.
Author
Owner

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 to editorHeight, and leave the footer at x = 24, width = max(1, bounds.width - 48). The enclosing SwiftUI surface still owns the centered 760 pt cap, so expanding the native editor inside NoteDocumentPage does 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 DisclosureGroup label 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.

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 to `editorHeight`, and leave the footer at `x = 24, width = max(1, bounds.width - 48)`. The enclosing SwiftUI surface still owns the centered 760 pt cap, so expanding the native editor inside `NoteDocumentPage` does 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 `DisclosureGroup` label 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.
Author
Owner

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: 4de2c9c979

Changes by file:

  • App/Sources/Notes/NoteDocumentScrollView.swift: editor frame is now x=0 with width equal to the page bounds; the same widened width is passed to the height callback. Footer remains x=24 with width page−48.
  • docs/DESIGN.md: spacing boundary now records editor glyph anchor x=35 pt (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 --check passes. 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.

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: 4de2c9c979a5da60ee75ff3d51bcbe6cf098f132 Changes by file: - App/Sources/Notes/NoteDocumentScrollView.swift: editor frame is now x=0 with width equal to the page bounds; the same widened width is passed to the height callback. Footer remains x=24 with width `page−48`. - docs/DESIGN.md: spacing boundary now records editor glyph anchor x=35 pt (`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 --check` passes. 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.
Author
Owner

Exact source review — 4de2c9c979a5da60ee75ff3d51bcbe6cf098f132 (parent eb8dd875832f703fb963278bd18ecff3e9287507): one P3 documentation finding; product source matches the approved plan.

  • P3 — 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–271 is correct: editor x changes from 12 to 0; width changes from bounds.width - 24 to bounds.width; the exact same width feeds editorHeight; footer x/width and all vertical geometry remain unchanged. The diagnostic logs the same expanded editor width. git diff --check passes, 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.

Exact source review — `4de2c9c979a5da60ee75ff3d51bcbe6cf098f132` (parent `eb8dd875832f703fb963278bd18ecff3e9287507`): **one P3 documentation finding; product source matches the approved plan**. - **P3 — `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–271` is correct: editor x changes from 12 to 0; width changes from `bounds.width - 24` to `bounds.width`; the exact same width feeds `editorHeight`; footer x/width and all vertical geometry remain unchanged. The diagnostic logs the same expanded editor width. `git diff --check` passes, 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.
Author
Owner

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 of 4de2c9c9)

Change: docs/DESIGN.md now 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 --check passes. No build or GUI run required for this wording-only change.

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: c23cca0963df2cdb260bb14700dc54b0c30afc4d (on top of 4de2c9c9) Change: `docs/DESIGN.md` now 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 --check` passes. No build or GUI run required for this wording-only change.
Author
Owner

704b focused package hover check: MarkdownBlockDocumentTests/testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction executed 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.

704b focused package hover check: `MarkdownBlockDocumentTests/testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction` executed 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.
Author
Owner

Follow-up and cumulative source review — exact tip c23cca0963df2cdb260bb14700dc54b0c30afc4d atop 4de2c9c979a5da60ee75ff3d51bcbe6cf098f132: PASS (no P1–P3 findings).

The documentation repair resolves the prior P3 exactly. docs/DESIGN.md:102–105 now 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.

Follow-up and cumulative source review — exact tip `c23cca0963df2cdb260bb14700dc54b0c30afc4d` atop `4de2c9c979a5da60ee75ff3d51bcbe6cf098f132`: **PASS (no P1–P3 findings)**. The documentation repair resolves the prior P3 exactly. `docs/DESIGN.md:102–105` now 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.
Author
Owner

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.

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.
Author
Owner

Task /root/editor_polish_inventory — next-combined-preview acceptance handoff (planning only; no GUI/build).

Already established: c23cca09 source review passed; the mounted hover/corridor selector passed on 704b. The 35 pt leading anchor is source-predicted, not measured.

Remaining VM checks, owned by /root on 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.

Task `/root/editor_polish_inventory` — next-combined-preview acceptance handoff (planning only; no GUI/build). Already established: `c23cca09` source review passed; the mounted hover/corridor selector passed on `704b`. The 35 pt leading anchor is source-predicted, not measured. Remaining VM checks, owned by `/root` on 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.
Author
Owner

3bbb VM package runtime exact hashes verified. Hover gate testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction passed: 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.txt and exact-logs/hover/.

3bbb VM package runtime exact hashes verified. Hover gate `testBlockHandleAppearsOnlyForHoverAndStaysReachableDuringInteraction` passed: 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.txt` and `exact-logs/hover/`.
Author
Owner

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.

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.
Author
Owner

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 — a4a34c7401bdca2c0e2ab10db58d71087d16df95
  • codex/wip/editor-handle-geometry-20260914 — 5aac728b2fb3e2e1d77b2881ba2036a3d22d0196
  • codex/wip/editor-handle-render-diagnostic-20260914 — d17a8d1cd16670082ce89a0617525d345b8307b3
  • wave12/editor-viewport-polish — f0186c5e83f3979dfc7d14448bbff657460e1f43
  • wave16/editor-hover-margins — db0b1f203dbe7c329c078b5d5fd49bdc5e938761
  • wave17/editor-layout-correction — c23cca0963df2cdb260bb14700dc54b0c30afc4d

Master #20 contains the resume instructions. No force push; dev remains 1d8f4adf.

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` — `a4a34c7401bdca2c0e2ab10db58d71087d16df95` - `codex/wip/editor-handle-geometry-20260914` — `5aac728b2fb3e2e1d77b2881ba2036a3d22d0196` - `codex/wip/editor-handle-render-diagnostic-20260914` — `d17a8d1cd16670082ce89a0617525d345b8307b3` - `wave12/editor-viewport-polish` — `f0186c5e83f3979dfc7d14448bbff657460e1f43` - `wave16/editor-hover-margins` — `db0b1f203dbe7c329c078b5d5fd49bdc5e938761` - `wave17/editor-layout-correction` — `c23cca0963df2cdb260bb14700dc54b0c30afc4d` Master #20 contains the resume instructions. No force push; dev remains 1d8f4adf.
Author
Owner

Spec change from user (2026-09-14), Craft reference screenshots supplied in session:

  • Replaces the earlier 'No text jump on hover' acceptance: on hover the block's content slides right smoothly to make room for the six-dot drag handle at the leading edge, and slides back when the hover ends. The handle appears only on hover (not while merely selected). Animation must respect Reduced Motion (instant reveal, no slide).
  • The trailing ⋯ block menu on hover/selection is tracked in #24; the selection model in #3.
  • Margin reduction and the centered reading width remain as previously accepted.

Assignment: same parallel track as #3 (wave19/block-editor-craft).

Spec change from user (2026-09-14), Craft reference screenshots supplied in session: - Replaces the earlier 'No text jump on hover' acceptance: on hover the block's content slides right smoothly to make room for the six-dot drag handle at the leading edge, and slides back when the hover ends. The handle appears only on hover (not while merely selected). Animation must respect Reduced Motion (instant reveal, no slide). - The trailing `⋯` block menu on hover/selection is tracked in #24; the selection model in #3. - Margin reduction and the centered reading width remain as previously accepted. Assignment: same parallel track as #3 (`wave19/block-editor-craft`).
Author
Owner

Chunk 1 (hover slide + handle in the vacated space) — branch wave19/block-editor-craft (pushed): 91bd58b draw-time per-fragment translation, ff0eaf1 reviewer fixes (native hit paths, attachment/task-button frames, caret and link cursor rects, targeted invalidation, scroll snap, projection rebind, deterministic clock test), 3facd83 single hover entry point driving both handle and slide after the user rejected the first build (static handle, no reliable slide), 1035232 handle alignment through re-projection.

Evidence: focused MarkdownBlockDocumentTests hover + 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 dev 1d8f4adf render); the VM cannot emit mouseMoved (cua-driver pointer warp), so the motion itself is user-verified. Build 3facd830 installed at kayg@mbp:~/Applications/Calternal.app for acceptance. Next chunks: #3 click/double-click editing, #24 ⋯ menu + context menu, Open-as-note.

Chunk 1 (hover slide + handle in the vacated space) — branch `wave19/block-editor-craft` (pushed): `91bd58b` draw-time per-fragment translation, `ff0eaf1` reviewer fixes (native hit paths, attachment/task-button frames, caret and link cursor rects, targeted invalidation, scroll snap, projection rebind, deterministic clock test), `3facd83` single hover entry point driving both handle and slide after the user rejected the first build (static handle, no reliable slide), `1035232` handle alignment through re-projection. Evidence: focused `MarkdownBlockDocumentTests` hover + 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 dev 1d8f4adf render); the VM cannot emit mouseMoved (cua-driver pointer warp), so the motion itself is user-verified. Build `3facd830` installed at `kayg@mbp:~/Applications/Calternal.app` for acceptance. Next chunks: #3 click/double-click editing, #24 ⋯ menu + context menu, Open-as-note.
Author
Owner

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.

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.
Author
Owner

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.

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.
Author
Owner

User report 2026-09-15 (bc3ace0 on 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.

User report 2026-09-15 (bc3ace0 on 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.
Author
Owner

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.

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.
Author
Owner

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): 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'.
Author
Owner

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.

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`.
Sign in to join this conversation.
No labels
No milestone
No project
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
No description provided.