[{"data":1,"prerenderedAt":1244},["ShallowReactive",2],{"cycle-doc-qmap-c24-PLAN.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":22},{"id":5,"title":6},"c24","synthetic-live-session-replay",{"id":8,"label":9},"qmap","Qmap","PLAN.md","c24. Synthetic Live Session Replay Plan",[13,14,15,16,17,18,19,20,21],"Goal","Recommended Product Shape","Three-Layer Architecture","Canonical 10-Second Storyboard","Tricky Details To Work Out Early","Investigation: Why The Arrows Blink","Targeted Plan: Only Remove Arrows Missing From The Next Map","Suggested File-Level Split","Implementation Order",{"type":23,"children":24},"root",[25,33,47,52,92,97,102,114,151,156,161,168,173,178,191,197,202,207,273,278,286,299,305,310,315,323,335,340,354,391,404,456,469,510,523,546,551,557,591,597,631,637,662,667,783,788,794,821,827,871,877,959,965,985,991,1014,1020,1044,1050,1068,1073,1112,1117,1123,1141,1147,1170,1176,1209,1215,1239],{"type":26,"tag":27,"props":28,"children":30},"element","h2",{"id":29},"goal",[31],{"type":32,"value":13},"text",{"type":26,"tag":34,"props":35,"children":36},"p",{},[37,39,45],{"type":32,"value":38},"Simulate one \"live\" agent session in qmap over ",{"type":26,"tag":40,"props":41,"children":42},"strong",{},[43],{"type":32,"value":44},"10 seconds",{"type":32,"value":46}," using synthetic data first, then preserve the same playback system so real session data can drop in later with minimal UI churn.",{"type":26,"tag":34,"props":48,"children":49},{},[50],{"type":32,"value":51},"Canonical demo:",{"type":26,"tag":53,"props":54,"children":55},"ul",{},[56,62,72,82],{"type":26,"tag":57,"props":58,"children":59},"li",{},[60],{"type":32,"value":61},"agent initializes",{"type":26,"tag":57,"props":63,"children":64},{},[65,67],{"type":32,"value":66},"research phase touches ",{"type":26,"tag":40,"props":68,"children":69},{},[70],{"type":32,"value":71},"24 HTTP URLs",{"type":26,"tag":57,"props":73,"children":74},{},[75,77],{"type":32,"value":76},"execution phase uses ",{"type":26,"tag":40,"props":78,"children":79},{},[80],{"type":32,"value":81},"4 MCP servers",{"type":26,"tag":57,"props":83,"children":84},{},[85,87],{"type":32,"value":86},"edit phase touches ",{"type":26,"tag":40,"props":88,"children":89},{},[90],{"type":32,"value":91},"6 files",{"type":26,"tag":34,"props":93,"children":94},{},[95],{"type":32,"value":96},"This should feel live, not like a static fixture swap. Actors and flows should accumulate over time, phase changes should read clearly, and playback should be deterministic enough for repeated visual tuning.",{"type":26,"tag":27,"props":98,"children":100},{"id":99},"recommended-product-shape",[101],{"type":32,"value":14},{"type":26,"tag":34,"props":103,"children":104},{},[105,107,112],{"type":32,"value":106},"Add a ",{"type":26,"tag":40,"props":108,"children":109},{},[110],{"type":32,"value":111},"third source mode",{"type":32,"value":113}," wherever this replay lands:",{"type":26,"tag":53,"props":115,"children":116},{},[117,129,140],{"type":26,"tag":57,"props":118,"children":119},{},[120,127],{"type":26,"tag":121,"props":122,"children":124},"code",{"className":123},[],[125],{"type":32,"value":126},"synthetic",{"type":32,"value":128}," — current stable fixtures",{"type":26,"tag":57,"props":130,"children":131},{},[132,138],{"type":26,"tag":121,"props":133,"children":135},{"className":134},[],[136],{"type":32,"value":137},"replay",{"type":32,"value":139}," — synthetic live session over 10 seconds",{"type":26,"tag":57,"props":141,"children":142},{},[143,149],{"type":26,"tag":121,"props":144,"children":146},{"className":145},[],[147],{"type":32,"value":148},"live",{"type":32,"value":150}," — real session feed when available",{"type":26,"tag":34,"props":152,"children":153},{},[154],{"type":32,"value":155},"The replay mode should not hard-code animation inside the Vue view. Instead, build a small playback stack with three layers.",{"type":26,"tag":27,"props":157,"children":159},{"id":158},"three-layer-architecture",[160],{"type":32,"value":15},{"type":26,"tag":162,"props":163,"children":165},"h3",{"id":164},"_1-scenario-spec",[166],{"type":32,"value":167},"1. Scenario Spec",{"type":26,"tag":34,"props":169,"children":170},{},[171],{"type":32,"value":172},"Human-authored semantic intent. This is where we describe the story we want to see.",{"type":26,"tag":34,"props":174,"children":175},{},[176],{"type":32,"value":177},"Suggested shape:",{"type":26,"tag":179,"props":180,"children":186},"pre",{"className":181,"code":182,"language":183,"meta":184,"style":185},"language-js","{\n  id: \"agent-research-edit-10s\",\n  durationMs: 10_000,\n  seed: 24,\n  actors: {\n    user: { id: \"user-mark\", type: \"user\", label: \"Mark\" },\n    agent: { id: \"agent-codex\", type: \"agent\", label: \"Codex\" },\n    mcpServers: [\n      { id: \"mcp-brave\", type: \"mcp-server\", label: \"Brave Search MCP\" },\n      { id: \"mcp-github\", type: \"mcp-server\", label: \"GitHub MCP\" },\n      { id: \"mcp-filesystem\", type: \"mcp-server\", label: \"Filesystem MCP\" },\n      { id: \"mcp-docs\", type: \"mcp-server\", label: \"Docs MCP\" }\n    ]\n  },\n  phases: [\n    { id: \"init\", startMs: 0, endMs: 1000 },\n    { id: \"research\", startMs: 1000, endMs: 4500, urls: 24 },\n    { id: \"edit\", startMs: 4500, endMs: 9000, mcpServers: 4, files: 6 },\n    { id: \"finalize\", startMs: 9000, endMs: 10_000 }\n  ]\n}\n","js","","undefined",[187],{"type":26,"tag":121,"props":188,"children":189},{"__ignoreMap":184},[190],{"type":32,"value":182},{"type":26,"tag":162,"props":192,"children":194},{"id":193},"_2-timeline-compiler",[195],{"type":32,"value":196},"2. Timeline Compiler",{"type":26,"tag":34,"props":198,"children":199},{},[200],{"type":32,"value":201},"Transforms the scenario spec into timestamped replay events and snapshot checkpoints.",{"type":26,"tag":34,"props":203,"children":204},{},[205],{"type":32,"value":206},"Suggested event types:",{"type":26,"tag":53,"props":208,"children":209},{},[210,219,228,237,246,255,264],{"type":26,"tag":57,"props":211,"children":212},{},[213],{"type":26,"tag":121,"props":214,"children":216},{"className":215},[],[217],{"type":32,"value":218},"actor.reveal",{"type":26,"tag":57,"props":220,"children":221},{},[222],{"type":26,"tag":121,"props":223,"children":225},{"className":224},[],[226],{"type":32,"value":227},"actor.state",{"type":26,"tag":57,"props":229,"children":230},{},[231],{"type":26,"tag":121,"props":232,"children":234},{"className":233},[],[235],{"type":32,"value":236},"flow.bump",{"type":26,"tag":57,"props":238,"children":239},{},[240],{"type":26,"tag":121,"props":241,"children":243},{"className":242},[],[244],{"type":32,"value":245},"phase.start",{"type":26,"tag":57,"props":247,"children":248},{},[249],{"type":26,"tag":121,"props":250,"children":252},{"className":251},[],[253],{"type":32,"value":254},"phase.end",{"type":26,"tag":57,"props":256,"children":257},{},[258],{"type":26,"tag":121,"props":259,"children":261},{"className":260},[],[262],{"type":32,"value":263},"focus.set",{"type":26,"tag":57,"props":265,"children":266},{},[267],{"type":26,"tag":121,"props":268,"children":270},{"className":269},[],[271],{"type":32,"value":272},"meta.update",{"type":26,"tag":34,"props":274,"children":275},{},[276],{"type":32,"value":277},"Suggested emitted shape:",{"type":26,"tag":179,"props":279,"children":281},{"className":181,"code":280,"language":183,"meta":184,"style":185},"{\n  atMs: 3125,\n  kind: \"flow.bump\",\n  payload: {\n    origin: \"mcp-brave\",\n    destination: \"ext-openai-docs\",\n    amount: 1\n  }\n}\n",[282],{"type":26,"tag":121,"props":283,"children":284},{"__ignoreMap":184},[285],{"type":32,"value":280},{"type":26,"tag":34,"props":287,"children":288},{},[289,291,297],{"type":32,"value":290},"The compiler should also produce snapshots on a fixed cadence, for example every ",{"type":26,"tag":121,"props":292,"children":294},{"className":293},[],[295],{"type":32,"value":296},"100ms",{"type":32,"value":298},", so playback is smooth but deterministic.",{"type":26,"tag":162,"props":300,"children":302},{"id":301},"_3-playback-source",[303],{"type":32,"value":304},"3. Playback Source",{"type":26,"tag":34,"props":306,"children":307},{},[308],{"type":32,"value":309},"Consumes the compiled timeline and exposes the same kind of session object the view already understands.",{"type":26,"tag":34,"props":311,"children":312},{},[313],{"type":32,"value":314},"Suggested interface:",{"type":26,"tag":179,"props":316,"children":318},{"className":181,"code":317,"language":183,"meta":184,"style":185},"const replay = createSessionReplay({\n  scenario,\n  snapshotMs: 100,\n});\n\nreplay.play();\nreplay.pause();\nreplay.seek(4500);\nreplay.subscribe(({ nowMs, session, phase, delta }) => {});\n",[319],{"type":26,"tag":121,"props":320,"children":321},{"__ignoreMap":184},[322],{"type":32,"value":317},{"type":26,"tag":34,"props":324,"children":325},{},[326,328,333],{"type":32,"value":327},"The key requirement is that the playback source emits ",{"type":26,"tag":40,"props":329,"children":330},{},[331],{"type":32,"value":332},"normal qmap session data",{"type":32,"value":334},", not special rendering commands.",{"type":26,"tag":27,"props":336,"children":338},{"id":337},"canonical-10-second-storyboard",[339],{"type":32,"value":16},{"type":26,"tag":162,"props":341,"children":343},{"id":342},"phase-1-init-0ms-1000ms",[344,346,352],{"type":32,"value":345},"Phase 1: Init (",{"type":26,"tag":121,"props":347,"children":349},{"className":348},[],[350],{"type":32,"value":351},"0ms - 1000ms",{"type":32,"value":353},")",{"type":26,"tag":53,"props":355,"children":356},{},[357,376,381,386],{"type":26,"tag":57,"props":358,"children":359},{},[360,362,368,370],{"type":32,"value":361},"reveal ",{"type":26,"tag":121,"props":363,"children":365},{"className":364},[],[366],{"type":32,"value":367},"User",{"type":32,"value":369}," and ",{"type":26,"tag":121,"props":371,"children":373},{"className":372},[],[374],{"type":32,"value":375},"AI Agent",{"type":26,"tag":57,"props":377,"children":378},{},[379],{"type":32,"value":380},"show initial invoke flow from user to agent",{"type":26,"tag":57,"props":382,"children":383},{},[384],{"type":32,"value":385},"keep MCP\u002Ffile\u002Fhost rugs empty at first",{"type":26,"tag":57,"props":387,"children":388},{},[389],{"type":32,"value":390},"optionally pre-register hidden actors so later reveals do not cause violent layout churn",{"type":26,"tag":162,"props":392,"children":394},{"id":393},"phase-2-research-1000ms-4500ms",[395,397,403],{"type":32,"value":396},"Phase 2: Research (",{"type":26,"tag":121,"props":398,"children":400},{"className":399},[],[401],{"type":32,"value":402},"1000ms - 4500ms",{"type":32,"value":353},{"type":26,"tag":53,"props":405,"children":406},{},[407,426,446,451],{"type":26,"tag":57,"props":408,"children":409},{},[410,412,418,420],{"type":32,"value":411},"reveal two research MCPs first: ",{"type":26,"tag":121,"props":413,"children":415},{"className":414},[],[416],{"type":32,"value":417},"Brave Search MCP",{"type":32,"value":419},", ",{"type":26,"tag":121,"props":421,"children":423},{"className":422},[],[424],{"type":32,"value":425},"Docs MCP",{"type":26,"tag":57,"props":427,"children":428},{},[429,431,436,438,444],{"type":32,"value":430},"fan out to ",{"type":26,"tag":40,"props":432,"children":433},{},[434],{"type":32,"value":435},"24 URL touches",{"type":32,"value":437}," across roughly ",{"type":26,"tag":121,"props":439,"children":441},{"className":440},[],[442],{"type":32,"value":443},"8-12",{"type":32,"value":445}," distinct hosts",{"type":26,"tag":57,"props":447,"children":448},{},[449],{"type":32,"value":450},"spread touches across the window so flows visibly accumulate instead of arriving in one burst",{"type":26,"tag":57,"props":452,"children":453},{},[454],{"type":32,"value":455},"let the research hosts appear lazily as first touched",{"type":26,"tag":162,"props":457,"children":459},{"id":458},"phase-3-edit-4500ms-9000ms",[460,462,468],{"type":32,"value":461},"Phase 3: Edit (",{"type":26,"tag":121,"props":463,"children":465},{"className":464},[],[466],{"type":32,"value":467},"4500ms - 9000ms",{"type":32,"value":353},{"type":26,"tag":53,"props":470,"children":471},{},[472,490,500,505],{"type":26,"tag":57,"props":473,"children":474},{},[475,477,483,484],{"type":32,"value":476},"reveal remaining MCPs: ",{"type":26,"tag":121,"props":478,"children":480},{"className":479},[],[481],{"type":32,"value":482},"Filesystem MCP",{"type":32,"value":419},{"type":26,"tag":121,"props":485,"children":487},{"className":486},[],[488],{"type":32,"value":489},"GitHub MCP",{"type":26,"tag":57,"props":491,"children":492},{},[493,494,498],{"type":32,"value":361},{"type":26,"tag":40,"props":495,"children":496},{},[497],{"type":32,"value":91},{"type":32,"value":499}," gradually rather than all at once",{"type":26,"tag":57,"props":501,"children":502},{},[503],{"type":32,"value":504},"start with reads, then transition a subset to writes so the file-access grouping remains meaningful",{"type":26,"tag":57,"props":506,"children":507},{},[508],{"type":32,"value":509},"accumulate MCP -> file and MCP -> host flows alongside agent -> MCP flows",{"type":26,"tag":162,"props":511,"children":513},{"id":512},"phase-4-finalize-9000ms-10_000ms",[514,516,522],{"type":32,"value":515},"Phase 4: Finalize (",{"type":26,"tag":121,"props":517,"children":519},{"className":518},[],[520],{"type":32,"value":521},"9000ms - 10_000ms",{"type":32,"value":353},{"type":26,"tag":53,"props":524,"children":525},{},[526,531,536,541],{"type":26,"tag":57,"props":527,"children":528},{},[529],{"type":32,"value":530},"stop introducing new actors",{"type":26,"tag":57,"props":532,"children":533},{},[534],{"type":32,"value":535},"continue a few final flow bumps",{"type":26,"tag":57,"props":537,"children":538},{},[539],{"type":32,"value":540},"settle on a readable end state with the hottest MCPs and touched files clearly visible",{"type":26,"tag":57,"props":542,"children":543},{},[544],{"type":32,"value":545},"expose summary metadata such as total URLs, total files, total MCPs used",{"type":26,"tag":27,"props":547,"children":549},{"id":548},"tricky-details-to-work-out-early",[550],{"type":32,"value":17},{"type":26,"tag":162,"props":552,"children":554},{"id":553},"layout-churn",[555],{"type":32,"value":556},"Layout Churn",{"type":26,"tag":53,"props":558,"children":559},{},[560,565,570],{"type":26,"tag":57,"props":561,"children":562},{},[563],{"type":32,"value":564},"keep actor ids stable for the whole replay",{"type":26,"tag":57,"props":566,"children":567},{},[568],{"type":32,"value":569},"optionally pre-seed hidden actors from frame 0",{"type":26,"tag":57,"props":571,"children":572},{},[573,575,581,583,589],{"type":32,"value":574},"distinguish ",{"type":26,"tag":121,"props":576,"children":578},{"className":577},[],[579],{"type":32,"value":580},"revealed",{"type":32,"value":582}," from ",{"type":26,"tag":121,"props":584,"children":586},{"className":585},[],[587],{"type":32,"value":588},"present",{"type":32,"value":590}," so layout slots can remain stable",{"type":26,"tag":162,"props":592,"children":594},{"id":593},"flow-identity",[595],{"type":32,"value":596},"Flow Identity",{"type":26,"tag":53,"props":598,"children":599},{},[600,605,618],{"type":26,"tag":57,"props":601,"children":602},{},[603],{"type":32,"value":604},"compile one deterministic flow id per logical connection",{"type":26,"tag":57,"props":606,"children":607},{},[608,610,616],{"type":32,"value":609},"update ",{"type":26,"tag":121,"props":611,"children":613},{"className":612},[],[614],{"type":32,"value":615},"volume",{"type":32,"value":617}," over time",{"type":26,"tag":57,"props":619,"children":620},{},[621,623,629],{"type":32,"value":622},"optionally track ",{"type":26,"tag":121,"props":624,"children":626},{"className":625},[],[627],{"type":32,"value":628},"lastTouchedAtMs",{"type":32,"value":630}," for pulse styling",{"type":26,"tag":162,"props":632,"children":634},{"id":633},"arrow-persistence-during-replay",[635],{"type":32,"value":636},"Arrow Persistence During Replay",{"type":26,"tag":53,"props":638,"children":639},{},[640,645,657],{"type":26,"tag":57,"props":641,"children":642},{},[643],{"type":32,"value":644},"selection-owned arrows currently rebuild on every replay snapshot, even when the logical flow still exists",{"type":26,"tag":57,"props":646,"children":647},{},[648,650,655],{"type":32,"value":649},"this creates a visible blink in ",{"type":26,"tag":121,"props":651,"children":653},{"className":652},[],[654],{"type":32,"value":5},{"type":32,"value":656}," because replay emits frequent session snapshots and re-selects the root agent after transitions",{"type":26,"tag":57,"props":658,"children":659},{},[660],{"type":32,"value":661},"treat selected-flow arrows as a reconciled set keyed by logical flow identity, not as disposable per-refresh decoration",{"type":26,"tag":27,"props":663,"children":665},{"id":664},"investigation-why-the-arrows-blink",[666],{"type":32,"value":18},{"type":26,"tag":53,"props":668,"children":669},{},[670,704,731,755,778],{"type":26,"tag":57,"props":671,"children":672},{},[673,678,680,686,688,694,696,702],{"type":26,"tag":121,"props":674,"children":676},{"className":675},[],[677],{"type":32,"value":5},{"type":32,"value":679}," drives ",{"type":26,"tag":121,"props":681,"children":683},{"className":682},[],[684],{"type":32,"value":685},"QMapAgentSession",{"type":32,"value":687}," with a continuously updating ",{"type":26,"tag":121,"props":689,"children":691},{"className":690},[],[692],{"type":32,"value":693},"session",{"type":32,"value":695}," plus ",{"type":26,"tag":121,"props":697,"children":699},{"className":698},[],[700],{"type":32,"value":701},"dataflows",{"type":32,"value":703},", and re-applies root-agent selection on ready\u002Ftransition end so the agent-centered arrows remain visible",{"type":26,"tag":57,"props":705,"children":706},{},[707,713,715,721,723,729],{"type":26,"tag":121,"props":708,"children":710},{"className":709},[],[711],{"type":32,"value":712},"useSceneReactivity()",{"type":32,"value":714}," updates ",{"type":26,"tag":121,"props":716,"children":718},{"className":717},[],[719],{"type":32,"value":720},"currentDataflows",{"type":32,"value":722}," and then always calls ",{"type":26,"tag":121,"props":724,"children":726},{"className":725},[],[727],{"type":32,"value":728},"refreshSelection()",{"type":32,"value":730}," after each reactive data change, including the fast path where there are no actor\u002Frug layout changes",{"type":26,"tag":57,"props":732,"children":733},{},[734,739,741,747,749],{"type":26,"tag":121,"props":735,"children":737},{"className":736},[],[738],{"type":32,"value":728},{"type":32,"value":740}," calls ",{"type":26,"tag":121,"props":742,"children":744},{"className":743},[],[745],{"type":32,"value":746},"applySelection()",{"type":32,"value":748},", which calls ",{"type":26,"tag":121,"props":750,"children":752},{"className":751},[],[753],{"type":32,"value":754},"createFlowsForActor()",{"type":26,"tag":57,"props":756,"children":757},{},[758,763,765,771,773],{"type":26,"tag":121,"props":759,"children":761},{"className":760},[],[762],{"type":32,"value":754},{"type":32,"value":764}," begins with ",{"type":26,"tag":121,"props":766,"children":768},{"className":767},[],[769],{"type":32,"value":770},"disposeFlows()",{"type":32,"value":772},", removing every current arrow mesh before recreating all connected flows from ",{"type":26,"tag":121,"props":774,"children":776},{"className":775},[],[777],{"type":32,"value":720},{"type":26,"tag":57,"props":779,"children":780},{},[781],{"type":32,"value":782},"result: any new replay snapshot tears down all animating arrows first, so even unchanged flows disappear for a frame and then reappear",{"type":26,"tag":27,"props":784,"children":786},{"id":785},"targeted-plan-only-remove-arrows-missing-from-the-next-map",[787],{"type":32,"value":19},{"type":26,"tag":162,"props":789,"children":791},{"id":790},"_1-lock-selection-flow-identity",[792],{"type":32,"value":793},"1. Lock Selection Flow Identity",{"type":26,"tag":53,"props":795,"children":796},{},[797,816],{"type":26,"tag":57,"props":798,"children":799},{},[800,802,808,810],{"type":32,"value":801},"define a stable selection-flow key using ",{"type":26,"tag":121,"props":803,"children":805},{"className":804},[],[806],{"type":32,"value":807},"dataflow.id",{"type":32,"value":809}," when present, with a deterministic fallback like ",{"type":26,"tag":121,"props":811,"children":813},{"className":812},[],[814],{"type":32,"value":815},"origin|destination|protocol",{"type":26,"tag":57,"props":817,"children":818},{},[819],{"type":32,"value":820},"use that key consistently for the selection overlay so we can compare the current rendered set against the next snapshot",{"type":26,"tag":162,"props":822,"children":824},{"id":823},"_2-replace-full-rebuild-with-reconciliation",[825],{"type":32,"value":826},"2. Replace Full Rebuild With Reconciliation",{"type":26,"tag":53,"props":828,"children":829},{},[830,843,856,861,866],{"type":26,"tag":57,"props":831,"children":832},{},[833,835,841],{"type":32,"value":834},"refactor ",{"type":26,"tag":121,"props":836,"children":838},{"className":837},[],[839],{"type":32,"value":840},"useActorSelection()",{"type":32,"value":842}," so selection flows are stored in a keyed map instead of a single disposable array",{"type":26,"tag":57,"props":844,"children":845},{},[846,848,854],{"type":32,"value":847},"when selection refreshes, compute ",{"type":26,"tag":121,"props":849,"children":851},{"className":850},[],[852],{"type":32,"value":853},"nextConnectedFlows",{"type":32,"value":855}," for the selected actor and diff them against the rendered flow map",{"type":26,"tag":57,"props":857,"children":858},{},[859],{"type":32,"value":860},"remove only flows whose key is absent from the next set",{"type":26,"tag":57,"props":862,"children":863},{},[864],{"type":32,"value":865},"create flows only for newly added keys",{"type":26,"tag":57,"props":867,"children":868},{},[869],{"type":32,"value":870},"keep existing flow instances alive for persisted keys",{"type":26,"tag":162,"props":872,"children":874},{"id":873},"_3-update-persisted-flows-in-place",[875],{"type":32,"value":876},"3. Update Persisted Flows In Place",{"type":26,"tag":53,"props":878,"children":879},{},[880,891,946],{"type":26,"tag":57,"props":881,"children":882},{},[883,885],{"type":32,"value":884},"for a persisted flow, update positions from current actor meshes instead of recreating the ",{"type":26,"tag":121,"props":886,"children":888},{"className":887},[],[889],{"type":32,"value":890},"LineFlow",{"type":26,"tag":57,"props":892,"children":893},{},[894,896,901,902,908,910,916,918],{"type":32,"value":895},"if replay changes mutable flow attributes such as ",{"type":26,"tag":121,"props":897,"children":899},{"className":898},[],[900],{"type":32,"value":615},{"type":32,"value":419},{"type":26,"tag":121,"props":903,"children":905},{"className":904},[],[906],{"type":32,"value":907},"status",{"type":32,"value":909},", or ",{"type":26,"tag":121,"props":911,"children":913},{"className":912},[],[914],{"type":32,"value":915},"protocol",{"type":32,"value":917},", either:\n",{"type":26,"tag":53,"props":919,"children":920},{},[921,941],{"type":26,"tag":57,"props":922,"children":923},{},[924,926,932,934,939],{"type":32,"value":925},"add a small ",{"type":26,"tag":121,"props":927,"children":929},{"className":928},[],[930],{"type":32,"value":931},"updateFlowData()",{"type":32,"value":933}," path on ",{"type":26,"tag":121,"props":935,"children":937},{"className":936},[],[938],{"type":32,"value":890},{"type":32,"value":940},", or",{"type":26,"tag":57,"props":942,"children":943},{},[944],{"type":32,"value":945},"recreate only that one changed flow while leaving the rest untouched",{"type":26,"tag":57,"props":947,"children":948},{},[949,951,957],{"type":32,"value":950},"continue to apply ",{"type":26,"tag":121,"props":952,"children":954},{"className":953},[],[955],{"type":32,"value":956},"flowConfig",{"type":32,"value":958}," watcher updates to surviving flows so tuning changes still propagate live",{"type":26,"tag":162,"props":960,"children":962},{"id":961},"_4-keep-full-disposal-for-real-removals",[963],{"type":32,"value":964},"4. Keep Full Disposal For Real Removals",{"type":26,"tag":53,"props":966,"children":967},{},[968,980],{"type":26,"tag":57,"props":969,"children":970},{},[971,973,978],{"type":32,"value":972},"preserve the existing ",{"type":26,"tag":121,"props":974,"children":976},{"className":975},[],[977],{"type":32,"value":770},{"type":32,"value":979}," behavior for deselection, actor removal, or full scene clear",{"type":26,"tag":57,"props":981,"children":982},{},[983],{"type":32,"value":984},"if the selected actor disappears from the next snapshot, clear all selection flows exactly as today",{"type":26,"tag":162,"props":986,"children":988},{"id":987},"_5-verify-against-replay-cases",[989],{"type":32,"value":990},"5. Verify Against Replay Cases",{"type":26,"tag":53,"props":992,"children":993},{},[994,999,1004,1009],{"type":26,"tag":57,"props":995,"children":996},{},[997],{"type":32,"value":998},"confirm that a snapshot containing the same logical agent-connected flows no longer causes arrow blink",{"type":26,"tag":57,"props":1000,"children":1001},{},[1002],{"type":32,"value":1003},"confirm that adding one new flow introduces only that arrow",{"type":26,"tag":57,"props":1005,"children":1006},{},[1007],{"type":32,"value":1008},"confirm that removing one flow disposes only that arrow",{"type":26,"tag":57,"props":1010,"children":1011},{},[1012],{"type":32,"value":1013},"confirm that actor exits during transitions still clean up affected flows safely",{"type":26,"tag":162,"props":1015,"children":1017},{"id":1016},"timing-determinism",[1018],{"type":32,"value":1019},"Timing Determinism",{"type":26,"tag":53,"props":1021,"children":1022},{},[1023,1028,1039],{"type":26,"tag":57,"props":1024,"children":1025},{},[1026],{"type":32,"value":1027},"deterministic seed for host ordering and event spacing",{"type":26,"tag":57,"props":1029,"children":1030},{},[1031,1033],{"type":32,"value":1032},"wall-clock playback driven by ",{"type":26,"tag":121,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":32,"value":1038},"requestAnimationFrame",{"type":26,"tag":57,"props":1040,"children":1041},{},[1042],{"type":32,"value":1043},"snapshot generation based on virtual clock, not render FPS",{"type":26,"tag":162,"props":1045,"children":1047},{"id":1046},"real-data-compatibility",[1048],{"type":32,"value":1049},"Real-Data Compatibility",{"type":26,"tag":53,"props":1051,"children":1052},{},[1053,1058,1063],{"type":26,"tag":57,"props":1054,"children":1055},{},[1056],{"type":32,"value":1057},"keep replay inputs event-oriented",{"type":26,"tag":57,"props":1059,"children":1060},{},[1061],{"type":32,"value":1062},"keep replay outputs session-shaped",{"type":26,"tag":57,"props":1064,"children":1065},{},[1066],{"type":32,"value":1067},"write adapters rather than mixing reducer logic into the Vue component",{"type":26,"tag":27,"props":1069,"children":1071},{"id":1070},"suggested-file-level-split",[1072],{"type":32,"value":20},{"type":26,"tag":53,"props":1074,"children":1075},{},[1076,1085,1094,1103],{"type":26,"tag":57,"props":1077,"children":1078},{},[1079],{"type":26,"tag":121,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":32,"value":1084},"shared\u002Freplay\u002FsessionReplayScenarios.js",{"type":26,"tag":57,"props":1086,"children":1087},{},[1088],{"type":26,"tag":121,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":32,"value":1093},"shared\u002Freplay\u002FcompileSessionReplay.js",{"type":26,"tag":57,"props":1095,"children":1096},{},[1097],{"type":26,"tag":121,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":32,"value":1102},"shared\u002Freplay\u002FcreateSessionReplay.js",{"type":26,"tag":57,"props":1104,"children":1105},{},[1106],{"type":26,"tag":121,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":32,"value":1111},"shared\u002Freplay\u002FreplaySessionAdapters.js",{"type":26,"tag":27,"props":1113,"children":1115},{"id":1114},"implementation-order",[1116],{"type":32,"value":21},{"type":26,"tag":162,"props":1118,"children":1120},{"id":1119},"phase-a-data-contract",[1121],{"type":32,"value":1122},"Phase A: Data Contract",{"type":26,"tag":53,"props":1124,"children":1125},{},[1126,1131,1136],{"type":26,"tag":57,"props":1127,"children":1128},{},[1129],{"type":32,"value":1130},"lock the scenario and replay event shapes",{"type":26,"tag":57,"props":1132,"children":1133},{},[1134],{"type":32,"value":1135},"author the canonical 10-second scenario",{"type":26,"tag":57,"props":1137,"children":1138},{},[1139],{"type":32,"value":1140},"decide whether hidden pre-seeded actors are part of the contract",{"type":26,"tag":162,"props":1142,"children":1144},{"id":1143},"phase-b-deterministic-compiler",[1145],{"type":32,"value":1146},"Phase B: Deterministic Compiler",{"type":26,"tag":53,"props":1148,"children":1149},{},[1150,1155,1165],{"type":26,"tag":57,"props":1151,"children":1152},{},[1153],{"type":32,"value":1154},"compile the scenario into timed events",{"type":26,"tag":57,"props":1156,"children":1157},{},[1158,1160],{"type":32,"value":1159},"emit snapshots every ",{"type":26,"tag":121,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":32,"value":296},{"type":26,"tag":57,"props":1166,"children":1167},{},[1168],{"type":32,"value":1169},"confirm the last snapshot is identical on every run",{"type":26,"tag":162,"props":1171,"children":1173},{"id":1172},"phase-c-ui-playback-controls",[1174],{"type":32,"value":1175},"Phase C: UI Playback Controls",{"type":26,"tag":53,"props":1177,"children":1178},{},[1179,1191,1204],{"type":26,"tag":57,"props":1180,"children":1181},{},[1182,1184,1189],{"type":32,"value":1183},"add ",{"type":26,"tag":121,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":32,"value":137},{"type":32,"value":1190}," as a source mode",{"type":26,"tag":57,"props":1192,"children":1193},{},[1194,1196,1202],{"type":32,"value":1195},"add play, pause, restart, scrub, and ",{"type":26,"tag":121,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":32,"value":1201},"1x\u002F2x",{"type":32,"value":1203}," speed controls",{"type":26,"tag":57,"props":1205,"children":1206},{},[1207],{"type":32,"value":1208},"show active phase and elapsed time in the header",{"type":26,"tag":162,"props":1210,"children":1212},{"id":1211},"phase-d-integration-and-recommendation",[1213],{"type":32,"value":1214},"Phase D: Integration and Recommendation",{"type":26,"tag":53,"props":1216,"children":1217},{},[1218,1223,1228],{"type":26,"tag":57,"props":1219,"children":1220},{},[1221],{"type":32,"value":1222},"run the replay against one experiment surface",{"type":26,"tag":57,"props":1224,"children":1225},{},[1226],{"type":32,"value":1227},"verify phase readability, layout behavior, and flow accumulation",{"type":26,"tag":57,"props":1229,"children":1230},{},[1231,1233],{"type":32,"value":1232},"decide whether any replay seam deserves promotion into ",{"type":26,"tag":121,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":32,"value":1238},"src\u002F",{"type":26,"tag":1240,"props":1241,"children":1242},"style",{},[1243],{"type":32,"value":184},1794599429918]