Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
ff6177e
fix(ui): clamp window geometry for small screens
Aug 21, 2026
2235c63
fix(ui): cover split pane small-screen overflow
Aug 21, 2026
32c8c3c
fix(ui): make small-screen fallback safe
Aug 21, 2026
70e56c9
fix(ui): loosen responsive settings height contract
Aug 21, 2026
bd06d62
feat(preview): support multiple media preview tabs
Aug 21, 2026
4c8b761
fix(preview): normalize legacy preview tabs
Aug 21, 2026
0bd7c6a
fix(media): make native file import selectable
Aug 21, 2026
458f3c0
test(ui): make storage persistence assertions proxy-safe
Aug 21, 2026
6c444e7
fix(preview): use declared spacing token
Aug 21, 2026
745a190
feat(media): add folder flat grouped view modes
Aug 21, 2026
5b1f45d
fix(media): normalize root and dangling folder ids
Aug 21, 2026
81bde3c
docs(qa): record convergence and media mode evidence
Aug 21, 2026
8615c22
docs(qa): record audio facade test gap
Aug 21, 2026
ddbf189
docs(plan): record media mode milestone
Aug 21, 2026
45fe2b2
fix media extract_pcm full-track semantics
Aug 21, 2026
1799435
docs(plan): define temporal preview parity
Aug 21, 2026
a833764
feat(preview): route temporal compositor playback to rust
Aug 21, 2026
1013355
fix(preview): block webkit temporal fallback for video stacks
Aug 21, 2026
ad0bd70
docs(plan): mark temporal route task complete
Aug 21, 2026
dafd5eb
feat(preview): enable temporal compositor controls
Aug 21, 2026
69a958f
docs(plan): mark preview surface task complete
Aug 21, 2026
ed83213
test(preview): cover temporal compositor playback
Aug 21, 2026
3e124dc
fix(preview): reset reversed playback publication streams
Aug 21, 2026
c95e701
docs(plan): mark native parity task complete
Aug 21, 2026
46dff8f
docs(qa): record temporal preview parity evidence
Aug 21, 2026
808aa69
docs(capability): map temporal preview evidence
Aug 21, 2026
35801f8
Fix macOS export save dialog filters
Aug 21, 2026
6b1f016
docs(qa): record temporal export and SavePanel evidence
Aug 21, 2026
7e33319
docs: refresh temporal QA evidence counts
Aug 21, 2026
0a995cf
docs: mark small-screen capability verified
Aug 21, 2026
a7a372e
feat(timeline): add range selection interactions
Aug 21, 2026
4cfed7d
docs: record final timeline and web gates
Aug 21, 2026
0bae80e
fix(export): clean failed outputs and propagate cancellation
Aug 21, 2026
a7d98d6
fix(export): reject symlinked output identities
Aug 21, 2026
3ccea10
docs: record export identity and sequential gates
Aug 21, 2026
f05bac8
fix(timeline): keep split no-op without selection
Aug 21, 2026
478e1b4
fix(timeline): make playhead trims selection-driven
Aug 21, 2026
78a6a2a
docs: record linked timeline parity slice
Aug 21, 2026
741ff07
fix(preview): fail closed on missing media layers
Aug 21, 2026
42f72f8
docs: record missing media playback gates
Aug 21, 2026
6b31449
chore(export): satisfy local clippy suggestions
Aug 21, 2026
97a574b
docs: record final preview gates and lint boundary
Aug 21, 2026
e106bc3
feat(motion): publish transparent alpha graphics
Aug 21, 2026
3b8ba9b
fix(agent): keep linked moves in sync
Aug 21, 2026
ba85202
feat(motion): expose alpha publish in agent documents
Aug 21, 2026
2668e25
docs: record linked parity and latest alpha package
Aug 21, 2026
5e3b5b7
fix(motion): preserve alpha when editing transparent clips
Aug 21, 2026
b9d08ae
docs: record alpha edit verification
Aug 21, 2026
76e700b
fix(timeline): make option trim main-only
Aug 21, 2026
6ce80fe
fix(motion): place alpha toggle in inspector
Aug 21, 2026
0a27cda
docs: record desktop smoke and option trim parity
Aug 21, 2026
b75e888
docs: record latest export and reopen smoke
Aug 21, 2026
eb0a43e
docs: record linked ripple screen verification
Aug 21, 2026
6794428
docs: record inspector subtitle and agent smoke
Aug 21, 2026
b3cc022
fix(sync): clamp playhead after timeline refresh
Aug 21, 2026
a1c275e
docs: record hevc and prores export smoke
Aug 21, 2026
cca9327
feat(export): add transparent prores 4444 delivery
Aug 21, 2026
0c6fce9
docs: record subtitle verification boundaries
Aug 21, 2026
7290a9c
docs: checkpoint desktop convergence plan
Aug 21, 2026
c1db732
feat: close upstream folder and lottie gaps
Aug 21, 2026
26a290c
docs: record latest packaged verification
Aug 21, 2026
537e790
docs: record timeline parity audit
Aug 21, 2026
58c7547
docs: record timeline frontend baseline
Aug 21, 2026
1c4ec63
test: cover timeline ripple action routing
Aug 21, 2026
a98a27c
test: verify lottie container preview parity
Aug 21, 2026
7daf1f7
docs: refresh timeline verification counts
Aug 21, 2026
5f78fa5
fix: preserve boosted webkit preview gain
Aug 21, 2026
2ed8a61
fix(preview): route lottie timelines through native playback
Aug 22, 2026
eb1cc1a
fix(export): preserve cancellation during progress setup
Aug 22, 2026
1172938
docs(qa): record media extension placeholders
Aug 22, 2026
cbbf0dd
docs(qa): record browser fallback layout metrics
Aug 22, 2026
17bcb8c
feat(media): enable text editing panel
Aug 22, 2026
d87b74f
feat(media): enable effect preset panel
Aug 22, 2026
33ee8e2
fix(media): preserve effects for linked video selections
Aug 22, 2026
3c68cf7
Prepare Beta 6 with editor updates, verified search assets and offici…
Sep 6, 2026
4e08454
Exclude local demo session lock from video sources
Sep 6, 2026
dee0685
Merge remote-tracking branch 'origin/main' into release/v1.0.0-beta.6
Sep 6, 2026
64dce59
Fix Windows semantic inference and enforce PCM sample budgets
Sep 6, 2026
aa40672
Resolve desktop export responsiveness and media rendering races
Sep 6, 2026
d1a020e
Drain Chromium startup frames before publishing capture generations
Sep 6, 2026
47a0e1d
Retain delete-capable Windows export handles through output verification
Sep 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions .github/workflows/motion-readback-qualification.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: Motion readback qualification

