Skip to content

Drawable depth: geometry, text formatting, and images (#3, #37, #38) - #39

Merged
leogdion merged 6 commits into
v0.1.xfrom
3-37-38-drawable-depth
Jul 31, 2026
Merged

Drawable depth: geometry, text formatting, and images (#3, #37, #38)#39
leogdion merged 6 commits into
v0.1.xfrom
3-37-38-drawable-depth

Conversation

@leogdion

Copy link
Copy Markdown
Member

Summary

Test plan

Made with Cursor

Unblock the v0.1.0 tag by exposing frame/zIndex, forked character styles, and Image drawables with Data/ bookkeeping on the shared authoring/write path.

Co-authored-by: Cursor <cursoragent@cursor.com>
@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 7fc1fd27-007d-4c08-8e7d-972a37514592

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

leogdion and others added 3 commits July 30, 2026 20:20
Extend AcceptanceDecks so the human #24 pass can open Magic Move size change, styled text, and an image with Dissolve In without hand-writing a probe.

Co-authored-by: Cursor <cursoragent@cursor.com>
Minted character styles now carry TSS.StyleArchive super + stylesheet
registration so formatting decks open in Keynote. Image minting is aligned
toward Keynote-inserted shape but still SIGTRAPs on the slim blank; triage
and next steps are in drawable_open_crash.md.

Co-authored-by: Cursor <cursoragent@cursor.com>
Two distinct Keynote 15.3 load failures, root-caused by diffing our slim
authored deck against a script-driven Keynote insert on the same blank:

1. TSPersistence abort: image DataInfo lacked materializedLength and the
   TSD.ImageDataAttributes extension (pixelSize), and we minted a thumbnail
   data Keynote never creates. Now: single full-size Data/ member, DataInfo
   with digest + materializedLength + pixel-size attributes, ownedDrawables
   entry, originalSize=naturalSize, rectangle tracedPath, wrap type 4.

2. NSViewLayout uncaught exception: the image's media style lives in the
   DocumentStylesheet component, but the slide component never declared the
   cross-component edge. registerExternalReferences now appends the
   TSP.ComponentExternalReference exactly as Keynote does.

All 8 acceptance decks (5 original + 3 drawable-depth) open cleanly in
Keynote 15.3; swift test 20/20; LINT_MODE=STRICT lint clean (restructured
ImageSupply into ImageRecords, replaced ref tuples with
TSP_ComponentDataReference, split oversized test file).

Findings: research/findings/drawable_open_crash.md (resolved, incl. the
Keynote autosave-in-place trap and raw-diff methodology).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@leogdion

Copy link
Copy Markdown
Member Author

Image open crash (#38) is fixed as of ac16bc8 — root causes and methodology in research/findings/drawable_open_crash.md. Scripted Keynote 15.3 open pass: all 8 acceptance decks (5 original + drawable_geometry, text_formatting, image_drawable) open with no crash and no new .ips; swift test 20/20; strict lint clean. Remaining before v0.1.0 tag: human open pass to confirm no silent repair dialog (the scripted pass can't see dialogs).

The 2026-07-30 open-only pass missed three render-level bugs:

1. drawable_geometry crashed / slide 2 blank (multi-slide clone):
   - RecordCloner materialized absent optional references as EMPTY
     messages (id 0) via inout accessor access — Keynote resolves 0 to
     nil, silently never loads the cloned component (0 iWork items),
     and Magic Move pairing crashes on the nil (NSSet nil exception).
     Every singular remap is now has*-guarded.
   - Cloned slide components now carry the template's uuid-map entries
     remapped with fresh uuids (Keynote requires one per member record);
     newly minted drawable records get entries too.
   - Cloned slide nodes now register a Document-component uuid entry and
     merge into the thumbnail data-reference row — an unregistered
     header data reference fails TSP integrity.
   - Magic Move moved to slide 1 in DrawableGeometryContent: Keynote
     plays the outgoing slide's transition.

2. text_formatting rendered plain: switched from a tableCharStyle
   CharacterStyle fork (opens, never paints) to Keynote's actual
   mechanism — a TSWP.ParagraphStyleArchive variation (isVariation,
   parent = storage's para style) on tableParaStyle, registered in the
   stylesheet styles + parentToChildrenStyleMap, storage header ref
   swapped, slide-component externalReferences edge, uuid entries in
   both components, and tsdFill alongside fontColor (color paints via
   the fill).

3. image_drawable showed the missing-media placeholder: the 1x1
   hand-minimal JPEG is not ImageIO-decodable; embedded a real 64x48
   sips-encoded JPEG.

Verification now includes rendered-slide export (renderdeck) and
AppleScript model probes, not just open-survival: all 8 decks open and
render green in Keynote 15.3; swift test 20/20; strict lint clean.

Findings: research/findings/drawable_open_crash.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@leogdion

Copy link
Copy Markdown
Member Author

Human-pass regressions fixed as of 6cda7f7 — details in research/findings/drawable_open_crash.md. drawable_geometry crash/blank slide 2 (RecordCloner materialized empty references + missing clone component uuid/data bookkeeping), text_formatting now renders (paragraph-style variation + tsdFill, matching Keynote's own mechanism), image renders (decodable sample JPEG). Verified by rendered-slide export, not just open-survival. Fresh decks regenerated to ~/Desktop/acceptance-decks/.

Foundation Process doesn't exist on iOS/tvOS/watchOS/visionOS (compile
failure) and the silent run() failure deadlocked both Windows jobs to the
6h timeout. List zip entry paths via KeyBundle instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@leogdion
leogdion merged commit 211b956 into v0.1.x Jul 31, 2026
17 checks passed
@leogdion
leogdion deleted the 3-37-38-drawable-depth branch July 31, 2026 14:02
leogdion pushed a commit that referenced this pull request Jul 31, 2026
- research/findings/acceptance_keynote_open.md: expanded-pass section (9 decks
  incl. text_runs, regression + drawable-depth render columns, #10 live-verify
  extra, tag + merge-to-main steps)
- .claude/PLAN.md, .claude/PARALLEL-WORKTREES.md, .claude/agent-notes.md:
  current position after PR #39 and PR #41 merges (drawable depth, mixed runs,
  TextBox/Text DSL rename) and issue housekeeping

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
leogdion added a commit that referenced this pull request Jul 31, 2026
- research/findings/acceptance_keynote_open.md: expanded-pass section (9 decks
  incl. text_runs, regression + drawable-depth render columns, #10 live-verify
  extra, tag + merge-to-main steps)
- .claude/PLAN.md, .claude/PARALLEL-WORKTREES.md, .claude/agent-notes.md:
  current position after PR #39 and PR #41 merges (drawable depth, mixed runs,
  TextBox/Text DSL rename) and issue housekeeping

Co-authored-by: CI <ci@example.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
@leogdion leogdion mentioned this pull request Jul 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant