{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"urn:silverferret:toon-data:v4","title":"SilverFerret toon data v4","description":"Approved 2026-10-04. Shared browser/server data contract. Examples are illustrative metadata, not user records.","type":"object","additionalProperties":false,"required":["schemaVersion","records"],"properties":{"schemaVersion":{"type":"integer","const":4,"examples":[4]},"records":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Record"}}},"$defs":{"Id":{"type":"string","examples":["page-01"],"pattern":"^[A-Za-z0-9_-]{1,100}$","description":"Opaque stable ID; illustrative readable IDs are used in examples."},"Locale":{"type":"string","examples":["ko"],"pattern":"^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$","description":"BCP 47 language tag; full validity is checked by the locale parser."},"Hash":{"type":"string","examples":["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],"pattern":"^[0-9a-f]{64}$"},"Color":{"type":"string","examples":["#ffffff"],"pattern":"^(#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?|none)$"},"Point":{"type":"array","examples":[[0.25,0.18]],"prefixItems":[{"type":"number","examples":[0]},{"type":"number","examples":[0]}],"minItems":2,"maxItems":2,"items":false,"description":"Anchor-normalized x,y. 1 means full anchor extent; intentional overflow may use values outside 0..1."},"SizePx":{"type":"object","properties":{"width":{"type":"integer","examples":[1370],"minimum":1},"height":{"type":"integer","examples":[1291],"minimum":1}},"required":["width","height"],"additionalProperties":false,"examples":[{"width":1370,"height":1291}]},"SizeMm":{"type":"array","examples":[[128,182]],"prefixItems":[{"type":"number","examples":[128],"exclusiveMinimum":0},{"type":"number","examples":[182],"exclusiveMinimum":0}],"minItems":2,"maxItems":2,"items":false},"Bounds":{"type":"object","properties":{"x0":{"type":"number","examples":[0],"minimum":0,"maximum":1},"x1":{"type":"number","examples":[0.5],"minimum":0,"maximum":1},"y0":{"type":"number","examples":[0],"minimum":0,"maximum":1},"y1":{"type":"number","examples":[0.3333333333333333],"minimum":0,"maximum":1}},"required":["x0","x1","y0","y1"],"additionalProperties":false,"description":"Inner layout plane; x0<x1 and y0<y1 are application invariants.","examples":[{"x0":0,"x1":0.5,"y0":0,"y1":0.3333333333333333}]},"Rect":{"type":"object","properties":{"x":{"type":"number","examples":[0]},"y":{"type":"number","examples":[0]},"width":{"type":"number","examples":[1]},"height":{"type":"number","examples":[1]}},"required":["x","y","width","height"],"additionalProperties":false,"examples":[{"x":0,"y":0,"width":1,"height":1}]},"Anchor":{"type":"object","properties":{"kind":{"type":"string","examples":["panel"],"enum":["panel","page"]},"id":{"$ref":"#/$defs/Id","examples":["cut-01"]}},"required":["kind","id"],"additionalProperties":false,"examples":[{"kind":"panel","id":"cut-01"}]},"Owner":{"type":"object","properties":{"kind":{"type":"string","examples":["scene"],"enum":["series","episode","scene"]},"id":{"$ref":"#/$defs/Id","examples":["scene-01"]}},"required":["kind","id"],"additionalProperties":false,"examples":[{"kind":"scene","id":"scene-01"}]},"GraphemeRange":{"type":"object","properties":{"start":{"type":"integer","examples":[0],"minimum":0},"end":{"type":"integer","examples":[8],"minimum":0}},"required":["start","end"],"additionalProperties":false,"description":"Half-open [start,end) extended-grapheme-cluster offsets; end must exceed start.","examples":[{"start":0,"end":8}]},"Emphasis":{"type":"object","properties":{"range":{"$ref":"#/$defs/GraphemeRange","examples":[{"start":4,"end":5}]},"style":{"type":"string","examples":["bold"],"enum":["bold","italic","bold-italic"]}},"required":["range","style"],"additionalProperties":false,"examples":[{"range":{"start":4,"end":5},"style":"bold"}]},"LocalizedText":{"type":"object","properties":{"text":{"type":"string","examples":["잠깐, 저 소리 들었어?"]},"revision":{"type":"integer","examples":[3],"minimum":1},"emphasisRanges":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Emphasis"}}},"required":["text","revision","emphasisRanges"],"additionalProperties":false,"examples":[{"text":"잠깐, 저 소리 들었어?","revision":3,"emphasisRanges":[]}]},"TextRef":{"type":"object","properties":{"textBlockId":{"$ref":"#/$defs/Id","examples":["text-dialogue"]},"locale":{"$ref":"#/$defs/Locale","examples":["ko"]},"textRevision":{"type":"integer","examples":[3],"minimum":1},"range":{"anyOf":[{"$ref":"#/$defs/GraphemeRange"},{"type":"null"}],"examples":[null]}},"required":["textBlockId","locale","textRevision"],"additionalProperties":false,"examples":[{"textBlockId":"text-dialogue","locale":"ko","textRevision":3}]},"Transform":{"type":"object","properties":{"translate":{"$ref":"#/$defs/Point","examples":[[0,0]]},"rotateDeg":{"type":"number","examples":[-12]},"scaleX":{"type":"number","examples":[1],"not":{"const":0}},"scaleY":{"type":"number","examples":[1],"not":{"const":0}},"skewXDeg":{"type":"number","examples":[0]},"skewYDeg":{"type":"number","examples":[0]}},"required":["translate","rotateDeg","scaleX","scaleY","skewXDeg","skewYDeg"],"additionalProperties":false,"examples":[{"translate":[0,0],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}]},"ManualBreak":{"type":"object","properties":{"textRefIndex":{"type":"integer","examples":[0],"minimum":0},"offset":{"type":"integer","examples":[7],"minimum":0}},"required":["textRefIndex","offset"],"additionalProperties":false,"description":"Grapheme offset within the selected text reference.","examples":[{"textRefIndex":0,"offset":7}]},"Typography":{"type":"object","properties":{"fontAssetId":{"$ref":"#/$defs/Id","examples":["font-ko"]},"fontSizeMm":{"type":"number","examples":[3.2],"exclusiveMinimum":0},"lineHeight":{"type":"number","examples":[1.35],"exclusiveMinimum":0},"trackingEm":{"type":"number","examples":[0]},"writingMode":{"type":"string","examples":["horizontal-tb"],"enum":["horizontal-tb","vertical-rl"]},"align":{"type":"string","examples":["center"],"enum":["start","center","end"]},"manualBreaks":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/ManualBreak"}}},"required":["fontAssetId","fontSizeMm","lineHeight","trackingEm","writingMode","align","manualBreaks"],"additionalProperties":false,"examples":[{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]}]},"PathCommand":{"oneOf":[{"type":"array","examples":[["M",0.15,0.18]],"prefixItems":[{"const":"M"},{"type":"number","examples":[0]},{"type":"number","examples":[0]}],"minItems":3,"maxItems":3,"items":false},{"type":"array","examples":[["L",0.4,0.2]],"prefixItems":[{"const":"L"},{"type":"number","examples":[0]},{"type":"number","examples":[0]}],"minItems":3,"maxItems":3,"items":false},{"type":"array","examples":[["C",0.15,0.06,0.65,0.06,0.65,0.18]],"prefixItems":[{"const":"C"},{"type":"number","examples":[0]},{"type":"number","examples":[0]},{"type":"number","examples":[0]},{"type":"number","examples":[0]},{"type":"number","examples":[0]},{"type":"number","examples":[0]}],"minItems":7,"maxItems":7,"items":false},{"type":"array","examples":[["Z"]],"prefixItems":[{"const":"Z"}],"minItems":1,"maxItems":1,"items":false}],"examples":[["M",0.15,0.18]]},"Path":{"type":"array","examples":[[["M",0.08,0.25],["C",0.08,0.13954,0.24565,0.05,0.45,0.05],["C",0.65435,0.05,0.82,0.13954,0.82,0.25],["C",0.82,0.36046,0.65435,0.45,0.45,0.45],["C",0.24565,0.45,0.08,0.36046,0.08,0.25],["Z"]]],"items":{"$ref":"#/$defs/PathCommand"},"minItems":2},"TailAttachment":{"type":"object","properties":{"curveIndex":{"type":"integer","examples":[2],"minimum":0},"t":{"type":"number","examples":[0.25],"minimum":0,"maximum":1}},"required":["curveIndex","t"],"additionalProperties":false,"description":"Zero-based C-command index and Bézier parameter.","examples":[{"curveIndex":2,"t":0.25}]},"TailTarget":{"type":"object","properties":{"speakerId":{"anyOf":[{"$ref":"#/$defs/Id"},{"type":"null"}],"examples":["character-01"]},"mouth":{"$ref":"#/$defs/Point","examples":[[0.73,0.78]]}},"required":["speakerId","mouth"],"additionalProperties":false,"examples":[{"speakerId":"character-01","mouth":[0.73,0.78]}]},"Tail":{"type":"object","properties":{"baseAttachments":{"type":"array","examples":[[{"curveIndex":2,"t":0.25},{"curveIndex":2,"t":0.55}]],"items":{"$ref":"#/$defs/TailAttachment"},"minItems":2,"maxItems":2},"tip":{"$ref":"#/$defs/Point","examples":[[0.64,0.6]]},"target":{"anyOf":[{"$ref":"#/$defs/TailTarget"},{"type":"null"}],"examples":[{"speakerId":"character-01","mouth":[0.73,0.78]}]},"controlPoints":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Point"}}},"required":["baseAttachments","tip","target","controlPoints"],"additionalProperties":false,"examples":[{"baseAttachments":[{"curveIndex":2,"t":0.25},{"curveIndex":2,"t":0.55}],"tip":[0.64,0.6],"target":{"speakerId":"character-01","mouth":[0.73,0.78]},"controlPoints":[]}]},"GlyphTransform":{"type":"object","properties":{"textRefIndex":{"type":"integer","examples":[0],"minimum":0},"range":{"$ref":"#/$defs/GraphemeRange","examples":[{"start":0,"end":1}]},"transform":{"$ref":"#/$defs/Transform","examples":[{"translate":[0,0],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}]}},"required":["textRefIndex","range","transform"],"additionalProperties":false,"description":"Transforms a shaped cluster range, never one code unit inside a Hangul syllable or combining sequence.","examples":[{"textRefIndex":0,"range":{"start":0,"end":1},"transform":{"translate":[0,0],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}}]},"Geometry":{"type":"object","properties":{"units":{"type":"string","examples":["anchor-normalized"],"enum":["anchor-normalized"]},"textFrame":{"$ref":"#/$defs/Rect","examples":[{"x":0.18,"y":0.16,"width":0.54,"height":0.18}]},"paddingMm":{"type":"number","examples":[1.5],"minimum":0},"body":{"anyOf":[{"$ref":"#/$defs/Path"},{"type":"null"}],"examples":[[["M",0.08,0.25],["C",0.08,0.13954,0.24565,0.05,0.45,0.05],["C",0.65435,0.05,0.82,0.13954,0.82,0.25],["C",0.82,0.36046,0.65435,0.45,0.45,0.45],["C",0.24565,0.45,0.08,0.36046,0.08,0.25],["Z"]]]},"tail":{"anyOf":[{"$ref":"#/$defs/Tail"},{"type":"null"}],"examples":[null]},"baseline":{"anyOf":[{"$ref":"#/$defs/Path"},{"type":"null"}],"examples":[null]},"glyphTransforms":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/GlyphTransform"}},"layoutMode":{"type":"string","examples":["auto"],"enum":["auto","manual"]}},"required":["units","textFrame","paddingMm","body","tail","baseline","glyphTransforms","layoutMode"],"additionalProperties":false,"examples":[{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":[["M",0.08,0.25],["C",0.08,0.13954,0.24565,0.05,0.45,0.05],["C",0.65435,0.05,0.82,0.13954,0.82,0.25],["C",0.82,0.36046,0.65435,0.45,0.45,0.45],["C",0.24565,0.45,0.08,0.36046,0.08,0.25],["Z"]],"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"}]},"Outline":{"type":"object","properties":{"color":{"$ref":"#/$defs/Color","examples":["#ffffff"]},"widthMm":{"type":"number","examples":[0.6],"minimum":0}},"required":["color","widthMm"],"additionalProperties":false,"examples":[{"color":"#ffffff","widthMm":0.6}]},"LetterStyle":{"type":"object","properties":{"balloonStyle":{"type":"string","examples":["oval"],"enum":["none","oval","rounded","whisper","burst","thought","custom"]},"fill":{"$ref":"#/$defs/Color","examples":["#ffffff"]},"stroke":{"$ref":"#/$defs/Color","examples":["#202020"]},"strokeMm":{"type":"number","examples":[0.25],"minimum":0},"dashMm":{"type":"array","examples":[[]],"items":{"type":"number","examples":[1],"minimum":0}},"textFill":{"$ref":"#/$defs/Color","examples":["#202020"]},"textOutlines":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Outline"}}},"required":["balloonStyle","fill","stroke","strokeMm","dashMm","textFill","textOutlines"],"additionalProperties":false,"examples":[{"balloonStyle":"oval","fill":"#ffffff","stroke":"#202020","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]}]},"Clip":{"oneOf":[{"type":"object","properties":{"mode":{"type":"string","examples":["none"],"enum":["none"]}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","examples":["panel"],"enum":["panel"]}},"required":["mode"],"additionalProperties":false},{"type":"object","properties":{"mode":{"type":"string","examples":["path"],"enum":["path"]},"path":{"$ref":"#/$defs/Path"}},"required":["mode","path"],"additionalProperties":false}],"examples":[{"mode":"panel"}]},"Locks":{"type":"object","properties":{"content":{"type":"boolean","examples":[true]},"geometry":{"type":"boolean","examples":[false]},"style":{"type":"boolean","examples":[false]}},"required":["content","geometry","style"],"additionalProperties":false,"examples":[{"content":true,"geometry":false,"style":false}]},"RecordVersion":{"type":"object","properties":{"kind":{"type":"string","examples":["artwork"]},"id":{"$ref":"#/$defs/Id","examples":["art-01"]},"revision":{"type":"integer","examples":[2],"minimum":1}},"required":["kind","id","revision"],"additionalProperties":false,"examples":[{"kind":"artwork","id":"art-01","revision":2}]},"AssetVersion":{"type":"object","properties":{"assetId":{"$ref":"#/$defs/Id","examples":["font-ko"]},"sha256":{"$ref":"#/$defs/Hash","examples":["bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"]}},"required":["assetId","sha256"],"additionalProperties":false,"examples":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}]},"Dependencies":{"type":"object","properties":{"layoutRevision":{"type":"integer","examples":[7],"minimum":1},"records":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/RecordVersion"}},"assets":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/AssetVersion"}},"rendererVersion":{"type":"string","examples":["lettering-v1"]}},"required":["layoutRevision","records","assets","rendererVersion"],"additionalProperties":false,"description":"Text revisions also live in textRefs; compare these dependencies when committing a patch.","examples":[{"layoutRevision":7,"records":[],"assets":[],"rendererVersion":"lettering-v1"}]},"GenerationSpec":{"type":"object","properties":{"prompt":{"type":"string","examples":["창가에서 소리를 듣고 돌아보는 인물"]},"referenceAssetIds":{"type":"array","examples":[["image-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"preferredSizePx":{"anyOf":[{"$ref":"#/$defs/SizePx"},{"type":"null"}],"examples":[null]}},"required":["prompt","referenceAssetIds","preferredSizePx"],"additionalProperties":false,"description":"null size derives from the current frame; an explicit size must preserve its aspect ratio. Engine connection remains out of scope.","examples":[{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null}]},"WatermarkMark":{"type":"object","properties":{"x":{"type":"number","examples":[0.22],"minimum":0,"maximum":1},"y":{"type":"number","examples":[0.18],"minimum":0,"maximum":1},"angle":{"type":"number","examples":[-6],"minimum":-12,"maximum":12}},"required":["x","y","angle"],"additionalProperties":false,"examples":[{"x":0.22,"y":0.18,"angle":-6}]},"Watermark":{"type":"object","properties":{"version":{"type":"integer","const":1,"examples":[1]},"opacity":{"type":"number","examples":[0.22],"minimum":0.1,"maximum":0.4},"marks":{"type":"array","examples":[[{"x":0.22,"y":0.18,"angle":-6},{"x":0.71,"y":0.49,"angle":3},{"x":0.39,"y":0.8,"angle":-2}]],"items":{"$ref":"#/$defs/WatermarkMark"},"minItems":3,"maxItems":3},"sourceArtworkId":{"anyOf":[{"$ref":"#/$defs/Id"},{"type":"null"}],"examples":[null]}},"required":["version","opacity","marks"],"additionalProperties":false,"description":"Preserves stage-6 mark semantics; text remains silverferret.com. null sourceArtworkId uses the composed page.","examples":[{"version":1,"opacity":0.22,"marks":[{"x":0.22,"y":0.18,"angle":-6},{"x":0.71,"y":0.49,"angle":3},{"x":0.39,"y":0.8,"angle":-2}]}]},"WorkflowStatus":{"type":"object","properties":{"layout":{"type":"string","examples":["ready"],"enum":["empty","ready","working","done","error","stale","skipped"]},"generation":{"type":"string","examples":["empty"],"enum":["empty","ready","working","done","error","stale","skipped"]},"retouch":{"type":"string","examples":["empty"],"enum":["empty","ready","working","done","error","stale","skipped"]},"lettering":{"type":"string","examples":["empty"],"enum":["empty","ready","working","done","error","stale","skipped"]},"sfx":{"type":"string","examples":["empty"],"enum":["empty","ready","working","done","error","stale","skipped"]},"watermark":{"type":"string","examples":["empty"],"enum":["empty","ready","working","done","error","stale","skipped"]}},"required":["layout","generation","retouch","lettering","sfx","watermark"],"additionalProperties":false,"examples":[{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"}]},"StorageRef":{"type":"object","properties":{"kind":{"type":"string","examples":["file"],"enum":["file","url","blob"]},"value":{"type":"string","examples":["assets/image-01.png"]}},"required":["kind","value"],"additionalProperties":false,"examples":[{"kind":"file","value":"assets/image-01.png"}]},"MaskBinding":{"type":"object","properties":{"assetId":{"$ref":"#/$defs/Id","examples":["mask-01"]},"space":{"type":"string","examples":["page"],"enum":["page","anchor","asset"]},"transform":{"$ref":"#/$defs/Transform","examples":[{"translate":[0,0],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}]}},"required":["assetId","space","transform"],"additionalProperties":false,"description":"Map the mask explicitly into page, anchor or source-asset coordinates.","examples":[{"assetId":"mask-01","space":"page","transform":{"translate":[0,0],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}}]},"Provenance":{"type":"object","properties":{"method":{"type":"string","examples":["imported"],"enum":["imported","generated","retouched"]},"inputAssetIds":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"prompt":{"type":"string","examples":[""]},"model":{"type":["string","null"],"examples":[null]},"seed":{"type":["integer","null"],"examples":[null]},"settings":{"type":"object","examples":[{}],"additionalProperties":true}},"required":["method","inputAssetIds","prompt","model","seed","settings"],"additionalProperties":false,"examples":[{"method":"imported","inputAssetIds":[],"prompt":"","model":null,"seed":null,"settings":{}}]},"SeriesData":{"type":"object","properties":{"titleTextId":{"$ref":"#/$defs/Id","examples":["title-series"]},"sourceLocale":{"$ref":"#/$defs/Locale","examples":["ko"]},"readingDirection":{"type":"string","examples":["rtl"],"enum":["ltr","rtl"]},"episodeOrder":{"type":"array","examples":[["episode-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"status":{"type":"string","examples":["preparing"],"enum":["preparing","serializing","completed","paused"]}},"required":["titleTextId","sourceLocale","readingDirection","episodeOrder","status"],"additionalProperties":true,"description":"Typed v4 toon fields; existing planning extensions are retained and checked by their existing validators.","not":{"anyOf":[{"required":["id"]},{"required":["title"]},{"required":["episodes"]}]},"examples":[{"titleTextId":"title-series","sourceLocale":"ko","readingDirection":"rtl","episodeOrder":["episode-01"],"status":"preparing"}]},"EpisodeData":{"type":"object","properties":{"titleTextId":{"$ref":"#/$defs/Id","examples":["title-episode"]},"sceneOrder":{"type":"array","examples":[["scene-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"pageOrder":{"type":"array","examples":[["page-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"visiblePageIds":{"type":"array","examples":[["page-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"phase":{"type":"string","examples":["draft"],"enum":["idea","draft","ready"]},"tags":{"type":"string","examples":["미스터리"]},"labels":{"type":"object","examples":[{}],"additionalProperties":{"$ref":"#/$defs/Id"}},"assignment":{"anyOf":[{"type":"null"},{"type":"object","properties":{"season":{"type":"integer","minimum":1,"maximum":99999},"number":{"type":"integer","minimum":1,"maximum":99999}},"required":["season","number"],"additionalProperties":false}]}},"required":["titleTextId","sceneOrder","pageOrder","visiblePageIds","phase","tags","labels"],"additionalProperties":true,"description":"Typed v4 toon fields; existing planning extensions are retained and checked by their existing validators.","not":{"anyOf":[{"required":["id"]},{"required":["title"]},{"required":["images"]},{"required":["imageCount"]}]},"examples":[{"titleTextId":"title-episode","sceneOrder":["scene-01"],"pageOrder":["page-01","page-02","page-03","page-04","page-05","page-06","page-07","page-08"],"visiblePageIds":["page-01","page-02","page-03","page-04","page-05","page-06","page-07","page-08"],"phase":"draft","tags":"미스터리","labels":{}}]},"SceneData":{"type":"object","properties":{"episodeId":{"$ref":"#/$defs/Id","examples":["episode-01"]},"title":{"type":"string","examples":["문밖의 소리"]},"textBlockOrder":{"type":"array","examples":[["text-dialogue","text-sfx"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"events":{"type":"string","examples":["문밖에서 소리가 난다."]},"direction":{"type":"string","examples":["시선은 문을 향한다."]},"characterIds":{"type":"array","examples":[["character-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"factIds":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"time":{"type":["integer","null"],"examples":[null],"minimum":0,"maximum":79999},"beat":{"type":"string","examples":["opening"],"enum":["opening","complication","turn","ending"]}},"required":["episodeId","title","textBlockOrder","events","direction","characterIds","factIds","time","beat"],"additionalProperties":true,"description":"Typed v4 toon fields; existing planning extensions are retained and checked by their existing validators.","not":{"anyOf":[{"required":["id"]},{"required":["dialogue"]}]},"examples":[{"episodeId":"episode-01","title":"문밖의 소리","textBlockOrder":["text-dialogue","text-thought","text-narration","text-sfx","text-caption","text-label","text-credit"],"events":"문밖에서 소리가 난다.","direction":"시선은 문을 향한다.","characterIds":["character-01"],"factIds":[],"time":null,"beat":"opening"}]},"CharacterData":{"type":"object","properties":{"name":{"type":"string","examples":["주인공"]},"aliases":{"type":"array","examples":[[]],"items":{"type":"string","examples":[""]}},"notes":{"type":"string","examples":["소리를 먼저 알아챈 인물"]}},"required":["name"],"additionalProperties":true,"description":"Typed v4 toon fields; existing planning extensions are retained and checked by their existing validators.","not":{"anyOf":[{"required":["id"]}]},"examples":[{"name":"주인공"}]},"PageData":{"type":"object","properties":{"episodeId":{"$ref":"#/$defs/Id","examples":["episode-01"]},"sizeMm":{"$ref":"#/$defs/SizeMm","examples":[[128,182]]},"targetPx":{"$ref":"#/$defs/SizePx","examples":[{"width":3024,"height":4299}]},"dpi":{"type":"integer","examples":[600],"minimum":1},"marginMm":{"type":"number","examples":[5],"minimum":0},"gutterMm":{"type":"object","properties":{"x":{"type":"number","examples":[2],"minimum":1,"maximum":4},"y":{"type":"number","examples":[4],"minimum":1,"maximum":8}},"required":["x","y"],"additionalProperties":false,"examples":[{"x":2,"y":4}]},"layoutRevision":{"type":"integer","examples":[7],"minimum":1},"panelOrder":{"type":"array","examples":[["cut-right","cut-left-1","cut-left-2","cut-left-3"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"letteringReadingOrder":{"type":"array","examples":[["letter-title","letter-dialogue"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"layerOrder":{"type":"array","examples":[["art-01","letter-dialogue","letter-title"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"watermark":{"anyOf":[{"$ref":"#/$defs/Watermark"},{"type":"null"}],"examples":[null]},"workflowStatus":{"$ref":"#/$defs/WorkflowStatus","examples":[{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"}]},"notes":{"type":"string","examples":[""]}},"required":["episodeId","sizeMm","targetPx","dpi","marginMm","gutterMm","layoutRevision","panelOrder","letteringReadingOrder","layerOrder","watermark","workflowStatus","notes"],"additionalProperties":false,"examples":[{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-right","cut-left-1","cut-left-2","cut-left-3"],"letteringReadingOrder":["letter-title","letter-dialogue","letter-thought","letter-narration","letter-sfx","letter-caption","letter-label","letter-credit"],"layerOrder":["art-01","letter-title","letter-dialogue","letter-thought","letter-narration","letter-sfx","letter-caption","letter-label","letter-credit"],"watermark":{"version":1,"opacity":0.22,"marks":[{"x":0.22,"y":0.18,"angle":-6},{"x":0.71,"y":0.49,"angle":3},{"x":0.39,"y":0.8,"angle":-2}],"sourceArtworkId":"art-01"},"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}]},"PanelData":{"type":"object","properties":{"pageId":{"$ref":"#/$defs/Id","examples":["page-01"]},"bounds":{"$ref":"#/$defs/Bounds","examples":[{"x0":0,"x1":0.5,"y0":0,"y1":0.3333333333333333}]},"sceneId":{"anyOf":[{"$ref":"#/$defs/Id"},{"type":"null"}],"examples":["scene-01"]},"storyBeatId":{"anyOf":[{"$ref":"#/$defs/Id"},{"type":"null"}],"examples":[null]},"characterIds":{"type":"array","examples":[["character-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"generation":{"$ref":"#/$defs/GenerationSpec","examples":[{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null}]},"notes":{"type":"string","examples":[""]}},"required":["pageId","bounds","sceneId","storyBeatId","characterIds","generation","notes"],"additionalProperties":false,"examples":[{"pageId":"page-01","bounds":{"x0":0.5,"x1":1,"y0":0,"y1":1},"sceneId":"scene-01","storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}]},"TextBlockData":{"type":"object","properties":{"owner":{"$ref":"#/$defs/Owner","examples":[{"kind":"scene","id":"scene-01"}]},"role":{"type":"string","examples":["dialogue"],"enum":["dialogue","thought","narration","sfx","title","caption","label","credit"]},"speakerIds":{"type":"array","examples":[["character-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true},"sourceLocale":{"$ref":"#/$defs/Locale","examples":["ko"]},"contentByLocale":{"type":"object","examples":[{"ko":{"text":"잠깐, 저 소리 들었어?","revision":3,"emphasisRanges":[]}}],"minProperties":1,"propertyNames":{"$ref":"#/$defs/Locale"},"additionalProperties":{"$ref":"#/$defs/LocalizedText"}},"utteranceGroupId":{"anyOf":[{"$ref":"#/$defs/Id"},{"type":"null"}],"examples":[null]},"delivery":{"type":["string","null"],"examples":["whisper"]}},"required":["owner","role","speakerIds","sourceLocale","contentByLocale"],"additionalProperties":false,"examples":[{"owner":{"kind":"series","id":"series-01"},"role":"title","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"예시 작품","revision":3,"emphasisRanges":[]}}}]},"LetteringData":{"type":"object","properties":{"pageId":{"$ref":"#/$defs/Id","examples":["page-01"]},"anchor":{"$ref":"#/$defs/Anchor","examples":[{"kind":"panel","id":"cut-left-1"}]},"textRefs":{"type":"array","examples":[[{"textBlockId":"text-dialogue","locale":"ko","textRevision":3}]],"items":{"$ref":"#/$defs/TextRef"},"minItems":1},"typography":{"$ref":"#/$defs/Typography","examples":[{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]}]},"geometry":{"$ref":"#/$defs/Geometry","examples":[{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":[["M",0.08,0.25],["C",0.08,0.13954,0.24565,0.05,0.45,0.05],["C",0.65435,0.05,0.82,0.13954,0.82,0.25],["C",0.82,0.36046,0.65435,0.45,0.45,0.45],["C",0.24565,0.45,0.08,0.36046,0.08,0.25],["Z"]],"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"}]},"style":{"$ref":"#/$defs/LetterStyle","examples":[{"balloonStyle":"oval","fill":"#ffffff","stroke":"#202020","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]}]},"transform":{"$ref":"#/$defs/Transform","examples":[{"translate":[0,0],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}]},"clip":{"$ref":"#/$defs/Clip","examples":[{"mode":"panel"}]},"occlusionMask":{"anyOf":[{"$ref":"#/$defs/MaskBinding"},{"type":"null"}],"examples":[null]},"locks":{"$ref":"#/$defs/Locks","examples":[{"content":true,"geometry":false,"style":false}]},"dependsOn":{"$ref":"#/$defs/Dependencies","examples":[{"layoutRevision":7,"records":[],"assets":[],"rendererVersion":"lettering-v1"}]}},"required":["pageId","anchor","textRefs","typography","geometry","style","transform","clip","locks","dependsOn"],"additionalProperties":false,"examples":[{"pageId":"page-01","anchor":{"kind":"page","id":"page-01"},"textRefs":[{"textBlockId":"title-episode","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":6,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0.18,0.08],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"none"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}]},"ArtworkData":{"type":"object","properties":{"pageId":{"$ref":"#/$defs/Id","examples":["page-01"]},"anchor":{"$ref":"#/$defs/Anchor","examples":[{"kind":"page","id":"page-01"}]},"assetId":{"$ref":"#/$defs/Id","examples":["image-01"]},"crop":{"$ref":"#/$defs/Rect","examples":[{"x":0,"y":0,"width":1,"height":1}]},"transform":{"$ref":"#/$defs/Transform","examples":[{"translate":[0,0],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}]},"opacity":{"type":"number","examples":[1],"minimum":0,"maximum":1},"blendMode":{"type":"string","examples":["normal"],"enum":["normal","multiply","screen","overlay"]},"mask":{"anyOf":[{"$ref":"#/$defs/MaskBinding"},{"type":"null"}],"examples":[null]},"provenance":{"$ref":"#/$defs/Provenance","examples":[{"method":"imported","inputAssetIds":[],"prompt":"","model":null,"seed":null,"settings":{}}]}},"required":["pageId","anchor","assetId","crop","transform","opacity","blendMode","provenance"],"additionalProperties":false,"examples":[{"pageId":"page-01","anchor":{"kind":"page","id":"page-01"},"assetId":"image-01","crop":{"x":0,"y":0,"width":1,"height":1},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"opacity":1,"blendMode":"normal","provenance":{"method":"imported","inputAssetIds":[],"prompt":"","model":null,"seed":null,"settings":{}}}]},"AssetData":{"type":"object","properties":{"sha256":{"$ref":"#/$defs/Hash","examples":["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]},"mime":{"type":"string","examples":["image/png"]},"widthPx":{"type":"integer","examples":[3024],"minimum":1},"heightPx":{"type":"integer","examples":[4299],"minimum":1},"storageRef":{"$ref":"#/$defs/StorageRef","examples":[{"kind":"file","value":"assets/image-01.png"}]},"role":{"type":"string","examples":["image"],"enum":["image","font","mask","vector"]},"sourceAssetIds":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true}},"required":["sha256","mime","storageRef","role","sourceAssetIds"],"additionalProperties":false,"examples":[{"sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","mime":"image/png","storageRef":{"kind":"file","value":"assets/image-01.png"},"role":"image","sourceAssetIds":[],"widthPx":3024,"heightPx":4299}]},"WorkspaceData":{"type":"object","properties":{"version":{"type":"integer","const":4,"examples":[4]},"order":{"type":"array","examples":[["series-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true}},"required":["version","order"],"additionalProperties":true,"description":"Typed v4 toon fields; existing planning extensions are retained and checked by their existing validators.","examples":[{"version":4,"order":["series-01"]}]},"LegacyPlanningData":{"type":"object","examples":[{}],"additionalProperties":true,"description":"Existing fact/relationship/knowledge/thread/document/views contracts continue to use their current validators; not replaced by this toon schema."},"GridCell":{"type":"object","properties":{"row":{"type":"integer","examples":[0],"minimum":0,"maximum":4},"column":{"type":"integer","examples":[1],"minimum":0,"maximum":4},"panelId":{"$ref":"#/$defs/Id","examples":["cut-right"]},"bounds":{"$ref":"#/$defs/Bounds","examples":[{"x0":0.5,"x1":1,"y0":0,"y1":0.3333333333333333}]}},"required":["row","column","panelId","bounds"],"additionalProperties":false,"readOnly":true,"description":"Derived grid cell, not an independently stored narrative record. A panel may span multiple cells.","examples":[{"row":0,"column":1,"panelId":"cut-right","bounds":{"x0":0.5,"x1":1,"y0":0,"y1":0.3333333333333333}}]},"PanelGenerationOutput":{"type":"object","properties":{"panelId":{"$ref":"#/$defs/Id","examples":["cut-left-1"]},"bounds":{"$ref":"#/$defs/Bounds","examples":[{"x0":0,"x1":0.5,"y0":0,"y1":0.3333333333333333}]},"framePx":{"$ref":"#/$defs/Rect","examples":[{"x":118.11,"y":118.11,"width":1370.268,"height":1291.268}]},"readingOrder":{"type":"integer","examples":[2],"minimum":1},"storyBeatId":{"anyOf":[{"$ref":"#/$defs/Id"},{"type":"null"}],"examples":[null]},"generation":{"type":"object","properties":{"aspectRatio":{"type":"number","examples":[1.06118],"exclusiveMinimum":0},"preferredSizePx":{"$ref":"#/$defs/SizePx","examples":[{"width":1370,"height":1291}]},"prompt":{"type":"string","examples":["소리를 듣고 돌아보는 인물"]},"referenceAssetIds":{"type":"array","examples":[["image-01"]],"items":{"$ref":"#/$defs/Id"},"uniqueItems":true}},"required":["aspectRatio","preferredSizePx","prompt","referenceAssetIds"],"additionalProperties":false,"examples":[{"aspectRatio":1.06118,"preferredSizePx":{"width":1370,"height":1291},"prompt":"소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"]}]}},"required":["panelId","bounds","framePx","readingOrder","storyBeatId","generation"],"additionalProperties":false,"readOnly":true,"description":"Derived panel entry in the existing silverferret.panel-generation.v2 manifest; compute from page/panel records.","examples":[{"panelId":"cut-left-1","bounds":{"x0":0,"x1":0.5,"y0":0,"y1":0.3333333333333333},"framePx":{"x":118.11,"y":118.11,"width":1370.268,"height":1291.268},"readingOrder":2,"storyBeatId":null,"generation":{"aspectRatio":1.06118,"preferredSizePx":{"width":1370,"height":1291},"prompt":"소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"]}}]},"Record":{"type":"object","properties":{"key":{"type":"string","examples":["series-01/lettering/letter-dialogue"]},"series":{"anyOf":[{"$ref":"#/$defs/Id"},{"type":"null"}],"examples":["series-01"]},"kind":{"type":"string","examples":["lettering"],"enum":["workspace","series","episode","scene","character","page","panel","text_block","lettering","artwork","asset","fact","relationship","knowledge","thread","document","views"]},"id":{"type":"string","pattern":"^[A-Za-z0-9_/-]{1,180}$","examples":["letter-dialogue"]},"revision":{"type":"integer","examples":[1],"minimum":1},"deleted":{"type":"boolean","examples":[false]},"updated":{"type":"integer","examples":[1791151200000],"minimum":0},"data":{"type":"object","examples":[{"pageId":"page-01","anchor":{"kind":"page","id":"page-01"},"textRefs":[{"textBlockId":"title-episode","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":6,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0.18,0.08],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"none"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}],"additionalProperties":true}},"required":["key","series","kind","id","revision","deleted","updated","data"],"additionalProperties":false,"allOf":[{"if":{"properties":{"kind":{"const":"workspace"}}},"then":{"properties":{"data":{"$ref":"#/$defs/WorkspaceData"},"series":{"type":"null"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"series"}}},"then":{"properties":{"data":{"$ref":"#/$defs/SeriesData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"episode"}}},"then":{"properties":{"data":{"$ref":"#/$defs/EpisodeData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"scene"}}},"then":{"properties":{"data":{"$ref":"#/$defs/SceneData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"character"}}},"then":{"properties":{"data":{"$ref":"#/$defs/CharacterData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"page"}}},"then":{"properties":{"data":{"$ref":"#/$defs/PageData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"panel"}}},"then":{"properties":{"data":{"$ref":"#/$defs/PanelData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"text_block"}}},"then":{"properties":{"data":{"$ref":"#/$defs/TextBlockData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"lettering"}}},"then":{"properties":{"data":{"$ref":"#/$defs/LetteringData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"artwork"}}},"then":{"properties":{"data":{"$ref":"#/$defs/ArtworkData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"asset"}}},"then":{"properties":{"data":{"$ref":"#/$defs/AssetData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"fact"}}},"then":{"properties":{"data":{"$ref":"#/$defs/LegacyPlanningData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"relationship"}}},"then":{"properties":{"data":{"$ref":"#/$defs/LegacyPlanningData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"knowledge"}}},"then":{"properties":{"data":{"$ref":"#/$defs/LegacyPlanningData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"thread"}}},"then":{"properties":{"data":{"$ref":"#/$defs/LegacyPlanningData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"document"}}},"then":{"properties":{"data":{"$ref":"#/$defs/LegacyPlanningData"},"series":{"$ref":"#/$defs/Id"}}}},{"if":{"properties":{"kind":{"const":"views"}}},"then":{"properties":{"data":{"$ref":"#/$defs/LegacyPlanningData"},"series":{"$ref":"#/$defs/Id"},"id":{"$ref":"#/$defs/Id"}}}}],"description":"Logical sync/export envelope. Non-workspace records persist in SQLite records; workspace persists in the existing workspaces table. key derives from series/kind/id; updated is UTC epoch milliseconds. Hydrate data.id for UI adapters.","examples":[{"key":"series-01/lettering/letter-title","series":"series-01","kind":"lettering","id":"letter-title","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"page","id":"page-01"},"textRefs":[{"textBlockId":"title-episode","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":6,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0.18,0.08],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"none"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}}]},"ExpectedRevision":{"type":"object","properties":{"key":{"type":"string","examples":["series-01/lettering/letter-dialogue"]},"revision":{"type":"integer","examples":[1],"minimum":0}},"required":["key","revision"],"additionalProperties":false,"examples":[{"key":"series-01/lettering/letter-dialogue","revision":1}]},"AgentPatch":{"type":"object","properties":{"schemaVersion":{"type":"integer","const":4,"examples":[4]},"operationId":{"$ref":"#/$defs/Id","examples":["op-lettering-01"]},"baseRevisions":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/ExpectedRevision"}},"upserts":{"type":"array","examples":[[]],"items":{"$ref":"#/$defs/Record"}},"deleteKeys":{"type":"array","examples":[[]],"items":{"type":"string","examples":["series-01/lettering/letter-dialogue"]}}},"required":["schemaVersion","operationId","baseRevisions","upserts","deleteKeys"],"additionalProperties":false,"description":"Transaction DTO containing proposed record snapshots. baseRevisions must cover every changed key. The server compares expected revisions, then assigns revision and updated itself; it never trusts client stamps. operationId makes retries idempotent.","examples":[{"schemaVersion":4,"operationId":"op-lettering-01","baseRevisions":[],"upserts":[],"deleteKeys":[]}]}},"examples":[{"schemaVersion":4,"records":[{"key":"/workspace/root","series":null,"kind":"workspace","id":"root","revision":1,"deleted":false,"updated":1791151200000,"data":{"version":4,"order":["series-01"]}},{"key":"series-01/series/series-01","series":"series-01","kind":"series","id":"series-01","revision":1,"deleted":false,"updated":1791151200000,"data":{"titleTextId":"title-series","sourceLocale":"ko","readingDirection":"rtl","episodeOrder":["episode-01"],"status":"preparing"}},{"key":"series-01/episode/episode-01","series":"series-01","kind":"episode","id":"episode-01","revision":1,"deleted":false,"updated":1791151200000,"data":{"titleTextId":"title-episode","sceneOrder":["scene-01"],"pageOrder":["page-01","page-02","page-03","page-04","page-05","page-06","page-07","page-08"],"visiblePageIds":["page-01","page-02","page-03","page-04","page-05","page-06","page-07","page-08"],"phase":"draft","tags":"미스터리","labels":{}}},{"key":"series-01/character/character-01","series":"series-01","kind":"character","id":"character-01","revision":1,"deleted":false,"updated":1791151200000,"data":{"name":"주인공"}},{"key":"series-01/scene/scene-01","series":"series-01","kind":"scene","id":"scene-01","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","title":"문밖의 소리","textBlockOrder":["text-dialogue","text-thought","text-narration","text-sfx","text-caption","text-label","text-credit"],"events":"문밖에서 소리가 난다.","direction":"시선은 문을 향한다.","characterIds":["character-01"],"factIds":[],"time":null,"beat":"opening"}},{"key":"series-01/text_block/title-series","series":"series-01","kind":"text_block","id":"title-series","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"series","id":"series-01"},"role":"title","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"예시 작품","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/title-episode","series":"series-01","kind":"text_block","id":"title-episode","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"episode","id":"episode-01"},"role":"title","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"문밖의 소리","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/text-dialogue","series":"series-01","kind":"text_block","id":"text-dialogue","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"scene","id":"scene-01"},"role":"dialogue","speakerIds":["character-01"],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"잠깐, 저 소리 들었어?","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/text-thought","series":"series-01","kind":"text_block","id":"text-thought","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"scene","id":"scene-01"},"role":"thought","speakerIds":["character-01"],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"기분 탓일까…","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/text-narration","series":"series-01","kind":"text_block","id":"text-narration","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"scene","id":"scene-01"},"role":"narration","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"복도는 조용했다.","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/text-sfx","series":"series-01","kind":"text_block","id":"text-sfx","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"scene","id":"scene-01"},"role":"sfx","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"쿵!","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/text-caption","series":"series-01","kind":"text_block","id":"text-caption","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"scene","id":"scene-01"},"role":"caption","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"오후 11시 · 복도","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/text-label","series":"series-01","kind":"text_block","id":"text-label","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"scene","id":"scene-01"},"role":"label","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"출입문","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/text_block/text-credit","series":"series-01","kind":"text_block","id":"text-credit","revision":3,"deleted":false,"updated":1791151200000,"data":{"owner":{"kind":"scene","id":"scene-01"},"role":"credit","speakerIds":[],"sourceLocale":"ko","contentByLocale":{"ko":{"text":"글·그림 SilverFerret","revision":3,"emphasisRanges":[]}}}},{"key":"series-01/page/page-01","series":"series-01","kind":"page","id":"page-01","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-right","cut-left-1","cut-left-2","cut-left-3"],"letteringReadingOrder":["letter-title","letter-dialogue","letter-thought","letter-narration","letter-sfx","letter-caption","letter-label","letter-credit"],"layerOrder":["art-01","letter-title","letter-dialogue","letter-thought","letter-narration","letter-sfx","letter-caption","letter-label","letter-credit"],"watermark":{"version":1,"opacity":0.22,"marks":[{"x":0.22,"y":0.18,"angle":-6},{"x":0.71,"y":0.49,"angle":3},{"x":0.39,"y":0.8,"angle":-2}],"sourceArtworkId":"art-01"},"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-right","series":"series-01","kind":"panel","id":"cut-right","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","bounds":{"x0":0.5,"x1":1,"y0":0,"y1":1},"sceneId":"scene-01","storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/panel/cut-left-1","series":"series-01","kind":"panel","id":"cut-left-1","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","bounds":{"x0":0,"x1":0.5,"y0":0,"y1":0.3333333333333333},"sceneId":"scene-01","storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/panel/cut-left-2","series":"series-01","kind":"panel","id":"cut-left-2","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","bounds":{"x0":0,"x1":0.5,"y0":0.3333333333333333,"y1":0.6666666666666666},"sceneId":"scene-01","storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/panel/cut-left-3","series":"series-01","kind":"panel","id":"cut-left-3","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","bounds":{"x0":0,"x1":0.5,"y0":0.6666666666666666,"y1":1},"sceneId":"scene-01","storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/page/page-02","series":"series-01","kind":"page","id":"page-02","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-02"],"letteringReadingOrder":[],"layerOrder":[],"watermark":null,"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-02","series":"series-01","kind":"panel","id":"cut-02","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-02","bounds":{"x0":0,"x1":1,"y0":0,"y1":1},"sceneId":null,"storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/page/page-03","series":"series-01","kind":"page","id":"page-03","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-03"],"letteringReadingOrder":[],"layerOrder":[],"watermark":null,"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-03","series":"series-01","kind":"panel","id":"cut-03","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-03","bounds":{"x0":0,"x1":1,"y0":0,"y1":1},"sceneId":null,"storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/page/page-04","series":"series-01","kind":"page","id":"page-04","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-04"],"letteringReadingOrder":[],"layerOrder":[],"watermark":null,"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-04","series":"series-01","kind":"panel","id":"cut-04","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-04","bounds":{"x0":0,"x1":1,"y0":0,"y1":1},"sceneId":null,"storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/page/page-05","series":"series-01","kind":"page","id":"page-05","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-05"],"letteringReadingOrder":[],"layerOrder":[],"watermark":null,"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-05","series":"series-01","kind":"panel","id":"cut-05","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-05","bounds":{"x0":0,"x1":1,"y0":0,"y1":1},"sceneId":null,"storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/page/page-06","series":"series-01","kind":"page","id":"page-06","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-06"],"letteringReadingOrder":[],"layerOrder":[],"watermark":null,"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-06","series":"series-01","kind":"panel","id":"cut-06","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-06","bounds":{"x0":0,"x1":1,"y0":0,"y1":1},"sceneId":null,"storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/page/page-07","series":"series-01","kind":"page","id":"page-07","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-07"],"letteringReadingOrder":[],"layerOrder":[],"watermark":null,"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-07","series":"series-01","kind":"panel","id":"cut-07","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-07","bounds":{"x0":0,"x1":1,"y0":0,"y1":1},"sceneId":null,"storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/page/page-08","series":"series-01","kind":"page","id":"page-08","revision":1,"deleted":false,"updated":1791151200000,"data":{"episodeId":"episode-01","sizeMm":[128,182],"targetPx":{"width":3024,"height":4299},"dpi":600,"marginMm":5,"gutterMm":{"x":2,"y":4},"layoutRevision":7,"panelOrder":["cut-08"],"letteringReadingOrder":[],"layerOrder":[],"watermark":null,"workflowStatus":{"layout":"ready","generation":"empty","retouch":"empty","lettering":"empty","sfx":"empty","watermark":"empty"},"notes":""}},{"key":"series-01/panel/cut-08","series":"series-01","kind":"panel","id":"cut-08","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-08","bounds":{"x0":0,"x1":1,"y0":0,"y1":1},"sceneId":null,"storyBeatId":null,"characterIds":["character-01"],"generation":{"prompt":"창가에서 소리를 듣고 돌아보는 인물","referenceAssetIds":["image-01"],"preferredSizePx":null},"notes":""}},{"key":"series-01/asset/image-01","series":"series-01","kind":"asset","id":"image-01","revision":1,"deleted":false,"updated":1791151200000,"data":{"sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","mime":"image/png","storageRef":{"kind":"file","value":"assets/image-01.png"},"role":"image","sourceAssetIds":[],"widthPx":3024,"heightPx":4299}},{"key":"series-01/asset/font-ko","series":"series-01","kind":"asset","id":"font-ko","revision":1,"deleted":false,"updated":1791151200000,"data":{"sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","mime":"font/otf","storageRef":{"kind":"file","value":"assets/font-ko.otf"},"role":"font","sourceAssetIds":[]}},{"key":"series-01/asset/mask-01","series":"series-01","kind":"asset","id":"mask-01","revision":1,"deleted":false,"updated":1791151200000,"data":{"sha256":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc","mime":"image/png","storageRef":{"kind":"file","value":"assets/mask-01.png"},"role":"mask","sourceAssetIds":[],"widthPx":3024,"heightPx":4299}},{"key":"series-01/artwork/art-01","series":"series-01","kind":"artwork","id":"art-01","revision":2,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"page","id":"page-01"},"assetId":"image-01","crop":{"x":0,"y":0,"width":1,"height":1},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"opacity":1,"blendMode":"normal","provenance":{"method":"imported","inputAssetIds":[],"prompt":"","model":null,"seed":null,"settings":{}}}},{"key":"series-01/lettering/letter-title","series":"series-01","kind":"lettering","id":"letter-title","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"page","id":"page-01"},"textRefs":[{"textBlockId":"title-episode","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":6,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0.18,0.08],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"none"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}},{"key":"series-01/lettering/letter-dialogue","series":"series-01","kind":"lettering","id":"letter-dialogue","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"panel","id":"cut-left-1"},"textRefs":[{"textBlockId":"text-dialogue","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":[["M",0.08,0.25],["C",0.08,0.13954,0.24565,0.05,0.45,0.05],["C",0.65435,0.05,0.82,0.13954,0.82,0.25],["C",0.82,0.36046,0.65435,0.45,0.45,0.45],["C",0.24565,0.45,0.08,0.36046,0.08,0.25],["Z"]],"tail":{"baseAttachments":[{"curveIndex":2,"t":0.25},{"curveIndex":2,"t":0.55}],"tip":[0.64,0.6],"target":{"speakerId":"character-01","mouth":[0.73,0.78]},"controlPoints":[]},"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"oval","fill":"#ffffff","stroke":"#202020","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"panel"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}},{"key":"series-01/lettering/letter-thought","series":"series-01","kind":"lettering","id":"letter-thought","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"panel","id":"cut-left-1"},"textRefs":[{"textBlockId":"text-thought","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":[["M",0.08,0.25],["C",0.08,0.13954,0.24565,0.05,0.45,0.05],["C",0.65435,0.05,0.82,0.13954,0.82,0.25],["C",0.82,0.36046,0.65435,0.45,0.45,0.45],["C",0.24565,0.45,0.08,0.36046,0.08,0.25],["Z"]],"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"thought","fill":"#ffffff","stroke":"#202020","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"panel"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}},{"key":"series-01/lettering/letter-narration","series":"series-01","kind":"lettering","id":"letter-narration","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"panel","id":"cut-left-1"},"textRefs":[{"textBlockId":"text-narration","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"panel"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}},{"key":"series-01/lettering/letter-sfx","series":"series-01","kind":"lettering","id":"letter-sfx","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"panel","id":"cut-left-1"},"textRefs":[{"textBlockId":"text-sfx","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":9,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[{"textRefIndex":0,"range":{"start":0,"end":1},"transform":{"translate":[0,0],"rotateDeg":-5,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}}],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[{"color":"#ffffff","widthMm":0.7}]},"transform":{"translate":[0.25,0.62],"rotateDeg":-12,"scaleX":1,"scaleY":1,"skewXDeg":8,"skewYDeg":0},"clip":{"mode":"panel"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"},"occlusionMask":{"assetId":"mask-01","space":"page","transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0}}}},{"key":"series-01/lettering/letter-caption","series":"series-01","kind":"lettering","id":"letter-caption","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"panel","id":"cut-left-1"},"textRefs":[{"textBlockId":"text-caption","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"panel"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}},{"key":"series-01/lettering/letter-label","series":"series-01","kind":"lettering","id":"letter-label","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"panel","id":"cut-left-1"},"textRefs":[{"textBlockId":"text-label","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"panel"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}},{"key":"series-01/lettering/letter-credit","series":"series-01","kind":"lettering","id":"letter-credit","revision":1,"deleted":false,"updated":1791151200000,"data":{"pageId":"page-01","anchor":{"kind":"page","id":"page-01"},"textRefs":[{"textBlockId":"text-credit","locale":"ko","textRevision":3}],"typography":{"fontAssetId":"font-ko","fontSizeMm":3.2,"lineHeight":1.35,"trackingEm":0,"writingMode":"horizontal-tb","align":"center","manualBreaks":[]},"geometry":{"units":"anchor-normalized","textFrame":{"x":0.18,"y":0.16,"width":0.54,"height":0.18},"paddingMm":1.5,"body":null,"tail":null,"baseline":null,"glyphTransforms":[],"layoutMode":"auto"},"style":{"balloonStyle":"none","fill":"none","stroke":"none","strokeMm":0.25,"dashMm":[],"textFill":"#202020","textOutlines":[]},"transform":{"translate":[0,0],"rotateDeg":0,"scaleX":1,"scaleY":1,"skewXDeg":0,"skewYDeg":0},"clip":{"mode":"none"},"locks":{"content":true,"geometry":false,"style":false},"dependsOn":{"layoutRevision":7,"records":[{"kind":"artwork","id":"art-01","revision":2}],"assets":[{"assetId":"font-ko","sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"},{"assetId":"image-01","sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}],"rendererVersion":"lettering-v1"}}}]}],"x-sqlite":{"records":{"key":"TEXT PRIMARY KEY","series":"TEXT NOT NULL REFERENCES series(id)","kind":"TEXT","id":"TEXT","data":"TEXT containing JSON","revision":"INTEGER","deleted":"INTEGER 0 or 1","updated":"INTEGER UTC epoch milliseconds"},"workspace":"Logical workspace envelope has series=null; persist in existing workspaces(account,data,revision), not the records table.","assets":"Asset metadata stays in records; storageRef locates file/blob bytes outside JSON records."},"x-invariants":["Record key equals series/kind/id; IDs and keys are unique. Resolve all foreign references within their series and check parent membership.","Title, source-language text and textRefs resolve. A range uses grapheme offsets for that exact textRevision; end exceeds start and fits the source.","pageOrder, panelOrder, sceneOrder, textBlockOrder and layerOrder contain unique IDs with matching owners. page.layerOrder contains both artwork and lettering, bottom to top; letteringReadingOrder is separate.","New authored episodes start with eight pages. Preserve extra/hidden/imported pages. Grid coverage, non-overlap, maximum 5x5 tracks and minimum 20mm cells use the existing geometry validator.","Page policy is 128x182mm, 3024x4299px at 600dpi with 5mm margin. Aspect ratio, pixel frames and grid cells are derived; geometry edits atomically compare and increment layoutRevision.","Body paths start with M and end with Z. Tail curve indices, glyph ranges and custom clip paths must resolve. Cross-panel placement uses page anchors or explicit overflow.","Asset roles, image/mask dimensions, hashes and actual font coverage must match their usage. Dependency revisions and hashes must match before a patch commits.","This schema validates JSON structure. Referential integrity, geometric relationships and rendered fit require application checks; examples use illustrative asset hashes and paths."]}