on:
push:
branches: ['release/**']
paths:
- 'crates/opentake-motion/**'
- '.github/workflows/motion-readback-qualification.yml'
workflow_dispatch:
inputs:
commit_sha:
description: Exact candidate commit for Motion readback qualification
required: true
type: string

permissions:
contents: read

jobs:
motion-readback:
name: Motion readback (${{ matrix.os }})
strategy:
fail-fast: false
matrix:
os: [ubuntu-24.04, windows-2022]
runs-on: ${{ matrix.os }}
timeout-minutes: 30
env:
CARGO_BUILD_JOBS: 2
OPENTAKE_MOTION_TRACE: '1'
steps:
- name: Validate immutable source input
shell: pwsh
env:
SOURCE_SHA: ${{ inputs.commit_sha || github.sha }}
run: |
if ($env:SOURCE_SHA -cnotmatch '^[0-9a-f]{40}$') { throw 'Expected exact 40-hex source SHA' }
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
ref: ${{ inputs.commit_sha || github.sha }}
persist-credentials: false
- name: Cache qualification dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: motion-readback-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml') }}
- name: Assert source and run complete Motion qualification
shell: pwsh
env:
SOURCE_SHA: ${{ inputs.commit_sha || github.sha }}
run: |
if ((git rev-parse HEAD).Trim() -cne $env:SOURCE_SHA) { throw 'Source SHA mismatch' }
rustc --version
cargo --version
$output = cargo test --locked -p opentake-motion --features chromium --lib --test chromium --jobs 2 -- --nocapture --test-threads=1 2>&1
$testExit = $LASTEXITCODE
$output | Set-Content -Encoding utf8 motion-readback-qualification.log
$output | ForEach-Object { Write-Output $_ }
if ($testExit -ne 0) { throw 'Motion readback qualification failed' }
$text = $output -join "`n"
if ($text -notmatch 'test result: ok\. 97 passed; 0 failed; 0 ignored;') { throw 'Expected all 97 Motion unit tests' }
if ($text -notmatch 'test result: ok\. 7 passed; 0 failed; 0 ignored;') { throw 'Expected all 7 Chromium integration tests' }
if ($text -notmatch '4K opaque single-frame elapsed_ms=\d+' -or $text -notmatch '4K transparent single-frame elapsed_ms=\d+') { throw 'Both real 4K paths must execute' }
- name: Preserve qualification evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: motion-readback-${{ matrix.os }}-${{ inputs.commit_sha || github.sha }}
path: motion-readback-qualification.log
12 changes: 6 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,8 @@ jobs:
expected_version = "1.0.0-beta.4"
expected_wix_version = "1.0.0.4"
else:
expected_version = "1.0.0-beta.5"
expected_wix_version = "1.0.0.5"
expected_version = "1.0.0-beta.6"
expected_wix_version = "1.0.0.6"
if "+" in tag:
raise SystemExit("SemVer build metadata is unsupported for updater asset URLs")
if SEMVER_RE.fullmatch(tag) is None:
Expand All @@ -188,8 +188,8 @@ jobs:
if not notes.is_file() or not notes.read_text(encoding="utf-8").strip():
raise SystemExit(f"release notes are missing or empty: {notes}")
prerelease = "-" in version.split("+", 1)[0]
if version == "1.0.0-beta.5" and not prerelease:
raise SystemExit("OpenTake 1.0.0-beta.5 must remain a prerelease")
if version == "1.0.0-beta.6" and not prerelease:
raise SystemExit("OpenTake 1.0.0-beta.6 must remain a prerelease")
if not prerelease:
raise SystemExit("this release workflow publishes prereleases only")

