Skip to content

feat(core): structural insert — insertNodes + insertTimeline verbs (0.6.41)#71

Merged
kiyeonjeon21 merged 1 commit into
mainfrom
feat/structural-insert
Jun 20, 2026
Merged

feat(core): structural insert — insertNodes + insertTimeline verbs (0.6.41)#71
kiyeonjeon21 merged 1 commit into
mainfrom
feat/structural-insert

Conversation

@kiyeonjeon21

Copy link
Copy Markdown
Owner

What

Completes the structural-editing CRUD surface (add / remove / reorder / insert). Insert is the last Spine 2 op; unlike reorder/remove (which patch existing addressable elements) it creates elements, so it needs new compose verbs. Scoped to the generic verbs only (per the roadmap's deprioritize-engine-primitives call) — the montage shot-payload generator is out of scope.

How

  • insertNodes — insert a node at a position (before/after a sibling root id, or index) vs addNodes appending on top, so a new layer can land under later nodes (a montage shot below the vignette/scrim grade).
  • insertTimeline — splice a step/beat into a named beat ({ into, before/after/index, step }); validates the step's tween/motionPath targets; unknown into/before/after or a missing target is an orphan.
  • Montage flattenphotoMontage now groups the shot beats directly under the "montage" beat (dropped the redundant inner seq wrapper — timing-equivalent, golden-safe), so the play order is addressable as into:"montage". Reorder/removeTimeline unaffected.
  • The overlay carries the full node + beat JSON (a consumer like reframe-studio authors it; reframe doesn't generate the shot payload).

Verification

  • 391 tests pass (+4 insert tests, incl. an end-to-end montage insert: hand-authored shot lands in play order between shot-1 and shot-2, paints under the grade, 0 orphans); typecheck clean; goldens byte-identical (montage isn't golden; flatten is timing-equivalent)
  • verify-overlay … montage-insert.json2 applied / 0 orphaned; montage-restructure.json still 4 / 0
  • Rendered the overlay'd montage: the inserted shot shows full-frame in sequence, under the grade
  • reframe labels rows unchanged by the flatten

Notes

  • Out of scope: montageInsertShot payload generator; node-insert into a nested group (root covers montage); exact neighbour-crossfade recompute across an insert (cosmetic, same tradeoff as remove).
  • Version → 0.6.41 (PATCH).

🤖 Generated with Claude Code

….6.41)

Completes the structural-editing CRUD surface (add/remove/reorder/insert).
Two positioned-insert compose verbs:

- insertNodes — insert a node at a position (before/after a sibling root id,
  or an index) vs addNodes appending on top, so a new layer can land under
  later nodes (e.g. a montage shot below the vignette/scrim grade)
- insertTimeline — splice a step/beat into a named beat ({into, before/after
  /index, step}); validates the step's targets; unknown into/before/after or
  a missing target is an orphan, never a silent drop

photoMontage/videoMontage now group the shot beats directly under the
"montage" beat (drop the redundant inner seq wrapper — timing-equivalent,
golden-safe), so the play order is addressable: insertTimeline {into:
"montage", after:"shot-1", step} splices a shot in. Reorder/removeTimeline
unaffected.

Insert creates elements, so the overlay carries the full node+beat JSON — a
consumer (reframe-studio) or the author supplies it; reframe does not
generate the montage shot payload (out of scope). Example overlay +
end-to-end montage insert test (asserts play order + paints under grade).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@kiyeonjeon21 kiyeonjeon21 merged commit 05f7002 into main Jun 20, 2026
1 check passed
@kiyeonjeon21 kiyeonjeon21 deleted the feat/structural-insert branch June 20, 2026 16:39
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