Skip to content

feat(timeline): add durable attached clip chains - #35

Merged
lightninglu10 merged 10 commits into
codepress-mainfrom
freecut-attached-clips
Sep 3, 2026
Merged

feat(timeline): add durable attached clip chains#35
lightninglu10 merged 10 commits into
codepress-mainfrom
freecut-attached-clips

Conversation

@lightninglu10

@lightninglu10 lightninglu10 commented Sep 1, 2026

Copy link
Copy Markdown

Touching timeline clips now behave as a durable attached sequence. Dragging an attached clip carries its touching tail, ripple trim and delete stop at an explicit break, and linked audio/video cohorts continue to move atomically.

Users can detach or reattach a clip from the timeline context menu. Attachment state survives project reloads and round-trips through the published editor surface and host-authoritative edit receipts. The editor surface version advances to 0.3.12.

The final host integration also preserves exact frame boundaries when a clip is moved from a non-zero frame, preventing rounded microsecond durations from creating one-microsecond overlaps. It preserves detached state for ordinary text items during native host reconciliation as well, so an unrelated detached tail cannot create a spurious revision or make a valid clip-chain drag ambiguous.

Verification

Verified at 66307357b847bb1e20c9d8dfd9a40adec54e6272: 719 test files and 5,374 tests passed, along with lint, type/boundary checks, changed-health ratchets, production and editor-surface builds, 43 Node headless checks, 19 edit contracts, real-browser QA, provenance verification, redaction checks, and the installed-consumer smoke test.

Demo

Right-clicking an attached clip exposes the detach action:

desktop attached clip context menu

After detaching, that clip moves independently while the remaining clips stay attached:

desktop detached clip moved independently

interaction detach and independently drag an attached clip

Watch the full interaction video

@lightninglu10 lightninglu10 self-assigned this Sep 1, 2026
@lightninglu10

Copy link
Copy Markdown
Author

Canonical QA Report

Verifier revision binding

  • Base: 9b81be151f3f4681b3195189b187435c94659435 (origin/codepress-main)
  • Head: bc1a77c595cd23e71d00424a1cbd1131448720ab
  • git rev-parse HEAD: bc1a77c595cd23e71d00424a1cbd1131448720ab
  • git status --porcelain: empty

Gate results

Gate Result Evidence
Revision binding PASS npm run qa:binding -- --check; clean head descended from the recorded base
Static check PASS vp check found no warnings, lint errors, or type errors in 2,499 files
Lint PASS npm run lint
Unit tests PASS 719 files, 5,373 tests
Production build PASS Included in npm run verify
Feature boundaries PASS 1,719 files scanned
Dependency contracts PASS 161 dependency files and 298 contract files scanned
Legacy imports PASS No unauthorized legacy imports
Dependency wrapper health PASS 46 pass-through wrappers, 0 unused
Changed health PASS 46 changed files; 0 introduced dead-code, complexity, or duplication findings
Edge budgets PASS All 8 monitored seams passed
Unused export ratchet PASS Ratchet synchronized and clean at 118
Unused class-member ratchet PASS Ratchet synchronized and clean at 80
Provenance PASS 51 runtime dependencies, 16 development dependencies, and 5 asset roots verified
Editor surface package PASS Built @quantfive/freecut-editor-surface@0.3.12
Installed consumer PASS Fresh install; 1 file and 2 tests passed
Node headless contracts PASS 43 checks passed
Edit contracts PASS 19 checks passed
Real-browser QA PASS System Chrome 152; render and real-pixel frame assertions passed
Redaction PASS 11 artifacts scanned; 6 fail-closed fixture tests passed

Inherited baseline failures

None. The inherited unused-export and class-member ratchet drift was repaired on this branch.

Environment blockers

None.

Visual/browser artifacts

Overall

✅ PASS — PENDING JUDGE

No merge until a trusted judge records PASS for this exact head.

…set duration

An asset whose duration failed to probe arrives with durationSeconds 0,
which safeDurationFrames mapped to a 1-frame sourceDuration. The end-edge
trim clamp then read that as 'no source remaining' and turned any extend
drag into a collapse to 1 frame, destroying the clip on commit.

- safeDurationFrames now floors the source bound at the clip's own
  in-use source range, so unknown durations can no longer undercut it
- clampTrimAmount floors maxExtend at zero on both edges, so an
  inconsistent source bound clamps an extend to a no-op instead of a
  negative delta that shrinks the clip
@lightninglu10
lightninglu10 marked this pull request as ready for review September 3, 2026 23:56
@lightninglu10
lightninglu10 merged commit b4975a0 into codepress-main Sep 3, 2026
3 checks passed
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