Expand Down Expand Up @@ -333,7 +333,7 @@ jobs:
> "$tooling_root/test_provision_ffmpeg_sidecars.py"
git cat-file blob "$RELEASE_TOOLING_SHA:.github/workflows/release.yml" \
> "$tooling_root/release.yml"
git cat-file blob "$RELEASE_TOOLING_SHA:docs/releases/1.0.0-beta.5.md" \
git cat-file blob "$RELEASE_TOOLING_SHA:docs/releases/1.0.0-beta.6.md" \
> "$tooling_root/release-notes.md"
test -s "$tooling_root/check_release_workflow.py"
test -s "$tooling_root/test_check_release_workflow.py"
Expand Down Expand Up @@ -372,7 +372,7 @@ jobs:
run: |
set -euo pipefail
case "$OPENTAKE_EXPECTED_RELEASE_VERSION" in
1.0.0-beta.5)
1.0.0-beta.6)
python3 -B -m unittest discover -s scripts -p 'test_check_license_inventory.py'
python3 -B scripts/check_license_inventory.py
;;
Expand Down
65 changes: 65 additions & 0 deletions .github/workflows/semantic-model-qualification.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
name: Semantic model qualification

on:
push:
branches: ['release/**']
workflow_dispatch:
inputs:
commit_sha:
description: Exact candidate commit for real model qualification
required: true
type: string

permissions:
contents: read

jobs:
real-model:
name: Real SigLIP2 (${{ matrix.os }})
strategy:
fail-fast: false
matrix:
os: [macos-15, windows-2022]
runs-on: ${{ matrix.os }}
timeout-minutes: 60
steps:
- name: Validate immutable source input
shell: pwsh
env:
SOURCE_SHA: ${{ inputs.commit_sha || github.sha }}
run: |
if ($env:SOURCE_SHA -cnotmatch '^[0-9a-f]{40}$') { throw 'Expected exact 40-hex source SHA' }
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
ref: ${{ inputs.commit_sha || github.sha }}
persist-credentials: false
- name: Cache qualification dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: semantic-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml') }}
- name: Assert source and export production manifest
shell: pwsh
env:
SOURCE_SHA: ${{ inputs.commit_sha || github.sha }}
run: |
if ((git rev-parse HEAD).Trim() -cne $env:SOURCE_SHA) { throw 'Source SHA mismatch' }
cargo run --locked -p opentake-media --features model-download --example search_manifest --quiet > search-manifest.json
if ($LASTEXITCODE -ne 0) { throw 'Production manifest export failed' }
- name: Fetch checksum-pinned model and image fixtures
shell: pwsh
run: |
python scripts/prepare_search_model_fixtures.py --manifest search-manifest.json --output "$env:RUNNER_TEMP/search-fixtures"
if ($LASTEXITCODE -ne 0) { throw 'Fixture verification failed' }
- name: Exercise real installed model, embeddings and ranking
shell: pwsh
run: |
$env:OPENTAKE_SEARCH_MODEL_TEST_DIR = "$env:RUNNER_TEMP/search-fixtures"
$output = cargo test --locked -p opentake-media --features model-download,ort-backend --lib real_model_offline_install_embeddings_and_ranking -- --ignored --nocapture --test-threads=1 2>&1
$testExit = $LASTEXITCODE
$output | ForEach-Object { Write-Output $_ }
if ($testExit -ne 0) { throw 'Real model qualification failed' }
if (-not ($output -match 'test result: ok\. 1 passed; 0 failed; 0 ignored;')) { throw 'Expected exactly one executed real-model test' }
101 changes: 101 additions & 0 deletions .github/workflows/windows-export-qualification.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: Windows export qualification

