Finish Finder and mixed attachment drag-and-drop workflows #15
Open
opened 2026-09-13 13:34:43 +00:00 by kayg
·
25 comments
No Branch/Tag specified
dev
wave19/desktop-test
wave19/per-space-state
wave19/first-space-integration
wave19/first-space-draft-transfer
wave19/block-editor-craft
codex/wip/root-conflict-snapshot-20260914
wave12/first-space-draft-transfer
wave14/editor-overnight-combined
wave17/editor-diagnostics-3bbb
wave16/code-block-polish
wave16/image-controls
wave16/event-title-crash-control
wave16/image-preview-dispatch-repair
wave16/event-title-lifecycle-qa
wave16/editor-list-refinements
wave17/editor-layout-correction
wave16/event-edit-date
wave16/note-title-presentation
wave16/editor-final-combined
wave18/document-chrome-repair
wave17/cross-event-drop
wave16/editor-structural-combined
wave16/editor-hover-margins
wave16/editor-caret-relocation-perf
wave16/inspector-polish
wave16/image-preview-integration
wave16/english-transcription
wave16/document-background-edge
wave16/sidebar-live-layout
wave15/image-preview-ownership-repair
wave15/editor-handle-six-dot
wave15/titlebar-public-repair
wave15/sidebar-initial-restoration
wave15/editor-formatting-tooltips
wave15/editor-drag-mounted-repair
wave15/image-preview-foundation-isolated
wave15/editor-block-drag-feedback
wave15/sidebar-attachment-layout
wave14/editor-inline-plain-fastpath
wave14/editor-rendered-paste-replacement
wave14/clipboard-awaited-shutdown
wave14/editor-selectall-toolbar-perf
fix/clipboard-body-undo-group
diagnostic/clipboard-insertion-491
wave14/sidebar-unselected-drag-v2
diagnostic/sidebar-unselected-drag-trace
diagnostic/clipboard-phase-0225
wave14/sidebar-prime-access
wave14/nested-projection-handle-test-fix
wave14/sidebar-unselected-event-drag
fix/clipboard-task-ownership-6318
fix/editor-resource-url-invalidation
codex/wip/editor-handle-render-diagnostic-20260914
fix/central9c9-clipboard-crash
codex/wip/editor-handle-diagnostic-20260914
wave14/sidebar-event-runtime-repair
wave14/nested-projection-runtime-fix
wave14/sidebar-event-test-fixtures
wave14/sidebar-attachment-overlap
integration/rendered-image-clipboard
wave14/sidebar-event-preview-integration
wave14/editor-nested-list-integrate
wave14/editor-nested-list-projection
task/rendered-image-clipboard
wave14/sidebar-paste-preview-integration
wave14/sidebar-event-day-dnd
wave14/editor-preview-next
wave14/editor-list-handle-integrated
task/native-basic-paste
wave14/editor-list-keyboard-audit
task/native-clipboard-contract
codex/wip/editor-handle-geometry-20260914
wave14/editor-block-drag
wave14/editor-drag-integrated
wave14/editor-empty-marker-map-publication
wave14/editor-empty-marker-runtime-diag
wave14/editor-empty-marker-preview
wave14/editor-empty-marker-host-repro
wave14/editor-empty-marker-probe
codex/wip/editor-hr-leaf-fix-20260914
wave14/event-attachment-drop
wave14/editor-empty-marker-paint
wave14/editor-drop-list-preview
wave14/editor-finder-drop
wave14/editor-rule-caret
wave14/editor-list-enter-next
wave14/editor-image-qa
wave14/editor-mode-commands
wave13/editor-code-performance-preview
wave14/sidebar-overlap-repair
wave13/cross-day-compile-repair
wave13/spotlight-retry
wave13/editor-chrome-runtime-repair
wave13/editor-inline-fast-path
codex/wip/detached-87aa-20260914
wave12/editor-viewport-polish
wave12/craft-code-block-polish
wave12/editor-asset-return-preview
wave12/voice-polish-preview
wave12/editor-native-return-runtime-repair
wave12/editor-asset-focus
wave12/cross-day-reviewed-integration
wave12/optional-voice-provider-finish
wave12/event-move-descriptor-compile-fix
wave12/editor-image-geometry-preview
wave12/editor-native-return-undo-repair
wave12/image-native-geometry-fixture
wave12/editor-pattern-preview
wave12/editor-bullet-continuation
wave12/editor-top-chrome
wave12/voice-composer-restart
wave12/speech-variable-buffer-repair
wave12/editor-image-preview
wave12/event-move-descriptor-scale
wave12/editor-image-geometry
wave12/afternoon-ui-preview
wave12/sidebar-hosted-bounds-repair
wave12/sidebar-overlap-live
wave12/speech-e2e-verification
wave12/mentions-polish-finish
wave12/editor-structural-range-repair
wave12/sidebar-fade-desktop-preview
wave12/sidebar-design-ledger
wave12/voice-assets-physical-fixtures
wave12/native-event-marker-polish
wave12/sidebar-fade-undo-preview
wave12/event-move-fence-corrections
wave12/sidebar-fade-boundary-repair
wave12/parent-space-entry-integration
wave12/editor-undo-group-repair
wave12/native-event-row-performance
wave12/parent-swipe-integration
wave12/metadata-noteid-test-fix
wave12/space-composer-generation-fix
wave12/voice-lifecycle-clock-fixture
wave12/sidebar-child-binding
wave12/voice-provider-pool-preview
wave12/composer-recording-preview
wave12/event-cross-day-store-corrections
wave12/voice-async-test-locks
wave12/speech-buffer-lease-fix
wave12/composer-no-top-readouts
wave12/sidebar-child-target
wave12/space-required-composer
wave12/editor-correctness-preview
wave12/voice-provider-compile-corrected
wave12/event-move-integration
wave12/voice-assets-compile-fix
wave12/parakeet-compile-fix
wave12/note-metadata-flexibility
wave12/sidebar-event-drag-drop
wave12/editor-paste-source-guard
wave12/note-asset-import-safety-causal-tests
wave12/note-asset-import-safety
wave12/editor-readonly-command-guards
wave12/voice-provider-integration
wave12/editor-format-flexibility
wave12/hosted-sidebar-ui-sdk-fix
wave12/event-cross-day-store
wave12/voice-app-wiring
wave12/voice-parakeet-assets
wave12/voice-hosted-await-fix
wave12/event-edit-date-guard
wave12/event-cross-day-app
wave12/network-client-entitlement
wave12/sidebar-row-overlap
wave12/voice-settings-surface
wave12/parakeet-capture-adapter
wave12/task-marker-normalization
wave12/voice-polish-integration
wave12/voice-capture-hardening
wave12/voice-provider-settings-plan
wave12/copied-space-editor-io
wave12/hosted-background-sendability
wave12/voice-stop-nlp
wave12/voice-fixture-roots
wave12/voice-claim-collision
wave12/sidebar-add-swipe-plan
wave12/copied-space-app-wiring-plan
wave12/voice-fence-stat-compilefix
wave12/composer-dismiss-crash-hotfix
wave12/voice-retainer-defer-fix
wave12/overnight-recovery-space-preview
wave12/background-checkpoint-compilefix
wave12/copied-space-enumeration-fix
wave12/copied-space-local-state
wave12/voice-fence-fixture-fix
wave12/voice-manifest-fd-fix
wave12/voice-recovery-publication-proof
wave12/voice-retainer-bytecount-fix
wave12/overnight-navigation-background-compilefix
wave12/navigation-work-diagnostic
wave12/overnight-navigation-background-preview
wave12/background-import-bounds
wave12/overnight-voice-lifecycle-preview
wave12/voice-frozen-claim
wave12/voice-input-seam
wave12/voice-recovery-compile-fix
wave12/voice-terminal-cleanup-plan
wave12/voice-recovery-activation-plan-current
wave12/overnight-runtime-probe-preview
wave12/overnight-sandbox-startup-preview
wave12/startup-geometry-diagnostic
wave12/voice-source-sandbox-fix
wave12/image-root-sandbox-fix
wave12/perf-scroll-zero-args
wave12/overnight-document-geometry-preview
wave12/native-document-geometry-diagnostic
wave12/overnight-draft-root-preview
wave12/voice-recovery-c-session-fence
wave12/draft-root-direct-open
wave12/hosted-single-module-linkage
wave12/overnight-voice-recovery-preview
wave12/voice-recovery-checkpoint-a-finalization
wave12/copied-space-local-state-plan
wave12/overnight-refresh-hosted-preview
wave12/incremental-refresh-bounded-load
wave12/raw-source-reconciliation-test-fix
wave12/overnight-rendering-startup-preview
wave12/draft-root-diagnostic
wave12/day-event-bulk-load
wave12/speech-asset-install-test-preview
wave12/hr-material-contrast
wave12/height-clamp-followup
wave12/voice-recovery-checkpoint-a-corrections
wave12/overnight-cstore-caret-preview
wave12/voice-recovery-checkpoint-a
wave12/editor-adjacent-caret-boundary-v3
wave12/voice-recovery-index-query-fix
wave12/editor-adjacent-caret-boundary-v2
wave12/voice-recovery-index-query
wave12/startup-collector-empty-args
wave12/editor-adjacent-caret-boundary
wave12/overnight-hr-storage-preview
wave12/hr-native-diagnostic-followup
wave12/hr-native-diagnostic
wave12/overnight-storage-settings-preview
wave12/snapshot-native-move-followup
wave12/speech-local-fallback
wave12/settings-stream-test-compilefix
wave12/snapshot-path-identity-followup
wave12/corefrontmatter-join-fastpath
wave12/speech-fallback-plan
wave12/overnight-caret-control-registry
wave12/editor-registry-compilefix
wave12/voicea-test-compilefix
wave12/overnight-caret-control-ready
wave12/voicea-enum-compilefix
wave12/voice-recovery-phaseb
wave12/overnight-caret-control
wave12/overnight-polish-storage-preview
wave12/voicea-foundation-compilefix
wave12/snapshot-path-identity
wave12/overnight-native-polish-preview
wave12/hr-rule-geometry
wave12/speech-conversion-fixture
wave12/editor-deferred-caret
wave12/overnight-hosted-lifetime-preview
wave12/marker-glyph-clipping
wave12/voice-recovery-activation
wave12/overnight-package-fixture-preview
wave12/overnight-lifetime-voice-preview
wave12/app-tests-cleanup
wave12/snapshot-physical-fixtures
wave12/event-date-title-punctuation
wave12/overnight-lifetime-voice-plan
wave12/overnight-draw-before
wave12/overnight-picker-event-preview
wave12/settings-watcher
wave12/event-date-title-fix
wave12/note-background-picker-fix
wave12/editor-lifetime
wave12/overnight-draw-preview
wave12/snapshot-attribute-compile-fix
wave12/editor-accepted-draw-trace
wave12/overnight-runtime-preview
wave12/composer-test-concurrency-fix
wave12/editor-caret-performance
wave12/overnight-snapshot-correction
wave12/settings-model-callbacks
wave12/overnight-full-preview
wave12/overnight-store-preview
wave12/rendered-bullet-fix
wave12/settings-document-fixture-fix
wave12/composer-task-pill-ui
wave12/overnight-roadmap-preview
wave12/task-tag-readouts
wave12/event-snapshot-dependency
wave12/h1-strict-preview
wave12/settings-store-await-fix
wave12/settings-store-test-fix
wave12/overnight-pill-preview
wave12/composer-pill-accent-fix
wave12/composer-pill-final
wave11/sidebar-cold-index-prime
wave12/overnight-preview
wave11/voice-draft-recovery
wave11/voice-transcription-finish
wave11/note-save-rename
wave11/task-event-preview
wave11/settings-enabled-plugin-section
wave11/pill-fade-preview
wave11/sidebar-top-fade-regression
wave11/event-sidebar-preview
wave11/composer-pill-restore
wave11/settings-plugins-portability
wave11/composer-hash-semantics
wave11/event-composer-edit
wave11/sidebar-spacing-followup
wave11/editor-performance-evidence
wave11/voice-preview
wave11/voice-stop-repair
wave11/polish-verification
wave11/plugins-settings-ui
wave11/bullet-list-regression
wave11/sidebar-insert-stability
wave11/polish-preview
wave11/document-style-repair
wave11/composer-native-readouts
wave11/mentions-disclosure-motion
wave11/sidebar-swipe-compact
wave11/legacy-helper-path-fix
wave11/persistence-integration
wave11/capsule-instant-presentation
wave11/native-link-activation
wave11/desktop-integration
wave11/link-integration
wave11/synthetic-note-names
wave11/composer-overflow-actions
wave11/legacy-root-links
wave11/note-title-punctuation
wave11/note-title-metadata
wave11/spotlight-navigation
wave11/spotlight-trace-baseline
wave11/note-name-collisions
wave11/identity-query-indexes
wave11/note-heading-title
wave11/capsule-scroll-chrome
wave11/sidebar-context-menu
wave11/spotlight-metadata
wave11/rename-link-repair
wave11/analytics-native
wave11/sidebar-scroll-restoration
wave11/sidebar-bottom-spacing
wave11/capsule-optical-alignment
wave11/markdown-link-resolution
wave11/command-results-layout
wave11/capsule-outside-dismissal
wave11/events-folder
wave11/capsule-query-retention
wave11/capsule-snap-preview
wave11/composer-controls-preview
wave11/sidebar-fade-preview
wave11/selection-lookup
wave11/note-creation-routing
wave11/sidebar-header-spacing
wave11/block-editor
wave11/space-onboarding
wave11/space-terminology
wave4/voice
wave2/search
wave4/glur-probe
wave7/cli-integration
wave12/inspector-style
wave4/document-presentation
wave2/cli
wave2/sidebar
No results found.
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
kayg/calternal-macos#15
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Request and current status
Bitmap paste is user-confirmed; some internal and block-to-event movement has historical evidence. Finder/multiple/mixed/foreign-vault cases remain unaccepted.
Acceptance
Drop Finder images into intended positions with feedback; move blocks and attach to another event without asset/identity loss. Verify mixed and multiple assets, cross-vault copy, rejected drops, undo and persisted bytes. Preserve original files.
Keep open until the user-facing outcome is verified in a delivered build. Source review or a successful build alone is not completion.
Bounded QA plan (not executed): use a disposable vault plus copied external source files. Exercise one Finder image drop into a known editor insertion point, then one mixed/multiple batch, one block-to-event attachment, one foreign-vault copy, and one rejected drop. For each accepted case capture destination cue/outcome, file SHA/identity, Undo, and persisted bytes; for rejection assert no source or destination mutation. Preserve originals and do not use the current synthetic fixture for Finder acceptance.
Current blocker: no mounted editor input target is materialized by the VM driver’s virtualized AX tree, so no reliable real drop target exists in the current route. No acceptance claim is made.
QA route update — the VM can now select a sidebar event through a fresh screenshot-derived foreground click with post-frame verification. No Finder/Quick Look fixture or multi-image editor-drop target was materialized in this bounded pass, so this issue has no new behavioral result. Evidence:
.agents/native-break/sidebar-live-9153/6ca85-foreground/RESULT.md.New user feedback on37c: photo/block internal drag works, but dropping photo on another event looks accepted then does nothing. Required cross-event contract: native dialog names/depicts the dragged block or asset and offers Copy, Move, Cancel, with Remember my choice checkbox. Copy creates the destination attachment and preserves source. Move publishes destination successfully before removing source, preserving identity/assets and avoiding silent loss. If Remember unchecked, prompt every time; checked saves the selected Copy/Move policy for later drops. Cancel leaves source/destination unchanged and does not save a policy. Remember applies to this cross-event block/asset drop workflow. User said three options then specified Copy/Move; Cancel is the reasonable third action, no clarification needed to start.
Needs exact payload/target/rejection diagnosis, undo/failure policy, duplicate/foreign-vault safety, native accessibility and real destination persistence proof. Visible success must mean attachment committed, not merely accepted drag. Task/reviewer/QA will update #15 directly.
Worker/role:
cross_event_drop/ task implementationOwned worktree/branch: planned
.worktrees/cross-event-drop,wave17/cross-event-drop, based exactly on central56e61d2e4d8da6915fc693a99b2d09d8b5160863. The dirty central checkout will not be used or modified for implementation.Current state: started; issue body and all comments read. User-confirmed failure is an internally dragged photo/block that shows an accepted drop on a different event but produces no destination mutation.
Owned scope: drop-specific editor payload serialization; sidebar cross-event attachment/block drop adapters; native Copy/Move/Cancel choice UI with item name and icon; opt-in remembered Copy/Move policy; focused transaction/failure/undo tests.
AppModelSidebarGestures.swiftandAppModelSidebarEventMoveIntegration.swiftremain owned by the event-date worker; any needed shared-file additions will be coordinated before editing.Plan before implementation:
Concrete next action: create the isolated worktree, complete the source audit, then post the exact implementation seam and failure semantics here before editing. No build or VM claim will be made by this worker; build ownership is on
agents@mbpthrough root.Validation evidence so far: Forgejo issue #15 and all three comments read; base commit resolves to
56e61d2e4d8da6915fc693a99b2d09d8b5160863(Polish note inspector state and availability). No implementation or runtime validation yet.Reviewer plan gate — CHANGES REQUESTED
Role:
reviewer(/root/event_date_review), independent read-only plan review.Worktree:
/Users/kayg/Developer/calternal-app/.worktrees/cross-event-dropBranch/base:
wave17/cross-event-drop,56e61d2eScope: issue #15 cross-event editor block/asset Copy/Move.
The bounded Codable payload, live source revalidation, destination-first ordering, policy persistence rules, native sheet, and explicit partial-success message are sound directions. Two semantics need tightening before implementation.
P1 — Destination-first deletion cannot safely transfer the original block identity or provide whole-move Undo
Sources/CalternalEditor/BlockEditorView.swift:1259-1295,:1418-1464;App/Sources/Model/AppModelEventAttachmentDrop.swift:31-67,:137-236; canonical source Undo helper atBlockEditorView.swift:88-141.^block-idin the destination then creates duplicate IDs. For note blocks, deep-link identity also includes the source note ID (noteBlock(vaultID:noteID:blockID)), so moving the raw block ID into a newly created attached note does not preserve inbound links by itself.P1 — A Bool receipt is too weak to authorize irreversible source completion
AppModel.attachDroppedMarkdown(currentlyApp/Sources/Model/AppModelEventAttachmentDrop.swift:31-67) to return a committed receipt/bool, then calling sourcecompleteMove(after:).acceptDropcurrently launches an unstructured task and immediately returns (SidebarView.swift:1837-1851). Multiple drops, sheet completions, and editor mutations can overlap. A Bool carries no transfer identity, payload fingerprint, destination, or one-shot consumption state. The existing attachment functions also check cancellation after the durable writer call.CrossEventDropReceiptcontaining the transfer UUID/payload fingerprint and committed destination identity/paths. BindcompleteMove(after:)to that exact validated transfer and consume it once. Treat the writer CAS as the commit point: after it succeeds, return.committedregardless of task cancellation or refresh failure; report refresh separately. Add tests for wrong receipt, duplicate completion, cancellation immediately after CAS, and two overlapping transfers.P2 — Constrain Move and the sheet lifecycle explicitly
NSAlertsheet is open, reject/serialize a second drop, and revalidate the source after the user chooses.acceptDropreturningtruebefore the sheet resolves is acceptable becauseBlockEditorView.draggingSession(...endedAt:operation:)does not delete the source, but Cancel must only dispose that pending transfer.Direct identity answer: Copy must mint fresh IDs. Under the proposed destination-first/partial-success design, Move must also mint fresh IDs. Transfer the originals only if Move is promoted to one Store-owned atomic/journaled operation with backlink repair and a durable inverse.
Worker/role:
cross_event_drop/ task implementationOwned worktree/branch:
.worktrees/cross-event-drop,wave17/cross-event-drop, exact base56e61d2e4d8da6915fc693a99b2d09d8b5160863. Worktree is clean. Event-date owner confirmed no overlap and retainsAppModelSidebarGestures.swiftplusAppModelSidebarEventMoveIntegration.swift.Current state: source audit complete; bounded implementation plan sent to independent reviewer
/root/event_date_reviewbefore editing.Exact diagnosis:
BlockEditorViewcurrently puts raw Markdown, UTF-16 range, source revision, and resource URLs into an unversioned property-list payload. Its live-source validator strips every block ID and returns only Markdown.SidebarView.Coordinator.validateDropaccepts that Markdown, andacceptDropimmediately returnstruewhile launching an untracked async copy. There is no choice UI, no source move completion, and no guard against a second attachment transfer while the first is pending.AppModel.attachDroppedMarkdownis copy-only and returnsVoid. It already has the right destination foundation: target identity fencing, durable event resolution, one stale CAS retry, contained asset snapshotting, atomic attachment/day publication with rollback, collision-safe attachment naming, note creation rollback, and explicit error reporting. The apparent accepted/no-op path exists because AppKit completes before this asynchronous result is known and the source is never removed.Bounded implementation seam:
SidebarView.Coordinatorowns one attachment-drop task. It uses a nativeNSAlertsheet with the derived name, system icon, Copy/Move/Cancel, and a checkbox titledRemember my choice; a remembered policy skips the sheet. A second drop while one is pending is rejected visibly.Undo policy: source deletion is one canonical editor Undo transaction. Undo restores the source block with its exact Markdown/IDs and leaves the already committed destination intact, producing the safe Copy state. Destination Store writes have no existing synchronous undo infrastructure; this change will not introduce a second block/store transaction system. This limitation will remain explicit for QA and issue acceptance.
Planned focused validation: editor payload round trip/bounds/foreign-editor/stale-revision; exact move deletion and Undo; display descriptor for image and generic/multiple blocks; preference checked/unchecked/Cancel; model destination boolean and moved image child ID; existing CAS retry, byte preservation, durable moved target and linked-note whitespace tests. No local Swift build; root build owner will run on
agents@mbp.Concrete next action: incorporate plan-review findings, implement the bounded seams, run static diff checks, commit atomically, post the exact candidate and validation limits, then hand it to independent review and QA.
Worker/role:
cross_event_drop/ task implementationPlan-review disposition:
/root/event_date_reviewrequested changes; both P1 findings and the P2 constraints are accepted. No implementation began before this disposition.Revised bounded semantics:
CrossEventDropReceiptcarrying the transfer UUID, payload fingerprint, durable destination event/day, and committed paths. Source completion requires that exact receipt, consumes it once, and rejects a mismatched or duplicate completion.Undo/failure policy after review: source deletion remains one canonical editor Undo transaction. Undo restores the source and intentionally leaves the destination, resulting in a safe Copy state with distinct IDs. If destination commits and source completion fails, both sides remain with distinct IDs and an explicit partial-outcome error. Destination failure leaves the source unchanged. No custom Store transaction system is introduced.
Concrete next action: implement this revised plan in the four owned production files/tests, then post a candidate for a new independent diff review and QA. Build/runtime evidence remains owned by root on
agents@mbpand the VM.Worker/role:
cross_event_drop/ task implementationCandidate state: implemented and committed; pending independent diff review, QA, build-host compilation/tests, VM behavior, and user acceptance.
Owned worktree/branch/commit:
.worktrees/cross-event-drop,wave17/cross-event-drop,6f86382276ec9b27c974917d89f28dff8eb0a379(Complete cross-event block and asset drops), based on56e61d2e.Implemented:
BlockEditorViewnow emits a versioned Codable v2 app-private payload bounded to 512 KiB encoded / 384 KiB Markdown / 512 blocks / 4,096-character file URLs. It binds transfer UUID, per-editor identity, UTF-16 range, revision, exact raw Markdown, and resource roots, and advertises no drag operation outside the app.CrossEventDropReceiptrecords the exact transfer/fingerprint plus committed day/event/paths. Source Move completion requires that receipt, consumes it once, rechecks live revision/range/raw bytes, removes the exact block/separator envelope only after destination publication, registers one canonical editor Undo, and invokes the normal edit callback.AppModelnow stores an opt-in remembered Copy/Move action in its injected UserDefaults. Unchecked actions and Cancel do not write policy. Move eligibility requires the source and destination to resolve to the same vault root.SidebarView.Coordinatorserializes one cross-event drop at a time and presents a nativeNSAlertsheet naming the item with its system icon, Copy/Move/Cancel buttons, Escape-bound Cancel, andRemember my choice. Foreign-vault Move is disabled. Source state is revalidated after the choice.Focused tests added/updated:
Validation performed:
git diff --checkand cached diff check passed. No local Swift compilation/test was run per build-host ownership rule. No VM/runtime/user-vault action was performed.Known acceptance limits: whole-transfer Undo intentionally restores the source while retaining the committed destination, yielding a safe Copy state with distinct IDs. Original backlink-preserving block identity relocation is not claimed; that requires a Store journal and backlink rewrite. Foreign mixed/multi-asset publication remains explicitly rejected rather than silently broken. Issue #15 must remain open through build, VM persistence/choice/dialog checks, and user QA.
Concrete next action: independent reviewer inspects
56e61d2e..6f863822, then QA checks focused failure/overlap/policy cases. Root build owner compiles/tests onagents@mbpand owns VM/user delivery.Worker/role:
cross_event_drop/ task implementationCandidate SHA correction: the exact full commit is
6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00. The previous candidate comment carried the correct short SHA (6f863822) but an incorrect manually expanded suffix. Branch/worktree/base, diff contents, validation state, and review request are unchanged. Reviewer should compare56e61d2e..6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00.Verification:
git rev-parse HEADandgit show --no-patch HEADboth read back6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00; worktree has no tracked modifications.Worker: cross-event-drop (
taskrole)Worktree/branch:
.worktrees/cross-event-drop/wave17/cross-event-dropState: candidate amended by a separate atomic follow-up commit; awaiting independent diff review
Exact candidate HEAD is now
a6b722eb8525d89e2f976bf8d79687d8099b5474(base implementation6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00, commit-boundary follow-upa6b722eb).The follow-up makes the durable destination CAS the return boundary: it constructs and returns the typed receipt without awaiting refresh/load. Refresh runs asynchronously. A post-commit cancellation/error checkpoint records that the drop was saved but skips refresh, while still returning the receipt so Move may safely delete the source. This prevents a completed destination write from being reported as an uncommitted drop.
Validation:
git diff --checkclean before commit. Per repository policy, no local Swift build or test was run. Next action: independent reviewer inspects the exact two-commit candidate, then focused remote build/tests and QA are required before acceptance.Independent source review — CHANGES REQUESTED
Role:
reviewer(/root/event_date_review)Worktree:
/Users/kayg/Developer/calternal-app/.worktrees/cross-event-dropBranch/base:
wave17/cross-event-drop,56e61d2eReviewed candidate: exact HEAD
a6b722eb8525d89e2f976bf8d79687d8099b5474State: read-only source review complete;
git diff --check 56e61d2e..HEADpasses. No local build/tests or GUI actions were run.P1 — Nested-note asset references bypass both the standalone copy path and the foreign mixed-asset rejection
Sources/CalternalCore/CoreAttachment.swift:139-141(unchanged scanner used by this feature);Sources/CalternalEditor/BlockEditorView.swift:1369-1380,1537-1541;App/Sources/Model/AppModelEventAttachmentDrop.swift:164-170,179-194,364-418.../../attachments/photo.png.AttachmentMarkdown.references(in:)recognizes onlyattachments/,./attachments/, or exactly one../attachments/. The transfer therefore classifies a standalone nested asset as ordinary Markdown and creates a linked note instead of copying the asset. A foreign nested mixed block also bypassesforeignMixedAssets, commits a note containing a foreign-relative path, and reports success with a broken asset. For same-vault mixed Markdown, the destination note is always created under top-levelnotes/; raw relative destinations are not rebased from the capturedsourceBaseURL, so links from a nested source can point somewhere else after publication.VaultWatcher.swift:552,VaultReader.swift:128-133), while the new code explicitly accepts arbitrary source base URLs under the vault. The focused asset tests use only a top-levelnotesbase and../attachments, so this supported source layout is untested.attachments/directory, using the existing root-bound resolution as the authority rather than the three-prefix lexical scanner. Pass the captured source base into linked-note creation and rebase parsed Markdown destinations from that directory to the finalnotePathdirectory (the existingVaultDocumentLinkRewriterelocation seam can do this); otherwise fail closed before CAS when directories differ. Add same-vault and foreign-vault tests with a nested source note for standalone and mixed assets, asserting destination resolution/bytes or zero mutation.P2 — “Cheap” hover validation decodes and compares the entire maximum payload on every AppKit proposal callback
App/Sources/Sidebar/SidebarView.swift:1769-1798;Sources/CalternalEditor/BlockEditorView.swift:1346-1351,1480-1507.validateDropcallback. Native hover feedback can hitch despite the method's “Cheap hover-time validation” contract.NSTableView.validateDropis called continuously as the pointer moves. Unlike the editor's internal drag path atBlockEditorView.swift:1246-1254, this cross-event path has no pasteboard/revision cache; its maximum accepted payload is deliberately large.changeCount(or transfer ID/fingerprint) plusdocument.sourceRevisionand editor identity, invalidate it when any key changes, and retain the full exact validation invalidatedDraggedBlockTransferat acceptance. A smaller option is to make hover check only the private type and encoded byte bound because the coordinator already proves the actual dragging source is thatBlockEditorView. Add an adversarial repeated-hover timing/count test at the maximum payload and verify the full decode/source comparison runs once per unchanged drag.Other reviewed criteria
Fresh destination IDs are minted before CAS retry for Copy and Move; the typed receipt is created after the writer boundary; post-CAS checkpoint failure still returns it; source completion revalidates exact editor/revision/range/raw bytes and is one-shot with canonical Undo; Move is gated to matching resolved roots; one coordinator task serializes sheets; Cancel/button mapping and remembered-policy writes are source-correct; external drags advertise no operation; AppKit/Swift 6 source shape showed no additional blocker by inspection.
The native sheet, one-pending-drop interaction, stale-source-after-destination message, actual persisted Undo, and performance remain runtime/QA gates. The current unit additions do not exercise the coordinator/NSAlert path.
Next action: implementation owner fixes P1 and P2 and adds the focused regressions, then requests an exact-HEAD re-review before remote build/QA.
Worker: cross-event-drop (
taskrole)Worktree/branch:
.worktrees/cross-event-drop/wave17/cross-event-dropState: reviewer changes accepted; repair in progress
Reviewer
/root/event_date_reviewrequested one P1 asset-path correction and one P2 hover-path correction againsta6b722eb8525d89e2f976bf8d79687d8099b5474. Both findings are accepted.Bounded repair:
AttachmentMarkdown's one-parent lexical prefixes. AppModel will use the captured root/base plusDocumentLinkMarkdown.resolveDestinationas the authority: only a target resolving beneath the source vault'sattachments/directory becomes an asset publication.VaultDocumentLinkRewrite. A foreign-vault block containing a nested attachment target will fail before any writer call. A same-vault linked-note copy will rebase destinations from a synthetic source document path in the captured source directory to the final creatednotePath, preserving nested attachment resolution. A standalone nested asset will snapshot/copy the resolved bytes as before.No Core attachment scanner or Store transaction infrastructure will be changed. Next action: implement these repairs, static-check and commit, post the exact new HEAD, then request exact-diff re-review before QA/build.
Worker: cross-event-drop (
taskrole)Worktree/branch:
.worktrees/cross-event-drop/wave17/cross-event-dropState: reviewer repair committed; exact-HEAD re-review requested
New exact candidate HEAD:
1fb74e9267f880ea35d7c18dffefada6cc6ed306(repair commit1fb74e92, prior candidatea6b722eb8525d89e2f976bf8d79687d8099b5474, base56e61d2e).Resolved P1:
AttachmentMarkdown's shallow prefix scanner.DocumentLinkMarkdown.resolveDestination; only paths canonically beneathattachments/enter the asset publication path.VaultDocumentLinkRewrite. Foreign nested assets fail before target mutation. Same-vault linked-note publication rebases parsed destinations from the captured source directory to the final created note path, so a nested../../attachments/...reference becomes the correct destination-relative spelling.Resolved P2:
Focused regressions now cover nested same-vault standalone byte publication, nested foreign standalone byte copy/source retention, same-vault mixed destination rebasing, foreign nested mixed zero mutation, repeated bounded hover with exact malformed-payload rejection, and oversized hover rejection.
Validation:
git diff --cached --checkand currentgit diff --checkpassed; worktree has no tracked modifications. Per policy no local Swift build/tests or GUI run. Next action: reviewer re-checks exact56e61d2e..1fb74e92; then QA/build-host validation.Repair re-review — APPROVED FOR REMOTE BUILD/QA
Role:
reviewer(/root/event_date_review)Worktree:
/Users/kayg/Developer/calternal-app/.worktrees/cross-event-dropBranch/base:
wave17/cross-event-drop,56e61d2eReviewed candidate: exact HEAD
1fb74e9267f880ea35d7c18dffefada6cc6ed306State: read-only full-range source re-review complete;
git diff --check 56e61d2e..HEADpasses. No local build/tests or GUI actions were run.No remaining P1, P2, or P3 source findings.
The prior P1 is resolved. The accepted-drop path now synthesizes a vault-relative source document path from the captured root/base directory, parses standalone image/link blocks independently of the old one-level attachment-prefix scanner, resolves destinations through
DocumentLinkMarkdown, and authorizes attachment reads only when the normalized target is underattachments/. Foreign nested standalone assets therefore take the byte-copy writer path; foreign nested mixed assets are detected and rejected before target mutation. Same-vault linked notes rebase parsed destinations from the captured source directory to each final collision-resolvednotePathusingVaultDocumentLinkRewrite. The added tests cover nested standalone same/foreign roots, nested foreign mixed rejection, and same-vault mixed rebasing while retaining source bytes.The prior P2 is resolved to the requested shape.
BlockEditorView.canAcceptCrossEventDropperforms only private-type data presence and encoded-size checks during repeated AppKit proposals. Exact JSON/editor/revision/range/raw-source/root validation and ID minting remain in the one accepted-drop path. The regression exercises 1,000 hover checks with a bounded but semantically malformed payload, then proves acceptance still rejects it; oversized data is rejected during hover.The full candidate still has the previously approved properties: fresh destination IDs are fixed before CAS retry for Copy and Move; destination receipt is returned after durable writer publication despite post-CAS cancellation/refresh failure; source completion is exact, one-shot, and undoable; Move is same-root only; the coordinator serializes one pending sheet; Cancel/policy/button mapping are source-correct; and the private payload advertises no external operation. I found no additional Swift 6/AppKit compile-shape concern by inspection.
Next action: dispatch the required remote compile/focused tests and adversarial/native QA. The native
NSAlertinteraction, one-pending-drop behavior, actual persisted source Undo, maximum-payload hover responsiveness, and user-facing destination persistence remain runtime acceptance gates; keep #15 open through delivered-build user QA.Worker: cross-event-drop (
taskrole)Worktree/branch:
.worktrees/cross-event-drop/wave17/cross-event-dropState: implementation and independent source review complete; handed to root for integration, remote build, and combined QA
Exact candidate:
1fb74e9267f880ea35d7c18dffefada6cc6ed306based on56e61d2e. Reviewer/root/event_date_reviewapproved the full range with no remaining P1/P2/P3 findings, and the review comment/readback is present above.Static evidence:
git diff --check 56e61d2e..HEADpasses; worktree has no tracked modifications. No local Swift build/tests or GUI actions were run under the build/VM ownership rules.Root has reserved QA for the combined build. Remaining gates are remote Swift 6.3 compile plus focused tests, native Copy/Move/Cancel sheet and remembered-choice behavior, one-pending-drop rejection, committed destination plus persisted source deletion/Undo outcomes, nested asset persistence, maximum-payload hover responsiveness, and user QA. Issue remains open.
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.
Work resumed at user request. Individual agent tasks must record their task name, worktree/branch, exact candidate revision, current status, next check and blockers in each relevant issue, with readback. Active dispatch: /root/block_drag_finish integrates source-approved #6
a969f8efnet, #12abb397be, #151fb74e92chain in an isolated checkout; /root/code_block_polish repairs #9 remaining actor-isolated scalar access, /root/ui_fixes_review_medium reviews; /root/title_completion and /root/event_date_completion investigate/correct awaited test fixture teardown in #5/#1. Central remains3e881860; desktop26eb1552 remains installed. No new build or acceptance yet. Prior usage blocker is historical: resumed agents are responding.Task identity:
/root/block_drag_finishIsolated integration candidate:
/Users/kayg/Developer/calternal-app/.worktrees/editor-final-combinedwave16/editor-final-combined3e8818608b7981a0670d229f322985f3474dbe5868885f1c4b8dceb4a59b35cc07b8516ffd0d4362Integrated the complete reviewed change chain for this issue without editing central. Shared
BlockEditorViewconflicts were resolved by preserving both the image-toolbar anchor update and the existing coalesced block-handle hover reconciliation during scroll/layout. Stable patch parity is exact for all commits except the first image-controls commit, whose deliberate two-call conflict resolution accounts for the patch-ID difference.Source checks completed: clean worktree, no conflict markers,
git diff --checkclean. No local build or GUI run. Exact merged interaction review is now requested. Current central/base still has the separately owned known Swift 6 code-painter isolation compiler blocker; this candidate does not claim to repair or compile past it.Merged interaction source review — exact isolated tip
68885f1c4b8dceb4a59b35cc07b8516ffd0d4362against base3e8818608b7981a0670d229f322985f3474dbe58: PASS (no P1–P3 findings).The reviewed #15 transfer chain retains its stable patches. The private payload is bounded, source-editor/revision/range/source/URL matched before export, and the public transfer contains only source-validated data. Destination attachment reads remain root-contained through the coordinated snapshot API; same-root mixed Markdown rebases asset paths, foreign mixed assets fail closed, standalone foreign assets copy bytes, and a typed commit receipt gates one-time source deletion. Existing clipboard export, internal block drag, and multi-selection paths remain distinct.
The integration conflict at the shared editor scroll/layout seam is resolved correctly: image-toolbar anchoring and hover reconciliation both run, without changing drop payload validation or drag state.
git diff --checkis clean and no conflict markers remain.This is source-only. The base's separately owned code-painter actor-isolation compile failure is excluded from this delta; build/runtime verification remains with its 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 integrated exact source-reviewed test lifecycle fixes: title3817c269c524898647b8265ac8755a2c22d4b359 as82ff556e and eventabcd17f50f7cb7c0d4f5ac72bb215a0bd36b8c1f as3171535b. Root independently matched event binary diff SHA0c241a51. Exact3171535be7f04e038f80799074104de68c4f5015 archive and265-input manifest are now building through the existing agents@mbp sole controller. Includes source-reviewed #6/#12/#15 combined changes. /root/image_preview_qa handles preceding704b focused runtime; root handles compiler while build subagent is usage-blocked. No new desktop delivery; no new test result yet.
Task
/root/editor_polish_inventory— next-combined-preview acceptance handoff (planning only; no GUI/build).Already established: the full transfer chain through
1fb74e92and combined integration passed source review, including bounded private payloads, path containment, destination commit receipts, and hover caching. No native choice-sheet or persistence path has run.Remaining VM checks, owned by
/rooton the next exact combined build and disposable vault: use four uniquely labelled source blocks/events. (1) Cancel and assert byte-identical source/destination. (2) Copy and assert destination persistence plus unchanged source. (3) Move and assert destination commit precedes source removal, then one source Undo restores exact source without duplicating destination. (4) choose Copy with Remember, perform another cross-event drop and require no sheet plus the remembered action. Snapshot and restore only the dedicated VM preference afterward. Also reject a second concurrent pending drop, stale source, malformed/oversized payload, and foreign mixed nested asset; prove local nested assets persist by SHA. Record sheet text/icon, drop cue, event IDs, source revision, file hashes, and restart persistence. Keep #15 open.3bbb VM package runtime exact hashes verified. Cross-event package gates passed 3/3: stale-safe payload/fresh IDs, receipt-once move with Undo source restoration, and image-transfer asset naming/fresh child identity. Each executed one test with zero failures; no timeout. Evidence:
.agents/native-break/3bbb-combined-package-qa/04-vm-summary.txtandexact-logs/cross-event/.Root installed and launched exact3bbb28a6fcf7bac1dae310bd07ea8e7a0ace6b68 as the only ~/Applications/Calternal.app. ExecutableSHA56e57a8fc553ce7ce82f6b72dbf04f2e2d442aefb53402b943adca14c208f408; zipSHAa8b1175bc354b455426351b0b7bfc9efb826071ddf0b4b69779cac0add9adb95; strict signature/arm64/Release/revision verified. Prior26eb quit via native menu; rollback retained. Space content inventory matched before/after replacement. Native current app restored the previously open note and Style inspector without editing its content. Receipt .agents/desktop-install/3bbb28a6/install-receipt.json.
User QA preview only. Pass: basic native launch/selection; package lists2/hover1/cross-event3; separate f907event7/7. Fail/open: actual mounted code gutter7assertions, imageFit/Fill4, imageQuickLookgesture8, hostedtitle4allocatoraborts. StyledVMdeeplink did not reach note; nativeUIfallback assigned. Each failure has independent author+reviewer, not closed. No stable or performance acceptance; latest imageprovider repair and diagnostics are NOT in this desktoppreview.
User test focus: centered width and mentions alignment, hover-only six dots, block selection/dragging, cross-event Copy/Move/Cancel/Remember dialog. These UI outcomes remain user acceptance gates.
Remote preservation checkpoint — 2026-09-14
The following original-worktree candidates are now pushed and exact hashes verified on both Forgejo and GitHub. These are preserved candidates/diagnostics, not a claim of new acceptance; some may already be integrated by cherry-pick or superseded. Use the issue’s existing evidence before choosing changes to resume.
diagnostic/clipboard-insertion-491—e187ac0d36e9807ad49a2bfdcd0e2f4f4594b96ddiagnostic/clipboard-phase-0225—a0885d5209be7fed77439124c094f682eb4292e0fix/clipboard-task-ownership-6318—b073493c6a2fd9c4a6f877c14035cbe88052b3aatask/native-clipboard-contract—4dec9a2c71f9e9dd2113dc9bfdd000c8e0e29716task/rendered-image-clipboard—7c79361150b3b02c1622ab1535db11730b84c874wave14/event-attachment-drop—dbaf3e55ec3df576beaa33efa29e2d9654f942c5wave17/cross-event-drop—1fb74e9267f880ea35d7c18dffefada6cc6ed306Master #20 contains the resume instructions. No force push; dev remains
1d8f4adf.