Files
gart/code/docs/CAPABILITY-AUDIT-2026-06.md

216 lines
15 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Capability Audit & Dual-Mode Roadmap — June 2026
> Produced 2026-06-11 from a 36-agent research sweep (8 researchers + 28 adversarial
> verifications: 22 confirmed, 6 partially-true, 0 refuted). Every load-bearing claim
> below was independently verified against primary sources — including the FCP 12.2
> binary installed on this machine (sdef dump, bundled DTD diff, Info.plist).
---
## 1. Where the ecosystem moved (Feb → Jun 2026)
While this repo idled after v0.7.0 (last push 2026-05-02), the FCP automation space
restructured:
| Event | Date | Why it matters |
|---|---|---|
| **Final Cut Pro 12.0** shipped (FCPXML **1.14**, Transcript Search, Visual Search, Beat Detection) | 2026-01-28 | We emit/target 1.11. FCP 12.2 (Apr 9) is current. Apple is absorbing low-end AI features natively. |
| **SpliceKit** launched (elliotttate + Chris Hocking/FCP Cafe) | 2026-03-30 | Live in-process FCP control via dylib injection. 221 MCP tools. Took the "most powerful" crown. |
| **CommandPost PR #3514** (MCP server over its WebSocket) opened, then abandoned | 2026-03-19 | Author pivoted to SpliceKit. Maintainer still "intends" native MCP. Unmerged. |
| **dreliq9/fcp-mcp** created — names THIS repo in its README as the baseline it beats | 2026-04-23 | "Where the competition stops at one layer." FCPXML engine + AppleScript live layer + ffprobe. 0 stars, but the positioning is public. |
| **SpliceKit went dormant** (no commits/releases since 2026-04-28; June issues unanswered) | 2026-04-28 → | The "live control" crown is sitting on an unmaintained injection layer. |
**Honest position today:** this repo is the most capable *pure-FCPXML* MCP server,
not "the most powerful AI editing MCP in the FCP ecosystem." SpliceKit owns the raw
power axis. The winnable axis is **safety + portability + media intelligence** —
no binary patching, runs on managed Macs, works without FCP installed, survives
every FCP update. Nobody else credibly occupies that quadrant *and* has format depth.
---
## 2. The control-surface map (verified)
### Official Apple surfaces (FCP 12.2, verified on-machine)
| Surface | Can | Cannot |
|---|---|---|
| **AppleScript dictionary** (`ProEditor.sdef`) | Enumerate open libraries → events → projects/sequences: names, IDs, durations, frame rates (100% read-only, sole command is `get`) | Create, modify, delete, export — anything |
| **Apple-event import** (`open` / odoc) | **Zero-click programmatic import** of `.fcpxml`/`.fcpxmld` with `<import-options>` (library location, copy assets, suppress warnings, base url). Officially documented. | Choose *where* in an open timeline content lands |
| **Workflow Extensions** (ProExtensionHost 1.1) | Floating panel inside FCP; read active sequence + playhead; observe selection/sequence changes; **movePlayhead(to:)** (the only write); drag media/FCPXML into timeline; host can network | Add clips, edit timeline content, modify sequences (explicitly excluded by Apple) |
| **FxPlug 4.3.4** | Render-graph plugins (effects/transitions/titles), timing/keyframe/project info | See or touch edit decisions entirely |
| **URL schemes / CLI / App Intents** | **Nothing — none exist** (verified: no CFBundleURLTypes, no appintents metadata, no headless mode) | — |
**The structural asymmetry: import is fully scriptable; there is NO official
programmatic export.** Reading back the user's current timeline requires a human
`File → Export XML` click — or an unofficial surface. Apple added **zero** new
automation hooks across FCP 11.0 → 12.2 (six releases). Do not bet on Apple opening up.
### Unofficial surfaces
| Route | Capability | Fragility | State |
|---|---|---|---|
| **SpliceKit** (MIT) — dylib-injected re-signed FCP copy, full ObjC runtime (78K classes: Flexo/Ozone/TimelineKit…), JSON-RPC on `127.0.0.1:9876` | Everything: blade, retime, color, effects, import/EXPORT, render, playback, 221 MCP tools | Breaks every FCP update; re-signed binary loses entitlements; DMCA §1201(f) asserted not tested; enterprise Macs will refuse it | **Dormant since 04-28** |
| **CommandPost** (MIT, 554★, v2.0.5 Feb 2026) — AXUIElement + per-version string tables; **built-in WebSocket server, port 27480**, executes any registered action by ID | Deep: timeline, full color suite, every inspector, export dialogs (incl. triggering Export XML via UI), media import. Production-proven (Apple's own WWDC videos graded through it) | Needs maintainer fix after essentially every FCP release; **v2 requires a paid LateNite app installed** (~US$10); v1 free but frozen | Alive |
| Raw AX / Keyboard Maestro / Hammerspoon | Menu clicks, shortcut chains | Brittle, shallow; CommandPost supersedes this for FCP | — |
### What FCPXML itself can never carry (the XML-only ceiling, DTD-verified)
- **Magnetic Mask** — Apple docs: "not included in XML exports." Period.
- **Transcript / visual-analysis / beat-detection data** — lives in the library, not the XML. 1.14's only additions are smart-collection *search* hooks referencing it.
- **Effect definitions** — referenced by uid; must exist on the importing machine.
- **Object-tracker + Cinematic depth data** — round-trips ONLY via `.fcpxmld` bundle sidecars (`dataLocator → locator`). Flat `.fcpxml` silently drops them.
- Render files, optimized media, undo history.
Fully round-trippable: clips/spines/lanes, multicam, sync clips, compounds,
**captions** (real CEA-608/ITT elements — Transcribe-to-Captions output lands here),
markers/keywords/roles, keyframed params, adjust-* intrinsics, filters with params.
**DTD version deltas are small** (1.12: filter nameOverride, optical-flow FRC;
1.13: stereo-3D/spatial, hidden-clip-marker, HFR conform; 1.14: smart-collection
search only — zero new timeline elements). Bumping support is cheap; the ground-truth
DTDs ship inside `/Applications/Final Cut Pro.app/.../Interchange.framework/Resources/`
(FCPXMLv1_0.dtd … FCPXMLv1_14.dtd). Apple's online FCPXML reference still documents
1.10 — the app bundle is the only real spec.
---
## 3. Competitive landscape
| Project | Stars | Approach | Status |
|---|---|---|---|
| samuelgursky/**davinci-resolve-mcp** | 1,217 | Real Resolve Python API; 341 granular tools | Active — shows the ceiling when an NLE has an official API (~20× FCP traction) |
| elliotttate/**SpliceKit** | 81 | Injection (live, everything) | Dormant 6 wks |
| **DareDev256/fcpxml-mcp-server** | 51 | Pure FCPXML | This repo |
| FireRed-**OpenStoryline** | 2,895 | Intention-driven editing agent (FCPXML as output) | Agentic rough-cut wave |
| DozaVisuals/**doza-assist** | 46 | Learns editing style from user's past cuts | Pushed daily |
| elliotttate/finalcutpro-mcp | 7 | JXA/System Events, 99 tools | Superseded by SpliceKit |
| Poechant/final-cut-pro-cli | 2 | FCPXML + .fcpbundle FS + minimal AppleScript | v0.1.0 May 27 |
| dreliq9/**fcp-mcp** | 0 | FCPXML + AppleScript live + ffprobe — "the most capable FCP MCP server" | Names us as the incumbent |
| OTIO fcpx adapter | 7 | — | **Dead** (last commit Jun 2024, no modern FCPXML) — OTIO is not a viable FCPXML path; we are more current than the "standard" |
| Eddie AI (commercial) | — | AI assembles → XML handoff → editor finishes in NLE | Validates our exact workflow pattern at NAB scale |
Python FCPXML competition is near zero (PyPI `fcpxml` is a placeholder; OTIO adapter
stale). The Swift side is livelier (pipeline-neo v2.5.2 validates DTDs 1.5–1.14;
orchetect/swift-fcpxml) — useful as reference implementations, not dependencies.
**CapCut verdict (asked 2026-06-11): lane crowded — don't build it.** ≥8 CapCut MCP
servers exist; VectCutAPI (1,977★) and capcut-mate (1,156★) push daily atop
pyJianYingDraft (3,425★). No official API; CN builds encrypt drafts; ByteDance
enforced its trademark (CapCutAPI → VectCutAPI forced rename). FCPXML is a documented,
stable Apple format — the opposite. Stay here.
---
## 4. Dual-mode architecture (decision)
Three tiers sharing one operation vocabulary. The repo audit found the de facto seam:
`FCPXMLModifier`'s ~30 public methods ARE the operation set; handlers are thin
(`_setup_modifier → method → save → _text_result`). Extract a backend Protocol over
that vocabulary; make `_setup_modifier` backend-selecting. Moderate refactor — not a
rewrite. (Known wart to fix on the way: read path uses frame-quantized `Timecode`
while write path uses rational `TimeValue` — unify on TimeValue.)
```
┌────────────────────────────────────┐
│ MCP tool surface (one schema) │
└────────────┬───────────────────────┘
┌────────────┴───────────────────────┐
│ Operation layer (~30 verbs) │
│ trim/split/retime/marker/reorder… │
└──┬──────────────┬──────────────┬───┘
Tier 1: XML │ Tier 2: Live (official) │ Tier 3: Bridges (optional)
─────────── │ ─────────────────────── │ ──────────────────────────
parser/writer │ • push-import (odoc + │ • SpliceKit JSON-RPC :9876
rough_cut/diff │ <import-options>) │ (if patched FCP running)
export — today │ • AppleScript library │ • CommandPost WS :27480
│ inspection (read) │ (if installed — incl.
│ • watch-folder round- │ triggering Export XML →
│ trip ergonomics │ closes the read-back loop)
│ • later: Workflow Ext │
│ (playhead/selection) │
└──────────────────────────┘
+ Media-intelligence layer feeding all tiers:
whisperX/parakeet · PySceneDetect 0.7/TransNetV2 · Beat This! · Silero VAD
· FastVLM/Qwen3-VL via mlx-vlm · ffmpeg-8 preview compiler
```
Principles:
1. **Never patch the binary.** Tier 3 *detects* SpliceKit/CommandPost if the user
installed them; we ship adapters, not injections. Safety is the brand.
2. **The export asymmetry is handled, not hidden:** watch-folder + one-keystroke
export instructions by default; CommandPost bridge automates the click when present;
SpliceKit bridge reads live state when present. Degrade gracefully.
3. **Media intelligence is the real moat.** Nobody couples FCPXML depth + actual
media analysis + preview-without-FCP. That combination is unique as of June 2026.
---
## 5. Roadmap
### v0.8 — Format currency (defensive, ~days)
- Parse FCPXML 1.12–1.14 (deltas enumerated above); tolerate unknown elements losslessly.
- `.fcpxmld` bundle read/write with **sidecar preservation** (don't destroy
object-tracking/Cinematic data — rare third-party tool that doesn't).
- CI: `xmllint --dtdvalid` against Apple's own bundled DTDs.
- Emit 1.13 by default (1.11 forfeits HFR/spatial attrs).
- Bulk media-relink tool (rewrite `media-rep src` paths — known user pain, trivial here).
- Hygiene: CHANGELOG entry for 0.7.0 missing; README badge says 912 tests / Testing
section says 795; README references nonexistent `fcpxml/README.md` and a phantom env var.
### v0.9 — Live mode v1, official surfaces only (~1-2 weeks)
- `push_to_fcp` tool: write FCPXML + `<import-options>`, fire the Apple event
(~20 lines; zero-click; officially supported).
- `list_open_libraries` / `get_fcp_state`: AppleScript read-only inspection via osascript.
- Watch-folder round-trip: user exports XML to a watched dir; server auto-detects,
diffs against last known state.
- Backend Protocol refactor (operation layer); split `server.py` (3,046 lines) into
`tools/` modules while at it.
### v0.10 — Media intelligence (the moat, ~weeks)
- Transcription: whisperX (word-level <100ms) or FluidAudio/Parakeet CoreML →
transcript-driven editing: cut-by-sentence, chapter markers, caption generation
into real FCPXML caption elements.
- Scene cuts: PySceneDetect 0.7 (has `save-fcp`!) + TransNetV2 for hard content.
- Beats: **Beat This!** (`pip install beat-this`, Apr 2026) — madmom is dead, do not dep.
- Silence: Silero VAD v6 / wrap auto-editor (public domain) rather than reimplement.
- Shot understanding: FastVLM / Qwen3-VL via mlx-vlm for "find the b-roll of X."
- **Preview-without-FCP**: compile timeline → ffmpeg trim/concat/xfade filtergraph,
render low-res proxy. Unfilled gap in the entire ecosystem; closes the verify loop.
### v1.0 — Bridges + positioning
- Optional adapters: SpliceKit `:9876` (live read/edit/export when present),
CommandPost `:27480` (action execution incl. Export XML trigger when present).
- Maintained OTIO bridge (the official adapter is dead — become the de facto one).
- Flagship demo: beat-synced music-video rough cut (350-video director credibility —
nobody else can author that demo).
- MCP Registry / Smithery refresh, FCP Cafe + Discord presence (the integration
debates are happening there; demand is explicit and unserved).
### Explicitly NOT doing
- CapCut MCP (crowded, encrypted format, trademark risk).
- Forking/bundling SpliceKit's injection (legal + fragility + enterprise rejection).
- Betting on Apple opening automation (two major versions, zero new hooks).
- madmom, OTIO-as-engine, raw AX scripting maintained solo.
---
## 6. Risks register
1. **SpliceKit revives** → it subsumes the live axis; our safety/portability framing
must be established before that. (Watch: github.com/elliotttate/SpliceKit commits.)
2. **dreliq9-class clones** — the tool taxonomy was replicated in ~a month by a 0-star
repo. Capability alone isn't the moat; distribution + format depth + media layer are.
3. **Apple absorbs from above** (native transcription/beat/visual search already) —
keep value in batch/programmatic workflows Apple won't ship.
4. **FCPXML coverage shrinks relatively** — Apple keeps new AI data library-side.
Means: the live bridges matter more over time, not less.
5. Round-trip lossiness blame: users will blame the tool for Apple's drops (Magnetic
Mask, sidecars). Document loudly; preserve bundles.
---
*Sources: 36-agent verified sweep 2026-06-11. Researcher outputs archived at
`/tmp/fcp-research/` (session-local). Key primary sources: FCP 12.2 sdef + bundled
DTDs (local), developer.apple.com Professional Video Applications docs,
github.com/elliotttate/SpliceKit, CommandPost PR #3514, Apple release notes 102825.*