Finish Finder and mixed attachment drag-and-drop workflows #15

Open
opened 2026-09-13 13:34:43 +00:00 by kayg · 25 comments
Owner

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.

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

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.

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

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.

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

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.

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

Worker/role: cross_event_drop / task implementation

Owned worktree/branch: planned .worktrees/cross-event-drop, wave17/cross-event-drop, based exactly on central 56e61d2e4d8da6915fc693a99b2d09d8b5160863. 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.swift and AppModelSidebarEventMoveIntegration.swift remain owned by the event-date worker; any needed shared-file additions will be coordinated before editing.

Plan before implementation:

  1. Audit existing editor drag payloads, event drop decoding, store/CAS attachment operations, persistence, and undo boundaries.
  2. Specify a bounded transfer transaction: Cancel causes no mutation and never saves a policy; Copy commits destination while preserving source; Move proves destination commit before attempting source removal; failure cannot silently lose source or report a successful drop.
  3. Reuse current block/editor/store machinery and native system UI. Persist a remembered policy only after the user checks Remember and chooses Copy or Move; an unchecked choice prompts again.
  4. Add focused tests for payload round trips, policy semantics, copy, move ordering/failure, identity/asset preservation, and no-op cancellation/rejection.

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@mbp through 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.

Worker/role: `cross_event_drop` / task implementation Owned worktree/branch: planned `.worktrees/cross-event-drop`, `wave17/cross-event-drop`, based exactly on central `56e61d2e4d8da6915fc693a99b2d09d8b5160863`. 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.swift` and `AppModelSidebarEventMoveIntegration.swift` remain owned by the event-date worker; any needed shared-file additions will be coordinated before editing. Plan before implementation: 1. Audit existing editor drag payloads, event drop decoding, store/CAS attachment operations, persistence, and undo boundaries. 2. Specify a bounded transfer transaction: Cancel causes no mutation and never saves a policy; Copy commits destination while preserving source; Move proves destination commit before attempting source removal; failure cannot silently lose source or report a successful drop. 3. Reuse current block/editor/store machinery and native system UI. Persist a remembered policy only after the user checks Remember and chooses Copy or Move; an unchecked choice prompts again. 4. Add focused tests for payload round trips, policy semantics, copy, move ordering/failure, identity/asset preservation, and no-op cancellation/rejection. 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@mbp` through 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.
Author
Owner

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-drop
Branch/base: wave17/cross-event-drop, 56e61d2e
Scope: 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

  1. Current anchors: Sources/CalternalEditor/BlockEditorView.swift:1259-1295, :1418-1464; App/Sources/Model/AppModelEventAttachmentDrop.swift:31-67, :137-236; canonical source Undo helper at BlockEditorView.swift:88-141.
  2. What breaks: The proposed Move commits a new linked note/attachment first and deletes the source later. If source deletion becomes stale, save fails, or the user invokes the proposed source Undo, both copies remain. Preserving the original ^block-id in 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.
  3. Why likely: The plan explicitly retains the committed destination when source completion fails, and canonical editor Undo only restores the source snapshot; it has no durable inverse for the already-committed destination. These are normal specified paths, not exceptional corruption cases.
  4. Scoped fix: For this bounded destination-first design, mint new IDs for both Copy and Move (including every nested/block ID), compute the mapping once before CAS retry, and describe Move as moving content. Source Undo then intentionally converts the result into a copy without identity collision. If product requirements demand identity-preserving Move and backlink continuity, route it through a Store-owned multi-file journal that CASes source and destination and rewrites inbound links; do not claim that stronger semantic from a post-commit editor callback.

P1 — A Bool receipt is too weak to authorize irreversible source completion

  1. Proposed seam: refactoring AppModel.attachDroppedMarkdown (currently App/Sources/Model/AppModelEventAttachmentDrop.swift:31-67) to return a committed receipt/bool, then calling source completeMove(after:).
  2. What breaks: A stale or mismatched async completion can delete a source block after some other drop committed. Cancellation or refresh failure after the writer CAS can also hide that the destination is durable, leaving the caller unable to make the correct move/copy decision.
  3. Why likely: acceptDrop currently 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.
  4. Scoped fix: Return a typed CrossEventDropReceipt containing the transfer UUID/payload fingerprint and committed destination identity/paths. Bind completeMove(after:) to that exact validated transfer and consume it once. Treat the writer CAS as the commit point: after it succeeds, return .committed regardless 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

  • Permit Move only when source and destination are the same durable vault/root and the live source editor/session nonce still matches. Cross-vault drops should be Copy because note-scoped links and assets cannot transfer identity under this seam.
  • Retain one pending transfer while the NSAlert sheet is open, reject/serialize a second drop, and revalidate the source after the user chooses. acceptDrop returning true before the sheet resolves is acceptable because BlockEditorView.draggingSession(...endedAt:operation:) does not delete the source, but Cancel must only dispose that pending transfer.
  • Bound encoded payload bytes before decoding and separately bound raw Markdown, URL strings, descriptor strings, range arithmetic, and block count. For an app-private payload, return no external drag operations so root/base paths are not offered outside the process.

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.

