Skip to content

reel: a funk2 shot can take its text mask from a copy line - #30

Open
IsraelWebDev wants to merge 2 commits into
mainfrom
card/reel-mask-copy
Open

IsraelWebDev wants to merge 2 commits into
mainfrom
card/reel-mask-copy

Conversation

@IsraelWebDev

Copy link
Copy Markdown
Owner

A funk2 source may name a copy line with mask_copy_id. The recipe's one text-masked layer then draws that copy text, so the copy lock and the text audit cover a masked word the same as a caption.

  • schema: Source.mask_copy_id (funk2 only)
  • copydeck: the id is a copy reference (existing unknown-id check and copy lock)
  • validate: exactly one text-masked layer, and that mask carries no text of its own
  • render: copy text becomes the mask text; text_mask refuses inexact drawing
  • audit: one /source_mask/0 entry per shot; a missing entr## Summary
  • A funk2 shot source can name a copy line as its one text mask: source: {"funk2": "recipe.json", "mask_copy_id": "hook"}. The recipe's text-masked layer then draws the copy text. That makes a kinetic-type word covered by the copy lock and the reel's text audit, as captions already are. Source: promo feedback of 2026-11-12, claude/promo-feedback-2026-11-12.md. Spec: docs/specs/reel-mask-copy.md.
    • schema: Source.mask_copy_id, funk2 only.
    • copydeck: the id is a copy reference, so the existing unknown-id check and the copy lock apply.
    • validate: the recipe needs exactly one text-masked layer, and that mask must carry no text of its own.
    • render: the copy text becomes the mask text when the recipe loads. The existing text mask refuses inexact drawing.
    • audit: each such shot gets <shot>/source_mask/0 in text_audit.json, with the exact text and its frames. A missing entry fails ok.
    • docs: section in docs/reel.md.
  • Tests

    • tests/reel/test_mask_copy.py (7 tests): parse (funk2 only), copy reference, validate (recipe without text validates; unknown copy id; own text refused; two text masks refused). All 7 pass locally on Windows.
    • tests/test_catalog.py and tests/test_mask_bevel_text.py: 22 passed locally.
    • ruff check and ruff format --check pass on funkbox and tests.
    • Not covered by a local test: the render itself and the audit entry it writes. Those need the GL path. CI runs them.
    • The broader local run over 190 existing funk2, audit and reel tests was still running when this was opened, so CI's full suite is the check that counts. Its result will be posted here.
  • Not in this change

    • Validate does not check that the copy text fits the mask. The render reports a failure if it does not draw.
    • The mask is static. A typewriter or per-letter reveal on a mask is a later card.
  • Not merged. Waiting for CI and approval.
  • 🤖 Generated with Claude Code
  • https://claude.ai/code/session_019RsXeZ8D98yMUSMFhvgEiDy fails ok
  • docs/reel.md section; docs/specs/reel-mask-copy.md
  • tests/reel/test_mask_copy.py

Claude-Session: https://claude.ai/code/session_019RsXeZ8D98yMUSMFhvgEiD

IsraelWebDev and others added 2 commits November 12, 2026 11:31
A funk2 source may name a copy line with mask_copy_id. The recipe's one text-masked layer then draws that copy text, so the copy lock and the text audit cover a masked word the same as a caption.

- schema: Source.mask_copy_id (funk2 only)
- copydeck: the id is a copy reference (existing unknown-id check and copy lock)
- validate: exactly one text-masked layer, and that mask carries no text of its own
- render: copy text becomes the mask text; text_mask refuses inexact drawing
- audit: one <shot>/source_mask/0 entry per shot; a missing entry fails ok
- docs/reel.md section; docs/specs/reel-mask-copy.md
- tests/reel/test_mask_copy.py

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RsXeZ8D98yMUSMFhvgEiD
The audit now reads Source.mask_copy_id, so the test stub needs the field.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RsXeZ8D98yMUSMFhvgEiD
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