@revola-ai/video-craft 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -0
- package/dist/anchors.js +69 -0
- package/dist/corpus.js +91 -0
- package/dist/projectDoc.js +83 -0
- package/dist/projectDocSync.js +39 -0
- package/dist/projectMeta.js +37 -0
- package/dist/provenance.js +41 -0
- package/dist/radar-check-ids.json +34 -0
- package/dist/registry.js +307 -0
- package/dist/rules/animatedBarChartTightBox.js +15 -0
- package/dist/rules/animatedBarChartWhenNotToUse.js +15 -0
- package/dist/rules/animatedBarChartWhenToUse.js +15 -0
- package/dist/rules/animatedLineChartWhenNotToUse.js +15 -0
- package/dist/rules/animatedLineChartWhenToUse.js +15 -0
- package/dist/rules/approvedSfxPaletteOnly.js +15 -0
- package/dist/rules/atmosphereGradientsFadeAtBothEnds.js +15 -0
- package/dist/rules/audioIsTheClock.js +16 -0
- package/dist/rules/beatsDeriveFromTheirOwnSequence.js +15 -0
- package/dist/rules/bestSceneSetsTheBar.js +15 -0
- package/dist/rules/bumpBeforeRefreeze.js +15 -0
- package/dist/rules/cameraIsTheNarrator.js +15 -0
- package/dist/rules/checkPinBeforeShip.js +16 -0
- package/dist/rules/coldViewerClarity.js +15 -0
- package/dist/rules/commitOrCutEffects.js +29 -0
- package/dist/rules/convertFramesAcrossClockBoundary.js +15 -0
- package/dist/rules/crossCutElementsLiveInTheHudLayer.js +15 -0
- package/dist/rules/cursorClicksRealControls.js +15 -0
- package/dist/rules/cutOnRealAudioPauses.js +15 -0
- package/dist/rules/darkButNeverDim.js +15 -0
- package/dist/rules/dataRadarTagsDeclared.js +193 -0
- package/dist/rules/declareAVerticalZoneMap.js +15 -0
- package/dist/rules/deleteRejectedRigsCompletely.js +15 -0
- package/dist/rules/deriveSeamsDontMeasure.js +17 -0
- package/dist/rules/deterministicSceneSource.js +65 -0
- package/dist/rules/diegeticSoundForOnscreenActions.js +15 -0
- package/dist/rules/distinctTransitionPerBeat.js +15 -0
- package/dist/rules/downloadOrDrawRichAssets.js +15 -0
- package/dist/rules/elementOnscreenForItsVoSentence.js +17 -0
- package/dist/rules/emitBuildNotes.js +15 -0
- package/dist/rules/energyFromTimingNotPartCount.js +15 -0
- package/dist/rules/evidenceBeforeClaimingFixed.js +15 -0
- package/dist/rules/exactPeerLockstep.js +15 -0
- package/dist/rules/firstPassIsADraft.js +15 -0
- package/dist/rules/fixCrowdingByRebandingNotNudging.js +15 -0
- package/dist/rules/fixesPreserveApprovedElements.js +15 -0
- package/dist/rules/floatingNotBoxed.js +15 -0
- package/dist/rules/focusBeatsRecedeTheContext.js +15 -0
- package/dist/rules/fontVarsBrandRemocn.js +15 -0
- package/dist/rules/geometricSeamsNotCrossfades.js +23 -0
- package/dist/rules/geometrySidecarExportsTyped.js +36 -0
- package/dist/rules/glowIsAFocalAccent.js +22 -0
- package/dist/rules/heroFillsTheFrame.js +17 -0
- package/dist/rules/htmlMasksForAnimatedCounters.js +15 -0
- package/dist/rules/impactStackOnPayoffs.js +15 -0
- package/dist/rules/interactiveTargetsAreDeclaredData.js +15 -0
- package/dist/rules/interpolateLiteralKeysMonotonic.js +79 -0
- package/dist/rules/latenessIsStructuralOverlapTheBeats.js +15 -0
- package/dist/rules/lessTextMoreVisualizations.js +15 -0
- package/dist/rules/liveLinkDuplicateReactAlias.js +15 -0
- package/dist/rules/make2dElements3d.js +15 -0
- package/dist/rules/masterMixLoudnessTarget.js +17 -0
- package/dist/rules/measureAlignmentDontEyeball.js +15 -0
- package/dist/rules/motionCarriesWeightAndMeaning.js +15 -0
- package/dist/rules/motionDensityFloor.js +15 -0
- package/dist/rules/neverEditTierBVendored.js +15 -0
- package/dist/rules/neverRestateDerivedFrameNumbersInComments.js +15 -0
- package/dist/rules/noAiGradientLook.js +15 -0
- package/dist/rules/noColoredFlashToHideACut.js +22 -0
- package/dist/rules/noDoubleFrameShift.js +126 -0
- package/dist/rules/noDuplicateMotionPrimitives.js +15 -0
- package/dist/rules/noLinearMotion.js +22 -0
- package/dist/rules/noNestedSvgFilters.js +93 -0
- package/dist/rules/noRepeatedAssetAcrossShots.js +15 -0
- package/dist/rules/noShorthandWithUndefinedLonghand.js +93 -0
- package/dist/rules/noStackedFadesAtACut.js +24 -0
- package/dist/rules/noStaticHolds.js +17 -0
- package/dist/rules/occlusionVisibleElements.js +17 -0
- package/dist/rules/oneContinuousVoTrack.js +15 -0
- package/dist/rules/onePunchPerMomentClass.js +15 -0
- package/dist/rules/oneRenderPerRound.js +15 -0
- package/dist/rules/openStaticAfterAHardCut.js +22 -0
- package/dist/rules/openingsAndClosingsCarryMore.js +15 -0
- package/dist/rules/persistentDeviceFrames.js +15 -0
- package/dist/rules/pixelDiffAnEmptyBandFirst.js +15 -0
- package/dist/rules/planIsPublishedNotGating.js +15 -0
- package/dist/rules/poweredByRevolaWatermark.js +15 -0
- package/dist/rules/predrawContentPresentAtTheCut.js +17 -0
- package/dist/rules/premiumSurfacesNotFlatBorders.js +15 -0
- package/dist/rules/radarDispositionsAreHumanOnly.js +17 -0
- package/dist/rules/realAssetsNotPlaceholders.js +15 -0
- package/dist/rules/rebuildUiFromReconNotScreenshots.js +15 -0
- package/dist/rules/reconStrandsRunInParallel.js +15 -0
- package/dist/rules/registryBeforeHandrolling.js +15 -0
- package/dist/rules/remapRateEndpointFormula.js +15 -0
- package/dist/rules/remocnContentTailwindChrome.js +15 -0
- package/dist/rules/retimeOnlyViaPlaybackOrDesignTokens.js +15 -0
- package/dist/rules/reviewTheRenderByFrameSweep.js +15 -0
- package/dist/rules/rollingNumberBoundedSequence.js +17 -0
- package/dist/rules/rollingNumberSequenceLayoutNone.js +16 -0
- package/dist/rules/rollingNumberTightBoxAlignment.js +15 -0
- package/dist/rules/rollingNumberWhenNotToUse.js +17 -0
- package/dist/rules/rollingNumberWhenToUse.js +17 -0
- package/dist/rules/sameFamilySameProject.js +15 -0
- package/dist/rules/sampleBrandFromProduct.js +15 -0
- package/dist/rules/sampleVelocityFromPreviousFramePosition.js +15 -0
- package/dist/rules/sceneRootTagDeclared.js +41 -0
- package/dist/rules/scrubDemoDataToGenericRoles.js +15 -0
- package/dist/rules/selfReviewThePlanForGaps.js +15 -0
- package/dist/rules/sourceArchivedBeforeBrief.js +17 -0
- package/dist/rules/statisticsSelfExplanatory.js +15 -0
- package/dist/rules/stopsAsRelativeSpacing.js +15 -0
- package/dist/rules/theWholeCanvasWorks.js +15 -0
- package/dist/rules/themePerSection.js +22 -0
- package/dist/rules/thesisDeclaredInBrief.js +17 -0
- package/dist/rules/tierARequiresPropUnreachableEdit.js +15 -0
- package/dist/rules/tinyBodyCopyAsRuledLines.js +15 -0
- package/dist/rules/titlesPinnedOutsideCameraPush.js +15 -0
- package/dist/rules/tokensNotRawHexes.js +60 -0
- package/dist/rules/typeTokenDefaultedParamsAsString.js +15 -0
- package/dist/rules/varyKitChoreographyAcrossSections.js +15 -0
- package/dist/rules/varyTheVisualizationGrammar.js +15 -0
- package/dist/rules/verifyCheapRenderDear.js +15 -0
- package/dist/rules/voAddressesTheViewer.js +15 -0
- package/dist/rules/voIsAPerformance.js +15 -0
- package/dist/rules/voScriptLocksSpokenWords.js +15 -0
- package/dist/rules/wrappersPreserveChildGeometry.js +15 -0
- package/dist/sourceCheck.js +47 -0
- package/dist/sourceCitations.js +68 -0
- package/dist/stageProjection.js +69 -0
- package/dist/stages.js +163 -0
- package/dist/testSupport.js +6 -0
- package/dist/types.js +0 -0
- package/dist/variants.js +8 -0
- package/dist/waiverProjection.js +20 -0
- package/package.json +32 -0
- package/src/anchors.test.ts +119 -0
- package/src/anchors.ts +110 -0
- package/src/corpus.test.ts +96 -0
- package/src/corpus.ts +149 -0
- package/src/corpusProject.test.ts +103 -0
- package/src/creativeEdge.test.ts +58 -0
- package/src/distBuild.test.ts +86 -0
- package/src/docStatus.test.ts +81 -0
- package/src/drift.test.ts +124 -0
- package/src/fixtures/data-radar-dynamic/Branches.tsx +14 -0
- package/src/fixtures/data-radar-dynamic/plan.fixture.yaml +16 -0
- package/src/fixtures/data-radar-forwarded/Scene.tsx +19 -0
- package/src/fixtures/data-radar-forwarded/plan.fixture.yaml +13 -0
- package/src/fixtures/data-radar-opaque/Scene.tsx +15 -0
- package/src/fixtures/data-radar-opaque/plan.fixture.yaml +10 -0
- package/src/fixtures/data-radar-tags/SceneClean.tsx +10 -0
- package/src/fixtures/data-radar-tags/SceneNullBinding.tsx +12 -0
- package/src/fixtures/data-radar-tags/SceneWithGap.tsx +11 -0
- package/src/fixtures/data-radar-tags/plan.fixture.yaml +29 -0
- package/src/fixtures/deterministic-scene.tsx +15 -0
- package/src/fixtures/double-shift/aliased.tsx +13 -0
- package/src/fixtures/double-shift/assigned.tsx +13 -0
- package/src/fixtures/double-shift/clean.tsx +19 -0
- package/src/fixtures/double-shift/destructured.tsx +12 -0
- package/src/fixtures/double-shift/elementAccess.tsx +12 -0
- package/src/fixtures/double-shift/layout.ts +24 -0
- package/src/fixtures/double-shift/mechanism-prefix.tsx.txt +458 -0
- package/src/fixtures/double-shift/wrapped.tsx +15 -0
- package/src/fixtures/geometry-sidecar-missing-export.ts +10 -0
- package/src/fixtures/geometry-sidecar-missing-type.ts +7 -0
- package/src/fixtures/geometry-sidecar-valid.ts +6 -0
- package/src/fixtures/interpolate-ascending.tsx +6 -0
- package/src/fixtures/interpolate-descending.tsx +8 -0
- package/src/fixtures/interpolate-identifier-keys.tsx +9 -0
- package/src/fixtures/nested-filters-broken.tsx +11 -0
- package/src/fixtures/nested-filters-fixed.tsx +8 -0
- package/src/fixtures/nested-filters-html-wrapper.tsx +14 -0
- package/src/fixtures/nested-filters-html.tsx +7 -0
- package/src/fixtures/nested-filters-siblings.tsx +12 -0
- package/src/fixtures/nondeterministic-scene.tsx +14 -0
- package/src/fixtures/nondeterministic-variants.tsx +16 -0
- package/src/fixtures/raw-hex-scene.tsx +10 -0
- package/src/fixtures/scene-root-declared/SceneHook.tsx +9 -0
- package/src/fixtures/scene-root-declared/plan.fixture.yaml +10 -0
- package/src/fixtures/scene-root-missing/SceneHook.tsx +11 -0
- package/src/fixtures/scene-root-missing/plan.fixture.yaml +10 -0
- package/src/fixtures/scene-root-no-names/SceneHook.tsx +6 -0
- package/src/fixtures/scene-root-no-names/plan.fixture.yaml +6 -0
- package/src/fixtures/scene-root-shell/SceneHook.tsx +8 -0
- package/src/fixtures/scene-root-shell/Shell.tsx +9 -0
- package/src/fixtures/scene-root-shell/plan.fixture.yaml +10 -0
- package/src/fixtures/shorthand-undefined-clean.tsx +23 -0
- package/src/fixtures/shorthand-undefined-longhand.tsx +17 -0
- package/src/fixtures/token-scene.tsx +9 -0
- package/src/includeCoverage.test.ts +176 -0
- package/src/learnedFrom.test.ts +32 -0
- package/src/projectDoc.test.ts +230 -0
- package/src/projectDoc.ts +152 -0
- package/src/projectDocSync.test.ts +152 -0
- package/src/projectDocSync.ts +79 -0
- package/src/projectMeta.test.ts +75 -0
- package/src/projectMeta.ts +53 -0
- package/src/provenance.ts +85 -0
- package/src/radar-check-ids.json +34 -0
- package/src/registry.test.ts +207 -0
- package/src/registry.ts +352 -0
- package/src/rules/animatedBarChartTightBox.ts +14 -0
- package/src/rules/animatedBarChartWhenNotToUse.ts +14 -0
- package/src/rules/animatedBarChartWhenToUse.ts +14 -0
- package/src/rules/animatedLineChartWhenNotToUse.ts +14 -0
- package/src/rules/animatedLineChartWhenToUse.ts +14 -0
- package/src/rules/approvedSfxPaletteOnly.ts +23 -0
- package/src/rules/atmosphereGradientsFadeAtBothEnds.ts +21 -0
- package/src/rules/audioIsTheClock.ts +22 -0
- package/src/rules/beatsDeriveFromTheirOwnSequence.ts +21 -0
- package/src/rules/bestSceneSetsTheBar.ts +21 -0
- package/src/rules/bumpBeforeRefreeze.ts +20 -0
- package/src/rules/cameraIsTheNarrator.ts +21 -0
- package/src/rules/checkPinBeforeShip.ts +22 -0
- package/src/rules/coldViewerClarity.ts +21 -0
- package/src/rules/commitOrCutEffects.ts +36 -0
- package/src/rules/convertFramesAcrossClockBoundary.ts +19 -0
- package/src/rules/crossCutElementsLiveInTheHudLayer.ts +21 -0
- package/src/rules/cursorClicksRealControls.ts +22 -0
- package/src/rules/cutOnRealAudioPauses.ts +20 -0
- package/src/rules/darkButNeverDim.ts +21 -0
- package/src/rules/dataRadarTagsDeclared.test.ts +60 -0
- package/src/rules/dataRadarTagsDeclared.ts +341 -0
- package/src/rules/declareAVerticalZoneMap.ts +19 -0
- package/src/rules/deleteRejectedRigsCompletely.ts +19 -0
- package/src/rules/deriveSeamsDontMeasure.ts +23 -0
- package/src/rules/deterministicSceneSource.test.ts +58 -0
- package/src/rules/deterministicSceneSource.ts +82 -0
- package/src/rules/diegeticSoundForOnscreenActions.ts +21 -0
- package/src/rules/distinctTransitionPerBeat.ts +21 -0
- package/src/rules/downloadOrDrawRichAssets.ts +22 -0
- package/src/rules/elementOnscreenForItsVoSentence.ts +25 -0
- package/src/rules/emitBuildNotes.ts +19 -0
- package/src/rules/energyFromTimingNotPartCount.ts +20 -0
- package/src/rules/evidenceBeforeClaimingFixed.ts +23 -0
- package/src/rules/exactPeerLockstep.ts +19 -0
- package/src/rules/firstPassIsADraft.ts +20 -0
- package/src/rules/fixCrowdingByRebandingNotNudging.ts +20 -0
- package/src/rules/fixesPreserveApprovedElements.ts +24 -0
- package/src/rules/floatingNotBoxed.ts +21 -0
- package/src/rules/focusBeatsRecedeTheContext.ts +20 -0
- package/src/rules/fontVarsBrandRemocn.ts +20 -0
- package/src/rules/geometricSeamsNotCrossfades.ts +28 -0
- package/src/rules/geometrySidecarExportsTyped.test.ts +37 -0
- package/src/rules/geometrySidecarExportsTyped.ts +59 -0
- package/src/rules/glowIsAFocalAccent.ts +28 -0
- package/src/rules/heroFillsTheFrame.ts +24 -0
- package/src/rules/htmlMasksForAnimatedCounters.ts +21 -0
- package/src/rules/impactStackOnPayoffs.ts +26 -0
- package/src/rules/interactiveTargetsAreDeclaredData.ts +21 -0
- package/src/rules/interpolateLiteralKeysMonotonic.test.ts +49 -0
- package/src/rules/interpolateLiteralKeysMonotonic.ts +98 -0
- package/src/rules/latenessIsStructuralOverlapTheBeats.ts +20 -0
- package/src/rules/lessTextMoreVisualizations.ts +22 -0
- package/src/rules/liveLinkDuplicateReactAlias.ts +22 -0
- package/src/rules/make2dElements3d.ts +21 -0
- package/src/rules/masterMixLoudnessTarget.ts +22 -0
- package/src/rules/measureAlignmentDontEyeball.ts +20 -0
- package/src/rules/motionCarriesWeightAndMeaning.ts +21 -0
- package/src/rules/motionDensityFloor.ts +20 -0
- package/src/rules/neverEditTierBVendored.ts +20 -0
- package/src/rules/neverRestateDerivedFrameNumbersInComments.ts +20 -0
- package/src/rules/noAiGradientLook.ts +22 -0
- package/src/rules/noColoredFlashToHideACut.ts +29 -0
- package/src/rules/noDoubleFrameShift.test.ts +95 -0
- package/src/rules/noDoubleFrameShift.ts +193 -0
- package/src/rules/noDuplicateMotionPrimitives.ts +19 -0
- package/src/rules/noLinearMotion.ts +29 -0
- package/src/rules/noNestedSvgFilters.test.ts +47 -0
- package/src/rules/noNestedSvgFilters.ts +138 -0
- package/src/rules/noRepeatedAssetAcrossShots.ts +19 -0
- package/src/rules/noShorthandWithUndefinedLonghand.test.ts +35 -0
- package/src/rules/noShorthandWithUndefinedLonghand.ts +140 -0
- package/src/rules/noStackedFadesAtACut.ts +30 -0
- package/src/rules/noStaticHolds.ts +24 -0
- package/src/rules/occlusionVisibleElements.ts +26 -0
- package/src/rules/oneContinuousVoTrack.ts +20 -0
- package/src/rules/onePunchPerMomentClass.ts +20 -0
- package/src/rules/oneRenderPerRound.ts +46 -0
- package/src/rules/openStaticAfterAHardCut.ts +29 -0
- package/src/rules/openingsAndClosingsCarryMore.ts +21 -0
- package/src/rules/persistentDeviceFrames.ts +20 -0
- package/src/rules/pixelDiffAnEmptyBandFirst.ts +20 -0
- package/src/rules/planIsPublishedNotGating.ts +32 -0
- package/src/rules/poweredByRevolaWatermark.ts +19 -0
- package/src/rules/predrawContentPresentAtTheCut.ts +21 -0
- package/src/rules/premiumSurfacesNotFlatBorders.ts +20 -0
- package/src/rules/radarDispositionsAreHumanOnly.ts +28 -0
- package/src/rules/realAssetsNotPlaceholders.ts +21 -0
- package/src/rules/rebuildUiFromReconNotScreenshots.ts +21 -0
- package/src/rules/reconStrandsRunInParallel.ts +63 -0
- package/src/rules/registryBeforeHandrolling.ts +20 -0
- package/src/rules/remapRateEndpointFormula.ts +19 -0
- package/src/rules/remocnContentTailwindChrome.ts +19 -0
- package/src/rules/retimeOnlyViaPlaybackOrDesignTokens.ts +18 -0
- package/src/rules/reviewTheRenderByFrameSweep.ts +23 -0
- package/src/rules/rollingNumberBoundedSequence.ts +21 -0
- package/src/rules/rollingNumberSequenceLayoutNone.ts +22 -0
- package/src/rules/rollingNumberTightBoxAlignment.ts +19 -0
- package/src/rules/rollingNumberWhenNotToUse.ts +24 -0
- package/src/rules/rollingNumberWhenToUse.ts +23 -0
- package/src/rules/sameFamilySameProject.ts +20 -0
- package/src/rules/sampleBrandFromProduct.ts +19 -0
- package/src/rules/sampleVelocityFromPreviousFramePosition.ts +21 -0
- package/src/rules/sceneRootTagDeclared.test.ts +43 -0
- package/src/rules/sceneRootTagDeclared.ts +78 -0
- package/src/rules/scrubDemoDataToGenericRoles.ts +19 -0
- package/src/rules/selfReviewThePlanForGaps.ts +47 -0
- package/src/rules/sourceArchivedBeforeBrief.ts +24 -0
- package/src/rules/statisticsSelfExplanatory.ts +18 -0
- package/src/rules/stopsAsRelativeSpacing.ts +21 -0
- package/src/rules/theWholeCanvasWorks.ts +21 -0
- package/src/rules/themePerSection.ts +28 -0
- package/src/rules/thesisDeclaredInBrief.ts +25 -0
- package/src/rules/tierARequiresPropUnreachableEdit.ts +20 -0
- package/src/rules/tinyBodyCopyAsRuledLines.ts +19 -0
- package/src/rules/titlesPinnedOutsideCameraPush.ts +22 -0
- package/src/rules/tokensNotRawHexes.test.ts +51 -0
- package/src/rules/tokensNotRawHexes.ts +89 -0
- package/src/rules/typeTokenDefaultedParamsAsString.ts +21 -0
- package/src/rules/varyKitChoreographyAcrossSections.ts +21 -0
- package/src/rules/varyTheVisualizationGrammar.ts +22 -0
- package/src/rules/verifyCheapRenderDear.ts +18 -0
- package/src/rules/voAddressesTheViewer.ts +18 -0
- package/src/rules/voIsAPerformance.ts +21 -0
- package/src/rules/voScriptLocksSpokenWords.ts +21 -0
- package/src/rules/wrappersPreserveChildGeometry.ts +22 -0
- package/src/sourceCheck.test.ts +50 -0
- package/src/sourceCheck.ts +55 -0
- package/src/sourceCitations.test.ts +747 -0
- package/src/sourceCitations.ts +217 -0
- package/src/stageProjection.ts +112 -0
- package/src/stages.test.ts +68 -0
- package/src/stages.ts +207 -0
- package/src/testSupport.ts +16 -0
- package/src/types.ts +181 -0
- package/src/variants.test.ts +24 -0
- package/src/variants.ts +13 -0
- package/src/waiverProjection.test.ts +59 -0
- package/src/waiverProjection.ts +45 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { animatedBarChartTightBox } from "./rules/animatedBarChartTightBox.js";
|
|
2
|
+
import { animatedBarChartWhenNotToUse } from "./rules/animatedBarChartWhenNotToUse.js";
|
|
3
|
+
import { animatedBarChartWhenToUse } from "./rules/animatedBarChartWhenToUse.js";
|
|
4
|
+
import { animatedLineChartWhenNotToUse } from "./rules/animatedLineChartWhenNotToUse.js";
|
|
5
|
+
import { animatedLineChartWhenToUse } from "./rules/animatedLineChartWhenToUse.js";
|
|
6
|
+
import { approvedSfxPaletteOnly } from "./rules/approvedSfxPaletteOnly.js";
|
|
7
|
+
import { atmosphereGradientsFadeAtBothEnds } from "./rules/atmosphereGradientsFadeAtBothEnds.js";
|
|
8
|
+
import { audioIsTheClock } from "./rules/audioIsTheClock.js";
|
|
9
|
+
import { beatsDeriveFromTheirOwnSequence } from "./rules/beatsDeriveFromTheirOwnSequence.js";
|
|
10
|
+
import { bestSceneSetsTheBar } from "./rules/bestSceneSetsTheBar.js";
|
|
11
|
+
import { bumpBeforeRefreeze } from "./rules/bumpBeforeRefreeze.js";
|
|
12
|
+
import { cameraIsTheNarrator } from "./rules/cameraIsTheNarrator.js";
|
|
13
|
+
import { checkPinBeforeShip } from "./rules/checkPinBeforeShip.js";
|
|
14
|
+
import { coldViewerClarity } from "./rules/coldViewerClarity.js";
|
|
15
|
+
import { commitOrCutEffects } from "./rules/commitOrCutEffects.js";
|
|
16
|
+
import { convertFramesAcrossClockBoundary } from "./rules/convertFramesAcrossClockBoundary.js";
|
|
17
|
+
import { crossCutElementsLiveInTheHudLayer } from "./rules/crossCutElementsLiveInTheHudLayer.js";
|
|
18
|
+
import { cursorClicksRealControls } from "./rules/cursorClicksRealControls.js";
|
|
19
|
+
import { cutOnRealAudioPauses } from "./rules/cutOnRealAudioPauses.js";
|
|
20
|
+
import { darkButNeverDim } from "./rules/darkButNeverDim.js";
|
|
21
|
+
import { dataRadarTagsDeclared } from "./rules/dataRadarTagsDeclared.js";
|
|
22
|
+
import { declareAVerticalZoneMap } from "./rules/declareAVerticalZoneMap.js";
|
|
23
|
+
import { deleteRejectedRigsCompletely } from "./rules/deleteRejectedRigsCompletely.js";
|
|
24
|
+
import { deriveSeamsDontMeasure } from "./rules/deriveSeamsDontMeasure.js";
|
|
25
|
+
import { deterministicSceneSource } from "./rules/deterministicSceneSource.js";
|
|
26
|
+
import { diegeticSoundForOnscreenActions } from "./rules/diegeticSoundForOnscreenActions.js";
|
|
27
|
+
import { distinctTransitionPerBeat } from "./rules/distinctTransitionPerBeat.js";
|
|
28
|
+
import { downloadOrDrawRichAssets } from "./rules/downloadOrDrawRichAssets.js";
|
|
29
|
+
import { elementOnscreenForItsVoSentence } from "./rules/elementOnscreenForItsVoSentence.js";
|
|
30
|
+
import { emitBuildNotes } from "./rules/emitBuildNotes.js";
|
|
31
|
+
import { energyFromTimingNotPartCount } from "./rules/energyFromTimingNotPartCount.js";
|
|
32
|
+
import { evidenceBeforeClaimingFixed } from "./rules/evidenceBeforeClaimingFixed.js";
|
|
33
|
+
import { exactPeerLockstep } from "./rules/exactPeerLockstep.js";
|
|
34
|
+
import { firstPassIsADraft } from "./rules/firstPassIsADraft.js";
|
|
35
|
+
import { fixCrowdingByRebandingNotNudging } from "./rules/fixCrowdingByRebandingNotNudging.js";
|
|
36
|
+
import { fixesPreserveApprovedElements } from "./rules/fixesPreserveApprovedElements.js";
|
|
37
|
+
import { floatingNotBoxed } from "./rules/floatingNotBoxed.js";
|
|
38
|
+
import { focusBeatsRecedeTheContext } from "./rules/focusBeatsRecedeTheContext.js";
|
|
39
|
+
import { fontVarsBrandRemocn } from "./rules/fontVarsBrandRemocn.js";
|
|
40
|
+
import { geometricSeamsNotCrossfades } from "./rules/geometricSeamsNotCrossfades.js";
|
|
41
|
+
import { geometrySidecarExportsTyped } from "./rules/geometrySidecarExportsTyped.js";
|
|
42
|
+
import { glowIsAFocalAccent } from "./rules/glowIsAFocalAccent.js";
|
|
43
|
+
import { heroFillsTheFrame } from "./rules/heroFillsTheFrame.js";
|
|
44
|
+
import { htmlMasksForAnimatedCounters } from "./rules/htmlMasksForAnimatedCounters.js";
|
|
45
|
+
import { impactStackOnPayoffs } from "./rules/impactStackOnPayoffs.js";
|
|
46
|
+
import { interactiveTargetsAreDeclaredData } from "./rules/interactiveTargetsAreDeclaredData.js";
|
|
47
|
+
import { interpolateLiteralKeysMonotonic } from "./rules/interpolateLiteralKeysMonotonic.js";
|
|
48
|
+
import { latenessIsStructuralOverlapTheBeats } from "./rules/latenessIsStructuralOverlapTheBeats.js";
|
|
49
|
+
import { lessTextMoreVisualizations } from "./rules/lessTextMoreVisualizations.js";
|
|
50
|
+
import { liveLinkDuplicateReactAlias } from "./rules/liveLinkDuplicateReactAlias.js";
|
|
51
|
+
import { make2dElements3d } from "./rules/make2dElements3d.js";
|
|
52
|
+
import { masterMixLoudnessTarget } from "./rules/masterMixLoudnessTarget.js";
|
|
53
|
+
import { measureAlignmentDontEyeball } from "./rules/measureAlignmentDontEyeball.js";
|
|
54
|
+
import { motionCarriesWeightAndMeaning } from "./rules/motionCarriesWeightAndMeaning.js";
|
|
55
|
+
import { motionDensityFloor } from "./rules/motionDensityFloor.js";
|
|
56
|
+
import { neverEditTierBVendored } from "./rules/neverEditTierBVendored.js";
|
|
57
|
+
import { neverRestateDerivedFrameNumbersInComments } from "./rules/neverRestateDerivedFrameNumbersInComments.js";
|
|
58
|
+
import { noAiGradientLook } from "./rules/noAiGradientLook.js";
|
|
59
|
+
import { noColoredFlashToHideACut } from "./rules/noColoredFlashToHideACut.js";
|
|
60
|
+
import { noDoubleFrameShift } from "./rules/noDoubleFrameShift.js";
|
|
61
|
+
import { noDuplicateMotionPrimitives } from "./rules/noDuplicateMotionPrimitives.js";
|
|
62
|
+
import { noLinearMotion } from "./rules/noLinearMotion.js";
|
|
63
|
+
import { noNestedSvgFilters } from "./rules/noNestedSvgFilters.js";
|
|
64
|
+
import { noRepeatedAssetAcrossShots } from "./rules/noRepeatedAssetAcrossShots.js";
|
|
65
|
+
import { noShorthandWithUndefinedLonghand } from "./rules/noShorthandWithUndefinedLonghand.js";
|
|
66
|
+
import { noStackedFadesAtACut } from "./rules/noStackedFadesAtACut.js";
|
|
67
|
+
import { noStaticHolds } from "./rules/noStaticHolds.js";
|
|
68
|
+
import { occlusionVisibleElements } from "./rules/occlusionVisibleElements.js";
|
|
69
|
+
import { oneContinuousVoTrack } from "./rules/oneContinuousVoTrack.js";
|
|
70
|
+
import { onePunchPerMomentClass } from "./rules/onePunchPerMomentClass.js";
|
|
71
|
+
import { oneRenderPerRound } from "./rules/oneRenderPerRound.js";
|
|
72
|
+
import { openingsAndClosingsCarryMore } from "./rules/openingsAndClosingsCarryMore.js";
|
|
73
|
+
import { openStaticAfterAHardCut } from "./rules/openStaticAfterAHardCut.js";
|
|
74
|
+
import { persistentDeviceFrames } from "./rules/persistentDeviceFrames.js";
|
|
75
|
+
import { pixelDiffAnEmptyBandFirst } from "./rules/pixelDiffAnEmptyBandFirst.js";
|
|
76
|
+
import { planIsPublishedNotGating } from "./rules/planIsPublishedNotGating.js";
|
|
77
|
+
import { poweredByRevolaWatermark } from "./rules/poweredByRevolaWatermark.js";
|
|
78
|
+
import { predrawContentPresentAtTheCut } from "./rules/predrawContentPresentAtTheCut.js";
|
|
79
|
+
import { premiumSurfacesNotFlatBorders } from "./rules/premiumSurfacesNotFlatBorders.js";
|
|
80
|
+
import { radarDispositionsAreHumanOnly } from "./rules/radarDispositionsAreHumanOnly.js";
|
|
81
|
+
import { realAssetsNotPlaceholders } from "./rules/realAssetsNotPlaceholders.js";
|
|
82
|
+
import { rebuildUiFromReconNotScreenshots } from "./rules/rebuildUiFromReconNotScreenshots.js";
|
|
83
|
+
import { reconStrandsRunInParallel } from "./rules/reconStrandsRunInParallel.js";
|
|
84
|
+
import { registryBeforeHandrolling } from "./rules/registryBeforeHandrolling.js";
|
|
85
|
+
import { remapRateEndpointFormula } from "./rules/remapRateEndpointFormula.js";
|
|
86
|
+
import { remocnContentTailwindChrome } from "./rules/remocnContentTailwindChrome.js";
|
|
87
|
+
import { retimeOnlyViaPlaybackOrDesignTokens } from "./rules/retimeOnlyViaPlaybackOrDesignTokens.js";
|
|
88
|
+
import { reviewTheRenderByFrameSweep } from "./rules/reviewTheRenderByFrameSweep.js";
|
|
89
|
+
import { rollingNumberBoundedSequence } from "./rules/rollingNumberBoundedSequence.js";
|
|
90
|
+
import { rollingNumberSequenceLayoutNone } from "./rules/rollingNumberSequenceLayoutNone.js";
|
|
91
|
+
import { rollingNumberTightBoxAlignment } from "./rules/rollingNumberTightBoxAlignment.js";
|
|
92
|
+
import { rollingNumberWhenNotToUse } from "./rules/rollingNumberWhenNotToUse.js";
|
|
93
|
+
import { rollingNumberWhenToUse } from "./rules/rollingNumberWhenToUse.js";
|
|
94
|
+
import { sameFamilySameProject } from "./rules/sameFamilySameProject.js";
|
|
95
|
+
import { sampleBrandFromProduct } from "./rules/sampleBrandFromProduct.js";
|
|
96
|
+
import { sampleVelocityFromPreviousFramePosition } from "./rules/sampleVelocityFromPreviousFramePosition.js";
|
|
97
|
+
import { sceneRootTagDeclared } from "./rules/sceneRootTagDeclared.js";
|
|
98
|
+
import { scrubDemoDataToGenericRoles } from "./rules/scrubDemoDataToGenericRoles.js";
|
|
99
|
+
import { selfReviewThePlanForGaps } from "./rules/selfReviewThePlanForGaps.js";
|
|
100
|
+
import { sourceArchivedBeforeBrief } from "./rules/sourceArchivedBeforeBrief.js";
|
|
101
|
+
import { statisticsSelfExplanatory } from "./rules/statisticsSelfExplanatory.js";
|
|
102
|
+
import { stopsAsRelativeSpacing } from "./rules/stopsAsRelativeSpacing.js";
|
|
103
|
+
import { themePerSection } from "./rules/themePerSection.js";
|
|
104
|
+
import { thesisDeclaredInBrief } from "./rules/thesisDeclaredInBrief.js";
|
|
105
|
+
import { theWholeCanvasWorks } from "./rules/theWholeCanvasWorks.js";
|
|
106
|
+
import { tierARequiresPropUnreachableEdit } from "./rules/tierARequiresPropUnreachableEdit.js";
|
|
107
|
+
import { tinyBodyCopyAsRuledLines } from "./rules/tinyBodyCopyAsRuledLines.js";
|
|
108
|
+
import { titlesPinnedOutsideCameraPush } from "./rules/titlesPinnedOutsideCameraPush.js";
|
|
109
|
+
import { tokensNotRawHexes } from "./rules/tokensNotRawHexes.js";
|
|
110
|
+
import { typeTokenDefaultedParamsAsString } from "./rules/typeTokenDefaultedParamsAsString.js";
|
|
111
|
+
import { varyKitChoreographyAcrossSections } from "./rules/varyKitChoreographyAcrossSections.js";
|
|
112
|
+
import { varyTheVisualizationGrammar } from "./rules/varyTheVisualizationGrammar.js";
|
|
113
|
+
import { verifyCheapRenderDear } from "./rules/verifyCheapRenderDear.js";
|
|
114
|
+
import { voAddressesTheViewer } from "./rules/voAddressesTheViewer.js";
|
|
115
|
+
import { voIsAPerformance } from "./rules/voIsAPerformance.js";
|
|
116
|
+
import { voScriptLocksSpokenWords } from "./rules/voScriptLocksSpokenWords.js";
|
|
117
|
+
import { wrappersPreserveChildGeometry } from "./rules/wrappersPreserveChildGeometry.js";
|
|
118
|
+
import RADAR_CHECK_IDS from "./radar-check-ids.json" with { type: "json" };
|
|
119
|
+
const RULES = [
|
|
120
|
+
animatedBarChartTightBox,
|
|
121
|
+
animatedBarChartWhenNotToUse,
|
|
122
|
+
animatedBarChartWhenToUse,
|
|
123
|
+
animatedLineChartWhenNotToUse,
|
|
124
|
+
animatedLineChartWhenToUse,
|
|
125
|
+
approvedSfxPaletteOnly,
|
|
126
|
+
atmosphereGradientsFadeAtBothEnds,
|
|
127
|
+
audioIsTheClock,
|
|
128
|
+
bestSceneSetsTheBar,
|
|
129
|
+
bumpBeforeRefreeze,
|
|
130
|
+
cameraIsTheNarrator,
|
|
131
|
+
checkPinBeforeShip,
|
|
132
|
+
coldViewerClarity,
|
|
133
|
+
commitOrCutEffects,
|
|
134
|
+
convertFramesAcrossClockBoundary,
|
|
135
|
+
crossCutElementsLiveInTheHudLayer,
|
|
136
|
+
cursorClicksRealControls,
|
|
137
|
+
cutOnRealAudioPauses,
|
|
138
|
+
darkButNeverDim,
|
|
139
|
+
dataRadarTagsDeclared,
|
|
140
|
+
declareAVerticalZoneMap,
|
|
141
|
+
deleteRejectedRigsCompletely,
|
|
142
|
+
deriveSeamsDontMeasure,
|
|
143
|
+
deterministicSceneSource,
|
|
144
|
+
diegeticSoundForOnscreenActions,
|
|
145
|
+
distinctTransitionPerBeat,
|
|
146
|
+
downloadOrDrawRichAssets,
|
|
147
|
+
elementOnscreenForItsVoSentence,
|
|
148
|
+
emitBuildNotes,
|
|
149
|
+
energyFromTimingNotPartCount,
|
|
150
|
+
evidenceBeforeClaimingFixed,
|
|
151
|
+
exactPeerLockstep,
|
|
152
|
+
firstPassIsADraft,
|
|
153
|
+
fixCrowdingByRebandingNotNudging,
|
|
154
|
+
fixesPreserveApprovedElements,
|
|
155
|
+
floatingNotBoxed,
|
|
156
|
+
fontVarsBrandRemocn,
|
|
157
|
+
glowIsAFocalAccent,
|
|
158
|
+
heroFillsTheFrame,
|
|
159
|
+
htmlMasksForAnimatedCounters,
|
|
160
|
+
interpolateLiteralKeysMonotonic,
|
|
161
|
+
latenessIsStructuralOverlapTheBeats,
|
|
162
|
+
lessTextMoreVisualizations,
|
|
163
|
+
liveLinkDuplicateReactAlias,
|
|
164
|
+
make2dElements3d,
|
|
165
|
+
masterMixLoudnessTarget,
|
|
166
|
+
motionCarriesWeightAndMeaning,
|
|
167
|
+
neverEditTierBVendored,
|
|
168
|
+
neverRestateDerivedFrameNumbersInComments,
|
|
169
|
+
noAiGradientLook,
|
|
170
|
+
noColoredFlashToHideACut,
|
|
171
|
+
noDoubleFrameShift,
|
|
172
|
+
noDuplicateMotionPrimitives,
|
|
173
|
+
noLinearMotion,
|
|
174
|
+
noNestedSvgFilters,
|
|
175
|
+
noRepeatedAssetAcrossShots,
|
|
176
|
+
noStackedFadesAtACut,
|
|
177
|
+
noStaticHolds,
|
|
178
|
+
occlusionVisibleElements,
|
|
179
|
+
oneContinuousVoTrack,
|
|
180
|
+
onePunchPerMomentClass,
|
|
181
|
+
oneRenderPerRound,
|
|
182
|
+
openingsAndClosingsCarryMore,
|
|
183
|
+
openStaticAfterAHardCut,
|
|
184
|
+
persistentDeviceFrames,
|
|
185
|
+
pixelDiffAnEmptyBandFirst,
|
|
186
|
+
planIsPublishedNotGating,
|
|
187
|
+
poweredByRevolaWatermark,
|
|
188
|
+
predrawContentPresentAtTheCut,
|
|
189
|
+
radarDispositionsAreHumanOnly,
|
|
190
|
+
realAssetsNotPlaceholders,
|
|
191
|
+
rebuildUiFromReconNotScreenshots,
|
|
192
|
+
reconStrandsRunInParallel,
|
|
193
|
+
registryBeforeHandrolling,
|
|
194
|
+
remapRateEndpointFormula,
|
|
195
|
+
remocnContentTailwindChrome,
|
|
196
|
+
retimeOnlyViaPlaybackOrDesignTokens,
|
|
197
|
+
rollingNumberBoundedSequence,
|
|
198
|
+
rollingNumberSequenceLayoutNone,
|
|
199
|
+
rollingNumberTightBoxAlignment,
|
|
200
|
+
rollingNumberWhenNotToUse,
|
|
201
|
+
rollingNumberWhenToUse,
|
|
202
|
+
sameFamilySameProject,
|
|
203
|
+
sampleBrandFromProduct,
|
|
204
|
+
sampleVelocityFromPreviousFramePosition,
|
|
205
|
+
sceneRootTagDeclared,
|
|
206
|
+
scrubDemoDataToGenericRoles,
|
|
207
|
+
selfReviewThePlanForGaps,
|
|
208
|
+
sourceArchivedBeforeBrief,
|
|
209
|
+
statisticsSelfExplanatory,
|
|
210
|
+
stopsAsRelativeSpacing,
|
|
211
|
+
themePerSection,
|
|
212
|
+
thesisDeclaredInBrief,
|
|
213
|
+
theWholeCanvasWorks,
|
|
214
|
+
tierARequiresPropUnreachableEdit,
|
|
215
|
+
tinyBodyCopyAsRuledLines,
|
|
216
|
+
titlesPinnedOutsideCameraPush,
|
|
217
|
+
tokensNotRawHexes,
|
|
218
|
+
typeTokenDefaultedParamsAsString,
|
|
219
|
+
varyKitChoreographyAcrossSections,
|
|
220
|
+
varyTheVisualizationGrammar,
|
|
221
|
+
verifyCheapRenderDear,
|
|
222
|
+
voAddressesTheViewer,
|
|
223
|
+
voIsAPerformance,
|
|
224
|
+
voScriptLocksSpokenWords,
|
|
225
|
+
beatsDeriveFromTheirOwnSequence,
|
|
226
|
+
focusBeatsRecedeTheContext,
|
|
227
|
+
geometricSeamsNotCrossfades,
|
|
228
|
+
geometrySidecarExportsTyped,
|
|
229
|
+
impactStackOnPayoffs,
|
|
230
|
+
interactiveTargetsAreDeclaredData,
|
|
231
|
+
measureAlignmentDontEyeball,
|
|
232
|
+
motionDensityFloor,
|
|
233
|
+
noShorthandWithUndefinedLonghand,
|
|
234
|
+
premiumSurfacesNotFlatBorders,
|
|
235
|
+
reviewTheRenderByFrameSweep,
|
|
236
|
+
wrappersPreserveChildGeometry
|
|
237
|
+
];
|
|
238
|
+
const TIERS = /* @__PURE__ */ new Set(["gate", "craft", "process"]);
|
|
239
|
+
const KEBAB = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
240
|
+
const COHERENCE_OWNER = "coherence";
|
|
241
|
+
function validateRegistry(rules, checkIds = RADAR_CHECK_IDS) {
|
|
242
|
+
const errors = [];
|
|
243
|
+
const seen = /* @__PURE__ */ new Set();
|
|
244
|
+
for (const rule of rules) {
|
|
245
|
+
if (seen.has(rule.id)) errors.push(`duplicate rule id "${rule.id}"`);
|
|
246
|
+
seen.add(rule.id);
|
|
247
|
+
if (!KEBAB.test(rule.id)) errors.push(`id "${rule.id}" is not kebab-case`);
|
|
248
|
+
if (!rule.learnedFrom) errors.push(`rule "${rule.id}" has no learnedFrom`);
|
|
249
|
+
if (!rule.claim.trim()) errors.push(`rule "${rule.id}" has an empty claim`);
|
|
250
|
+
if (!rule.why.trim()) errors.push(`rule "${rule.id}" has an empty why`);
|
|
251
|
+
if (!TIERS.has(rule.tier)) {
|
|
252
|
+
errors.push(`rule "${rule.id}" has an unknown tier "${rule.tier}"`);
|
|
253
|
+
}
|
|
254
|
+
if (rule.tier === "gate" && !rule.verify?.trim()) {
|
|
255
|
+
errors.push(`rule "${rule.id}" is a gate with no verify`);
|
|
256
|
+
}
|
|
257
|
+
if (rule.scope.kind === "component" && !KEBAB.test(rule.scope.slug)) {
|
|
258
|
+
errors.push(`component slug "${rule.scope.slug}" is not kebab-case`);
|
|
259
|
+
}
|
|
260
|
+
for (const ex of rule.exceptions ?? []) {
|
|
261
|
+
if (!ex.project.trim() || !ex.decision.trim() || !ex.recordedIn.trim()) {
|
|
262
|
+
errors.push(`rule "${rule.id}" has an exception with an empty field`);
|
|
263
|
+
}
|
|
264
|
+
if (ex.recordedIn.startsWith("/") || ex.recordedIn.includes("\\")) {
|
|
265
|
+
errors.push(
|
|
266
|
+
`rule "${rule.id}": exception recordedIn "${ex.recordedIn}" is not a repo-relative POSIX path`
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const e = rule.enforcement;
|
|
271
|
+
if (e.kind === "prose" && "anchor" in e && "unanchorable" in e) {
|
|
272
|
+
errors.push(`rule "${rule.id}" carries both an anchor and an unanchorable reason`);
|
|
273
|
+
}
|
|
274
|
+
if (e.kind === "prose" && "unanchorable" in e && !e.unanchorable.trim()) {
|
|
275
|
+
errors.push(`rule "${rule.id}" has an empty unanchorable reason`);
|
|
276
|
+
}
|
|
277
|
+
if (e.kind === "prose" && "anchor" in e) {
|
|
278
|
+
const { file } = e.anchor;
|
|
279
|
+
if (file.startsWith("/") || file.includes("\\")) {
|
|
280
|
+
errors.push(`rule "${rule.id}": anchor file "${file}" is not a repo-relative POSIX path`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
if (e.kind === "source" && e.check.include.length === 0) {
|
|
284
|
+
errors.push(`rule "${rule.id}" has no include globs`);
|
|
285
|
+
}
|
|
286
|
+
if (rule.owner !== void 0 && rule.owner !== COHERENCE_OWNER && !checkIds.includes(rule.owner)) {
|
|
287
|
+
errors.push(`rule "${rule.id}" owner "${rule.owner}" is not a known radar check id or "${COHERENCE_OWNER}"`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
for (const field of ["whenToUse", "whenNotToUse"]) {
|
|
291
|
+
const counts = /* @__PURE__ */ new Map();
|
|
292
|
+
for (const rule of rules) {
|
|
293
|
+
if (rule.scope.kind !== "component" || rule.scope.field !== field) continue;
|
|
294
|
+
counts.set(rule.scope.slug, (counts.get(rule.scope.slug) ?? 0) + 1);
|
|
295
|
+
}
|
|
296
|
+
for (const [slug, count] of counts) {
|
|
297
|
+
if (count > 1) {
|
|
298
|
+
errors.push(`component "${slug}" has ${count} ${field} rules, expected at most 1`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return errors;
|
|
303
|
+
}
|
|
304
|
+
export {
|
|
305
|
+
RULES,
|
|
306
|
+
validateRegistry
|
|
307
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const animatedBarChartTightBox = {
|
|
2
|
+
id: "animated-bar-chart-tight-box",
|
|
3
|
+
claim: "AnimatedBarChart fills its nearest positioned ancestor; give it a position: relative box sized to the intended width and height, and pass matching width/height props.",
|
|
4
|
+
why: "The component renders position: absolute inset 0 and centers its fixed-size SVG; in an unsized or oversized box the chart floats to the container's middle instead of sitting where the card design intends.",
|
|
5
|
+
learnedFrom: "revola-video/src/scenes/V2Beat4DashboardRemocn.tsx",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "component", slug: "animated-bar-chart", field: "gotcha" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "packages/video-kit/src/motion/animated-bar-chart.tsx" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
animatedBarChartTightBox
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const animatedBarChartWhenNotToUse = {
|
|
2
|
+
id: "animated-bar-chart-when-not-to-use",
|
|
3
|
+
claim: "Do not use AnimatedBarChart for time-series trends (use the line chart), for a single headline number (use RollingNumber), or when bars must interleave with bespoke chrome inside the plot area.",
|
|
4
|
+
why: "A categorical bar race telling a trend story reads wrong, and the component owns its whole SVG plot area, so bespoke overlays inside it fight the layout.",
|
|
5
|
+
learnedFrom: "docs/superpowers/specs/2026-07-23-ws2-wave1-tier-a-seed-design.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "component", slug: "animated-bar-chart", field: "whenNotToUse" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "packages/video-kit/src/motion/animated-bar-chart.tsx" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
animatedBarChartWhenNotToUse
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const animatedBarChartWhenToUse = {
|
|
2
|
+
id: "animated-bar-chart-when-to-use",
|
|
3
|
+
claim: "Use AnimatedBarChart for a single categorical comparison beat (attention, volume, ranking) where staggered bar growth IS the story.",
|
|
4
|
+
why: "It is the kit's owned bar chart: themed gradient bars, staggered spring growth, category and value labels; hand-rolling one repeats the pre-registry _lib sprawl.",
|
|
5
|
+
learnedFrom: "docs/superpowers/specs/2026-07-23-ws2-wave1-tier-a-seed-design.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "component", slug: "animated-bar-chart", field: "whenToUse" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "packages/video-kit/src/motion/animated-bar-chart.tsx" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
animatedBarChartWhenToUse
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const animatedLineChartWhenNotToUse = {
|
|
2
|
+
id: "animated-line-chart-when-not-to-use",
|
|
3
|
+
claim: "Do not use AnimatedLineChart for categorical comparisons (use AnimatedBarChart) or a single headline number (use RollingNumber).",
|
|
4
|
+
why: "A trend-line draw-on telling a categorical comparison story reads wrong, and a single headline number does not need a plotted series at all.",
|
|
5
|
+
learnedFrom: "docs/superpowers/specs/2026-07-23-ws2-wave1-tier-a-seed-design.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "component", slug: "animated-line-chart", field: "whenNotToUse" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "packages/video-kit/src/motion/animated-line-chart.tsx" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
animatedLineChartWhenNotToUse
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const animatedLineChartWhenToUse = {
|
|
2
|
+
id: "animated-line-chart-when-to-use",
|
|
3
|
+
claim: "Use AnimatedLineChart for a continuous trend over time (growth, decline, rate) where the draw-on reveal IS the story.",
|
|
4
|
+
why: "It is the kit's owned line chart: themed gradient stroke, spring-driven draw-on with a leading dot; hand-rolling one repeats the pre-registry _lib sprawl.",
|
|
5
|
+
learnedFrom: "docs/superpowers/specs/2026-07-23-ws2-wave1-tier-a-seed-design.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "component", slug: "animated-line-chart", field: "whenToUse" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "packages/video-kit/src/motion/animated-line-chart.tsx" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
animatedLineChartWhenToUse
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const approvedSfxPaletteOnly = {
|
|
2
|
+
id: "approved-sfx-palette-only",
|
|
3
|
+
claim: "Source SFX only from the approved library of real recordings (ASMR typing, UI clicks, soft plops); synthesized whooshes, reveal risers, success chimes, and bling tones are banned, no single sound is overused, and SFX sit above the music in the mix.",
|
|
4
|
+
why: "Every synthesized or harsh sound was rejected on first listen, across three videos; the approved recordings were the only sounds that ever survived review.",
|
|
5
|
+
learnedFrom: "claude-sessions-digest/portfolio-reels.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
unanchorable: "The rule is an asset-selection judgment over audio files; no code location expresses it."
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
approvedSfxPaletteOnly
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const atmosphereGradientsFadeAtBothEnds = {
|
|
2
|
+
id: "atmosphere-gradients-fade-at-both-ends",
|
|
3
|
+
claim: "Make full-bleed atmosphere gradients (fog, haze) transparent at both ends and confine them to a declared world band.",
|
|
4
|
+
why: "A fog gradient that started opaque produced a hard black band that sliced the frame and cut the clock in half; band confinement guarantees it can never reach elements in other zones.",
|
|
5
|
+
learnedFrom: "revola-video/BUILD_NOTES_CRAFT.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "revola-video/src/scenes/craft/S1Graveyard.tsx" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
atmosphereGradientsFadeAtBothEnds
|
|
15
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const audioIsTheClock = {
|
|
2
|
+
id: "audio-is-the-clock",
|
|
3
|
+
claim: "Record or generate the voiceover first, measure it, and fit the video to the audio; never re-time audio to fit the video.",
|
|
4
|
+
why: "Reversing the order forces re-recording or hand-stretching audio every time timing shifts, and every feedback round shifts timing; deriving durations from the measured WAV makes a re-time a re-measure.",
|
|
5
|
+
learnedFrom: "HOW_I_BUILD_VIDEOS.md",
|
|
6
|
+
tier: "gate",
|
|
7
|
+
verify: "`ffprobe -show_entries stream=nb_frames <render>` equals `total` in .video/timing.json",
|
|
8
|
+
scope: { kind: "pipeline" },
|
|
9
|
+
enforcement: {
|
|
10
|
+
kind: "prose",
|
|
11
|
+
anchor: { file: "packages/video-cli/src/measure.ts" }
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
audioIsTheClock
|
|
16
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const beatsDeriveFromTheirOwnSequence = {
|
|
2
|
+
id: "beats-derive-from-their-own-sequence",
|
|
3
|
+
claim: "Compute a beat's frame from the duration of the Sequence it renders in, never from a parent's or a section's length.",
|
|
4
|
+
why: "A click beat derived from its section's length landed 10 frames past the last frame its shorter in-frame sequence ever draws, so the cursor drifted toward the button and the scene cut away before the press - the beat silently did not exist, and nothing failed.",
|
|
5
|
+
learnedFrom: "claude-sessions-digest/product-room-video.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "revola-video/src/productroom/PRColdOpen.tsx" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
beatsDeriveFromTheirOwnSequence
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const bestSceneSetsTheBar = {
|
|
2
|
+
id: "best-scene-sets-the-bar",
|
|
3
|
+
claim: "The moment a scene is approved it becomes the film's standard: take it as inspiration for every other scene, name it in review, and measure the weakest scene against the strongest every round.",
|
|
4
|
+
why: "'Amazing, move on to the next scene, now you know what I like' and 'make it match the first 3 scenes' animation quality' show approval creating a bar; rounds that ignored it re-litigated settled taste scene by scene.",
|
|
5
|
+
learnedFrom: "docs/style/CREATIVE_EDGE.md",
|
|
6
|
+
tier: "process",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
unanchorable: "A cross-scene quality comparison made during review rounds; no single code location expresses it."
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
bestSceneSetsTheBar
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const bumpBeforeRefreeze = {
|
|
2
|
+
id: "bump-before-refreeze",
|
|
3
|
+
claim: "If kit content changed, bump the kit version before re-freezing; never repack the same version with different bytes.",
|
|
4
|
+
why: "A same-version repack is a silent wrong pin: npm sees an unchanged dep string, keeps old content locally, and breaks fresh installs elsewhere.",
|
|
5
|
+
learnedFrom: "HOW_I_BUILD_VIDEOS.md",
|
|
6
|
+
tier: "process",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "packages/video-cli/src/kitShell.ts", symbol: "freezeKit" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
bumpBeforeRefreeze
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const cameraIsTheNarrator = {
|
|
2
|
+
id: "camera-is-the-narrator",
|
|
3
|
+
claim: "The camera tells the story with few, motivated, committed moves - a push into the element the VO names, a continuous journey through stations, following typing as it happens, a dive through an element into the next scene - each aimed at one subject with dwell time at the destination; unmotivated, whiplash, or decorative in-out moves read as mistakes.",
|
|
4
|
+
why: "'Amazing camera effects' was the recurring ask and 'camera buggy and clumsy ... it zooms in and suddenly zooms out' the recurring complaint; three deliberate moves consistently out-reviewed five micro-keys, and editorial single-subject framing beat crowded ensemble frames.",
|
|
5
|
+
learnedFrom: "docs/style/CREATIVE_EDGE.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
unanchorable: "A camera-arc judgment across a scene's key schedule; no single code location expresses it."
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
cameraIsTheNarrator
|
|
15
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const checkPinBeforeShip = {
|
|
2
|
+
id: "check-pin-before-ship",
|
|
3
|
+
claim: "Run check-pin --project <dir> before any video ships; ship only on a frozen, committed, integrity-matching tarball pin.",
|
|
4
|
+
why: "Shipping on a live link or stale tarball makes the delivered render non-reproducible: the exact bytes that rendered it cannot be recovered later.",
|
|
5
|
+
learnedFrom: "HOW_I_BUILD_VIDEOS.md",
|
|
6
|
+
tier: "gate",
|
|
7
|
+
verify: "`video check-pin --project <dir>`",
|
|
8
|
+
scope: { kind: "pipeline" },
|
|
9
|
+
enforcement: {
|
|
10
|
+
kind: "prose",
|
|
11
|
+
anchor: { file: "packages/video-cli/src/cli.ts" }
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
checkPinBeforeShip
|
|
16
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const coldViewerClarity = {
|
|
2
|
+
id: "cold-viewer-clarity",
|
|
3
|
+
claim: "Every scene passes the cold-viewer test: someone outside the company can say what the scene is about; confusion is fixed with orientation copy, clearer visual metaphors, or slower reveals, because clarity and spectacle are the same axis, not a trade.",
|
|
4
|
+
why: "'I showed someone this video and they said they don't get it' triggered rebuilds of scenes that were already visually approved; polish that fails to communicate is not polish.",
|
|
5
|
+
learnedFrom: "docs/style/CREATIVE_EDGE.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
unanchorable: "A comprehension judgment requiring an outside-context reading of the scene; no single code location expresses it."
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
coldViewerClarity
|
|
15
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const commitOrCutEffects = {
|
|
2
|
+
id: "commit-or-cut-effects",
|
|
3
|
+
claim: "An effect either commits or gets cut: a half-committed effect that barely registers is as much a defect as one stamped on every beat, and film grain is out entirely.",
|
|
4
|
+
why: "Review rounds flagged both failure directions - 'don't overuse the reveal effect' alongside 'the blur effect is so minimal and low effort' - so the only approved states for an effect are absent or unmistakable.",
|
|
5
|
+
learnedFrom: "docs/style/CREATIVE_EDGE.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
// The blanket "film grain is out entirely" half of this claim contradicted
|
|
8
|
+
// the shipped kit, which exports and documents `FilmGrain` (video-kit
|
|
9
|
+
// src/craft/stage.tsx), and QGuard renders it twice in Shell.tsx. Unwaived,
|
|
10
|
+
// the projection read as a standing instruction to delete a deliberate,
|
|
11
|
+
// spec'd element - so an agent following CLAUDE.md would strip working
|
|
12
|
+
// work. The ban itself is real client feedback ("just don't like that grain
|
|
13
|
+
// effect", CREATIVE_EDGE directive 15), so it stands everywhere else.
|
|
14
|
+
exceptions: [
|
|
15
|
+
{
|
|
16
|
+
project: "qse-qguard-video",
|
|
17
|
+
decision: "client chose ACT854's persistent frame chrome for the QGuard restyle, film grain included - specified in the mounted-once cinematic overlay as a 256px feTurbulence tile at mixBlendMode overlay (motion-brand-spec \xA76.1)",
|
|
18
|
+
recordedIn: "qse-qguard-video/docs/motion-brand-spec.md"
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
scope: { kind: "pipeline" },
|
|
22
|
+
enforcement: {
|
|
23
|
+
kind: "prose",
|
|
24
|
+
unanchorable: "A commitment-level judgment per effect instance; no single code location expresses it."
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
export {
|
|
28
|
+
commitOrCutEffects
|
|
29
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const convertFramesAcrossClockBoundary = {
|
|
2
|
+
id: "convert-frames-across-clock-boundary",
|
|
3
|
+
claim: "When design and playback clocks coexist, route every cross-boundary value through the remap: values mirroring scene-internal beats convert design-to-playback, and values measuring the film read the composition timeline.",
|
|
4
|
+
why: "A design frame used where a playback frame is meant drifts silently: raw design-frame cue anchors would have been ~1.5s off picture at 1.34x, and the on-screen counter would have claimed a 60s runtime the 56.6s film does not have.",
|
|
5
|
+
learnedFrom: "revola-video/BUILD_NOTES_CRAFT.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "revola-video/src/scenes/craft/mix.tsx", symbol: "at1" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
convertFramesAcrossClockBoundary
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const crossCutElementsLiveInTheHudLayer = {
|
|
2
|
+
id: "cross-cut-elements-live-in-the-hud-layer",
|
|
3
|
+
claim: "Render any element that must hold an exact screen position across a scene cut (a seam contract) in the HUD/screen-space layer, never in world space under the camera.",
|
|
4
|
+
why: "In world space the camera drags the element wherever the last key happens to be, so any recut silently moves the seam and invalidates the neighbouring scene's match cut.",
|
|
5
|
+
learnedFrom: "revola-video/BUILD_NOTES_CRAFT.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "revola-video/src/scenes/craft/craftKit.tsx", symbol: "CraftStage" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
crossCutElementsLiveInTheHudLayer
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const cursorClicksRealControls = {
|
|
2
|
+
id: "cursor-clicks-real-controls",
|
|
3
|
+
claim: "Every cursor click lands on a real, visible control and causes a visible state change; click ripples appear only on genuine navigation clicks, never as decorative presses inside content.",
|
|
4
|
+
why: "Decorative presses that change nothing read as confusing and 'really bad' to clients, and the ripple fix needed a second round because leftover presses survived; interaction realism is what sells a walkthrough as the real product.",
|
|
5
|
+
learnedFrom: "claude-sessions-digest/act854-qpa-video.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "packages/video-kit/src/pure/walk.ts" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
cursorClicksRealControls
|
|
15
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const cutOnRealAudioPauses = {
|
|
2
|
+
id: "cut-on-real-audio-pauses",
|
|
3
|
+
claim: "Place scene boundaries inside real pauses in the recorded read, verified with ffmpeg silencedetect, never by arithmetic division of the audio.",
|
|
4
|
+
why: "An arithmetic cut point lands mid-word or mid-breath; verifying against detected silences guarantees each scene change coincides with a pause in the narration.",
|
|
5
|
+
learnedFrom: "revola-video/BUILD_NOTES_CRAFT.md",
|
|
6
|
+
tier: "craft",
|
|
7
|
+
scope: { kind: "pipeline" },
|
|
8
|
+
enforcement: {
|
|
9
|
+
kind: "prose",
|
|
10
|
+
anchor: { file: "revola-video/src/tokensCraft.ts" }
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
export {
|
|
14
|
+
cutOnRealAudioPauses
|
|
15
|
+
};
|