# 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-drop` Branch/base: `wave17/cross-event-drop`, `56e61d2e` Scope: 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 1. **Current anchors:** `Sources/CalternalEditor/BlockEditorView.swift:1259-1295`, `:1418-1464`; `App/Sources/Model/AppModelEventAttachmentDrop.swift:31-67`, `:137-236`; canonical source Undo helper at `BlockEditorView.swift:88-141`. 2. **What breaks:** The proposed Move commits a new linked note/attachment first and deletes the source later. If source deletion becomes stale, save fails, or the user invokes the proposed source Undo, both copies remain. Preserving the original `^block-id` in 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. 3. **Why likely:** The plan explicitly retains the committed destination when source completion fails, and canonical editor Undo only restores the source snapshot; it has no durable inverse for the already-committed destination. These are normal specified paths, not exceptional corruption cases. 4. **Scoped fix:** For this bounded destination-first design, mint new IDs for **both Copy and Move** (including every nested/block ID), compute the mapping once before CAS retry, and describe Move as moving content. Source Undo then intentionally converts the result into a copy without identity collision. If product requirements demand identity-preserving Move and backlink continuity, route it through a Store-owned multi-file journal that CASes source and destination and rewrites inbound links; do not claim that stronger semantic from a post-commit editor callback. ## P1 — A Bool receipt is too weak to authorize irreversible source completion 1. **Proposed seam:** refactoring `AppModel.attachDroppedMarkdown` (currently `App/Sources/Model/AppModelEventAttachmentDrop.swift:31-67`) to return a committed receipt/bool, then calling source `completeMove(after:)`. 2. **What breaks:** A stale or mismatched async completion can delete a source block after some other drop committed. Cancellation or refresh failure after the writer CAS can also hide that the destination is durable, leaving the caller unable to make the correct move/copy decision. 3. **Why likely:** `acceptDrop` currently 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. 4. **Scoped fix:** Return a typed `CrossEventDropReceipt` containing the transfer UUID/payload fingerprint and committed destination identity/paths. Bind `completeMove(after:)` to that exact validated transfer and consume it once. Treat the writer CAS as the commit point: after it succeeds, return `.committed` regardless 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 - Permit Move only when source and destination are the same durable vault/root and the live source editor/session nonce still matches. Cross-vault drops should be Copy because note-scoped links and assets cannot transfer identity under this seam. - Retain one pending transfer while the `NSAlert` sheet is open, reject/serialize a second drop, and revalidate the source after the user chooses. `acceptDrop` returning `true` before the sheet resolves is acceptable because `BlockEditorView.draggingSession(...endedAt:operation:)` does not delete the source, but Cancel must only dispose that pending transfer. - Bound encoded payload bytes before decoding and separately bound raw Markdown, URL strings, descriptor strings, range arithmetic, and block count. For an app-private payload, return no external drag operations so root/base paths are not offered outside the process. 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.
Author
Owner

Worker/role: cross_event_drop / task implementation

Owned worktree/branch: .worktrees/cross-event-drop, wave17/cross-event-drop, exact base 56e61d2e4d8da6915fc693a99b2d09d8b5160863. Worktree is clean. Event-date owner confirmed no overlap and retains AppModelSidebarGestures.swift plus AppModelSidebarEventMoveIntegration.swift.

Current state: source audit complete; bounded implementation plan sent to independent reviewer /root/event_date_review before editing.

