The open-source full-stack studio for Opus 5.5 motion video. Reverse engineering for any video. Code video with HTML: recreate, edit and render. BYOA + BYOK · Motion.md · Images, Video, Music & Voice.
This report summarizes scanner evidence for nexu-io/openmotion, a TypeScript project with 9,868 GitHub stars. SynthScan examined 1,052,693 lines of code across 7443 source files, recording 1024 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 1.3 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-11-14.
Can maintainers explain intent, assumptions, and trade-offs? 888 finding(s).
Are imports declared and package/API names verified? 11 finding(s).
Are wrappers, guards, and repeated structures necessary? 860 finding(s).
Which changes need focused human review? 1024 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1024 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | hyperframes.ts | 121 | export async function snapshotExportExpectation(runtimeRoot: string, directory: string) { | CODE |
| LOW | editor-server.ts | 35 | export function renderDownloadDisposition(title: string | undefined, extension: string): string { | CODE |
| LOW | phase1-versions.ts | 239 | export async function recoverProjectTransactions(store: WorkspaceStore, runtimeRoot: string) { | CODE |
| LOW | studio/src/webmcp/handles.ts | 197 | export function elementHandleMatchesProject(handle: string, projectId: string | null): boolean { | CODE |
| LOW | studio/src/captions/components/CaptionOverlayUtils.ts | 171 | export function getOrCreateWrapper(el: HTMLElement): HTMLElement { | CODE |
| LOW | studio/src/captions/components/CaptionOverlayUtils.ts | 233 | export function applyCaptionModelToIframe(model: { | CODE |
| LOW⚡ | studio/src/contexts/DomEditContext.tsx | 137 | export function useDomEditActionsContextOptional(): DomEditActionsValue | null { | CODE |
| LOW⚡ | studio/src/contexts/DomEditContext.tsx | 141 | export function useDomEditSelectionContext(): DomEditSelectionValue { | CODE |
| LOW⚡ | studio/src/contexts/DomEditContext.tsx | 150 | export function useDomEditSelectionContextOptional(): DomEditSelectionValue | null { | CODE |
| LOW | studio/src/contexts/FileManagerContext.tsx | 15 | export function useFileManagerContextOptional(): FileManagerValue | null { | CODE |
| LOW | studio/src/contexts/TimelineEditContext.tsx | 20 | export function useTimelineEditContextOptional(): TimelineEditCallbacks { | CODE |
| LOW | studio/src/contexts/TimelineEditContext.tsx | 24 | export function useTimelineEditContextValue(): TimelineEditCallbacks | null { | CODE |
| LOW | studio/src/contexts/VariablePromoteContext.tsx | 109 | export function useVariablePromoteChannel(channel: PromoteChannel): ChannelPromote | null { | CODE |
| LOW | studio/src/contexts/StudioContext.tsx | 81 | export function useStudioShellContextOptional(): StudioShellValue | null { | CODE |
| LOW | studio/src/contexts/StudioContext.tsx | 91 | export function useStudioPlaybackContextOptional(): StudioPlaybackValue | null { | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 49 | function resolvePreviewLocalPointer( | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 75 | function needsPointerEventsInheritanceFallback(doc: Document, win: Window): boolean { | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 96 | function hasOwnPointerEventsOverride(el: HTMLElement, win: Window): boolean { | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 101 | function inheritsPointerEventsNoneFromAncestor(el: HTMLElement, win: Window): boolean { | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 119 | function hasAuthorPointerEventsNone(el: HTMLElement): boolean { | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 127 | function collectPointerEventsNoneTargets( | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 141 | function filterAuthorInteractiveTargets( | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 184 | export function getPreviewTargetFromPointer( | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 233 | export function getAllPreviewTargetsFromPointer( | CODE |
| LOW | studio/src/utils/studioPreviewHelpers.ts | 291 | export function pauseStudioPreviewPlayback(iframe: HTMLIFrameElement | null): number | null { | CODE |
| LOW | studio/src/utils/studioSaveDiagnostics.ts | 70 | function createStudioSaveAbortError(): Error { | CODE |
| LOW | studio/src/utils/studioSaveDiagnostics.ts | 94 | export function getStudioSaveErrorMessage(error: unknown): string { | CODE |
| LOW | studio/src/utils/studioSaveDiagnostics.ts | 110 | export function isStudioSaveErrorAlreadyToasted(error: unknown): boolean { | CODE |
| LOW | studio/src/utils/studioSaveDiagnostics.ts | 144 | function isRetryableStudioSaveError(error: unknown): boolean { | CODE |
| LOW | studio/src/utils/studioSaveDiagnostics.ts | 152 | export function buildStudioSaveFailureProperties( | CODE |
| LOW | studio/src/utils/studioSaveDiagnostics.ts | 191 | export async function createStudioSaveHttpError( | CODE |
| LOW | studio/src/utils/rdpSimplify.ts | 154 | function interpolatePropertyAtTime( | CODE |
| LOW | studio/src/utils/clipboardPayload.ts | 33 | export function serializeClipboardPayload(payload: ClipboardPayload): string { | CODE |
| LOW | studio/src/utils/clipboardPayload.ts | 41 | export function deserializeClipboardPayload(json: string): ClipboardPayload | null { | CODE |
| LOW⚡ | studio/src/utils/studioUrlState.ts | 51 | export function resolveMasterCompositionPath(compositions: string[]): string | null { | CODE |
| LOW⚡ | studio/src/utils/studioUrlState.ts | 61 | export function normalizeStudioUrlPanelTab(tab: RightPanelTab | null): RightPanelTab | null { | CODE |
| LOW⚡ | studio/src/utils/studioUrlState.ts | 67 | export function normalizeStudioCompositionPath( | CODE |
| LOW | studio/src/utils/studioUrlState.ts | 162 | export function parseStudioUrlStateFromHash(hash: string): StudioUrlState { | CODE |
| LOW | studio/src/utils/studioUrlState.ts | 177 | export function readStudioUrlStateFromWindow(): StudioUrlState { | CODE |
| LOW | studio/src/utils/clipboard.ts | 33 | function shouldCopyWithSelectionFirst(): boolean { | CODE |
| LOW | studio/src/utils/frameCapture.ts | 34 | export function buildFrameCaptureFilename(compositionPath: string | null, currentTime: number) { | CODE |
| LOW | studio/src/utils/rootDuration.ts | 35 | export function readRootCompositionDuration(source: string): number | null { | CODE |
| LOW | studio/src/utils/rootDuration.ts | 39 | export function rootCompositionDurationOf(doc: Document): number | null { | CODE |
| LOW | studio/src/utils/rootDuration.ts | 59 | export function patchRootCompositionDuration(source: string, newValue: string): string { | CODE |
| LOW | studio/src/utils/rootDuration.ts | 77 | export function extendRootDurationInSource(source: string, newEnd: number): string { | CODE |
| LOW | studio/src/utils/sourcePatcher.ts | 47 | function escapeStyleAttributeValue(value: string, quote: string): string { | CODE |
| LOW | studio/src/utils/sourcePatcher.ts | 56 | function splitInlineStyleDeclarations(style: string): string[] { | CODE |
| LOW | studio/src/utils/sourcePatcher.ts | 352 | function findMatchingClosingTagIndex(html: string, tagName: string, contentStart: number): number { | CODE |
| LOW | studio/src/utils/sourcePatcher.ts | 412 | function patchHtmlAttributeByTarget( | CODE |
| LOW | studio/src/utils/timelineAssetDrop.ts | 14 | export function parseTimelineAssetPayload(raw: string): { path: string; duration?: number } | null { | CODE |
| LOW | studio/src/utils/timelineAssetDrop.ts | 58 | export function buildTimelineFileDropPlacements( | CODE |
| LOW | studio/src/utils/timelineAssetDrop.ts | 74 | export function resolveTimelineAssetCompositionSize(source: string): { | CODE |
| LOW | studio/src/utils/timelineAssetDrop.ts | 108 | export function buildTimelineAssetInsertHtml(input: { | CODE |
| LOW | studio/src/utils/timelineAssetDrop.ts | 144 | export function extendCompositionDurationIfNeeded(source: string, requiredEnd: number): string { | CODE |
| LOW | studio/src/utils/timelineAssetDrop.ts | 157 | export function setCompositionDurationToContent( | CODE |
| LOW | studio/src/utils/timelineAssetDrop.ts | 170 | export function insertTimelineAssetIntoSource(source: string, assetHtml: string): string { | CODE |
| LOW | studio/src/utils/sdkCutoverEligibility.ts | 94 | export function shouldDeclineTextCutoverForTarget(target: unknown, ops: PatchOperation[]): boolean { | CODE |
| LOW | studio/src/utils/sdkCutoverEligibility.ts | 144 | export function sdkCutoverIneligibleReason( | CODE |
| LOW | studio/src/utils/studioFileHistory.ts | 71 | export async function saveProjectFilesWithHistory( | CODE |
| LOW | studio/src/utils/studioFileHistory.ts | 83 | export async function saveServerRewriteWithHistory(input: { | CODE |
| 675 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | studio/src/utils/sdkCutoverEligibility.ts | 55 | // ─── html-attribute safety ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/gsapUndoRestore.test.ts | 28 | // ── Bug 2: undo/redo restore soft-apply ────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.ts | 25 | // ─── Types ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.ts | 42 | // ─── Op helpers ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.ts | 59 | // ─── Read-back helpers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.ts | 171 | // ─── Core check (pure — testable without flag) ──────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.ts | 256 | // ─── Telemetry ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.ts | 578 | // ─── Soak gate ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 17 | // ─── Telemetry capture ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 33 | // ─── Flag mock ──────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 48 | // ─── Fixtures ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 67 | // ─── A. Flag gating ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 141 | // ─── B. Telemetry-only (no side effects on real write) ──────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 202 | // ─── C. Resolver-parity detection ──────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 333 | // ─── D. Redaction ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 374 | // ─── E. Soak gate ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 526 | // ─── G. recordAnimationResolverParity (GSAP animationId ops) ────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 578 | // ── Stale-session disambiguation (the 0.7.48 keyframe-op class) ───────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 675 | // ─── G2. runResolverShadow cross-file guard ─────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 715 | // ─── H. Inlined sub-composition: bare leaf id resolves (regression) ─────────── | COMMENT |
| MEDIUM | studio/src/utils/sdkResolverShadow.test.ts | 758 | // ─── I. Attempt counter (denominator for the soak gate) ─────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 23 | // ── toggleMainLineSlide ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 48 | // ── reorderMainLineSlide ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 74 | // ── reorderBranchSlide ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 97 | // ── setSlideNotes ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 111 | // ── branch-scoped authoring (Finding #14) ────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 111 | // ── branch-scoped authoring (Finding #14) ────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 147 | // ── addFragment ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 175 | // ── removeFragment ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 189 | // ── createSequence ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 210 | // ── renameSequence ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 232 | // ── deleteSequence ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 295 | // ── assignToBranch ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 332 | // ── addHotspot / removeHotspot ───────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 376 | // ── safeParseManifest ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.test.ts | 399 | // ── makeSlideshowNotesController ────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowSubPanels.tsx | 13 | // ── Section header (accordion toggle) ──────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowSubPanels.tsx | 37 | // ── Sub-surface: Slide List ────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowSubPanels.tsx | 136 | // ── Sub-surface: Slide Inspector ───────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowSubPanels.tsx | 212 | // ── Sub-surface: Branch Tree ────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowSubPanels.tsx | 434 | // ── Sub-surface: Hotspot Tool ───────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.tsx | 73 | // ── Notes-attribution controller (pure, testable) ───────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/SlideshowPanel.tsx | 165 | // ── Component ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/slideshowPanelHelpers.ts | 8 | // ── Scene shape used by the panel UI ────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/panels/slideshowPanelHelpers.ts | 17 | // ── Pure manifest transforms ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/editor/propertyPanelHelpers.ts | 405 | // ── GSAP runtime value readers (used by PropertyPanel) ──────────────────── | COMMENT |
| MEDIUM | studio/src/components/editor/LayersPanel.test.ts | 182 | // ── liveTime throttle contract (mirrors the useEffect in LayersPanel) ────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 14 | // ── helpers ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 87 | // ── parseZIndex ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 104 | // ── distinct-z fast path (single-element patch) ──────────────────────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 201 | // ── DOM-order ties (the repro) ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 276 | // ── overlap scoping (real getBoundingClientRect) ──────────────────────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 354 | // ── non-painting sibling hygiene ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 423 | // ── visibility scoping (forward/backward step over VISIBLE siblings only) ────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 497 | // ── default visibility probe (element-level computed style) ─────────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 543 | // ── resolveCrossedNeighbor (the "show your work" flash target) ──────────────── | COMMENT |
| MEDIUM | …/src/components/editor/canvasContextMenuZOrder.test.ts | 580 | // ── isZOrderActionEnabled ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/editor/domEditingElement.ts | 23 | // ─── Visibility ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/editor/domEditingElement.ts | 79 | // ─── Visual scoring ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | studio/src/components/editor/domEditingElement.ts | 81 | // ─── Layer patch target ────────────────────────────────────────────────────── | COMMENT |
| 65 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | studio/src/utils/designInputTracking.ts | 1 | import { trackStudioEvent } from "./studioTelemetry"; | COMMENT |
| LOW | studio/src/utils/gsapSoftReload.ts | 401 | // Prefer the caller-supplied scrub position (the studio's own authoritative | COMMENT |
| LOW | studio/src/utils/sdkResolverShadow.ts | 361 | // sessionElementCount > 0 + element_not_found = runtime-only element; | COMMENT |
| LOW | studio/src/utils/sdkResolverShadow.ts | 441 | trackStudioEvent("sdk_resolver_shadow", { | COMMENT |
| LOW | studio/src/utils/gsapUndoRestore.ts | 101 | return true; | COMMENT |
| LOW | studio/src/utils/reloadDebug.ts | 1 | // Preview full-reload diagnostics — grep [hf-reload]. Off by default; opt in per | COMMENT |
| LOW | studio/src/utils/selectDebug.ts | 1 | // Canvas selection diagnostics — grep [hf-select]. Off by default; opt in with | COMMENT |
| LOW | studio/src/components/renders/useRenderQueue.ts | 81 | export function useRenderQueue( | COMMENT |
| LOW | studio/src/components/feedback/projectProvenance.ts | 1 | import { buildProjectApiPath } from "../../utils/projectRouting"; | COMMENT |
| LOW | studio/src/components/feedback/feedbackTrigger.ts | 1 | // --------------------------------------------------------------------------- | COMMENT |
| LOW | studio/src/components/nle/useTimelineEditCallbacks.ts | 301 | if (selection) { | COMMENT |
| LOW | studio/src/components/nle/NLEContext.tsx | 101 | setShadowIframeNode, | COMMENT |
| LOW | studio/src/components/editor/useFxCarve.ts | 281 | if (lanes.length > 0 || carriedOver.lanes.length !== automation.lanes.length) { | COMMENT |
| LOW | studio/src/components/editor/MotionPathOverlay.tsx | 141 | ); | COMMENT |
| LOW | studio/src/components/editor/MotionPathOverlay.tsx | 281 | ? geometry.nodes.map((n, i) => (i === draft.index ? { ...n, x: draft.x, y: draft.y } : n)) | COMMENT |
| LOW | …dio/src/components/editor/offCanvasIndicatorRefresh.ts | 41 | const Observer = doc.defaultView?.MutationObserver ?? globalThis.MutationObserver; | COMMENT |
| LOW | …/src/components/editor/propertyPanelFlatPrimitives.tsx | 301 | // every move) never commits until the pointer pauses or lifts — which kills | COMMENT |
| LOW | …/src/components/editor/propertyPanelFlatPrimitives.tsx | 321 | // instead of closing over the callback at schedule time. A caller whose | COMMENT |
| LOW | studio/src/components/editor/useDomEditOverlayRects.ts | 161 | // An explicitly-selected element's overlay must track it whenever it's laid | COMMENT |
| LOW | studio/src/components/editor/useFxCarveGrouping.ts | 201 | * Reads the element's `data-label` as well as its id and `src`, because a clip's | COMMENT |
| LOW | …c/components/editor/propertyPanelAudioFxGroup.test.tsx | 1921 | ); | COMMENT |
| LOW | studio/src/components/editor/domEditOverlayGeometry.ts | 41 | COMMENT | |
| LOW | studio/src/components/editor/EaseCurveSection.tsx | 281 | // Keep the local draft displayed until the committed `ease` prop round-trips | COMMENT |
| LOW | studio/src/components/editor/PropertyPanelFlat.tsx | 161 | // preserves them across re-renders, but toggling a non-adjacent group still | COMMENT |
| LOW | studio/src/hooks/gsapTweenSynth.ts | 81 | byPct.set(kf.percentage, { ...kf, properties: { ...kf.properties } }); | COMMENT |
| LOW | studio/src/hooks/useDomEditAttributeCommits.ts | 221 | ], | COMMENT |
| LOW | studio/src/hooks/timelineAudioGroupVolume.ts | 81 | * ensures the NEXT parse is honest, and a live attribute patch does not cause | COMMENT |
| LOW | studio/src/hooks/useGsapScriptCommits.ts | 461 | ); | COMMENT |
| LOW | studio/src/hooks/gsapKeyframeCacheHelpers.ts | 81 | const sourceAnimations = new Map<string, GsapAnimation[]>(); | COMMENT |
| LOW | studio/src/hooks/useTimelineGroupEditing.ts | 261 | // Running it anyway is what made the mirrored z-order lane move blink — | COMMENT |
| LOW | studio/src/hooks/useSdkSession.ts | 121 | COMMENT | |
| LOW | studio/src/hooks/gsapResizeIntercept.ts | 321 | // sent almost every element to the fallback below: a 630px chip scaled by | COMMENT |
| LOW | studio/src/hooks/gsapResizeIntercept.ts | 341 | // | COMMENT |
| LOW | studio/src/hooks/gsapResizeIntercept.ts | 461 | if (measured === "settled") return true; | COMMENT |
| LOW | studio/src/hooks/useAnimatedPropertyCommit.ts | 461 | throw new GsapEditBlockedError("no-selector"); | COMMENT |
| LOW | studio/src/hooks/useStudioTestHooks.ts | 101 | // tears the effect down on the very next frame. Releasing on teardown | COMMENT |
| LOW | studio/src/telemetry/breadcrumbs.ts | 1 | // --------------------------------------------------------------------------- | COMMENT |
| LOW | studio/src/telemetry/distinctId.ts | 1 | // --------------------------------------------------------------------------- | COMMENT |
| LOW | studio/src/telemetry/distinctId.ts | 101 | } | COMMENT |
| LOW | studio/src/telemetry/canary.ts | 1 | // --------------------------------------------------------------------------- | COMMENT |
| LOW | studio/src/telemetry/canary.ts | 21 | // second storage location, so its localStorage id doubles as the seed. | COMMENT |
| LOW | …dio/src/player/components/useAutomationLaneGestures.ts | 281 | if (e.button !== 0) return; | COMMENT |
| LOW | studio/src/player/components/TimelineGroupRow.tsx | 81 | // into the display list, and every one of these reads silently degraded to | COMMENT |
| LOW | …udio/src/player/components/useAutomationEdgeStretch.ts | 161 | (e: ReactPointerEvent<SVGSVGElement>): boolean => { | COMMENT |
| LOW | studio/src/player/components/TimelineTrackHeader.tsx | 201 | ); | COMMENT |
| LOW | …/src/player/components/timelineClipDragPreview.test.ts | 21 | TRACKS_TOP_PAD, | COMMENT |
| LOW | studio/src/player/components/Player.tsx | 281 | container.classList.add("preview-revealing"); | COMMENT |
| LOW | studio/src/player/components/TimelineClipDiamonds.tsx | 141 | const diamondSize = beatsActive | COMMENT |
| LOW | studio/src/player/hooks/useTimelinePlayer.ts | 441 | // keepPlaying: move the playhead without the paused-seek audio scrub. | COMMENT |
| LOW | studio/src/player/store/playerStore.ts | 501 | setElements: (elements) => set({ elements }), | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 81 | #endif`,ku=`#ifdef USE_ALPHATEST | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 301 | #elif defined( USE_COLOR ) | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 321 | #endif | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 441 | uv.x *= CUBEUV_TEXEL_WIDTH; | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 501 | #ifdef USE_TANGENT | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 561 | outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity ); | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 581 | uniform float refractionRatio; | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 901 | #else | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 1301 | #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS ) | COMMENT |
| LOW | …onents/showcase/glass-shard-title/assets/glass-main.js | 1361 | #if defined( RE_IndirectSpecular ) | COMMENT |
| 60 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …o/src/components/nle/useTimelineEditCallbacks.test.tsx | 438 | expect(mocks.actions.handleGsapRemoveAllKeyframes.mock.calls.map((call) => call[0])).toEqual([ | CODE |
| CRITICAL | …/src/player/components/TimelineAutomationLane.test.tsx | 869 | const right = (nearB.props.onPreview.mock.calls.at(-1)?.[0] as HfAutomation | undefined) | CODE |
| CRITICAL | …/src/player/components/TimelineAutomationLane.test.tsx | 876 | const left = (nearA.props.onPreview.mock.calls.at(-1)?.[0] as HfAutomation | undefined) | CODE |
| CRITICAL | …onents/showcase/glass-shard-title/assets/glass-main.js | 3586 | }`,Je={alphahash_fragment:Fu,alphahash_pars_fragment:Bu,alphamap_fragment:zu,alphamap_pars_fragment:Vu,alphatest_fragmen | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 291 | ### 1. The first full-stack agentic video generator | COMMENT |
| MEDIUM | README.REVERSE-ENGINEERING.md | 337 | ### 1. The first full-stack agentic video generator | COMMENT |
| MEDIUM | studio/src/components/CompositionMissingBanner.test.tsx | 3 | // same small React-root scaffold every banner test in this directory uses. | COMMENT |
| MEDIUM | …io/src/components/editor/domEditingAgentPrompt.test.ts | 161 | // Both end on the identical guardrails block, byte for byte. | COMMENT |
| MEDIUM⚡ | web/catalog/hyperframes.json | 1 | {"version":1,"syncedAt":"2026-10-26T15:31:08.812Z","mediaCheckedAt":"2026-10-26T15:31:08.815Z","sources":["https://raw.g | CODE |
| MEDIUM⚡ | web/catalog/hyperframes.json | 1 | {"version":1,"syncedAt":"2026-10-26T15:31:08.812Z","mediaCheckedAt":"2026-10-26T15:31:08.815Z","sources":["https://raw.g | CODE |
| MEDIUM⚡ | web/catalog/hyperframes.json | 1 | {"version":1,"syncedAt":"2026-10-26T15:31:08.812Z","mediaCheckedAt":"2026-10-26T15:31:08.815Z","sources":["https://raw.g | CODE |
| MEDIUM | …otion-8197b521-9883-45de-be9d-6b492770b3eb/TEMPLATE.md | 1 | # Recursive agent orchestration | COMMENT |
| MEDIUM | …97b521-9883-45de-be9d-6b492770b3eb/source/preview.html | 5 | <div class="overview"><section class="hero"><div class="tile-label">构图与编排 <span>可播放 · 可替换内容</span></div><figure class="d | CODE |
| MEDIUM | …7b521-9883-45de-be9d-6b492770b3eb/source/demos/data.js | 1 | const CONFIG={"mode": "w2-recursive-agents", "demoTitle": "Orchestrate", "palette": ["#f5f5f1", "#202122", "#9966cc", "# | CODE |
| MEDIUM | docs/product/studio-vision.md | 117 | ## 知识、RAG 与数据闭环 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | studio/src/components/editor/EaseCurveSection.tsx | 285 | // `ease` changes, `curve` already equals the draft, so the handoff is seamless. | COMMENT |
| MEDIUM | studio/src/player/components/TimelineFxButton.test.tsx | 147 | // The design doc calls the sentence this dialog carries "the highest-leverage | COMMENT |
| LOW | web/connect.html | 67 | <details><summary><span data-i18n="Do I need assets or a prompt first?">需要先准备素材或填写提示词吗?</span> <svg class="ui-icon | CODE |
| MEDIUM⚡ | web/catalog/hyperframes.json | 1 | {"version":1,"syncedAt":"2026-10-26T15:31:08.812Z","mediaCheckedAt":"2026-10-26T15:31:08.815Z","sources":["https://raw.g | CODE |
| MEDIUM⚡ | web/catalog/hyperframes.json | 1 | {"version":1,"syncedAt":"2026-10-26T15:31:08.812Z","mediaCheckedAt":"2026-10-26T15:31:08.815Z","sources":["https://raw.g | CODE |
| MEDIUM | …930878-a770-486d-b697-a1d0f10089ce/source/preview.html | 5 | <div class="overview"><section class="hero"><div class="tile-label">构图与编排 <span>可播放 · 可替换内容</span></div><figure class="d | CODE |
| MEDIUM | …930878-a770-486d-b697-a1d0f10089ce/source/preview.html | 28 | <section id="source-view" hidden><pre># Introducing Prime Agent: A self-improving RLM harness for coding and long-runnin | CODE |
| MEDIUM | …30878-a770-486d-b697-a1d0f10089ce/source/demos/data.js | 1 | const CONFIG={"mode": "f3-prime", "mechanism": "prime", "demoTitle": "PRIME-AGENT", "brand": "Prime Intellect", "palette | CODE |
| MEDIUM | …6dbdd-1cb7-434e-9b50-b7c9116ab46c/source/demos/data.js | 1 | const CONFIG={"mode": "w1-service-list", "demoTitle": "Find home services", "palette": ["#f9fbff", "#22262a", "#478be3", | CODE |
| MEDIUM | …0411c-316e-4b1c-8c15-c1c56527e53a/source/demos/data.js | 2 | const DATA={"tracks": [{"id": "text-0.center", "target": "text-0", "property": "center", "unit": "px", "space": "canvas" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | studio/tests/e2e/design-panel-qa-matrix.md | 7 | ## Step 0: demo-failure reproduction (baseline, pre-fix) | COMMENT |
| LOW⚡ | studio/src/captions/parser.ts | 183 | // Step 1: Extract transcript words from source | COMMENT |
| LOW⚡ | studio/src/captions/parser.ts | 189 | // Step 2: Look for grouping and word elements in the iframe DOM | COMMENT |
| LOW | studio/src/captions/parser.ts | 204 | // Step 5: Read computed styles from the first word or group element | COMMENT |
| LOW | studio/src/captions/parser.ts | 256 | // Step 6: Read container styles from group element (if visible background) | COMMENT |
| LOW | studio/src/captions/parser.ts | 284 | // Step 7: Apply extracted styles to all groups in the model | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | studio/src/captions/parser.ts | 183 | // Step 1: Extract transcript words from source | COMMENT |
| LOW⚡ | studio/src/captions/parser.ts | 189 | // Step 2: Look for grouping and word elements in the iframe DOM | COMMENT |
| LOW | studio/src/captions/parser.ts | 204 | // Step 5: Read computed styles from the first word or group element | COMMENT |
| LOW | studio/src/captions/parser.ts | 256 | // Step 6: Read container styles from group element (if visible background) | COMMENT |
| LOW | studio/src/captions/parser.ts | 284 | // Step 7: Apply extracted styles to all groups in the model | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | studio/src/utils/htmlAttrSafety.ts | 41 | "placeholder", | CODE |
| LOW | studio/src/motion/artifactBrowser.test.ts | 55 | for (const address of ['javascript:alert(1)', 'data:text/html,hello', 'file:///etc/passwd', 'https://user:secret@examp | CODE |
| LOW⚡ | web/catalog/hyperframes.json | 1 | {"version":1,"syncedAt":"2026-10-26T15:31:08.812Z","mediaCheckedAt":"2026-10-26T15:31:08.815Z","sources":["https://raw.g | CODE |
| LOW | scripts/check.ts | 61 | // Agents choose routes from these texts, so a stale "placeholder" note hides a ready Skill. | COMMENT |
| LOW | packages/design-system/token-model.js | 29 | { title: '中性色', note: '背景、边框与文字,共同构成界面的基本层次。', keys: ['bg', 'panel', 'raised', 'inset', 'hover', 'border', 'border-str | CODE |
| LOW | packages/design-system/tokens.json | 120 | "placeholder": "#848484", | CODE |
| LOW | packages/design-system/tokens.json | 172 | "placeholder": "#969696", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | web/connect.html | 22 | <p class="connect-notice" id="host-unavailable" role="note" hidden><svg class="ui-icon" aria-hidden="true"><us | CODE |