Human-only; requires Final Cut Pro. This is the Share and Export step: generate
the .fcpxml, import it, confirm it renders, then use Final Cut's Share → Master File
to produce the .mp4. It is manual because Final Cut exposes no scripting verb for
export (see "Why the Final Cut export step is manual" above).
Procedure
swift run fcpxml-dsl export presentation presentation.fcpxml
swift run fcpxml-dsl verify-import presentation.fcpxml
- Confirm visually in Final Cut that the slides and dissolves render as intended —
in particular that anchored titles appear over their generator backgrounds.
- Share → Master File, H.264, 1080p24.
- Drag the resulting
.mp4 into a GitHub issue or PR comment. GitHub returns a
permanent https://github.com/user-attachments/assets/<uuid> URL.
- Paste that URL bare, on its own line into
README.md.
Why that hosting mechanism
GitHub's markdown renderer will not play a repo-hosted video.
 renders as a broken image or a plain link. A bare
user-attachments URL on its own line renders a real inline player, and it keeps a
multi-MB binary out of a package repository that SwiftPM clones on every resolve.
README changes
Place the video near the top of ### Authoring with FCPKitDSL (README.md:122-155),
with a copy-pasteable PresentationDocument snippet beneath it.
While there: README.md:151 says the CLI "exports two smoke-test cuts". That is stale —
e2a64c3 added rgb for a third, and Issue 5 adds a fourth. Update the count.
Evidence doc
Create docs/manual/presentation-demo.md recording the procedure as performed, with
Final Cut and FCPXML versions, matching the fixture-provenance convention in
AGENTS.md and the precedent of docs/manual/typed-generation-gate.md.
That doc must also record why step 4 is manual, citing the evidence from
"Why the Final Cut export step is manual" above: one get command, every property
access="r", everything behind the com.apple.FinalCut.library.inspection
read-only access group. Include the bundle-identifier-based sdef invocation from
that section so a future reader can re-verify against a newer Final Cut release
rather than taking the claim on trust.
Verify during import — genuinely unknown until Final Cut sees the file
- Does Final Cut render an anchored title over a
<video>-backed generator on
lane 1? The DTD permits it and lane semantics say yes, but this combination has
not been round-tripped through Final Cut in this repo.
- Do cross dissolves between two generators behave like dissolves between asset
clips? Transition packing assumes T/2 overlap on both neighbors. Generators have
no media handles beyond their declared duration, so Final Cut may object to the
overlap. If it does, the mitigation is extending each generator's duration by T/2
on each side.
Record the outcome of both in docs/manual/presentation-demo.md either way — a
negative result is evidence worth keeping.
Acceptance criteria
- The README shows an inline-playing video and a copy-pasteable snippet.
- No new files at the repo root (per the
AGENTS.md docs-layout rule).
docs/manual/presentation-demo.md records versions, the sdef rationale, and the
two verification outcomes.
Conventions
- MIT header block on every new file (see
Scripts/header.sh).
- Swift Testing (
import Testing, @Test) for new tests, per .claude/agent-notes.md. Include "Tests" in either the parent enum or the child struct, never both.
- Doc comments on every public declaration.
- Keep files under 225 lines (SwiftLint
file_length); prefer Type+Modifiers.swift splits.
- Run
swift test and swift run fcpxml-diff schema-completeness Tests/FCPKitTests/TestData before each PR. Prefer opening a PR over merging.
Full spec with context and rationale: docs/planning/demo-presentation-video.md
Human-only; requires Final Cut Pro. This is the Share and Export step: generate
the
.fcpxml, import it, confirm it renders, then use Final Cut's Share → Master Fileto produce the
.mp4. It is manual because Final Cut exposes no scripting verb forexport (see "Why the Final Cut export step is manual" above).
Procedure
swift run fcpxml-dsl export presentation presentation.fcpxmlswift run fcpxml-dsl verify-import presentation.fcpxmlin particular that anchored titles appear over their generator backgrounds.
.mp4into a GitHub issue or PR comment. GitHub returns apermanent
https://github.com/user-attachments/assets/<uuid>URL.README.md.Why that hosting mechanism
GitHub's markdown renderer will not play a repo-hosted video.
renders as a broken image or a plain link. A bareuser-attachments URL on its own line renders a real inline player, and it keeps a
multi-MB binary out of a package repository that SwiftPM clones on every resolve.
README changes
Place the video near the top of
### Authoring with FCPKitDSL(README.md:122-155),with a copy-pasteable
PresentationDocumentsnippet beneath it.While there: README.md:151 says the CLI "exports two smoke-test cuts". That is stale —
e2a64c3addedrgbfor a third, and Issue 5 adds a fourth. Update the count.Evidence doc
Create
docs/manual/presentation-demo.mdrecording the procedure as performed, withFinal Cut and FCPXML versions, matching the fixture-provenance convention in
AGENTS.mdand the precedent ofdocs/manual/typed-generation-gate.md.That doc must also record why step 4 is manual, citing the evidence from
"Why the Final Cut export step is manual" above: one
getcommand, every propertyaccess="r", everything behind thecom.apple.FinalCut.library.inspectionread-only access group. Include the bundle-identifier-based
sdefinvocation fromthat section so a future reader can re-verify against a newer Final Cut release
rather than taking the claim on trust.
Verify during import — genuinely unknown until Final Cut sees the file
<video>-backed generator onlane 1? The DTD permits it and lane semantics say yes, but this combination has
not been round-tripped through Final Cut in this repo.
clips? Transition packing assumes T/2 overlap on both neighbors. Generators have
no media handles beyond their declared duration, so Final Cut may object to the
overlap. If it does, the mitigation is extending each generator's duration by T/2
on each side.
Record the outcome of both in
docs/manual/presentation-demo.mdeither way — anegative result is evidence worth keeping.
Acceptance criteria
AGENTS.mddocs-layout rule).docs/manual/presentation-demo.mdrecords versions, the sdef rationale, and thetwo verification outcomes.
Conventions
Scripts/header.sh).import Testing,@Test) for new tests, per.claude/agent-notes.md. Include "Tests" in either the parent enum or the child struct, never both.file_length); preferType+Modifiers.swiftsplits.swift testandswift run fcpxml-diff schema-completeness Tests/FCPKitTests/TestDatabefore each PR. Prefer opening a PR over merging.Full spec with context and rationale: docs/planning/demo-presentation-video.md