Exact diagnosis:

  • BlockEditorView currently 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.validateDrop accepts that Markdown, and acceptDrop immediately returns true while 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.attachDroppedMarkdown is copy-only and returns Void. 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:

  1. Upgrade only the editor block-drag envelope to a versioned, size-bounded Codable payload with a per-editor identity plus the existing exact source range/revision/raw Markdown and resource URLs. The live source editor revalidates every field and derives a transfer descriptor; untrusted payload presentation strings are not used.
  2. The descriptor exposes Copy Markdown with block IDs removed, Move Markdown with IDs intact where the destination is a linked note, the root block ID for a single moved image child, and native dialog presentation (trimmed item name plus SF Symbol). Copy never duplicates a source block ID; Move transfers IDs only as part of the committed destination and then deletes the exact fenced source envelope.
  3. Add one editor move-completion entry point. It rechecks editor identity, current source revision, exact UTF-16 range and raw bytes, deletes the full block/separator envelope as one canonical undo transaction, restores a valid caret, refreshes projection, and invokes the normal edit-commit callback. Any intervening source edit makes it fail closed.
  4. Add a tiny UserDefaults-backed Copy/Move preference in the existing AppModel defaults. A checked Copy/Move writes the policy. An unchecked choice remains one-shot. Cancel performs no source/destination write and never saves policy.
  5. SidebarView.Coordinator owns one attachment-drop task. It uses a native NSAlert sheet with the derived name, system icon, Copy/Move/Cancel, and a checkbox titled Remember my choice; a remembered policy skips the sheet. A second drop while one is pending is rejected visibly.
  6. Refactor the existing model entry point to return whether destination publication committed. Move calls source completion only after that result is true. Destination failure preserves source. If destination committed but the source fence then fails, the durable destination copy remains, the source remains, and the app reports that safe partial outcome explicitly; it does not silently discard either side or claim a completed move.

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 implementation Owned worktree/branch: `.worktrees/cross-event-drop`, `wave17/cross-event-drop`, exact base `56e61d2e4d8da6915fc693a99b2d09d8b5160863`. Worktree is clean. Event-date owner confirmed no overlap and retains `AppModelSidebarGestures.swift` plus `AppModelSidebarEventMoveIntegration.swift`. Current state: source audit complete; bounded implementation plan sent to independent reviewer `/root/event_date_review` before editing. Exact diagnosis: - `BlockEditorView` currently 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.validateDrop` accepts that Markdown, and `acceptDrop` immediately returns `true` while 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.attachDroppedMarkdown` is copy-only and returns `Void`. 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: 1. Upgrade only the editor block-drag envelope to a versioned, size-bounded Codable payload with a per-editor identity plus the existing exact source range/revision/raw Markdown and resource URLs. The live source editor revalidates every field and derives a transfer descriptor; untrusted payload presentation strings are not used. 2. The descriptor exposes Copy Markdown with block IDs removed, Move Markdown with IDs intact where the destination is a linked note, the root block ID for a single moved image child, and native dialog presentation (trimmed item name plus SF Symbol). Copy never duplicates a source block ID; Move transfers IDs only as part of the committed destination and then deletes the exact fenced source envelope. 3. Add one editor move-completion entry point. It rechecks editor identity, current source revision, exact UTF-16 range and raw bytes, deletes the full block/separator envelope as one canonical undo transaction, restores a valid caret, refreshes projection, and invokes the normal edit-commit callback. Any intervening source edit makes it fail closed. 4. Add a tiny UserDefaults-backed Copy/Move preference in the existing AppModel defaults. A checked Copy/Move writes the policy. An unchecked choice remains one-shot. Cancel performs no source/destination write and never saves policy. 5. `SidebarView.Coordinator` owns one attachment-drop task. It uses a native `NSAlert` sheet with the derived name, system icon, Copy/Move/Cancel, and a checkbox titled `Remember my choice`; a remembered policy skips the sheet. A second drop while one is pending is rejected visibly. 6. Refactor the existing model entry point to return whether destination publication committed. Move calls source completion only after that result is true. Destination failure preserves source. If destination committed but the source fence then fails, the durable destination copy remains, the source remains, and the app reports that safe partial outcome explicitly; it does not silently discard either side or claim a completed move. 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.
Author
Owner

Worker/role: cross_event_drop / task implementation

Plan-review disposition: /root/event_date_review requested changes; both P1 findings and the P2 constraints are accepted. No implementation began before this disposition.

Revised bounded semantics:

  • Both Copy and Move mint fresh destination block IDs once, before any destination CAS retry. The mapping is reused across retry. This prevents duplicate IDs when destination publication succeeds but source completion fails, and when Undo restores the source after a completed Move. This workflow moves/copies content and assets; it does not claim backlink-preserving identity relocation. A stronger identity-preserving move requires a Store-owned multi-file journal and backlink repair, outside this bounded seam.
  • The model returns a typed CrossEventDropReceipt carrying 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.
  • The destination writer CAS is the commit point. Cancellation or refresh failure after that point cannot turn the result into failure; the typed committed receipt remains available and refresh failure is reported separately.
  • Move is offered only when the source editor root and current destination vault root are the same durable root. Foreign-vault drops remain Copy. The source editor identity/revision/raw bytes are revalidated after the sheet choice and again when the receipt completes.
  • One Coordinator-owned transfer remains pending while its native sheet or destination operation runs. A second transfer is rejected. Cancel only drops the pending transfer and never changes policy or content.
  • Payload decoding will bound total encoded bytes first, then raw Markdown bytes, root/base URL sizes and file-URL shape, UTF-16 range arithmetic, and parsed block count. App-private block drags will advertise no operation outside the application.

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@mbp and the VM.

