mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-11 14:50:02 +00:00
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.
2.8 KiB
2.8 KiB
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:
- Run
scripts/lint_source.pyover the source. - Compare the JSON output to
expected.jsonfor that case. - 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/lambdacode with a note; translate the rest only if no other blockers are present.translate_after_dropping_wrappers— translate normally; dropuseCallback/useMemo/delayRenderwrappers.inline_hook_body_if_pure— inline the custom hook's body if it's a pure derivation ofuseCurrentFrame; 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.