on:
push:
branches: ['release/**']
paths:
- 'src-tauri/src/export.rs'
- '.github/workflows/windows-export-qualification.yml'
workflow_dispatch:
inputs:
commit_sha:
description: Exact candidate commit for Windows export qualification
required: true
type: string

permissions:
contents: read

jobs:
windows-export:
runs-on: windows-2022
timeout-minutes: 60
env:
SOURCE_SHA: ${{ inputs.commit_sha || github.sha }}
CARGO_BUILD_JOBS: 2
defaults:
run:
shell: pwsh
steps:
- name: Validate immutable source input
run: |
if ($env:SOURCE_SHA -cnotmatch '^[0-9a-f]{40}$') { throw 'Expected exact 40-hex source SHA' }
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
with:
ref: ${{ env.SOURCE_SHA }}
persist-credentials: false
- name: Cache Cargo target and dependencies
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: windows-export-${{ runner.arch }}-${{ hashFiles('**/Cargo.toml', 'Cargo.lock', 'rust-toolchain.toml') }}
- name: Bind source and provision locked Windows sidecars
run: |
$actual = (git rev-parse HEAD).Trim()
if ($actual -cne $env:SOURCE_SHA) { throw 'Source SHA mismatch' }
"source_sha=$actual" | Set-Content -Encoding utf8 windows-export-qualification.log
$provision = python scripts/provision_ffmpeg_sidecars.py --target x86_64-pc-windows-msvc 2>&1
$provisionExit = $LASTEXITCODE
$provision | Set-Content -Encoding utf8 windows-export-provision.log
$provision | ForEach-Object { Write-Output $_ }
if ($provisionExit -ne 0) { throw 'Pinned FFmpeg provisioning failed' }
$toolsDir = Join-Path $env:RUNNER_TEMP 'opentake-export-ffmpeg'
New-Item -ItemType Directory -Force $toolsDir | Out-Null
foreach ($tool in @('ffmpeg', 'ffprobe')) {
$sidecar = Join-Path $env:GITHUB_WORKSPACE "src-tauri/binaries/$tool-x86_64-pc-windows-msvc.exe"
if (-not (Test-Path -LiteralPath $sidecar -PathType Leaf)) { throw "Missing pinned sidecar: $tool" }
$envName = 'OPENTAKE_' + $tool.ToUpperInvariant()
"$envName=$sidecar" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
# Legacy test helpers use bare executable names; keep them on the
# same provisioned bytes rather than the runner's unrelated FFmpeg.
Copy-Item -LiteralPath $sidecar -Destination (Join-Path $toolsDir "$tool.exe") -Force
}
$toolsDir | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
- name: Run debug Tauri export tests and verify required regressions
run: |
foreach ($sidecar in @($env:OPENTAKE_FFMPEG, $env:OPENTAKE_FFPROBE)) {
$version = & $sidecar -version 2>&1
$versionExit = $LASTEXITCODE
$version | Add-Content -Encoding utf8 windows-export-sidecars.log
$version | ForEach-Object { Write-Output $_ }
if ($versionExit -ne 0) { throw 'Pinned FFmpeg sidecar is not runnable' }
}
$output = cargo test --locked -p opentake-tauri --lib export::tests --jobs 2 -- --nocapture --test-threads=1 2>&1
$testExit = $LASTEXITCODE
$lines = @($output | ForEach-Object { "$_" })
$lines | Add-Content -Encoding utf8 windows-export-qualification.log
$lines | ForEach-Object { Write-Output $_ }
if ($testExit -ne 0) { throw 'Tauri export qualification failed' }
$text = [regex]::Replace(($lines -join "`n"), '\x1b\[[0-?]*[ -/]*[@-~]', '')
foreach ($name in @(
'export_output_cleanup_removes_active_partial_output_on_drop',
'export_output_probe_reads_the_retained_file_before_cleanup'
)) {
$pattern = '(?m)^test export::tests::' + [regex]::Escape($name) + ' \.\.\. ok\s*$'
if ($text -notmatch $pattern) { throw "Required regression did not actually pass: $name" }
}
if ($text -notmatch '(?m)^test result: ok\. [1-9][0-9]* passed; 0 failed; 0 ignored;') {
throw 'Expected a nonempty export test group with zero failures and zero ignored tests'
}
- name: Preserve qualification evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: windows-export-${{ env.SOURCE_SHA }}
path: |
windows-export-qualification.log
windows-export-provision.log
windows-export-sidecars.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
# Task 2 Report — Preview Temporal Remap Parity