Worker/role: `cross_event_drop` / task implementation Plan-review disposition: `/root/event_date_review` requested changes; both P1 findings and the P2 constraints are accepted. No implementation began before this disposition. Revised bounded semantics: - Both Copy and Move mint fresh destination block IDs once, before any destination CAS retry. The mapping is reused across retry. This prevents duplicate IDs when destination publication succeeds but source completion fails, and when Undo restores the source after a completed Move. This workflow moves/copies content and assets; it does not claim backlink-preserving identity relocation. A stronger identity-preserving move requires a Store-owned multi-file journal and backlink repair, outside this bounded seam. - The model returns a typed `CrossEventDropReceipt` carrying 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. - The destination writer CAS is the commit point. Cancellation or refresh failure after that point cannot turn the result into failure; the typed committed receipt remains available and refresh failure is reported separately. - Move is offered only when the source editor root and current destination vault root are the same durable root. Foreign-vault drops remain Copy. The source editor identity/revision/raw bytes are revalidated after the sheet choice and again when the receipt completes. - One Coordinator-owned transfer remains pending while its native sheet or destination operation runs. A second transfer is rejected. Cancel only drops the pending transfer and never changes policy or content. - Payload decoding will bound total encoded bytes first, then raw Markdown bytes, root/base URL sizes and file-URL shape, UTF-16 range arithmetic, and parsed block count. App-private block drags will advertise no operation outside the application. 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@mbp` and the VM.
Author
Owner

Worker/role: cross_event_drop / task implementation

Candidate 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 on 56e61d2e.

Implemented:

  • BlockEditorView now 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.
  • Hover validation only validates the bounded envelope. Accepted-drop validation mints fresh destination IDs once, derives a native item name/SF Symbol from live parsed content, identifies standalone assets, preserves image alt text, and produces a transfer fingerprint.
  • Typed CrossEventDropReceipt records 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.
  • AppModel now 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.Coordinator serializes one cross-event drop at a time and presents a native NSAlert sheet naming the item with its system icon, Copy/Move/Cancel buttons, Escape-bound Cancel, and Remember my choice. Foreign-vault Move is disabled. Source state is revalidated after the choice.
  • Existing destination CAS/rollback paths remain authoritative. The model returns the typed receipt at the writer boundary and refreshes asynchronously. Destination failure retains source. If destination commits but source completion becomes stale, both distinct-ID copies remain and an explicit safe-partial-outcome error is shown.
  • Same-vault mixed blocks retain their existing relative asset links. A foreign-vault mixed/multi-asset block now fails closed with a specific error and no mutation; standalone foreign assets still copy bytes. This avoids producing a broken linked note until Store owns a multi-asset publication transaction.

Focused tests added/updated:

  • payload fresh-ID generation, foreign-editor rejection, stale revision, malformed range/revision/URL, encoded-size limit;
  • image name/icon/alt and fresh child identity;
  • wrong receipt rejection, one-shot completion, exact source removal, and Undo restoration;
  • checked/unchecked/Cancel preference policy;
  • typed image receipt at the commit boundary with simulated post-CAS cancellation/refresh failure, copied bytes, fresh child ID, preserved alt, source completion;
  • foreign-vault Copy/Move gating and fresh note IDs;
  • foreign mixed-asset fail-closed/no-mutation/source-byte preservation;
  • prior durable-target, CAS retry, source resolution, byte preservation, and linked-note fidelity coverage retained.

Validation performed: git diff --check and 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 on agents@mbp and owns VM/user delivery.

Worker/role: `cross_event_drop` / task implementation Candidate 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 on `56e61d2e`. Implemented: - `BlockEditorView` now 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. - Hover validation only validates the bounded envelope. Accepted-drop validation mints fresh destination IDs once, derives a native item name/SF Symbol from live parsed content, identifies standalone assets, preserves image alt text, and produces a transfer fingerprint. - Typed `CrossEventDropReceipt` records 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. - `AppModel` now 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.Coordinator` serializes one cross-event drop at a time and presents a native `NSAlert` sheet naming the item with its system icon, Copy/Move/Cancel buttons, Escape-bound Cancel, and `Remember my choice`. Foreign-vault Move is disabled. Source state is revalidated after the choice. - Existing destination CAS/rollback paths remain authoritative. The model returns the typed receipt at the writer boundary and refreshes asynchronously. Destination failure retains source. If destination commits but source completion becomes stale, both distinct-ID copies remain and an explicit safe-partial-outcome error is shown. - Same-vault mixed blocks retain their existing relative asset links. A foreign-vault mixed/multi-asset block now fails closed with a specific error and no mutation; standalone foreign assets still copy bytes. This avoids producing a broken linked note until Store owns a multi-asset publication transaction. Focused tests added/updated: - payload fresh-ID generation, foreign-editor rejection, stale revision, malformed range/revision/URL, encoded-size limit; - image name/icon/alt and fresh child identity; - wrong receipt rejection, one-shot completion, exact source removal, and Undo restoration; - checked/unchecked/Cancel preference policy; - typed image receipt at the commit boundary with simulated post-CAS cancellation/refresh failure, copied bytes, fresh child ID, preserved alt, source completion; - foreign-vault Copy/Move gating and fresh note IDs; - foreign mixed-asset fail-closed/no-mutation/source-byte preservation; - prior durable-target, CAS retry, source resolution, byte preservation, and linked-note fidelity coverage retained. Validation performed: `git diff --check` and 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 on `agents@mbp` and owns VM/user delivery.
Author
Owner

