{
  "version": 1,
  "engines": ["gpu", "osr"],
  "statuses": ["consumed", "partial", "ignored", "other-subsystem"],
  "fields": [
    { "path": "tracks[].items[].audio", "applies_to": ["cuts"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/render-cut/src/internal-render.mjs projectRendererCompatibilityEdit; packages/render-cut/src/plan.mjs cut_audio uses isCutAudioAudible before GPU/OSR audioSourcePath mux" },
    { "path": "tracks[].items[].link", "applies_to": ["audio"], "gpu": "ignored", "osr": "ignored", "evidence": "Editing association only. Engines use the audio item source and timing; link is not consumed." },
    { "path": "tracks[].items[].cut_edge", "applies_to": ["audio", "cuts", "layers", "overlays", "baked"], "gpu": "ignored", "osr": "ignored", "evidence": "Editing-only restore record of the pre-cut media edge on visual and audio items; engines use the item source and timing." },
    { "path": "tracks[].items[].reason", "applies_to": ["audio"], "gpu": "ignored", "osr": "ignored", "evidence": "Editing-only provenance on surviving audio pieces for cut restoration; engines use the item source and timing." },
    { "path": "tracks[].items[].label", "applies_to": ["audio"], "gpu": "ignored", "osr": "ignored", "evidence": "Editing-only provenance label on surviving audio pieces for cut restoration; engines use the item source and timing." },
    { "path": "tracks[].items[].mute", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/audio-ownership.ts isAudioItemAudible; packages/render-cut/src/internal-render.mjs and plan.mjs audio mix" },
    { "path": "tracks[].items[].id", "applies_to": ["cuts", "layers", "overlays", "baked", "captions", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem; packages/frame-engine/src/timeline/plan.ts layerFromPlacement/resolvedCompositeLayers; packages/render-cut/src/internal-render.mjs captionItemOverlays/renderItemDeclaration" },
    { "path": "tracks[].items[].id", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].name", "applies_to": ["cuts", "layers", "overlays", "baked", "audio", "captions", "group"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "edit-store authoring metadata", "evidence": "packages/edit-store/src/edit-v2.ts validateItem/validateAudioItem; packages/edit-store/src/internal-model.ts buildV2Item does not project item names" },
    { "path": "tracks[].items[].hidden", "applies_to": ["captions"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/render-cut/src/internal-render.mjs collectHiddenItemIds/captionItemOverlays" },
    { "path": "tracks[].items[].hidden", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem projects hidden; packages/overlay-runtime/src/parts.mjs expandBagOverlays and packages/render-cut/src/internal-render.mjs unexpandedHtmlOverlays skip hidden overlay items" },
    { "path": "tracks[].items[].hidden", "applies_to": ["cuts", "layers", "baked", "audio", "group"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem projects hidden for visual declarations but packages/render-cut/src/internal-render.mjs cut/layer compatibility projection does not skip it; buildV2AudioItem omits hidden", "hint": "描画対象から外すには item を削除するか、対応する非表示契約が実装されるまで hidden を使わない" },
    { "path": "tracks[].items[].locked", "applies_to": ["cuts", "layers", "overlays", "baked", "audio", "captions", "group"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "timeline editor", "evidence": "packages/edit-store/src/edit-v2.ts validateItem/validateAudioItem; packages/edit-store/src/internal-model.ts buildV2Item does not project locked" },
    { "path": "tracks[].items[].at", "applies_to": ["cuts", "layers", "overlays", "baked", "captions", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem; packages/frame-engine/src/timeline/plan.ts buildResolvedTimelinePlan/isLayerActiveAt; packages/overlay-runtime/src/parts.mjs overlayRecord" },
    { "path": "tracks[].items[].at", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].duration", "applies_to": ["cuts", "layers", "overlays", "baked", "captions", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem; packages/frame-engine/src/timeline/plan.ts isLayerActiveAt/buildResolvedTimelinePlan; packages/overlay-runtime/src/parts.mjs overlayRecord" },
    { "path": "tracks[].items[].duration", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].anchor", "applies_to": ["cuts", "layers", "overlays", "baked", "group", "audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "edit-store anchor resolution", "evidence": "packages/edit-store/src/item-anchor.ts resolveItemAnchors/withoutItemAnchors including audio items; packages/edit-store/src/internal-model.ts readInternalEdit resolves anchor into at/duration before the engine plan and audio mix; packages/edit-store/src/tree-ops.ts refreshItemAnchors" },
    { "path": "tracks[].items[].transform", "applies_to": ["cuts", "layers", "overlays", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts visualAt/layerStyleVisualAt/resolvedCompositeLayers; packages/render-cut/src/rasterize.mjs renderOverlayNode", "note": "scaleX/scaleY > 0; effective axes = scaleX/scaleY ?? scale ?? 1; equal axes normalize to scale" },
    { "path": "tracks[].items[].transform", "applies_to": ["captions", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/group-flatten.ts flattenGroupDescendants; packages/render-cut/src/internal-render.mjs captionItemOverlays; packages/overlay-runtime/src/parts.mjs expandItem", "note": "group の media / caption / HTML の子へ静的 transform を合成する。group は等比のみ（scaleX/scaleY 禁止）" },
    { "path": "tracks[].items[].opacity", "applies_to": ["cuts", "layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts visualAt/layerStyleVisualAt/resolvedCompositeLayers" },
    { "path": "tracks[].items[].opacity", "applies_to": ["overlays", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/group-flatten.ts flattenGroupDescendants; packages/render-cut/src/rasterize.mjs renderOverlayNode; apps/shell/extensions/akari-preview/src/browser/akari-preview-open-handler.ts applyOverlayTracks", "note": "group の静的不透明度は子へ乗算し、keyframes の無い overlay にも適用する" },
    { "path": "tracks[].items[].opacity", "applies_to": ["captions"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/internal-render.mjs captionItemOverlays projects opacity; packages/render-cut/src/rasterize.mjs renderOverlayNode does not apply static opacity" },
    { "path": "tracks[].items[].blend", "applies_to": ["layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts BLENDS/resolvedCompositeLayers" },
    { "path": "tracks[].items[].blend", "applies_to": ["cuts", "overlays", "captions", "group"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/edit-store/src/internal-model.ts needsLayersEngine; packages/render-cut/src/rasterize.mjs renderOverlayNode has no blend application", "hint": "非 normal blend は layers 投影になる media item で使う" },
    { "path": "tracks[].items[].crop", "applies_to": ["cuts", "layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts layerStyleVisualAt/resolvedCompositeLayers" },
    { "path": "tracks[].items[].frame", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts needsLayersEngine; packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers; packages/frame-engine/src/compositor/webgl2.ts layerFragment/photoFrameUniforms" },
    { "path": "tracks[].items[].crop", "applies_to": ["overlays", "captions", "group"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/rasterize.mjs renderOverlayNode applies transform vars only", "hint": "overlay の HTML/CSS 内で clipping を表現する" },
    { "path": "tracks[].items[].adjust", "applies_to": ["cuts", "layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts resolveAdjustLut; packages/frame-engine/src/compositor/webgl2.ts configureAdjustLut" },
    { "path": "tracks[].items[].adjust.fx", "applies_to": ["cuts", "layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/compositor/webgl2.ts runFxPasses" },
    { "path": "tracks[].items[].adjust", "applies_to": ["overlays", "captions", "group"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/rasterize.mjs renderOverlayNode applies transform vars only", "hint": "overlay の HTML/CSS 内で色調整を表現する" },
    { "path": "tracks[].items[].perspective", "applies_to": ["cuts"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/frame-engine/src/timeline/plan.ts cutDeclaresPerspective warning; layerStyleVisualAt does not read perspective", "issue": 39, "hint": "layers 経路（mask / 非 normal blend）へ寄せるか perspective を外す" },
    { "path": "tracks[].items[].perspective", "applies_to": ["layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers" },
    { "path": "tracks[].items[].perspective", "applies_to": ["overlays", "captions", "group"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/rasterize.mjs renderOverlayNode applies no perspective geometry", "hint": "overlay の HTML/CSS 内で perspective を表現する" },
    { "path": "tracks[].items[].motion", "applies_to": ["cuts", "layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/item-motion.ts motionVisualAt is composed by packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers and visualAt for layer and cut evaluation" },
    { "path": "tracks[].items[].motion", "applies_to": ["captions"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/frame-engine/src/timeline/caption-motion.ts captionMotionAt; captions use their own animation field", "hint": "字幕の動きは字幕の設定を使う" },
    { "path": "tracks[].items[].motion", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/item-motion.js evaluateOverlayMotion; packages/overlay-runtime/src/overlay-runtime.js; packages/render-cut/src/rasterize.mjs; packages/gpu-export/src/page-runtime.js", "note": "プレビューと書き出しで共通評価" },
    { "path": "tracks[].items[].motion", "applies_to": ["group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/group-flatten.ts motionParents; packages/frame-engine/src/timeline/plan.ts evaluateItemMotion; packages/overlay-runtime/src/parts.mjs motionParents", "note": "親の動きは子の評価後に継承" },
    { "path": "tracks[].items[].animator", "applies_to": ["cuts", "layers", "baked"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/frame-engine/src/timeline/plan.ts warnUnknownFields warns once per non-text item" },
    { "path": "tracks[].items[].animator", "applies_to": ["captions", "group"], "gpu": "consumed", "osr": "ignored", "evidence": "packages/frame-engine/src/timeline/caption-animator.ts normalizeAnimators/captionAnimatorStateAt/animatorUnitsOf", "note": "GPU caption units only; group applies to caption text. segments uses words; letterSpacing is evaluated but the GPU tile exit ignores it with a warning. Other group text paths are outside v1." },
    { "path": "tracks[].items[].animator", "applies_to": ["overlays"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/rasterize.mjs renderOverlayNode has no animator evaluator", "hint": "HTML text uses CSS/GSAP animation" },
    { "path": "tracks[].items[].keyframes", "applies_to": ["cuts", "layers", "overlays", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts layerStyleVisualAt/resolvedCompositeLayers; packages/render-cut/src/internal-render.mjs resolveReferencedItemKeyframes; packages/gpu-export/src/page-runtime.js GpuDomLayerRuntime.captureRun" },
    { "path": "tracks[].items[].keyframes", "applies_to": ["captions"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/internal-render.mjs captionItemOverlays; packages/overlay-runtime/src/parts.mjs expandItem do not evaluate parent/caption keyframes", "hint": "group の keyframes / motion は静的な子への継承対象外。keyframes は描画される child item に置く" },
    { "path": "tracks[].items[].keyframes", "applies_to": ["group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/group-flatten.ts motionParents; packages/frame-engine/src/timeline/plan.ts evaluateItemMotion; packages/overlay-runtime/src/parts.mjs motionParents", "note": "親の位置・拡縮・回転・不透明度を子に継承" },
    { "path": "tracks[].items[].items", "applies_to": ["overlays", "captions", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2Item recursion; packages/overlay-runtime/src/parts.mjs expandBagOverlays; packages/render-cut/src/internal-render.mjs captionItemOverlays" },
    { "path": "tracks[].items[].items", "applies_to": ["cuts", "layers", "baked"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/edit-store/src/internal-model.ts buildV2Item stores children; packages/render-cut/src/internal-render.mjs projectRendererCompatibilityEdit enumerates only top-level cut/layer items", "hint": "media / baked child は独立 track item にする" },
    { "path": "tracks[].items[].mask", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts needsLayersEngine/buildV2VisualItem; packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers" },
    { "path": "tracks[].items[].maskFeather", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/mask/compose-still-mask.ts; packages/frame-engine/src/evaluate.ts" },
    { "path": "tracks[].items[].regions", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem; packages/frame-engine/src/adjust/photo-regions.ts; packages/frame-engine/src/evaluate.ts" },
    { "path": "tracks[].items[].erase", "applies_to": ["layers"], "gpu": "partial", "osr": "partial", "runtime_warning": true, "note": "静止画の線だけ適用。動画では警告する", "evidence": "packages/frame-engine/src/mask/compose-still-mask.ts; packages/frame-engine/src/timeline/plan.ts" },
    { "path": "tracks[].items[].flip", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts; packages/frame-engine/src/compositor/webgl2.ts" },
    { "path": "tracks[].items[].source", "applies_to": ["cuts", "layers", "overlays", "baked", "captions", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem source.kind switch" },
    { "path": "tracks[].items[].source", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].role", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem role switch" },
    { "path": "tracks[].items[].gain_db", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem gainDb projection" },
    { "path": "tracks[].items[].fade_in", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem fadeIn/fade_in projection" },
    { "path": "tracks[].items[].fade_out", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem fadeOut/fade_out projection" },
    { "path": "tracks[].items[].fade_in_shape", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/envelope.ts projectAudioFadeShapes/audioFadeFfmpegCurve; packages/render-cut/src/plan.mjs fadeCurveOption" },
    { "path": "tracks[].items[].fade_out_shape", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/envelope.ts projectAudioFadeShapes/audioFadeFfmpegCurve; packages/render-cut/src/plan.mjs fadeCurveOption" },
    { "path": "tracks[].items[].ducking", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem ducking projection" },
    { "path": "tracks[].items[].duck_db", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem duck projection; packages/edit-store/src/envelope.ts computeDuckEnvelope" },
    { "path": "tracks[].items[].duck_attack", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/envelope.ts computeDuckEnvelope attack ramp" },
    { "path": "tracks[].items[].duck_release", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/envelope.ts computeDuckEnvelope release ramp" },
    { "path": "tracks[].items[].denoise", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/media-bin/src/preview-audio-sidecar.mjs buildAudioClipFxFilters; packages/render-cut/src/plan.mjs clipFxPrefix" },
    { "path": "tracks[].items[].lowcut_hz", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/media-bin/src/preview-audio-sidecar.mjs buildAudioClipFxFilters highpass cascade" },
    { "path": "tracks[].items[].keyframes[].gain_db", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/envelope.ts evaluateEnvelopeDb; packages/edit-store/src/audio-schedule.ts envelopeEvents" },
    { "path": "tracks[].items[].source.pitch_semitones", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/media-bin/src/preview-audio-sidecar.mjs buildAudioClipFxFilters rubberband pitch" },
    { "path": "tracks[].items[].source.formant", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/media-bin/src/preview-audio-sidecar.mjs buildAudioClipFxFilters rubberband formant" },
    { "path": "tracks[].items[].script", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "narration metadata", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem narration projection" },
    { "path": "tracks[].items[].reading", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "narration metadata", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem narration projection" },
    { "path": "tracks[].items[].caption_ref", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "narration metadata", "evidence": "packages/schemas/edit.schema.json itemV2AudioMedia" },
    { "path": "tracks[].items[].provenance", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "narration metadata", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem narration projection" },

    { "path": "tracks[].items[].source.kind", "applies_to": ["cuts", "layers", "overlays", "baked", "captions", "group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts legacyKindOfV2Track/buildV2VisualItem; packages/render-cut/src/internal-render.mjs renderItemKind" },
    { "path": "tracks[].items[].source.canvas", "applies_to": ["group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem; packages/overlay-runtime/src/parts.mjs expandItem emits a clipped full-frame HTML background record" },
    { "path": "tracks[].items[].source.kind", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "edit-store audio projection", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].source.shape", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/shape-markup.ts shapeMarkup; packages/edit-store/src/shape-markup-v1.ts shapeMarkupV1; packages/edit-store/src/internal-model.ts buildV2VisualItem lowers shape sources to inline SVG HTML overlays" },
    { "path": "tracks[].items[].source.src", "applies_to": ["cuts", "layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem; packages/frame-engine/src/timeline/plan.ts layerFromPlacement/resolvedCompositeLayers" },
    { "path": "tracks[].items[].source.src", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].source.in", "applies_to": ["cuts"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts layerFromPlacement/buildResolvedTimelinePlan" },
    { "path": "tracks[].items[].source.in", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem layer declaration emits `in: item.source.in`; packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers sourceTimeUs = finite(layer.in, 0) + localSeconds * speed" },
    { "path": "tracks[].items[].source.in", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].source.out", "applies_to": ["cuts"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts buildResolvedTimelinePlan/layerFromPlacement" },
    { "path": "tracks[].items[].source.out", "applies_to": ["layers"], "gpu": "partial", "osr": "partial", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem folds out - in into the layer declaration's speed when the span disagrees with item.duration by more than a frame; packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers consumes layer.speed", "hint": "layers の表示尺は item.duration で決まる。source.out は out - in が duration と 1 フレーム超ずれたときだけ再生速度として効く（素材窓のクリップには使われない）" },
    { "path": "tracks[].items[].source.out", "applies_to": ["audio"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "render-cut audio mix", "evidence": "packages/edit-store/src/internal-model.ts buildV2AudioItem" },
    { "path": "tracks[].items[].source.framing", "applies_to": ["cuts"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts visualAt/interpolateFraming" },
    { "path": "tracks[].items[].source.framing", "applies_to": ["layers"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/edit-store/src/internal-model.ts copyMediaSourceFields; packages/frame-engine/src/timeline/plan.ts KNOWN_LAYER_KEYS omits framing" },
    { "path": "tracks[].items[].source.transition_out", "applies_to": ["cuts"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts normalizeTransition/evaluationPlanFromResolvedTimeline" },
    { "path": "tracks[].items[].source.transition_out", "applies_to": ["layers"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/edit-store/src/internal-model.ts copyMediaSourceFields; packages/frame-engine/src/timeline/plan.ts KNOWN_LAYER_KEYS omits transition_out" },
    { "path": "tracks[].items[].source.freeze", "applies_to": ["cuts"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/plan.ts buildResolvedTimelinePlan/playbackSecondsAt" },
    { "path": "tracks[].items[].source.freeze", "applies_to": ["layers"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/edit-store/src/internal-model.ts copyMediaSourceFields; packages/frame-engine/src/timeline/plan.ts KNOWN_LAYER_KEYS omits freeze" },
    { "path": "tracks[].items[].source.fx", "applies_to": ["cuts", "layers"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/edit-store/src/internal-model.ts copyMediaSourceFields; packages/frame-engine/src/timeline/plan.ts KNOWN_CUT_KEYS/KNOWN_LAYER_KEYS omit fx", "hint": "GPU / OSR frame-engine には登録済み cut FX が無い" },
    { "path": "tracks[].items[].source.speed", "applies_to": ["cuts"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem speed projection; packages/frame-engine/src/timeline/plan.ts buildResolvedTimelinePlan/layerFromPlacement" },
    { "path": "tracks[].items[].source.speed", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts copyMediaSourceFields; packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers preserves source trim and speed" },
    { "path": "tracks[].items[].source.gain_db", "applies_to": ["cuts"], "gpu": "other-subsystem", "osr": "other-subsystem", "evidence": "packages/render-cut/src/plan.mjs cutSpeechVolumeSuffix (appendSequentialAudioCutFilters / gap-aware); packages/edit-store/src/audio-schedule.ts projectSpeechDeclarations speechGainDb", "note": "埋め込み音声（speech）の減衰。映像エンジンではなく render-cut の cut 音声（全エンジン共通）とプレビューの音声供給が消費する" },
    { "path": "tracks[].items[].source.mute", "applies_to": ["cuts"], "gpu": "other-subsystem", "osr": "other-subsystem", "evidence": "packages/render-cut/src/plan.mjs cut.mute -> anullsrc branch; packages/edit-store/src/audio-schedule.ts projectSpeechDeclarations skips muted cuts", "note": "埋め込み音声（speech）のミュート。尺は保ち無音区間になる" },
    { "path": "tracks[].items[].source.chroma_key", "applies_to": ["cuts", "layers"], "gpu": "partial", "osr": "partial", "runtime_warning": true, "evidence": "packages/edit-store/src/internal-model.ts needsLayersEngine/copyMediaSourceFields; packages/frame-engine/src/timeline/plan.ts KNOWN_CUT_KEYS/KNOWN_LAYER_KEYS omit chroma_key", "note": "透過 intent は layers 振り分けに使うが、frame-engine 自体は chroma key 抽出や background 置換をしない" },
    { "path": "tracks[].items[].source.path", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem html source; packages/gpu-export/src/page-builder.mjs loadAndBuildGpuPage; packages/osr-export/src/page-builder.mjs loadAndBuildOsrPage" },
    { "path": "tracks[].items[].source.path", "applies_to": ["captions"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem fixes captions.json; packages/gpu-export/src/page-builder.mjs loadAndBuildGpuPage; packages/osr-export/src/page-builder.mjs loadAndBuildOsrPage", "note": "schema が captions.json の定数に閉じている" },
    { "path": "tracks[].items[].source.part", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/parts.mjs applyPartMask/expandBagOverlays" },
    { "path": "tracks[].items[].source.style", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/parts.mjs applyPartMask/serializeInlineStyle" },
    { "path": "tracks[].items[].source.text", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/parts.mjs applyPartMask" },
    { "path": "tracks[].items[].source.elements", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/parts.mjs applyElementOverrides" },
    { "path": "tracks[].items[].source.exclude", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/parts.mjs projectBagChildren/expandBagOverlays" },
    { "path": "tracks[].items[].source.exclude", "applies_to": ["captions"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/tree-ops.ts collectExcludedCaptionIds/filterCaptionRootByExcludedIds; both page-builder loadAndBuild functions" },
    { "path": "tracks[].items[].source.derivedFrom", "applies_to": ["overlays"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "overlay authoring provenance", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem stores derivedFrom on InternalHtmlSource; packages/overlay-runtime/src/parts.mjs does not use it for pixels" },
    { "path": "tracks[].items[].source.vars", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/gpu-export/src/page-builder.mjs resolveOverlayVars/buildDomRuns; packages/render-cut/src/rasterize.mjs renderOverlayNode" },
    { "path": "tracks[].items[].source.params", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem; packages/edit-store/src/shape-markup.ts shapeMarkup; packages/gpu-export/src/page-runtime.js applyTextSlotParams; packages/render-cut/src/rasterize.mjs renderOverlaySheet", "issue": 32 },
    { "path": "tracks[].items[].source.params", "applies_to": ["baked"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "telop bake authoring", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem telop declaration; frame-engine consumes only source.baked pixels" },
    { "path": "tracks[].items[].source.preset", "applies_to": ["baked"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "telop bake authoring", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem telop declaration; frame-engine consumes only source.baked pixels" },
    { "path": "tracks[].items[].source.baked", "applies_to": ["baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem maps baked to layer src; packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers" },
    { "path": "tracks[].items[].source.from", "applies_to": ["baked"], "gpu": "other-subsystem", "osr": "other-subsystem", "consumer": "telop provenance", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem stores from on InternalTelopSource but does not project it to frame-engine" },
    { "path": "tracks[].items[].source.filter", "applies_to": ["layers"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem filter declaration; both page-builder LUT resolution paths; packages/frame-engine/src/timeline/plan.ts validFilter/resolvedCompositeLayers" },
    { "path": "tracks[].items[].source.id", "applies_to": ["captions"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem caption source; packages/render-cut/src/internal-render.mjs captionItemOverlays" },

    { "path": "tracks[].items[].keyframes[].t", "applies_to": ["cuts", "layers", "overlays", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/internal-model.ts buildV2VisualItem frame-to-seconds projection; packages/frame-engine/src/timeline/layer-visual.ts computeLayerKeyframesVisual; packages/overlay-runtime/src/keyframes.mjs interpolateKeyframes" },
    { "path": "tracks[].items[].keyframes[].t", "applies_to": ["captions"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/internal-render.mjs captionItemOverlays and packages/overlay-runtime/src/parts.mjs expandItem do not evaluate caption/group keyframes" },
    { "path": "tracks[].items[].keyframes[].t", "applies_to": ["group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/group-flatten.ts motionParents; packages/frame-engine/src/timeline/plan.ts evaluateItemMotion; packages/overlay-runtime/src/parts.mjs motionParents", "note": "親の位置・拡縮・回転・不透明度を子に継承" },
    { "path": "tracks[].items[].keyframes[].transform", "applies_to": ["cuts", "layers", "overlays", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/layer-visual.ts computeLayerKeyframesVisual; packages/overlay-runtime/src/keyframes.mjs pointValue/interpolateKeyframes", "note": "scale/scaleX/scaleY mixed endpoints interpolate effective axis values" },
    { "path": "tracks[].items[].keyframes[].transform", "applies_to": ["captions"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/internal-render.mjs captionItemOverlays and packages/overlay-runtime/src/parts.mjs expandItem do not evaluate caption/group keyframes" },
    { "path": "tracks[].items[].keyframes[].transform", "applies_to": ["group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/group-flatten.ts motionParents; packages/frame-engine/src/timeline/plan.ts evaluateItemMotion; packages/overlay-runtime/src/parts.mjs motionParents", "note": "親の位置・拡縮・回転・不透明度を子に継承" },
    { "path": "tracks[].items[].keyframes[].vars", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/gpu-export/src/page-runtime.js applyThreeItemMotion; packages/render-cut/src/rasterize.mjs __akariSyncAnimations; packages/overlay-runtime/src/item-motion.js evaluateOverlayVars", "note": "3D overlay の変数キーは GPU の three 描画前に評価する。v0 で書けるのは 3D の向きだけ" },
    { "path": "tracks[].items[].keyframes[].crop", "applies_to": ["cuts", "layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/layer-visual.ts computeLayerKeyframesVisual; packages/frame-engine/src/timeline/plan.ts layerStyleVisualAt/resolvedCompositeLayers" },
    { "path": "tracks[].items[].keyframes[].crop", "applies_to": ["overlays", "captions", "group"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/overlay-runtime/src/keyframes.mjs PROPERTY_DEFAULTS/interpolateKeyframes omit crop; caption/group paths do not evaluate keyframes" },
    { "path": "tracks[].items[].keyframes[].perspective", "applies_to": ["cuts"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/frame-engine/src/timeline/plan.ts cutDeclaresPerspective warning; layerStyleVisualAt does not read perspective", "issue": 39 },
    { "path": "tracks[].items[].keyframes[].perspective", "applies_to": ["layers", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/layer-visual.ts computeLayerKeyframesVisual; packages/frame-engine/src/timeline/plan.ts resolvedCompositeLayers/filterQuadCornersAt" },
    { "path": "tracks[].items[].keyframes[].perspective", "applies_to": ["overlays", "captions", "group"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/overlay-runtime/src/keyframes.mjs PROPERTY_DEFAULTS/interpolateKeyframes omit perspective; caption/group paths do not evaluate keyframes" },
    { "path": "tracks[].items[].keyframes[].opacity", "applies_to": ["cuts", "layers", "overlays", "baked"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/frame-engine/src/timeline/layer-visual.ts computeLayerKeyframesVisual; packages/overlay-runtime/src/keyframes.mjs interpolateKeyframes" },
    { "path": "tracks[].items[].keyframes[].opacity", "applies_to": ["captions"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/internal-render.mjs captionItemOverlays and packages/overlay-runtime/src/parts.mjs expandItem do not evaluate caption/group keyframes" },
    { "path": "tracks[].items[].keyframes[].opacity", "applies_to": ["group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/edit-store/src/group-flatten.ts motionParents; packages/frame-engine/src/timeline/plan.ts evaluateItemMotion; packages/overlay-runtime/src/parts.mjs motionParents", "note": "親の位置・拡縮・回転・不透明度を子に継承" },
    { "path": "tracks[].items[].keyframes[].animator", "applies_to": ["cuts", "layers", "baked"], "gpu": "ignored", "osr": "ignored", "runtime_warning": true, "evidence": "packages/frame-engine/src/timeline/plan.ts warnUnknownFields warns once per non-text item including animator keyframes" },
    { "path": "tracks[].items[].keyframes[].animator", "applies_to": ["captions", "group"], "gpu": "consumed", "osr": "ignored", "evidence": "packages/frame-engine/src/timeline/caption-animator.ts animatorParamsAt", "note": "Item-relative integer frames; offset/start/end for caption units, including caption text in groups" },
    { "path": "tracks[].items[].keyframes[].animator", "applies_to": ["overlays"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/overlay-runtime/src/keyframes.mjs interpolateKeyframes omits animator" },
    { "path": "tracks[].items[].keyframes[].easing", "applies_to": ["cuts", "layers", "baked"], "gpu": "partial", "osr": "partial", "evidence": "packages/frame-engine/src/timeline/layer-visual.ts LayerKeyframe/ease; packages/frame-engine/src/timeline/plan.ts filterQuadCornersAt", "note": "transform/opacity は共通評価の easing を使う。crop は linear と ease-in-out のみ。filter perspective は easing を無視する" },
    { "path": "tracks[].items[].keyframes[].easing", "applies_to": ["overlays"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/keyframes.mjs easingAt/easingFor supports schema vocabulary and cubic-bezier" },
    { "path": "tracks[].items[].keyframes[].easing", "applies_to": ["captions"], "gpu": "ignored", "osr": "ignored", "evidence": "packages/render-cut/src/internal-render.mjs captionItemOverlays and packages/overlay-runtime/src/parts.mjs expandItem do not evaluate caption/group keyframes" },
    { "path": "tracks[].items[].keyframes[].easing", "applies_to": ["group"], "gpu": "consumed", "osr": "consumed", "evidence": "packages/overlay-runtime/src/item-motion.js keyframeValue/ease; packages/frame-engine/src/timeline/plan.ts evaluateItemMotion", "note": "親の位置・拡縮・回転・不透明度へ適用" }
  ]
}