## Scope

- Task: restore Preview controls for the native temporal-remap route after Task 1 routed compositor temporal timelines to Rust.
- Baseline commit: `ad0bd70`
- Task 1 dependency acknowledged:
- route work landed in `a833764`
- follow-up fix landed in `1013355`
- Modified files:
- `web/src/components/preview/Preview.tsx`
- `web/src/components/preview/Preview.test.tsx`
- `web/src/components/preview/previewEngine.test.ts`

## Constraints Followed

- Only changed the brief-listed Preview files plus this required task report.
- Did not modify Rust, upstream Swift, docs, or user audit files.
- Did not dispatch subagents or reviewers.
- Added/updated tests before touching production code.
- Reused the existing native playback surface, controller identity, clock, and capture flow.

## Root Cause

Task 1 already changed the route contract so temporal compositor timelines no longer return `unsupported` when Rust playback is available.

That left two Preview-side gaps:

- stale UI tests still treated `reversed` compositor timelines as unsupported
- the native timeline surface had no explicit `data-playback-surface="native"` marker, so the Preview contract could not assert the Rust surface directly

No Rust/engine production route change was needed for temporal remap playback itself.

## Red Phase

Added temporal compositor coverage with a `text` clip using:

- `reversed: true`
- `speed: 1.5`

Focused command run before implementation:

```bash
NODE_OPTIONS=--localstorage-file=/tmp/opentake-vitest-localstorage-preview-remap-ui.json pnpm exec vitest run src/components/preview/Preview.test.tsx src/components/preview/previewEngine.test.ts
```

Observed failures before implementation:

- old unsupported tests failed because the current route now correctly renders the Rust surface for temporal compositor timelines
- the new native-surface assertion failed because Preview did not emit `data-playback-surface="native"` on the timeline Rust path

This confirmed the engine route was already correct, while the Preview test contract and one surface marker were outdated/incomplete.

## Green Phase

Production change in `Preview.tsx`:

- wrapped the timeline `RustFrameBuffer` in a minimal container that emits `data-playback-surface="native"` only when `playbackRoute.kind === "rust"`

Test updates:

- added a shared temporal compositor fixture in `Preview.test.tsx`
- asserted that Rust-capable Preview shows:
- no `unsupported-playback-surface`
- `data-playback-surface="native"`
- enabled play/capture controls
- asserted that the same temporal compositor timeline still shows typed unsupported UI when Rust capability is unavailable
- updated the old generic unsupported Preview cases to use a genuinely unsupported `lottie` clip instead of the now-supported temporal compositor case
- updated `previewEngine.test.ts` so the temporal compositor route now expects:
- native playback start when capability resolves
- transport stop without native start when capability is unavailable

## Verification

Focused Preview/engine tests after the change:

```bash
NODE_OPTIONS=--localstorage-file=/tmp/opentake-vitest-localstorage-preview-remap-ui.json pnpm exec vitest run src/components/preview/Preview.test.tsx src/components/preview/previewEngine.test.ts
```

Result:

- `2` test files passed
- `44` tests passed
- exit code `0`

Build check:

```bash
pnpm build
```

Result:

- `tsc -b && vite build` passed
- Vite emitted pre-existing bundle-size / ineffective-dynamic-import warnings only
- exit code `0`

## Commit

Commit message:

```text
feat(preview): enable temporal compositor controls
```

## Notes / Concerns

- The worktree `.git` file still points at a stale absolute path under `/Users/lvbaiqing/...`, so plain `git` fails with `fatal: not a git repository: (null)`.
- Git operations for this task must use explicit:

```bash
GIT_DIR='/Users/trip/TRUE 开发/PRIMARY-CN/OpenTake/.git/worktrees/OpenTake-generation'
GIT_COMMON_DIR='/Users/trip/TRUE 开发/PRIMARY-CN/OpenTake/.git'
GIT_WORK_TREE='/Users/trip/TRUE 开发/PRIMARY-CN/OpenTake-generation'
```

- The repository contains many unrelated user changes outside this task; they were left untouched and excluded from the staged commit.
Loading
Loading