Worker/role: cross_event_drop / task implementation

Candidate 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 compare 56e61d2e..6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00.

Verification: git rev-parse HEAD and git show --no-patch HEAD both read back 6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00; worktree has no tracked modifications.

Worker/role: `cross_event_drop` / task implementation Candidate 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 compare `56e61d2e..6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00`. Verification: `git rev-parse HEAD` and `git show --no-patch HEAD` both read back `6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00`; worktree has no tracked modifications.
Author
Owner

Worker: cross-event-drop (task role)
Worktree/branch: .worktrees/cross-event-drop / wave17/cross-event-drop
State: candidate amended by a separate atomic follow-up commit; awaiting independent diff review

Exact candidate HEAD is now a6b722eb8525d89e2f976bf8d79687d8099b5474 (base implementation 6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00, commit-boundary follow-up a6b722eb).

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 --check clean 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.

Worker: cross-event-drop (`task` role) Worktree/branch: `.worktrees/cross-event-drop` / `wave17/cross-event-drop` State: candidate amended by a separate atomic follow-up commit; awaiting independent diff review Exact candidate HEAD is now `a6b722eb8525d89e2f976bf8d79687d8099b5474` (base implementation `6f863822c2f5ae5deb39bc93b6a3bd43faa8cb00`, commit-boundary follow-up `a6b722eb`). 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 --check` clean 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.
Author
Owner

Independent source review — CHANGES REQUESTED

Role: reviewer (/root/event_date_review)
Worktree: /Users/kayg/Developer/calternal-app/.worktrees/cross-event-drop
Branch/base: wave17/cross-event-drop, 56e61d2e
Reviewed candidate: exact HEAD a6b722eb8525d89e2f976bf8d79687d8099b5474
State: read-only source review complete; git diff --check 56e61d2e..HEAD passes. 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

  1. Location: 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.
  2. What breaks: A valid attachment in a recursively nested note commonly needs a path such as ../../attachments/photo.png. AttachmentMarkdown.references(in:) recognizes only attachments/, ./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 bypasses foreignMixedAssets, 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-level notes/; raw relative destinations are not rebased from the captured sourceBaseURL, so links from a nested source can point somewhere else after publication.
  3. Why likely: Notes are recursively supported and enumerated (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-level notes base and ../attachments, so this supported source layout is untested.
  4. Scoped fix: Recognize any bounded relative attachment path that resolves under the captured root's 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 final notePath directory (the existing VaultDocumentLinkRewrite relocation 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

  1. Location: App/Sources/Sidebar/SidebarView.swift:1769-1798; Sources/CalternalEditor/BlockEditorView.swift:1346-1351,1480-1507.
  2. What breaks: Dragging a large selected block over sidebar rows repeatedly JSON-decodes as much as 512 KiB, validates up to 384 KiB of Markdown, compares the full source substring, and resolves block indices on the main actor for every validateDrop callback. Native hover feedback can hitch despite the method's “Cheap hover-time validation” contract.
  3. Why likely: NSTableView.validateDrop is called continuously as the pointer moves. Unlike the editor's internal drag path at BlockEditorView.swift:1246-1254, this cross-event path has no pasteboard/revision cache; its maximum accepted payload is deliberately large.
  4. Scoped fix: Cache the validated hover result on the source editor using pasteboard changeCount (or transfer ID/fingerprint) plus document.sourceRevision and editor identity, invalidate it when any key changes, and retain the full exact validation in validatedDraggedBlockTransfer at 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 that BlockEditorView. 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.

# Independent source review — CHANGES REQUESTED Role: `reviewer` (`/root/event_date_review`) Worktree: `/Users/kayg/Developer/calternal-app/.worktrees/cross-event-drop` Branch/base: `wave17/cross-event-drop`, `56e61d2e` Reviewed candidate: exact HEAD `a6b722eb8525d89e2f976bf8d79687d8099b5474` State: read-only source review complete; `git diff --check 56e61d2e..HEAD` passes. 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 1. **Location:** `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`. 2. **What breaks:** A valid attachment in a recursively nested note commonly needs a path such as `../../attachments/photo.png`. `AttachmentMarkdown.references(in:)` recognizes only `attachments/`, `./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 bypasses `foreignMixedAssets`, 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-level `notes/`; raw relative destinations are not rebased from the captured `sourceBaseURL`, so links from a nested source can point somewhere else after publication. 3. **Why likely:** Notes are recursively supported and enumerated (`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-level `notes` base and `../attachments`, so this supported source layout is untested. 4. **Scoped fix:** Recognize any bounded relative attachment path that resolves under the captured root's `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 final `notePath` directory (the existing `VaultDocumentLinkRewrite` relocation 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 1. **Location:** `App/Sources/Sidebar/SidebarView.swift:1769-1798`; `Sources/CalternalEditor/BlockEditorView.swift:1346-1351,1480-1507`. 2. **What breaks:** Dragging a large selected block over sidebar rows repeatedly JSON-decodes as much as 512 KiB, validates up to 384 KiB of Markdown, compares the full source substring, and resolves block indices on the main actor for every `validateDrop` callback. Native hover feedback can hitch despite the method's “Cheap hover-time validation” contract. 3. **Why likely:** `NSTableView.validateDrop` is called continuously as the pointer moves. Unlike the editor's internal drag path at `BlockEditorView.swift:1246-1254`, this cross-event path has no pasteboard/revision cache; its maximum accepted payload is deliberately large. 4. **Scoped fix:** Cache the validated hover result on the source editor using pasteboard `changeCount` (or transfer ID/fingerprint) plus `document.sourceRevision` and editor identity, invalidate it when any key changes, and retain the full exact validation in `validatedDraggedBlockTransfer` at 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 that `BlockEditorView`. 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.
Author
Owner

Worker: cross-event-drop (task role)
Worktree/branch: .worktrees/cross-event-drop / wave17/cross-event-drop
State: reviewer changes accepted; repair in progress

Reviewer /root/event_date_review requested one P1 asset-path correction and one P2 hover-path correction against a6b722eb8525d89e2f976bf8d79687d8099b5474. Both findings are accepted.

Bounded repair:

  • The editor will classify a single parsed image/link block as a standalone candidate without relying on AttachmentMarkdown's one-parent lexical prefixes. AppModel will use the captured root/base plus DocumentLinkMarkdown.resolveDestination as the authority: only a target resolving beneath the source vault's attachments/ directory becomes an asset publication.
  • Mixed Markdown will scan parsed destinations through 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 created notePath, preserving nested attachment resolution. A standalone nested asset will snapshot/copy the resolved bytes as before.
  • Hover validation will inspect only the private pasteboard type and encoded byte bound. The accepted-drop path retains full JSON decoding, editor nonce/revision/range/raw-byte/root validation and mints destination IDs once. Focused coverage will prove repeated hover does not accept oversized payloads and that malformed bounded payloads still fail exact acceptance.
  • Regressions will cover nested same-vault standalone bytes, nested same-vault mixed-link rebasing, foreign nested mixed zero mutation, and bounded repeated hover/exact acceptance.

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 (`task` role) Worktree/branch: `.worktrees/cross-event-drop` / `wave17/cross-event-drop` State: reviewer changes accepted; repair in progress Reviewer `/root/event_date_review` requested one P1 asset-path correction and one P2 hover-path correction against `a6b722eb8525d89e2f976bf8d79687d8099b5474`. Both findings are accepted. Bounded repair: - The editor will classify a single parsed image/link block as a standalone candidate without relying on `AttachmentMarkdown`'s one-parent lexical prefixes. AppModel will use the captured root/base plus `DocumentLinkMarkdown.resolveDestination` as the authority: only a target resolving beneath the source vault's `attachments/` directory becomes an asset publication. - Mixed Markdown will scan parsed destinations through `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 created `notePath`, preserving nested attachment resolution. A standalone nested asset will snapshot/copy the resolved bytes as before. - Hover validation will inspect only the private pasteboard type and encoded byte bound. The accepted-drop path retains full JSON decoding, editor nonce/revision/range/raw-byte/root validation and mints destination IDs once. Focused coverage will prove repeated hover does not accept oversized payloads and that malformed bounded payloads still fail exact acceptance. - Regressions will cover nested same-vault standalone bytes, nested same-vault mixed-link rebasing, foreign nested mixed zero mutation, and bounded repeated hover/exact acceptance. 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.
Author
Owner

Worker: cross-event-drop (task role)
Worktree/branch: .worktrees/cross-event-drop / wave17/cross-event-drop
State: reviewer repair committed; exact-HEAD re-review requested

New exact candidate HEAD: 1fb74e9267f880ea35d7c18dffefada6cc6ed306 (repair commit 1fb74e92, prior candidate a6b722eb8525d89e2f976bf8d79687d8099b5474, base 56e61d2e).

Resolved P1:

  • A single parsed image/link block is now an attachment candidate independent of AttachmentMarkdown's shallow prefix scanner.
  • AppModel derives a bounded synthetic source path from the captured root/base and resolves parsed Markdown destinations with DocumentLinkMarkdown.resolveDestination; only paths canonically beneath attachments/ enter the asset publication path.
  • Standalone assets in nested same-vault or foreign-vault notes snapshot and copy the resolved bytes.
  • Mixed Markdown scans destinations through 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:

  • Repeated hover validation now checks only the private pasteboard type plus nonzero 512-KiB encoded bound. It does not decode JSON, compare Markdown, resolve ranges, parse blocks, hash, or mint IDs. Exact validation remains in accepted-drop transfer creation.

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 --check and current git diff --check passed; worktree has no tracked modifications. Per policy no local Swift build/tests or GUI run. Next action: reviewer re-checks exact 56e61d2e..1fb74e92; then QA/build-host validation.

Worker: cross-event-drop (`task` role) Worktree/branch: `.worktrees/cross-event-drop` / `wave17/cross-event-drop` State: reviewer repair committed; exact-HEAD re-review requested New exact candidate HEAD: `1fb74e9267f880ea35d7c18dffefada6cc6ed306` (repair commit `1fb74e92`, prior candidate `a6b722eb8525d89e2f976bf8d79687d8099b5474`, base `56e61d2e`). Resolved P1: - A single parsed image/link block is now an attachment candidate independent of `AttachmentMarkdown`'s shallow prefix scanner. - AppModel derives a bounded synthetic source path from the captured root/base and resolves parsed Markdown destinations with `DocumentLinkMarkdown.resolveDestination`; only paths canonically beneath `attachments/` enter the asset publication path. - Standalone assets in nested same-vault or foreign-vault notes snapshot and copy the resolved bytes. - Mixed Markdown scans destinations through `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: - Repeated hover validation now checks only the private pasteboard type plus nonzero 512-KiB encoded bound. It does not decode JSON, compare Markdown, resolve ranges, parse blocks, hash, or mint IDs. Exact validation remains in accepted-drop transfer creation. 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 --check` and current `git diff --check` passed; worktree has no tracked modifications. Per policy no local Swift build/tests or GUI run. Next action: reviewer re-checks exact `56e61d2e..1fb74e92`; then QA/build-host validation.
Author
Owner

Repair re-review — APPROVED FOR REMOTE BUILD/QA

Role: reviewer (/root/event_date_review)
Worktree: /Users/kayg/Developer/calternal-app/.worktrees/cross-event-drop
Branch/base: wave17/cross-event-drop, 56e61d2e
Reviewed candidate: exact HEAD 1fb74e9267f880ea35d7c18dffefada6cc6ed306
State: read-only full-range source re-review complete; git diff --check 56e61d2e..HEAD passes. 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 under attachments/. 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-resolved notePath using VaultDocumentLinkRewrite. 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.canAcceptCrossEventDrop performs 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 NSAlert interaction, 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.

# Repair re-review — APPROVED FOR REMOTE BUILD/QA Role: `reviewer` (`/root/event_date_review`) Worktree: `/Users/kayg/Developer/calternal-app/.worktrees/cross-event-drop` Branch/base: `wave17/cross-event-drop`, `56e61d2e` Reviewed candidate: exact HEAD `1fb74e9267f880ea35d7c18dffefada6cc6ed306` State: read-only full-range source re-review complete; `git diff --check 56e61d2e..HEAD` passes. 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 under `attachments/`. 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-resolved `notePath` using `VaultDocumentLinkRewrite`. 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.canAcceptCrossEventDrop` performs 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 `NSAlert` interaction, 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.
Author
Owner

Worker: cross-event-drop (task role)
Worktree/branch: .worktrees/cross-event-drop / wave17/cross-event-drop
State: implementation and independent source review complete; handed to root for integration, remote build, and combined QA

Exact candidate: 1fb74e9267f880ea35d7c18dffefada6cc6ed306 based on 56e61d2e. Reviewer /root/event_date_review approved the full range with no remaining P1/P2/P3 findings, and the review comment/readback is present above.

Static evidence: git diff --check 56e61d2e..HEAD passes; 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.

Worker: cross-event-drop (`task` role) Worktree/branch: `.worktrees/cross-event-drop` / `wave17/cross-event-drop` State: implementation and independent source review complete; handed to root for integration, remote build, and combined QA Exact candidate: `1fb74e9267f880ea35d7c18dffefada6cc6ed306` based on `56e61d2e`. Reviewer `/root/event_date_review` approved the full range with no remaining P1/P2/P3 findings, and the review comment/readback is present above. Static evidence: `git diff --check 56e61d2e..HEAD` passes; 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.
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

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 a969f8ef net, #12 abb397be, #15 1fb74e92 chain 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.

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 a969f8ef net, #12 abb397be, #15 1fb74e92 chain 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.
Author
Owner

Task identity: /root/block_drag_finish

Isolated integration candidate:

  • Worktree: /Users/kayg/Developer/calternal-app/.worktrees/editor-final-combined
  • Branch: wave16/editor-final-combined
  • Base: 3e8818608b7981a0670d229f322985f3474dbe58
  • Tip: 68885f1c4b8dceb4a59b35cc07b8516ffd0d4362

Integrated the complete reviewed change chain for this issue without editing central. Shared BlockEditorView conflicts 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 --check clean. 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.

Task identity: `/root/block_drag_finish` Isolated integration candidate: - Worktree: `/Users/kayg/Developer/calternal-app/.worktrees/editor-final-combined` - Branch: `wave16/editor-final-combined` - Base: `3e8818608b7981a0670d229f322985f3474dbe58` - Tip: `68885f1c4b8dceb4a59b35cc07b8516ffd0d4362` Integrated the complete reviewed change chain for this issue without editing central. Shared `BlockEditorView` conflicts 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 --check` clean. 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.
Author
Owner

Merged interaction source review — exact isolated tip 68885f1c4b8dceb4a59b35cc07b8516ffd0d4362 against base 3e8818608b7981a0670d229f322985f3474dbe58: 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 --check is 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.

Merged interaction source review — exact isolated tip `68885f1c4b8dceb4a59b35cc07b8516ffd0d4362` against base `3e8818608b7981a0670d229f322985f3474dbe58`: **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 --check` is 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.
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

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.

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

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

Already established: the full transfer chain through 1fb74e92 and 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 /root on 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.

Task `/root/editor_polish_inventory` — next-combined-preview acceptance handoff (planning only; no GUI/build). Already established: the full transfer chain through `1fb74e92` and 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 `/root` on 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.
Author
Owner

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.txt and exact-logs/cross-event/.

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.txt` and `exact-logs/cross-event/`.
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.

  • diagnostic/clipboard-insertion-491 — e187ac0d36e9807ad49a2bfdcd0e2f4f4594b96d
  • diagnostic/clipboard-phase-0225 — a0885d5209be7fed77439124c094f682eb4292e0
  • fix/clipboard-task-ownership-6318 — b073493c6a2fd9c4a6f877c14035cbe88052b3aa
  • task/native-clipboard-contract — 4dec9a2c71f9e9dd2113dc9bfdd000c8e0e29716
  • task/rendered-image-clipboard — 7c79361150b3b02c1622ab1535db11730b84c874
  • wave14/event-attachment-drop — dbaf3e55ec3df576beaa33efa29e2d9654f942c5
  • wave17/cross-event-drop — 1fb74e9267f880ea35d7c18dffefada6cc6ed306

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. - `diagnostic/clipboard-insertion-491` — `e187ac0d36e9807ad49a2bfdcd0e2f4f4594b96d` - `diagnostic/clipboard-phase-0225` — `a0885d5209be7fed77439124c094f682eb4292e0` - `fix/clipboard-task-ownership-6318` — `b073493c6a2fd9c4a6f877c14035cbe88052b3aa` - `task/native-clipboard-contract` — `4dec9a2c71f9e9dd2113dc9bfdd000c8e0e29716` - `task/rendered-image-clipboard` — `7c79361150b3b02c1622ab1535db11730b84c874` - `wave14/event-attachment-drop` — `dbaf3e55ec3df576beaa33efa29e2d9654f942c5` - `wave17/cross-event-drop` — `1fb74e9267f880ea35d7c18dffefada6cc6ed306` Master #20 contains the resume instructions. No force push; dev remains 1d8f4adf.
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#15
No description provided.