Files
hyperframes/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch
James 7509916227 feat(skills): remotion-to-hyperframes corpus T4 (5/7)
Adds the escape-hatch tier — lint-only fixtures that test the skill's
ability to refuse translation cleanly when it sees patterns that don't map
to HF's seek-driven model.

Cases (8 total):
  01-use-state.tsx          blocker: r2hf/use-state
  02-use-effect-deps.tsx    blocker: r2hf/use-effect-deps (multi-line body
                            with internal commas — regression target for
                            the regex bug fix in PR 2)
  03-async-metadata.tsx     blocker: r2hf/async-metadata
  04-third-party-react.tsx  blocker: r2hf/third-party-react-ui (@mui/material)
  05-lambda-config.tsx      blocker: r2hf/lambda-import
  06-warnings-only.tsx      warnings: delayRender / useCallback / useMemo
                            (no blockers — translates after dropping wrappers)
  07-custom-hook.tsx        warning: r2hf/custom-hook (pure useFadeIn)
  08-mixed.tsx              multiple blockers + warnings (aggregate test)

Each case documents:
  - The Remotion pattern it demonstrates
  - Why it's a blocker / warning / info
  - What the skill should do (refuse / drop-and-translate / translate-as-is)

Validation harness (validate.sh):
  Runs lint_source.py against each case, asserts:
    - Each expected blocker rule fires with severity="blocker"
    - Each expected warning rule fires with severity="warning"
    - lint_source.py exit code is 1 when blockers expected, 0 otherwise

T4 has no renders to diff. The skill is graded on lint correctness — that's
the gate that decides whether to translate or recommend the runtime interop
pattern from PR #214.

Result: 8/8 cases pass.
2026-04-27 23:55:24 +00:00
..

Tier 4 — escape-hatch

What it tests

T4 is the lint-only tier. There are no renders to diff — the skill is graded on whether it correctly refuses to translate each case (and recommends the runtime interop pattern from PR #214 instead) or, where appropriate, translates after dropping warning-level decorations.

Each cases/*.tsx file is a minimal Remotion composition that demonstrates one specific pattern. The skill should:

  1. Run scripts/lint_source.py over the source.
  2. Compare the JSON output to expected.json for that case.
  3. Take the documented skill_action:
    • refuse_translation_recommend_interop — print the rationale + link to the PR #214 interop guide; do not produce HF output.
    • drop_lambda_code_translate_remainder_if_clean — drop the @remotion/lambda code with a note; translate the rest only if no other blockers are present.
    • translate_after_dropping_wrappers — translate normally; drop useCallback / useMemo / delayRender wrappers.
    • inline_hook_body_if_pure — inline the custom hook's body if it's a pure derivation of useCurrentFrame; otherwise bow out.

Cases

# File Expected finding Notes
01 01-use-state.tsx blocker r2hf/use-state useState driving animation
02 02-use-effect-deps.tsx blocker r2hf/use-effect-deps useEffect/useLayoutEffect with non-empty deps
03 03-async-metadata.tsx blocker r2hf/async-metadata calculateMetadata returns a Promise
04 04-third-party-react.tsx blocker r2hf/third-party-react-ui imports @mui/material
05 05-lambda-config.tsx warning r2hf/lambda-import imports @remotion/lambda — drops, translates
06 06-warnings-only.tsx warnings only delayRender / useCallback / useMemo
07 07-custom-hook.tsx warning r2hf/custom-hook locally-defined useFadeIn (export const form)
08 08-mixed.tsx 3 blockers + 1 warning aggregate-findings test

Validation

./validate.sh

The script runs lint_source.py against each case and asserts:

  • Each expected blocker rule fires with severity blocker.
  • Each expected warning rule fires with severity warning (or stronger).
  • lint_source.py's exit code is 1 when blockers are expected, 0 otherwise.

T4 passes when every case matches its expected output. No renders involved.